Full Code of vxcontrol/pentagi for AI

master e05062ed1e47 cached
898 files
66.0 MB
3.2M tokens
15612 symbols
2 requests
Copy disabled (too large) Download .txt
Showing preview only (12,848K chars total). Download the full file to get everything.
Repository: vxcontrol/pentagi
Branch: master
Commit: e05062ed1e47
Files: 898
Total size: 66.0 MB

Directory structure:
gitextract_pdoz2d7b/

├── .dockerignore
├── .env.example
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1-bug-report.yml
│   │   └── 2-enhancement.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SAVED_REPLIES.md
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── CLAUDE.md
├── Dockerfile
├── EULA.md
├── LICENSE
├── NOTICE
├── README.md
├── backend/
│   ├── cmd/
│   │   ├── ctester/
│   │   │   ├── main.go
│   │   │   ├── models.go
│   │   │   ├── report.go
│   │   │   └── utils.go
│   │   ├── etester/
│   │   │   ├── flush.go
│   │   │   ├── info.go
│   │   │   ├── main.go
│   │   │   ├── reindex.go
│   │   │   ├── search.go
│   │   │   ├── test.go
│   │   │   └── tester.go
│   │   ├── ftester/
│   │   │   ├── main.go
│   │   │   ├── mocks/
│   │   │   │   ├── logs.go
│   │   │   │   └── tools.go
│   │   │   └── worker/
│   │   │       ├── args.go
│   │   │       ├── executor.go
│   │   │       ├── interactive.go
│   │   │       └── tester.go
│   │   ├── installer/
│   │   │   ├── checker/
│   │   │   │   ├── checker.go
│   │   │   │   ├── helpers.go
│   │   │   │   └── helpers_test.go
│   │   │   ├── files/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── files.go
│   │   │   │   ├── files_test.go
│   │   │   │   └── generate.go
│   │   │   ├── hardening/
│   │   │   │   ├── hardening.go
│   │   │   │   ├── hardening_test.go
│   │   │   │   ├── migrations.go
│   │   │   │   ├── migrations_test.go
│   │   │   │   ├── network.go
│   │   │   │   └── network_test.go
│   │   │   ├── loader/
│   │   │   │   ├── example_test.go
│   │   │   │   ├── file.go
│   │   │   │   ├── loader.go
│   │   │   │   └── loader_test.go
│   │   │   ├── main.go
│   │   │   ├── main_test.go
│   │   │   ├── navigator/
│   │   │   │   ├── navigator.go
│   │   │   │   └── navigator_test.go
│   │   │   ├── processor/
│   │   │   │   ├── compose.go
│   │   │   │   ├── docker.go
│   │   │   │   ├── fs.go
│   │   │   │   ├── fs_test.go
│   │   │   │   ├── locale.go
│   │   │   │   ├── logic.go
│   │   │   │   ├── logic_test.go
│   │   │   │   ├── mock_test.go
│   │   │   │   ├── model.go
│   │   │   │   ├── pg.go
│   │   │   │   ├── processor.go
│   │   │   │   ├── state.go
│   │   │   │   └── update.go
│   │   │   ├── state/
│   │   │   │   ├── example_test.go
│   │   │   │   ├── state.go
│   │   │   │   └── state_test.go
│   │   │   └── wizard/
│   │   │       ├── app.go
│   │   │       ├── controller/
│   │   │       │   └── controller.go
│   │   │       ├── locale/
│   │   │       │   └── locale.go
│   │   │       ├── logger/
│   │   │       │   └── logger.go
│   │   │       ├── models/
│   │   │       │   ├── ai_agents_settings_form.go
│   │   │       │   ├── apply_changes.go
│   │   │       │   ├── base_controls.go
│   │   │       │   ├── base_screen.go
│   │   │       │   ├── docker_form.go
│   │   │       │   ├── embedder_form.go
│   │   │       │   ├── eula.go
│   │   │       │   ├── graphiti_form.go
│   │   │       │   ├── helpers/
│   │   │       │   │   ├── calc_context.go
│   │   │       │   │   └── calc_context_test.go
│   │   │       │   ├── langfuse_form.go
│   │   │       │   ├── list_screen.go
│   │   │       │   ├── llm_provider_form.go
│   │   │       │   ├── llm_providers.go
│   │   │       │   ├── main_menu.go
│   │   │       │   ├── maintenance.go
│   │   │       │   ├── mock_form.go
│   │   │       │   ├── monitoring.go
│   │   │       │   ├── observability_form.go
│   │   │       │   ├── processor_operation_form.go
│   │   │       │   ├── reset_password.go
│   │   │       │   ├── scraper_form.go
│   │   │       │   ├── search_engines_form.go
│   │   │       │   ├── server_settings_form.go
│   │   │       │   ├── summarizer.go
│   │   │       │   ├── summarizer_form.go
│   │   │       │   ├── tools.go
│   │   │       │   ├── types.go
│   │   │       │   └── welcome.go
│   │   │       ├── registry/
│   │   │       │   └── registry.go
│   │   │       ├── styles/
│   │   │       │   └── styles.go
│   │   │       ├── terminal/
│   │   │       │   ├── key2uv.go
│   │   │       │   ├── pty_unix.go
│   │   │       │   ├── pty_windows.go
│   │   │       │   ├── teacmd.go
│   │   │       │   ├── teacmd_test.go
│   │   │       │   ├── terminal.go
│   │   │       │   ├── terminal_test.go
│   │   │       │   └── vt/
│   │   │       │       ├── callbacks.go
│   │   │       │       ├── cc.go
│   │   │       │       ├── charset.go
│   │   │       │       ├── csi.go
│   │   │       │       ├── csi_cursor.go
│   │   │       │       ├── csi_mode.go
│   │   │       │       ├── csi_screen.go
│   │   │       │       ├── csi_sgr.go
│   │   │       │       ├── cursor.go
│   │   │       │       ├── dcs.go
│   │   │       │       ├── esc.go
│   │   │       │       ├── focus.go
│   │   │       │       ├── handlers.go
│   │   │       │       ├── key.go
│   │   │       │       ├── mode.go
│   │   │       │       ├── mouse.go
│   │   │       │       ├── osc.go
│   │   │       │       ├── screen.go
│   │   │       │       ├── terminal.go
│   │   │       │       ├── terminal_test.go
│   │   │       │       ├── utf8.go
│   │   │       │       └── utils.go
│   │   │       └── window/
│   │   │           ├── window.go
│   │   │           └── window_test.go
│   │   └── pentagi/
│   │       ├── main.go
│   │       └── tools.go
│   ├── docs/
│   │   ├── analytics_api.md
│   │   ├── chain_ast.md
│   │   ├── chain_summary.md
│   │   ├── charm.md
│   │   ├── config.md
│   │   ├── controller.md
│   │   ├── database.md
│   │   ├── docker.md
│   │   ├── flow_execution.md
│   │   ├── gemini.md
│   │   ├── installer/
│   │   │   ├── charm-architecture-patterns.md
│   │   │   ├── charm-best-practices.md
│   │   │   ├── charm-core-libraries.md
│   │   │   ├── charm-debugging-guide.md
│   │   │   ├── charm-form-patterns.md
│   │   │   ├── charm-navigation-patterns.md
│   │   │   ├── checker-test-scenarios.md
│   │   │   ├── checker.md
│   │   │   ├── installer-architecture-design.md
│   │   │   ├── installer-base-screen.md
│   │   │   ├── installer-overview.md
│   │   │   ├── installer-troubleshooting.md
│   │   │   ├── processor-implementation.md
│   │   │   ├── processor-logic-implementation.md
│   │   │   ├── processor-wizard-integration.md
│   │   │   ├── processor.md
│   │   │   ├── reference-config-pattern.md
│   │   │   └── terminal-wizard-integration.md
│   │   ├── installer.md
│   │   ├── langfuse.md
│   │   ├── llms_how_to.md
│   │   ├── observability.md
│   │   ├── ollama.md
│   │   ├── prompt_engineering_openai.md
│   │   └── prompt_engineering_pentagi.md
│   ├── fern/
│   │   ├── fern.config.json
│   │   ├── generators.yml
│   │   └── langfuse/
│   │       └── openapi.yml
│   ├── go.mod
│   ├── go.sum
│   ├── gqlgen/
│   │   └── gqlgen.yml
│   ├── migrations/
│   │   ├── migrations.go
│   │   └── sql/
│   │       ├── 20241026_115120_initial_state.sql
│   │       ├── 20241130_183411_new_type_logs.sql
│   │       ├── 20241215_132209_new_user_role.sql
│   │       ├── 20241222_171335_msglog_result_format.sql
│   │       ├── 20250102_152614_flow_trace_id.sql
│   │       ├── 20250103_1215631_new_msgchain_type_fixer.sql
│   │       ├── 20250322_172248_new_searchengine_types.sql
│   │       ├── 20250331_200137_assistant_mode.sql
│   │       ├── 20250412_181121_subtask_context copy.sql
│   │       ├── 20250414_213004_thinking_msg_part.sql
│   │       ├── 20250419_100249_new_logs_indices.sql
│   │       ├── 20250420_120356_settings_permission.sql
│   │       ├── 20250701_094823_base_settings.sql
│   │       ├── 20250821_123456_add_searxng_search_type.sql
│   │       ├── 20250901_165149_remove_input_idx.sql
│   │       ├── 20251028_113516_remove_result_idx.sql
│   │       ├── 20251102_194813_remove_description_idx.sql
│   │       ├── 20260128_153000_tool_call_id_template.sql
│   │       ├── 20260129_120000_add_tracking_fields.sql
│   │       ├── 20260218_150000_api_tokens.sql
│   │       ├── 20260222_140000_user_preferences.sql
│   │       ├── 20260223_120000_add_sploitus_search_type.sql
│   │       ├── 20260227_120000_add_cn_providers.sql
│   │       └── 20260310_153000_agent_supervision.sql
│   ├── pkg/
│   │   ├── cast/
│   │   │   ├── chain_ast.go
│   │   │   ├── chain_ast_test.go
│   │   │   └── chain_data_test.go
│   │   ├── config/
│   │   │   ├── config.go
│   │   │   └── config_test.go
│   │   ├── controller/
│   │   │   ├── alog.go
│   │   │   ├── alogs.go
│   │   │   ├── aslog.go
│   │   │   ├── aslogs.go
│   │   │   ├── assistant.go
│   │   │   ├── context.go
│   │   │   ├── flow.go
│   │   │   ├── flows.go
│   │   │   ├── msglog.go
│   │   │   ├── msglogs.go
│   │   │   ├── screenshot.go
│   │   │   ├── screenshots.go
│   │   │   ├── slog.go
│   │   │   ├── slogs.go
│   │   │   ├── subtask.go
│   │   │   ├── subtasks.go
│   │   │   ├── task.go
│   │   │   ├── tasks.go
│   │   │   ├── termlog.go
│   │   │   ├── termlogs.go
│   │   │   ├── vslog.go
│   │   │   └── vslogs.go
│   │   ├── csum/
│   │   │   ├── chain_summary.go
│   │   │   ├── chain_summary_e2e_test.go
│   │   │   ├── chain_summary_reasoning_test.go
│   │   │   └── chain_summary_split_test.go
│   │   ├── database/
│   │   │   ├── agentlogs.sql.go
│   │   │   ├── analytics.sql.go
│   │   │   ├── api_token_with_secret.go
│   │   │   ├── api_tokens.sql.go
│   │   │   ├── assistantlogs.sql.go
│   │   │   ├── assistants.sql.go
│   │   │   ├── containers.sql.go
│   │   │   ├── converter/
│   │   │   │   ├── analytics.go
│   │   │   │   ├── analytics_test.go
│   │   │   │   ├── converter.go
│   │   │   │   └── converter_test.go
│   │   │   ├── database.go
│   │   │   ├── db.go
│   │   │   ├── flows.sql.go
│   │   │   ├── models.go
│   │   │   ├── msgchains.sql.go
│   │   │   ├── msglogs.sql.go
│   │   │   ├── prompts.sql.go
│   │   │   ├── providers.sql.go
│   │   │   ├── querier.go
│   │   │   ├── roles.sql.go
│   │   │   ├── screenshots.sql.go
│   │   │   ├── searchlogs.sql.go
│   │   │   ├── subtasks.sql.go
│   │   │   ├── tasks.sql.go
│   │   │   ├── termlogs.sql.go
│   │   │   ├── toolcalls.sql.go
│   │   │   ├── user_preferences.sql.go
│   │   │   ├── users.sql.go
│   │   │   └── vecstorelogs.sql.go
│   │   ├── docker/
│   │   │   └── client.go
│   │   ├── graph/
│   │   │   ├── context.go
│   │   │   ├── context_test.go
│   │   │   ├── generated.go
│   │   │   ├── model/
│   │   │   │   └── models_gen.go
│   │   │   ├── resolver.go
│   │   │   ├── schema.graphqls
│   │   │   ├── schema.resolvers.go
│   │   │   └── subscriptions/
│   │   │       ├── controller.go
│   │   │       ├── publisher.go
│   │   │       └── subscriber.go
│   │   ├── graphiti/
│   │   │   └── client.go
│   │   ├── observability/
│   │   │   ├── collector.go
│   │   │   ├── langfuse/
│   │   │   │   ├── agent.go
│   │   │   │   ├── api/
│   │   │   │   │   ├── .fern/
│   │   │   │   │   │   └── metadata.json
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── annotationqueues/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── annotationqueues.go
│   │   │   │   │   ├── blobstorageintegrations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── blobstorageintegrations.go
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── client_test.go
│   │   │   │   │   ├── comments/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── comments.go
│   │   │   │   │   ├── core/
│   │   │   │   │   │   ├── api_error.go
│   │   │   │   │   │   ├── http.go
│   │   │   │   │   │   └── request_option.go
│   │   │   │   │   ├── datasetitems/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasetitems.go
│   │   │   │   │   ├── datasetrunitems/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasetrunitems.go
│   │   │   │   │   ├── datasets/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasets.go
│   │   │   │   │   ├── error_codes.go
│   │   │   │   │   ├── errors.go
│   │   │   │   │   ├── file_param.go
│   │   │   │   │   ├── health/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── health.go
│   │   │   │   │   ├── ingestion/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── ingestion.go
│   │   │   │   │   ├── internal/
│   │   │   │   │   │   ├── caller.go
│   │   │   │   │   │   ├── caller_test.go
│   │   │   │   │   │   ├── error_decoder.go
│   │   │   │   │   │   ├── error_decoder_test.go
│   │   │   │   │   │   ├── explicit_fields.go
│   │   │   │   │   │   ├── explicit_fields_test.go
│   │   │   │   │   │   ├── extra_properties.go
│   │   │   │   │   │   ├── extra_properties_test.go
│   │   │   │   │   │   ├── http.go
│   │   │   │   │   │   ├── query.go
│   │   │   │   │   │   ├── query_test.go
│   │   │   │   │   │   ├── retrier.go
│   │   │   │   │   │   ├── retrier_test.go
│   │   │   │   │   │   ├── stringer.go
│   │   │   │   │   │   └── time.go
│   │   │   │   │   ├── llmconnections/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── llmconnections.go
│   │   │   │   │   ├── media/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── media.go
│   │   │   │   │   ├── metrics/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── metrics.go
│   │   │   │   │   ├── metricsv2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── metricsv2.go
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── models.go
│   │   │   │   │   ├── observations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── observations.go
│   │   │   │   │   ├── observationsv2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── observationsv2.go
│   │   │   │   │   ├── opentelemetry/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── opentelemetry.go
│   │   │   │   │   ├── option/
│   │   │   │   │   │   └── request_option.go
│   │   │   │   │   ├── organizations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── organizations.go
│   │   │   │   │   ├── pointer.go
│   │   │   │   │   ├── projects/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── projects.go
│   │   │   │   │   ├── prompts/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── prompts.go
│   │   │   │   │   ├── promptversion/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── promptversion.go
│   │   │   │   │   ├── reference.md
│   │   │   │   │   ├── scim/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scim.go
│   │   │   │   │   ├── score/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── score.go
│   │   │   │   │   ├── scoreconfigs/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scoreconfigs.go
│   │   │   │   │   ├── scorev2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scorev2.go
│   │   │   │   │   ├── sessions/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── sessions.go
│   │   │   │   │   ├── trace/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── trace.go
│   │   │   │   │   └── types.go
│   │   │   │   ├── chain.go
│   │   │   │   ├── client.go
│   │   │   │   ├── context.go
│   │   │   │   ├── converter.go
│   │   │   │   ├── converter_test.go
│   │   │   │   ├── embedding.go
│   │   │   │   ├── evaluator.go
│   │   │   │   ├── event.go
│   │   │   │   ├── generation.go
│   │   │   │   ├── guardrail.go
│   │   │   │   ├── helpers.go
│   │   │   │   ├── noop.go
│   │   │   │   ├── observation.go
│   │   │   │   ├── observer.go
│   │   │   │   ├── options.go
│   │   │   │   ├── retriever.go
│   │   │   │   ├── score.go
│   │   │   │   ├── span.go
│   │   │   │   ├── tool.go
│   │   │   │   └── trace.go
│   │   │   ├── lfclient.go
│   │   │   ├── obs.go
│   │   │   ├── otelclient.go
│   │   │   └── profiling/
│   │   │       └── profiling.go
│   │   ├── providers/
│   │   │   ├── anthropic/
│   │   │   │   ├── anthropic.go
│   │   │   │   ├── anthropic_test.go
│   │   │   │   ├── config.yml
│   │   │   │   └── models.yml
│   │   │   ├── assistant.go
│   │   │   ├── bedrock/
│   │   │   │   ├── bedrock.go
│   │   │   │   ├── bedrock_test.go
│   │   │   │   ├── config.yml
│   │   │   │   └── models.yml
│   │   │   ├── custom/
│   │   │   │   ├── custom.go
│   │   │   │   ├── custom_test.go
│   │   │   │   └── example_test.go
│   │   │   ├── deepseek/
│   │   │   │   ├── config.yml
│   │   │   │   ├── deepseek.go
│   │   │   │   ├── deepseek_test.go
│   │   │   │   └── models.yml
│   │   │   ├── embeddings/
│   │   │   │   ├── embedder.go
│   │   │   │   ├── embedder_test.go
│   │   │   │   └── wrapper.go
│   │   │   ├── gemini/
│   │   │   │   ├── config.yml
│   │   │   │   ├── gemini.go
│   │   │   │   ├── gemini_test.go
│   │   │   │   └── models.yml
│   │   │   ├── glm/
│   │   │   │   ├── config.yml
│   │   │   │   ├── glm.go
│   │   │   │   ├── glm_test.go
│   │   │   │   └── models.yml
│   │   │   ├── handlers.go
│   │   │   ├── helpers.go
│   │   │   ├── helpers_test.go
│   │   │   ├── kimi/
│   │   │   │   ├── config.yml
│   │   │   │   ├── kimi.go
│   │   │   │   ├── kimi_test.go
│   │   │   │   └── models.yml
│   │   │   ├── ollama/
│   │   │   │   ├── config.yml
│   │   │   │   ├── ollama.go
│   │   │   │   └── ollama_test.go
│   │   │   ├── openai/
│   │   │   │   ├── config.yml
│   │   │   │   ├── models.yml
│   │   │   │   ├── openai.go
│   │   │   │   └── openai_test.go
│   │   │   ├── pconfig/
│   │   │   │   ├── config.go
│   │   │   │   └── config_test.go
│   │   │   ├── performer.go
│   │   │   ├── performers.go
│   │   │   ├── provider/
│   │   │   │   ├── agents.go
│   │   │   │   ├── agents_test.go
│   │   │   │   ├── litellm.go
│   │   │   │   ├── litellm_test.go
│   │   │   │   ├── provider.go
│   │   │   │   └── wrapper.go
│   │   │   ├── provider.go
│   │   │   ├── providers.go
│   │   │   ├── qwen/
│   │   │   │   ├── config.yml
│   │   │   │   ├── models.yml
│   │   │   │   ├── qwen.go
│   │   │   │   └── qwen_test.go
│   │   │   ├── subtask_patch.go
│   │   │   ├── subtask_patch_test.go
│   │   │   └── tester/
│   │   │       ├── config.go
│   │   │       ├── mock/
│   │   │       │   └── provider.go
│   │   │       ├── result.go
│   │   │       ├── runner.go
│   │   │       ├── runner_test.go
│   │   │       └── testdata/
│   │   │           ├── completion.go
│   │   │           ├── completion_test.go
│   │   │           ├── json.go
│   │   │           ├── json_test.go
│   │   │           ├── models.go
│   │   │           ├── registry.go
│   │   │           ├── registry_test.go
│   │   │           ├── result.go
│   │   │           ├── tests.yml
│   │   │           ├── tool.go
│   │   │           └── tool_test.go
│   │   ├── queue/
│   │   │   ├── queue.go
│   │   │   └── queue_test.go
│   │   ├── schema/
│   │   │   └── schema.go
│   │   ├── server/
│   │   │   ├── auth/
│   │   │   │   ├── api_token_cache.go
│   │   │   │   ├── api_token_cache_test.go
│   │   │   │   ├── api_token_id.go
│   │   │   │   ├── api_token_id_test.go
│   │   │   │   ├── api_token_jwt.go
│   │   │   │   ├── api_token_test.go
│   │   │   │   ├── auth_middleware.go
│   │   │   │   ├── auth_middleware_test.go
│   │   │   │   ├── integration_test.go
│   │   │   │   ├── permissions.go
│   │   │   │   ├── permissions_test.go
│   │   │   │   ├── session.go
│   │   │   │   ├── session_test.go
│   │   │   │   ├── users_cache.go
│   │   │   │   └── users_cache_test.go
│   │   │   ├── context/
│   │   │   │   ├── context.go
│   │   │   │   └── context_test.go
│   │   │   ├── docs/
│   │   │   │   ├── docs.go
│   │   │   │   ├── swagger.json
│   │   │   │   └── swagger.yaml
│   │   │   ├── logger/
│   │   │   │   └── logger.go
│   │   │   ├── middleware.go
│   │   │   ├── models/
│   │   │   │   ├── agentlogs.go
│   │   │   │   ├── analytics.go
│   │   │   │   ├── api_tokens.go
│   │   │   │   ├── assistantlogs.go
│   │   │   │   ├── assistants.go
│   │   │   │   ├── containers.go
│   │   │   │   ├── flows.go
│   │   │   │   ├── init.go
│   │   │   │   ├── msgchains.go
│   │   │   │   ├── msglogs.go
│   │   │   │   ├── prompts.go
│   │   │   │   ├── providers.go
│   │   │   │   ├── roles.go
│   │   │   │   ├── screenshots.go
│   │   │   │   ├── searchlogs.go
│   │   │   │   ├── subtasks.go
│   │   │   │   ├── tasks.go
│   │   │   │   ├── termlogs.go
│   │   │   │   ├── users.go
│   │   │   │   └── vecstorelogs.go
│   │   │   ├── oauth/
│   │   │   │   ├── client.go
│   │   │   │   ├── github.go
│   │   │   │   └── google.go
│   │   │   ├── rdb/
│   │   │   │   └── table.go
│   │   │   ├── response/
│   │   │   │   ├── errors.go
│   │   │   │   ├── http.go
│   │   │   │   └── http_test.go
│   │   │   ├── router.go
│   │   │   └── services/
│   │   │       ├── agentlogs.go
│   │   │       ├── analytics.go
│   │   │       ├── api_tokens.go
│   │   │       ├── api_tokens_test.go
│   │   │       ├── assistantlogs.go
│   │   │       ├── assistants.go
│   │   │       ├── auth.go
│   │   │       ├── containers.go
│   │   │       ├── flows.go
│   │   │       ├── graphql.go
│   │   │       ├── msglogs.go
│   │   │       ├── prompts.go
│   │   │       ├── providers.go
│   │   │       ├── roles.go
│   │   │       ├── screenshots.go
│   │   │       ├── searchlogs.go
│   │   │       ├── subtasks.go
│   │   │       ├── tasks.go
│   │   │       ├── termlogs.go
│   │   │       ├── users.go
│   │   │       ├── users_test.go
│   │   │       └── vecstorelogs.go
│   │   ├── system/
│   │   │   ├── host_id.go
│   │   │   ├── utils.go
│   │   │   ├── utils_darwin.go
│   │   │   ├── utils_linux.go
│   │   │   ├── utils_test.go
│   │   │   └── utils_windows.go
│   │   ├── templates/
│   │   │   ├── graphiti/
│   │   │   │   ├── agent_response.tmpl
│   │   │   │   └── tool_execution.tmpl
│   │   │   ├── prompts/
│   │   │   │   ├── adviser.tmpl
│   │   │   │   ├── assistant.tmpl
│   │   │   │   ├── coder.tmpl
│   │   │   │   ├── enricher.tmpl
│   │   │   │   ├── execution_logs.tmpl
│   │   │   │   ├── flow_descriptor.tmpl
│   │   │   │   ├── full_execution_context.tmpl
│   │   │   │   ├── generator.tmpl
│   │   │   │   ├── image_chooser.tmpl
│   │   │   │   ├── input_toolcall_fixer.tmpl
│   │   │   │   ├── installer.tmpl
│   │   │   │   ├── language_chooser.tmpl
│   │   │   │   ├── memorist.tmpl
│   │   │   │   ├── pentester.tmpl
│   │   │   │   ├── primary_agent.tmpl
│   │   │   │   ├── question_adviser.tmpl
│   │   │   │   ├── question_coder.tmpl
│   │   │   │   ├── question_enricher.tmpl
│   │   │   │   ├── question_execution_monitor.tmpl
│   │   │   │   ├── question_installer.tmpl
│   │   │   │   ├── question_memorist.tmpl
│   │   │   │   ├── question_pentester.tmpl
│   │   │   │   ├── question_reflector.tmpl
│   │   │   │   ├── question_searcher.tmpl
│   │   │   │   ├── question_task_planner.tmpl
│   │   │   │   ├── refiner.tmpl
│   │   │   │   ├── reflector.tmpl
│   │   │   │   ├── reporter.tmpl
│   │   │   │   ├── searcher.tmpl
│   │   │   │   ├── short_execution_context.tmpl
│   │   │   │   ├── subtasks_generator.tmpl
│   │   │   │   ├── subtasks_refiner.tmpl
│   │   │   │   ├── summarizer.tmpl
│   │   │   │   ├── task_assignment_wrapper.tmpl
│   │   │   │   ├── task_descriptor.tmpl
│   │   │   │   ├── task_reporter.tmpl
│   │   │   │   ├── tool_call_id_collector.tmpl
│   │   │   │   ├── tool_call_id_detector.tmpl
│   │   │   │   └── toolcall_fixer.tmpl
│   │   │   ├── templates.go
│   │   │   ├── templates_test.go
│   │   │   └── validator/
│   │   │       ├── testdata.go
│   │   │       ├── validator.go
│   │   │       └── validator_test.go
│   │   ├── terminal/
│   │   │   ├── output.go
│   │   │   └── output_test.go
│   │   ├── tools/
│   │   │   ├── args.go
│   │   │   ├── args_test.go
│   │   │   ├── browser.go
│   │   │   ├── browser_test.go
│   │   │   ├── code.go
│   │   │   ├── context.go
│   │   │   ├── context_test.go
│   │   │   ├── duckduckgo.go
│   │   │   ├── duckduckgo_test.go
│   │   │   ├── executor.go
│   │   │   ├── executor_test.go
│   │   │   ├── google.go
│   │   │   ├── google_test.go
│   │   │   ├── graphiti_search.go
│   │   │   ├── guide.go
│   │   │   ├── memory.go
│   │   │   ├── memory_utils.go
│   │   │   ├── memory_utils_test.go
│   │   │   ├── perplexity.go
│   │   │   ├── perplexity_test.go
│   │   │   ├── proxy_test.go
│   │   │   ├── registry.go
│   │   │   ├── registry_test.go
│   │   │   ├── search.go
│   │   │   ├── searxng.go
│   │   │   ├── searxng_test.go
│   │   │   ├── sploitus.go
│   │   │   ├── sploitus_test.go
│   │   │   ├── tavily.go
│   │   │   ├── tavily_test.go
│   │   │   ├── terminal.go
│   │   │   ├── terminal_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── ddg_result_docker_security.html
│   │   │   │   ├── ddg_result_golang_http_client.html
│   │   │   │   ├── ddg_result_owasp_vulnerabilities.html
│   │   │   │   ├── ddg_result_site_github_golang.html
│   │   │   │   ├── ddg_result_sql_injection.html
│   │   │   │   ├── sploitus_result_cve_2026.json
│   │   │   │   ├── sploitus_result_metasploit.json
│   │   │   │   ├── sploitus_result_nginx.json
│   │   │   │   └── sploitus_result_nmap.json
│   │   │   ├── tools.go
│   │   │   ├── traversaal.go
│   │   │   └── traversaal_test.go
│   │   └── version/
│   │       ├── version.go
│   │       └── version_test.go
│   └── sqlc/
│       ├── models/
│       │   ├── agentlogs.sql
│       │   ├── analytics.sql
│       │   ├── api_tokens.sql
│       │   ├── assistantlogs.sql
│       │   ├── assistants.sql
│       │   ├── containers.sql
│       │   ├── flows.sql
│       │   ├── msgchains.sql
│       │   ├── msglogs.sql
│       │   ├── prompts.sql
│       │   ├── providers.sql
│       │   ├── roles.sql
│       │   ├── screenshots.sql
│       │   ├── searchlogs.sql
│       │   ├── subtasks.sql
│       │   ├── tasks.sql
│       │   ├── termlogs.sql
│       │   ├── toolcalls.sql
│       │   ├── user_preferences.sql
│       │   ├── users.sql
│       │   └── vecstorelogs.sql
│       └── sqlc.yml
├── build/
│   └── .gitkeep
├── docker-compose-graphiti.yml
├── docker-compose-langfuse.yml
├── docker-compose-observability.yml
├── docker-compose.yml
├── examples/
│   ├── configs/
│   │   ├── custom-openai.provider.yml
│   │   ├── deepinfra.provider.yml
│   │   ├── deepseek.provider.yml
│   │   ├── moonshot.provider.yml
│   │   ├── novita.provider.yml
│   │   ├── ollama-llama318b-instruct.provider.yml
│   │   ├── ollama-llama318b.provider.yml
│   │   ├── ollama-qwen332b-fp16-tc.provider.yml
│   │   ├── ollama-qwq32b-fp16-tc.provider.yml
│   │   ├── openrouter.provider.yml
│   │   ├── vllm-qwen3.5-27b-fp8-no-think.provider.yml
│   │   ├── vllm-qwen3.5-27b-fp8.provider.yml
│   │   └── vllm-qwen332b-fp16.provider.yml
│   ├── guides/
│   │   ├── vllm-qwen35-27b-fp8.md
│   │   └── worker_node.md
│   ├── prompts/
│   │   └── base_web_pentest.md
│   ├── reports/
│   │   ├── ollama_qwen3_32b_fp16_base_web_pentest.md
│   │   └── openai_base_web_pentest.md
│   └── tests/
│       ├── anthropic-report.md
│       ├── bedrock-report.md
│       ├── custom-openai-report.md
│       ├── deepinfra-report.md
│       ├── deepseek-report.md
│       ├── gemini-report.md
│       ├── glm-report.md
│       ├── kimi-report.md
│       ├── moonshot-report.md
│       ├── novita-report.md
│       ├── ollama-cloud-report.md
│       ├── ollama-llama318b-instruct-report.md
│       ├── ollama-llama318b-report.md
│       ├── ollama-qwen332b-fp16-tc-report.md
│       ├── ollama-qwq-32b-fp16-tc-report.md
│       ├── openai-report.md
│       ├── openrouter-report.md
│       ├── qwen-report.md
│       └── vllm-qwen332b-fp16-report.md
├── frontend/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── .prettierrc
│   ├── README.md
│   ├── components.json
│   ├── eslint.config.mjs
│   ├── graphql-codegen.ts
│   ├── graphql-schema.graphql
│   ├── index.html
│   ├── package.json
│   ├── postcss.config.cjs
│   ├── public/
│   │   └── favicon/
│   │       └── site.webmanifest
│   ├── scripts/
│   │   ├── generate-ssl.ts
│   │   └── lib.ts
│   ├── src/
│   │   ├── app.tsx
│   │   ├── components/
│   │   │   ├── icons/
│   │   │   │   ├── anthropic.tsx
│   │   │   │   ├── bedrock.tsx
│   │   │   │   ├── custom.tsx
│   │   │   │   ├── deepseek.tsx
│   │   │   │   ├── flow-status-icon.tsx
│   │   │   │   ├── gemini.tsx
│   │   │   │   ├── github.tsx
│   │   │   │   ├── glm.tsx
│   │   │   │   ├── google.tsx
│   │   │   │   ├── kimi.tsx
│   │   │   │   ├── logo.tsx
│   │   │   │   ├── ollama.tsx
│   │   │   │   ├── open-ai.tsx
│   │   │   │   ├── provider-icon.tsx
│   │   │   │   └── qwen.tsx
│   │   │   ├── layouts/
│   │   │   │   ├── app-layout.tsx
│   │   │   │   ├── flows-layout.tsx
│   │   │   │   ├── main-layout.tsx
│   │   │   │   ├── main-sidebar.tsx
│   │   │   │   └── settings-layout.tsx
│   │   │   ├── routes/
│   │   │   │   ├── protected-route.tsx
│   │   │   │   └── public-route.tsx
│   │   │   ├── shared/
│   │   │   │   ├── confirmation-dialog.tsx
│   │   │   │   ├── markdown.tsx
│   │   │   │   ├── page-loader.tsx
│   │   │   │   └── terminal.tsx
│   │   │   └── ui/
│   │   │       ├── accordion.tsx
│   │   │       ├── alert.tsx
│   │   │       ├── avatar.tsx
│   │   │       ├── badge.tsx
│   │   │       ├── breadcrumb.tsx
│   │   │       ├── button.tsx
│   │   │       ├── calendar.tsx
│   │   │       ├── card.tsx
│   │   │       ├── collapsible.tsx
│   │   │       ├── command.tsx
│   │   │       ├── data-table.tsx
│   │   │       ├── dialog.tsx
│   │   │       ├── dropdown-menu.tsx
│   │   │       ├── empty.tsx
│   │   │       ├── form.tsx
│   │   │       ├── input-group.tsx
│   │   │       ├── input.tsx
│   │   │       ├── label.tsx
│   │   │       ├── popover.tsx
│   │   │       ├── progress.tsx
│   │   │       ├── resizable.tsx
│   │   │       ├── scroll-area.tsx
│   │   │       ├── select.tsx
│   │   │       ├── separator.tsx
│   │   │       ├── sheet.tsx
│   │   │       ├── sidebar.tsx
│   │   │       ├── skeleton.tsx
│   │   │       ├── sonner.tsx
│   │   │       ├── spinner.tsx
│   │   │       ├── status-card.tsx
│   │   │       ├── switch.tsx
│   │   │       ├── table.tsx
│   │   │       ├── tabs.tsx
│   │   │       ├── textarea-autosize.tsx
│   │   │       ├── textarea.tsx
│   │   │       ├── toggle-group.tsx
│   │   │       ├── toggle.tsx
│   │   │       └── tooltip.tsx
│   │   ├── features/
│   │   │   ├── authentication/
│   │   │   │   ├── login-form.tsx
│   │   │   │   └── password-change-form.tsx
│   │   │   └── flows/
│   │   │       ├── agents/
│   │   │       │   ├── flow-agent-icon.tsx
│   │   │       │   ├── flow-agent.tsx
│   │   │       │   └── flow-agents.tsx
│   │   │       ├── flow-central-tabs.tsx
│   │   │       ├── flow-form.tsx
│   │   │       ├── flow-tabs.tsx
│   │   │       ├── flow-tasks-dropdown.tsx
│   │   │       ├── messages/
│   │   │       │   ├── flow-assistant-messages.tsx
│   │   │       │   ├── flow-automation-messages.tsx
│   │   │       │   ├── flow-message-type-icon.tsx
│   │   │       │   └── flow-message.tsx
│   │   │       ├── screenshots/
│   │   │       │   ├── flow-screenshot.tsx
│   │   │       │   └── flow-screenshots.tsx
│   │   │       ├── tasks/
│   │   │       │   ├── flow-subtask.tsx
│   │   │       │   ├── flow-task-status-icon.tsx
│   │   │       │   ├── flow-task.tsx
│   │   │       │   └── flow-tasks.tsx
│   │   │       ├── terminal/
│   │   │       │   └── flow-terminal.tsx
│   │   │       ├── tools/
│   │   │       │   ├── flow-tool.tsx
│   │   │       │   └── flow-tools.tsx
│   │   │       └── vector-stores/
│   │   │           ├── flow-vector-store-action-icon.tsx
│   │   │           ├── flow-vector-store.tsx
│   │   │           └── flow-vector-stores.tsx
│   │   ├── graphql/
│   │   │   └── types.ts
│   │   ├── hooks/
│   │   │   ├── use-adaptive-column-visibility.ts
│   │   │   ├── use-auto-scroll.ts
│   │   │   ├── use-breakpoint.ts
│   │   │   └── use-theme.ts
│   │   ├── lib/
│   │   │   ├── apollo.ts
│   │   │   ├── axios.ts
│   │   │   ├── log.ts
│   │   │   ├── report-pdf.tsx
│   │   │   ├── report.ts
│   │   │   ├── utils/
│   │   │   │   ├── auth.ts
│   │   │   │   └── format.ts
│   │   │   ├── utils.test.ts
│   │   │   ├── utils.ts
│   │   │   └── сlipboard.ts
│   │   ├── main.tsx
│   │   ├── models/
│   │   │   ├── api.ts
│   │   │   ├── info.ts
│   │   │   ├── provider.tsx
│   │   │   └── user.ts
│   │   ├── pages/
│   │   │   ├── flows/
│   │   │   │   ├── flow-report.tsx
│   │   │   │   ├── flow.tsx
│   │   │   │   ├── flows.tsx
│   │   │   │   └── new-flow.tsx
│   │   │   ├── login.tsx
│   │   │   ├── oauth-result.tsx
│   │   │   └── settings/
│   │   │       ├── settings-api-tokens.tsx
│   │   │       ├── settings-mcp-server.tsx
│   │   │       ├── settings-mcp-servers.tsx
│   │   │       ├── settings-prompt.tsx
│   │   │       ├── settings-prompts.tsx
│   │   │       ├── settings-provider.tsx
│   │   │       └── settings-providers.tsx
│   │   ├── providers/
│   │   │   ├── favorites-provider.tsx
│   │   │   ├── flow-provider.tsx
│   │   │   ├── flows-provider.tsx
│   │   │   ├── providers-provider.tsx
│   │   │   ├── sidebar-flows-provider.tsx
│   │   │   ├── system-settings-provider.tsx
│   │   │   ├── theme-provider.tsx
│   │   │   └── user-provider.tsx
│   │   ├── schemas/
│   │   │   └── user-schema.ts
│   │   └── styles/
│   │       └── index.css
│   ├── tsconfig.app.json
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   ├── types/
│   │   └── vite-env.d.ts
│   └── vite.config.ts
├── observability/
│   ├── clickhouse/
│   │   └── prometheus.xml
│   ├── grafana/
│   │   ├── config/
│   │   │   ├── grafana.ini
│   │   │   └── provisioning/
│   │   │       ├── dashboards/
│   │   │       │   └── dashboard.yml
│   │   │       └── datasources/
│   │   │           └── datasource.yml
│   │   └── dashboards/
│   │       ├── components/
│   │       │   ├── pentagi_service.json
│   │       │   └── victoriametrics.json
│   │       ├── home.json
│   │       └── server/
│   │           ├── docker_containers.json
│   │           ├── docker_engine.json
│   │           └── node_exporter_full.json
│   ├── jaeger/
│   │   ├── bin/
│   │   │   ├── SOURCE.md
│   │   │   ├── jaeger-clickhouse-linux-amd64
│   │   │   └── jaeger-clickhouse-linux-arm64
│   │   ├── config.yml
│   │   ├── plugin-config.yml
│   │   └── sampling_strategies.json
│   ├── loki/
│   │   └── config.yml
│   └── otel/
│       └── config.yml
└── scripts/
    ├── entrypoint.sh
    ├── version.ps1
    └── version.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
frontend/coverage
frontend/dist
frontend/node_modules
frontend/ssl

**/*.log
**/*.env
**/.DS_Store
**/Thumbs.db


================================================
FILE: .env.example
================================================
# PentAGI Environment Variables

## For communication with PentAGI Cloud API
INSTALLATION_ID=
LICENSE_KEY=

## Allow to interact with user while executing tasks
ASK_USER=

## LLM Providers
OPEN_AI_KEY=
OPEN_AI_SERVER_URL=https://api.openai.com/v1

ANTHROPIC_API_KEY=
ANTHROPIC_SERVER_URL=https://api.anthropic.com/v1

## Google AI (Gemini) LLM provider
GEMINI_API_KEY=
GEMINI_SERVER_URL=https://generativelanguage.googleapis.com

## AWS Bedrock LLM provider
BEDROCK_REGION=us-east-1
BEDROCK_DEFAULT_AUTH=
BEDROCK_BEARER_TOKEN=
BEDROCK_ACCESS_KEY_ID=
BEDROCK_SECRET_ACCESS_KEY=
BEDROCK_SESSION_TOKEN=
BEDROCK_SERVER_URL=

## DeepSeek LLM provider
DEEPSEEK_API_KEY=
DEEPSEEK_SERVER_URL=https://api.deepseek.com
DEEPSEEK_PROVIDER=

## GLM (Zhipu AI) LLM provider
GLM_API_KEY=
GLM_SERVER_URL=https://api.z.ai/api/paas/v4
GLM_PROVIDER=

## Kimi (Moonshot) LLM provider
KIMI_API_KEY=
KIMI_SERVER_URL=https://api.moonshot.ai/v1
KIMI_PROVIDER=

## Qwen (Alibaba Cloud DashScope) LLM provider
QWEN_API_KEY=
QWEN_SERVER_URL=https://dashscope-us.aliyuncs.com/compatible-mode/v1
QWEN_PROVIDER=

## Custom LLM provider
LLM_SERVER_URL=
LLM_SERVER_KEY=
LLM_SERVER_MODEL=
LLM_SERVER_PROVIDER=
LLM_SERVER_CONFIG_PATH=
LLM_SERVER_LEGACY_REASONING=
LLM_SERVER_PRESERVE_REASONING=

## Ollama LLM provider (Local Server or Cloud)
# Local: http://ollama-server:11434, Cloud: https://ollama.com
OLLAMA_SERVER_URL=
# Required for Ollama Cloud (https://ollama.com/settings/keys), leave empty for local
OLLAMA_SERVER_API_KEY=
OLLAMA_SERVER_MODEL=
OLLAMA_SERVER_CONFIG_PATH=
OLLAMA_SERVER_PULL_MODELS_TIMEOUT=
OLLAMA_SERVER_PULL_MODELS_ENABLED=
OLLAMA_SERVER_LOAD_MODELS_ENABLED=

## Embedding
EMBEDDING_URL=
EMBEDDING_KEY=
EMBEDDING_MODEL=
EMBEDDING_PROVIDER=
EMBEDDING_BATCH_SIZE=
EMBEDDING_STRIP_NEW_LINES=

## Summarizer
SUMMARIZER_PRESERVE_LAST=
SUMMARIZER_USE_QA=
SUMMARIZER_SUM_MSG_HUMAN_IN_QA=
SUMMARIZER_LAST_SEC_BYTES=
SUMMARIZER_MAX_BP_BYTES=
SUMMARIZER_MAX_QA_SECTIONS=
SUMMARIZER_MAX_QA_BYTES=
SUMMARIZER_KEEP_QA_SECTIONS=

## Assistant
ASSISTANT_USE_AGENTS=
ASSISTANT_SUMMARIZER_PRESERVE_LAST=
ASSISTANT_SUMMARIZER_LAST_SEC_BYTES=
ASSISTANT_SUMMARIZER_MAX_BP_BYTES=
ASSISTANT_SUMMARIZER_MAX_QA_SECTIONS=
ASSISTANT_SUMMARIZER_MAX_QA_BYTES=
ASSISTANT_SUMMARIZER_KEEP_QA_SECTIONS=

## Execution Monitor Detector
EXECUTION_MONITOR_ENABLED=
EXECUTION_MONITOR_SAME_TOOL_LIMIT=
EXECUTION_MONITOR_TOTAL_TOOL_LIMIT=

## Agent execution tool calls limit
MAX_GENERAL_AGENT_TOOL_CALLS=
MAX_LIMITED_AGENT_TOOL_CALLS=

## Agent planning step for pentester, coder, installer
AGENT_PLANNING_STEP_ENABLED=

## HTTP proxy to use it in isolation environment
PROXY_URL=

## SSL/TLS Certificate Configuration
EXTERNAL_SSL_CA_PATH=
EXTERNAL_SSL_INSECURE=

## HTTP client timeout in seconds for external API calls (LLM providers, search tools, etc.)
## Default: 600 (10 minutes). Set to 0 to use the default.
HTTP_CLIENT_TIMEOUT=

## Scraper URLs and settings
## For Docker (default):
SCRAPER_PUBLIC_URL=
SCRAPER_PRIVATE_URL=https://someuser:somepass@scraper/
## For Podman rootless, use: SCRAPER_PRIVATE_URL=http://someuser:somepass@scraper:3000/
## See README.md "Running PentAGI with Podman" section for details
LOCAL_SCRAPER_USERNAME=someuser
LOCAL_SCRAPER_PASSWORD=somepass
LOCAL_SCRAPER_MAX_CONCURRENT_SESSIONS=10

## PentAGI server settings (docker-compose.yml)
PENTAGI_LISTEN_IP=
PENTAGI_LISTEN_PORT=
PENTAGI_DATA_DIR=
PENTAGI_SSL_DIR=
PENTAGI_OLLAMA_DIR=
PENTAGI_DOCKER_SOCKET=
PENTAGI_DOCKER_CERT_PATH=
PENTAGI_LLM_SERVER_CONFIG_PATH=
PENTAGI_OLLAMA_SERVER_CONFIG_PATH=

## PentAGI security settings
PUBLIC_URL=https://localhost:8443
CORS_ORIGINS=https://localhost:8443
COOKIE_SIGNING_SALT=salt # change this to improve security

## PentAGI internal server settings (inside the container)
STATIC_DIR=
STATIC_URL=
SERVER_PORT=8443
SERVER_HOST=0.0.0.0
SERVER_SSL_CRT=
SERVER_SSL_KEY=
SERVER_USE_SSL=true

## OAuth google
OAUTH_GOOGLE_CLIENT_ID=
OAUTH_GOOGLE_CLIENT_SECRET=

## OAuth github
OAUTH_GITHUB_CLIENT_ID=
OAUTH_GITHUB_CLIENT_SECRET=

## DuckDuckGo search engine
DUCKDUCKGO_ENABLED=
DUCKDUCKGO_REGION=
DUCKDUCKGO_SAFESEARCH=
DUCKDUCKGO_TIME_RANGE=

## Sploitus search engine API
SPLOITUS_ENABLED=

## Google search engine API
GOOGLE_API_KEY=
GOOGLE_CX_KEY=
GOOGLE_LR_KEY=

## Traversaal search engine API
TRAVERSAAL_API_KEY=

## Tavily search engine API
TAVILY_API_KEY=

## Perplexity search engine API
PERPLEXITY_API_KEY=
PERPLEXITY_MODEL=
PERPLEXITY_CONTEXT_SIZE=

## SEARXNG search engine API
SEARXNG_URL=
SEARXNG_CATEGORIES=general
SEARXNG_LANGUAGE=
SEARXNG_SAFESEARCH=0
SEARXNG_TIME_RANGE=
SEARXNG_TIMEOUT=

## Langfuse observability settings
LANGFUSE_BASE_URL=
LANGFUSE_PROJECT_ID=
LANGFUSE_PUBLIC_KEY=
LANGFUSE_SECRET_KEY=

## OpenTelemetry observability settings
OTEL_HOST=

## Docker client settings to run primary terminal container
DOCKER_HOST=
DOCKER_TLS_VERIFY=
DOCKER_CERT_PATH=

## Docker settings inside primary terminal container
DOCKER_INSIDE=true # enable to use docker socket
DOCKER_NET_ADMIN=true # enable to use net_admin capability
DOCKER_SOCKET=/var/run/docker.sock # path on host machine
DOCKER_NETWORK=
DOCKER_WORK_DIR=
DOCKER_PUBLIC_IP=0.0.0.0 # public ip of host machine
DOCKER_DEFAULT_IMAGE=
DOCKER_DEFAULT_IMAGE_FOR_PENTEST=

# Postgres (pgvector) settings
PENTAGI_POSTGRES_USER=postgres
PENTAGI_POSTGRES_PASSWORD=postgres # change this to improve security
PENTAGI_POSTGRES_DB=pentagidb

## Graphiti knowledge graph settings
## Set GRAPHITI_ENABLED=true and GRAPHITI_URL=http://graphiti:8000 to enable embedded Graphiti
GRAPHITI_ENABLED=false
GRAPHITI_TIMEOUT=30
GRAPHITI_URL=
GRAPHITI_MODEL_NAME=

# Neo4j settings (used by Graphiti stack)
NEO4J_USER=neo4j
NEO4J_DATABASE=neo4j
NEO4J_PASSWORD=devpassword # change this to improve security
NEO4J_URI=bolt://neo4j:7687

## PentAGI image settings
PENTAGI_IMAGE=

## Scraper network settings
## Default ports: SCRAPER_LISTEN_IP=127.0.0.1, SCRAPER_LISTEN_PORT=9443
## Note: These settings don't need to change for Podman rootless
SCRAPER_LISTEN_IP=
SCRAPER_LISTEN_PORT=

## Postgres network settings
PGVECTOR_LISTEN_IP=
PGVECTOR_LISTEN_PORT=

## Postgres Exporter network settings
POSTGRES_EXPORTER_LISTEN_IP=
POSTGRES_EXPORTER_LISTEN_PORT=


# Langfuse Environment Variables

## Langfuse server settings
LANGFUSE_LISTEN_IP=
LANGFUSE_LISTEN_PORT=
LANGFUSE_NEXTAUTH_URL=

## Langfuse Postgres
LANGFUSE_POSTGRES_USER=postgres
LANGFUSE_POSTGRES_PASSWORD=postgres # change this to improve security
LANGFUSE_POSTGRES_DB=langfuse

## Langfuse Clickhouse
LANGFUSE_CLICKHOUSE_USER=clickhouse
LANGFUSE_CLICKHOUSE_PASSWORD=clickhouse # change this to improve security
LANGFUSE_CLICKHOUSE_URL=http://langfuse-clickhouse:8123
LANGFUSE_CLICKHOUSE_MIGRATION_URL=clickhouse://langfuse-clickhouse:9000
LANGFUSE_CLICKHOUSE_CLUSTER_ENABLED=false

## Langfuse S3
LANGFUSE_S3_BUCKET=langfuse
LANGFUSE_S3_REGION=auto
LANGFUSE_S3_ACCESS_KEY_ID=accesskey # change this to improve security
LANGFUSE_S3_SECRET_ACCESS_KEY=secretkey # change this to improve security
LANGFUSE_S3_ENDPOINT=http://langfuse-minio:9000
LANGFUSE_S3_FORCE_PATH_STYLE=true
LANGFUSE_S3_EVENT_UPLOAD_PREFIX=events/
LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=media/
LANGFUSE_S3_BATCH_EXPORT_ENABLED=true

## Langfuse Redis
LANGFUSE_REDIS_HOST=langfuse-redis
LANGFUSE_REDIS_PORT=6379
LANGFUSE_REDIS_AUTH=redispassword # change this to improve security
LANGFUSE_REDIS_TLS_ENABLED=false
LANGFUSE_REDIS_TLS_CA=
LANGFUSE_REDIS_TLS_CERT=
LANGFUSE_REDIS_TLS_KEY=

## Langfuse web app security settings
LANGFUSE_SALT=salt # change this to improve security
LANGFUSE_ENCRYPTION_KEY=0000000000000000000000000000000000000000000000000000000000000000 # change this to improve security

## Langfuse web app nextauth settings
LANGFUSE_NEXTAUTH_URL=http://localhost:4000
LANGFUSE_NEXTAUTH_SECRET=secret # change this to improve security

## Langfuse extra settings
LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=true
LANGFUSE_TELEMETRY_ENABLED=false
LANGFUSE_LOG_LEVEL=info

## Langfuse init settings
LANGFUSE_INIT_ORG_ID=ocm47619l0000872mcd2dlbqwb
LANGFUSE_INIT_ORG_NAME=PentAGI Org
LANGFUSE_INIT_PROJECT_ID=cm47619l0000872mcd2dlbqwb
LANGFUSE_INIT_PROJECT_NAME=PentAGI
LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-lf-00000000-0000-0000-0000-000000000000 # change this to improve security
LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-lf-00000000-0000-0000-0000-000000000000 # change this to improve security
LANGFUSE_INIT_USER_EMAIL=admin@pentagi.com
LANGFUSE_INIT_USER_NAME=admin
LANGFUSE_INIT_USER_PASSWORD=password # change this to improve security

## Langfuse SDK sync settings
LANGFUSE_SDK_CI_SYNC_PROCESSING_ENABLED=false
LANGFUSE_READ_FROM_POSTGRES_ONLY=false
LANGFUSE_READ_FROM_CLICKHOUSE_ONLY=true
LANGFUSE_RETURN_FROM_CLICKHOUSE=true

## Langfuse ingestion tuning
LANGFUSE_INGESTION_QUEUE_DELAY_MS=
LANGFUSE_INGESTION_CLICKHOUSE_WRITE_INTERVAL_MS=
LANGFUSE_INGESTION_CLICKHOUSE_WRITE_BATCH_SIZE=
LANGFUSE_INGESTION_CLICKHOUSE_MAX_ATTEMPTS=

## Langfuse email
LANGFUSE_EMAIL_FROM_ADDRESS=
LANGFUSE_SMTP_CONNECTION_URL=

## Langfuse optional Azure blob
LANGFUSE_USE_AZURE_BLOB=false

## Langfuse license settings
LANGFUSE_EE_LICENSE_KEY=

## Langfuse OpenTelemetry settings
LANGFUSE_OTEL_EXPORTER_OTLP_ENDPOINT=
LANGFUSE_OTEL_SERVICE_NAME=

## Langfuse custom oauth2 settings
LANGFUSE_AUTH_CUSTOM_CLIENT_ID=
LANGFUSE_AUTH_CUSTOM_CLIENT_SECRET=
LANGFUSE_AUTH_CUSTOM_ISSUER=
LANGFUSE_AUTH_CUSTOM_NAME=PentAGI
LANGFUSE_AUTH_CUSTOM_SCOPE=openid email profile
LANGFUSE_AUTH_CUSTOM_CLIENT_AUTH_METHOD=client_secret_post
LANGFUSE_AUTH_CUSTOM_ALLOW_ACCOUNT_LINKING=true

## Langfuse auth settings
LANGFUSE_AUTH_DISABLE_SIGNUP=false # disable signup if PentAGI OAuth2 is used
LANGFUSE_AUTH_SESSION_MAX_AGE=240

## Langfuse allowed organization creators
LANGFUSE_ALLOWED_ORGANIZATION_CREATORS=admin@pentagi.com

## Langfuse default settings for new users
LANGFUSE_DEFAULT_ORG_ID=ocm47619l0000872mcd2dlbqwb
LANGFUSE_DEFAULT_PROJECT_ID=cm47619l0000872mcd2dlbqwb
LANGFUSE_DEFAULT_ORG_ROLE=VIEWER
LANGFUSE_DEFAULT_PROJECT_ROLE=VIEWER


# Observability Environment Variables

## Observability server settings
GRAFANA_LISTEN_IP=
GRAFANA_LISTEN_PORT=

## OpenTelemetry server settings
OTEL_GRPC_LISTEN_IP=
OTEL_GRPC_LISTEN_PORT=
OTEL_HTTP_LISTEN_IP=
OTEL_HTTP_LISTEN_PORT=


================================================
FILE: .github/ISSUE_TEMPLATE/1-bug-report.yml
================================================
name: "\U0001F41B Bug report"
description: "Report a bug in PentAGI"
title: "[Bug]: "
labels: ["bug"]
assignees:
  - asdek
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report! Please provide as much information as possible to help us diagnose and fix the issue.
  - type: dropdown
    id: component
    attributes:
      label: Affected Component
      description: Which component of PentAGI is affected by this bug?
      multiple: true
      options:
        - Core Services (Frontend UI/Backend API)
        - AI Agents (Researcher/Developer/...)
        - Security Tools Integration
        - Memory System (Vector Store/Knowledge Base)
        - Monitoring Stack Integration (Grafana/OpenTelemetry)
        - Analytics Platform Integration (Langfuse)
        - External Integrations (LLM/Search APIs)
        - Documentation and User Experience
        - Other (please specify in the description)
    validations:
      required: true
  - type: textarea
    attributes:
      label: Describe the bug
      description: Please provide a clear and concise description of the bug, including expected and actual behavior.
      placeholder: |
        What happened:
        - Actual behavior: When executing a penetration test against [target], the AI agent [behavior]
        
        What should happen:
        - Expected behavior: The system should [expected outcome]
        
        Additional context:
        - Task/Flow ID (if applicable): [ID from UI]
        - Error messages: [any error messages from logs/UI]
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to Reproduce
      description: Please provide detailed steps to reproduce the bug.
      placeholder: |
        1. Access PentAGI Web UI at [relative URL]
        2. Start a new flow with parameters [...] or prompt [...]
        3. Configure target system as [...]
        4. Observe AI agent behavior in [...] or log from Langfuse
        5. Error occurs when [...] or screenshot/export logs from Grafana
    validations:
      required: true
  - type: textarea
    attributes:
      label: System Configuration
      description: Please provide details about your setup
      placeholder: |
        PentAGI Version: [e.g., latest from Docker Hub]
        Deployment Type:
        - [ ] Docker Compose
        - [ ] Custom Deployment
        
        Environment:
        - Docker Version: [output of `docker --version`]
        - Docker Compose Version: [output of `docker compose version`]
        - Host OS: [e.g., Ubuntu 22.04, macOS 14.0]
        - Available Resources:
          - RAM: [e.g., 8GB]
          - CPU: [e.g., 4 cores]
          - Disk Space: [e.g., 50GB free]
        
        Enabled Features:
        - [ ] Langfuse Analytics
        - [ ] Grafana Monitoring
        - [ ] Custom LLM Server
        
        Active Integrations:
        - LLM Provider: [OpenAI/Anthropic/Custom]
        - Search Systems: [Google/DuckDuckGo/Tavily/Traversaal/Perplexity]
    validations:
      required: true
  - type: textarea
    attributes:
      label: Logs and Artifacts
      description: |
        Please provide relevant logs and artifacts. You can find logs using:
        - Docker logs: `docker logs pentagi`
        - Grafana dashboards (if enabled)
        - Langfuse traces (if enabled)
        - Browser console logs (for UI issues)
      placeholder: |
        ```
        Paste logs here
        ```
        
        For large logs, please use GitHub Gist and provide the link.
    validations:
      required: false
  - type: textarea
    attributes:
      label: Screenshots or Recordings
      description: |
        If applicable, add screenshots or recordings to help explain your problem.
        - For UI issues: Browser screenshots/recordings
        - For agent behavior: Langfuse trace screenshots
        - For monitoring: Grafana dashboard screenshots
      placeholder: Drag and drop images/videos here, or paste links to external storage.
    validations:
      required: false
  - type: checkboxes
    id: verification
    attributes:
      label: Verification
      description: Please verify the following before submitting
      options:
        - label: I have checked that this issue hasn't been already reported
        - label: I have provided all relevant configuration files (with sensitive data removed)
        - label: I have included relevant logs and error messages
        - label: I am running the latest version of PentAGI
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/2-enhancement.yml
================================================
name: "\U0001F680 Enhancement"
description: "Suggest an enhancement for PentAGI"
title: "[Enhancement]: "
labels: ["enhancement"]
assignees:
  - asdek
body:
  - type: markdown
    attributes:
      value: |
        Thank you for suggesting an enhancement to make PentAGI better! Please provide as much detail as possible to help us understand your suggestion.
  - type: dropdown
    id: component
    attributes:
      label: Target Component
      description: Which component of PentAGI would this enhancement affect?
      multiple: true
      options:
        - Core Services (Frontend UI/Backend API)
        - AI Agents (Researcher/Developer/Executor)
        - Security Tools Integration
        - Memory System (Vector Store/Knowledge Base)
        - Monitoring Stack (Grafana/OpenTelemetry)
        - Analytics Platform (Langfuse)
        - External Integrations (LLM/Search APIs)
        - Documentation and User Experience
    validations:
      required: true
  - type: textarea
    attributes:
      label: Enhancement Description
      description: Please describe the enhancement you would like to see.
      placeholder: |
        Problem Statement:
        - Current Limitation: [describe what's currently missing or could be improved]
        - Use Case: [describe how you use PentAGI and why this enhancement would help]
        
        Proposed Solution:
        - Feature Description: [detailed description of the enhancement]
        - Expected Benefits: [how this would improve PentAGI]
        
        Example Scenario:
        [Provide a concrete example of how this enhancement would be used]
    validations:
      required: true
  - type: textarea
    attributes:
      label: Technical Details
      description: If you have technical suggestions for implementation, please share them.
      placeholder: |
        Implementation Approach:
        - Architecture Changes: [any changes needed to current architecture]
        - New Components: [any new services or integrations needed]
        - Dependencies: [new tools or libraries required]
        
        Integration Points:
        - AI Agents: [how it affects agent behavior]
        - Memory System: [data storage requirements]
        - Monitoring: [new metrics or traces needed]
        
        Security Considerations:
        - [Any security implications to consider]
    validations:
      required: false
  - type: textarea
    attributes:
      label: Designs and Mockups
      description: |
        If applicable, provide mockups, diagrams, or examples to illustrate your enhancement.
        - For UI changes: wireframes or mockups
        - For architecture changes: system diagrams
        - For agent behavior: sequence diagrams
      placeholder: |
        Drag and drop images here, or provide links to external design tools.
        
        For complex diagrams, you can use Mermaid syntax:
        ```mermaid
        sequenceDiagram
            User->>PentAGI: Request
            PentAGI->>NewComponent: Process
            NewComponent->>User: Enhanced Response
        ```
    validations:
      required: false
  - type: textarea
    attributes:
      label: Alternative Solutions
      description: |
        Please describe any alternative solutions or features you've considered.
      placeholder: |
        Alternative Approaches:
        1. [First alternative approach]
           - Pros: [benefits]
           - Cons: [drawbacks]
        
        2. [Second alternative approach]
           - Pros: [benefits]
           - Cons: [drawbacks]
        
        Reason for Preferred Solution:
        [Explain why your main proposal is better than these alternatives]
    validations:
      required: false
  - type: checkboxes
    id: verification
    attributes:
      label: Verification
      description: Please verify the following before submitting
      options:
        - label: I have checked that this enhancement hasn't been already proposed
        - label: This enhancement aligns with PentAGI's goal of autonomous penetration testing
        - label: I have considered the security implications of this enhancement
        - label: I have provided clear use cases and benefits
    validations:
      required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Thank you for your contribution to PentAGI! Please fill out this template completely to help us review your changes effectively.
Any PR that does not include enough information may be closed at maintainers' discretion.
-->

### Description of the Change
<!--
We must be able to understand the design of your change from this description. Please provide as much detail as possible.
-->

#### Problem
<!-- Describe the problem this PR addresses -->

#### Solution
<!-- Describe your solution and its key aspects -->

<!-- Enter any applicable Issue number(s) here that will be closed/resolved by this PR. -->
Closes #

### Type of Change
<!-- Mark with an `x` all options that apply -->

- [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
- [ ] 🚀 New feature (non-breaking change which adds functionality)
- [ ] 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] 📚 Documentation update
- [ ] 🔧 Configuration change
- [ ] 🧪 Test update
- [ ] 🛡️ Security update

### Areas Affected
<!-- Mark with an `x` all components that are affected -->

- [ ] Core Services (Frontend UI/Backend API)
- [ ] AI Agents (Researcher/Developer/Executor)
- [ ] Security Tools Integration
- [ ] Memory System (Vector Store/Knowledge Base)
- [ ] Monitoring Stack (Grafana/OpenTelemetry)
- [ ] Analytics Platform (Langfuse)
- [ ] External Integrations (LLM/Search APIs)
- [ ] Documentation
- [ ] Infrastructure/DevOps

### Testing and Verification
<!--
Please describe the tests that you ran to verify your changes and provide instructions so we can reproduce.
-->

#### Test Configuration
```yaml
PentAGI Version:
Docker Version:
Host OS:
LLM Provider:
Enabled Features: [Langfuse/Grafana/etc]
```

#### Test Steps
1. 
2. 
3. 

#### Test Results
<!-- Include relevant screenshots, logs, or test outputs -->

### Security Considerations
<!-- 
Describe any security implications of your changes.
For security-related changes, please note any new dependencies, changed permissions, etc.
-->

### Performance Impact
<!--
Describe any performance implications and testing done to verify acceptable performance.
Especially important for changes affecting AI agents, memory systems, or data processing.
-->

### Documentation Updates
<!-- Note any documentation changes required by this PR -->

- [ ] README.md updates
- [ ] API documentation updates
- [ ] Configuration documentation updates
- [ ] GraphQL schema updates
- [ ] Other: <!-- specify -->

### Deployment Notes
<!--
Describe any special considerations for deploying this change.
Include any new environment variables, configuration changes, or migration steps.
-->

### Checklist
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->

#### Code Quality
- [ ] My code follows the project's coding standards
- [ ] I have added/updated necessary documentation
- [ ] I have added tests to cover my changes
- [ ] All new and existing tests pass
- [ ] I have run `go fmt` and `go vet` (for Go code)
- [ ] I have run `npm run lint` (for TypeScript/JavaScript code)

#### Security
- [ ] I have considered security implications
- [ ] Changes maintain or improve the security model
- [ ] Sensitive information has been properly handled

#### Compatibility
- [ ] Changes are backward compatible
- [ ] Breaking changes are clearly marked and documented
- [ ] Dependencies are properly updated

#### Documentation
- [ ] Documentation is clear and complete
- [ ] Comments are added for non-obvious code
- [ ] API changes are documented

### Additional Notes
<!-- Any additional information that would be helpful for reviewers -->


================================================
FILE: .github/SAVED_REPLIES.md
================================================
# Saved Replies

These are standardized responses for the PentAGI Development Team to use when responding to Issues and Pull Requests. Using these templates helps maintain consistency in our communications and saves time.

Since GitHub currently does not support repository-wide saved replies, team members should maintain these individually. All responses are versioned for easier updates.

While these are templates, please customize them to fit the specific context and:
- Welcome new contributors
- Thank them for their contribution
- Provide context for your response
- Outline next steps

You can add these saved replies to [your personal GitHub account here](https://github.com/settings/replies).

## Issue Responses

### Issue: Already Fixed (v1)
```
Thank you for reporting this issue! This has been resolved in a recent release. Please update to the latest version (see our [releases page](https://github.com/vxcontrol/pentagi/releases)) and verify if the issue persists.

If you continue experiencing problems after updating, please:
1. Check your configuration against our documentation
2. Provide logs from both PentAGI and monitoring systems (Grafana/Langfuse)
3. Include details about your environment and enabled features
```

### Issue: Need More Information (v1)
```
Thank you for your report! To help us better understand and address your issue, please provide additional information:

1. PentAGI version and deployment method (Docker Compose/Custom)
2. Relevant logs from:
   - Docker containers
   - Grafana dashboards (if enabled)
   - Langfuse traces (if enabled)
3. Steps to reproduce the issue
4. Expected vs actual behavior

Please update your issue using our bug report template for consistency.
```

### Issue: Cannot Reproduce (v1)
```
Thank you for reporting this issue! Unfortunately, I cannot reproduce the problem with the provided information. To help us investigate:

1. Verify you're using the latest version
2. Provide your complete environment configuration
3. Share relevant logs and monitoring data
4. Include step-by-step reproduction instructions
5. Specify which AI agents were involved (Researcher/Developer/Executor)

Please update your issue with these details so we can better assist you.
```

### Issue: Expected Behavior (v1)
```
Thank you for your report! This appears to be the expected behavior because:

[Explanation of why this is working as designed]

If you believe this behavior should be different, please:
1. Describe your use case in detail
2. Explain why the current behavior doesn't meet your needs
3. Suggest alternative behavior that would work better

We're always open to improving PentAGI's functionality.
```

### Issue: Missing Template (v1)
```
Thank you for reporting this! To help us process your issue efficiently, please use our issue templates:

- [Bug Report Template](https://github.com/vxcontrol/pentagi/blob/master/.github/ISSUE_TEMPLATE/1-bug-report.md) for problems
- [Enhancement Template](https://github.com/vxcontrol/pentagi/blob/master/.github/ISSUE_TEMPLATE/2-enhancement.md) for suggestions

Please edit your issue to include the template information. This helps ensure we have all necessary details to assist you.
```

### Issue: PR Welcome (v1)
```
Thank you for raising this issue! We welcome contributions from the community.

If you'd like to implement this yourself:
1. Check our [contribution guidelines](CONTRIBUTING.md)
2. Review the architecture documentation
3. Consider security implications (especially for AI agent modifications)
4. Include tests and documentation
5. Update monitoring/analytics as needed

Feel free to ask questions if you need guidance. We're here to help!
```

## PR Responses

### PR: Ready to Merge (v1)
```
Excellent work! This PR meets our quality standards and I'll proceed with merging it.

If you're interested in further contributions, check our:
- [Help Wanted Issues](https://github.com/vxcontrol/pentagi/labels/help-wanted)
- [Good First Issues](https://github.com/vxcontrol/pentagi/labels/good-first-issue)

Thank you for improving PentAGI!
```

### PR: Needs Work (v1)
```
Thank you for your contribution! A few items need attention before we can merge:

[List specific items that need addressing]

Common requirements:
- Tests for new functionality
- Documentation updates
- Security considerations
- Performance impact assessment
- Monitoring/analytics integration

Please update your PR addressing these points. Let us know if you need any clarification.
```

### PR: Missing Template (v1)
```
Thank you for your contribution! Please update your PR to use our [PR template](https://github.com/vxcontrol/pentagi/blob/master/.github/PULL_REQUEST_TEMPLATE.md).

The template helps ensure we have:
- Clear description of changes
- Testing information
- Security considerations
- Documentation updates
- Deployment notes

This helps us review your changes effectively.
```

### PR: Missing Issue (v1)
```
Thank you for your contribution! We require an associated issue for each PR to:
- Discuss approach before implementation
- Track related changes
- Maintain clear project history

Please:
1. [Create an issue](https://github.com/vxcontrol/pentagi/issues/new/choose)
2. Link it to this PR
3. Update the PR description with the issue reference

This helps us maintain good project organization.
```

### PR: Inactive (v1)
```
This PR has been inactive for a while. To keep our review process efficient:

1. If you're still working on this:
   - Let us know your timeline
   - Update with latest main branch
   - Address any existing feedback

2. If you're no longer working on this:
   - We can close it
   - Someone else can pick it up

Please let us know your preference within the next week.
```

### General: Need Help (v1)
```
I need additional expertise on this. Pinging:
- @asdek for technical review
- @security-team for security implications
- @ai-team for AI agent behavior
- @infra-team for infrastructure changes

[Specific questions or concerns that need addressing]
```


================================================
FILE: .github/workflows/ci.yml
================================================
name: Docker build and push

on:
  push:
    branches:
      - "**"
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"
  workflow_dispatch:

jobs:
  lint-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      # Go setup and cache
      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24'
          cache: true
          cache-dependency-path: backend/go.sum

      # Cache Go dependencies
      - name: Go Mod Cache
        uses: actions/cache@v5
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('backend/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      # Node.js setup and cache
      - name: Set up Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '23'
          cache: 'npm'
          cache-dependency-path: 'frontend/package-lock.json'

      # Cache npm dependencies
      - name: Get npm cache directory
        id: npm-cache-dir
        run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT

      - name: Cache npm packages
        uses: actions/cache@v5
        id: npm-cache
        with:
          path: |
            ${{ steps.npm-cache-dir.outputs.dir }}
            frontend/node_modules
          key: ${{ runner.os }}-npm-${{ hashFiles('frontend/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-

      # Frontend lint and test
      - name: Frontend - Install dependencies
        if: steps.npm-cache.outputs.cache-hit != 'true'
        working-directory: frontend
        run: npm ci
        continue-on-error: true

      - name: Frontend - Prettier
        working-directory: frontend
        run: npm run prettier
        continue-on-error: true

      - name: Frontend - Lint
        working-directory: frontend
        run: npm run lint
        continue-on-error: true

      - name: Frontend - Test
        working-directory: frontend
        run: npm run test
        continue-on-error: true

      # Backend lint and test
      - name: Backend - Download dependencies
        working-directory: backend
        run: go mod download
        continue-on-error: true

      - name: Backend - Lint
        uses: golangci/golangci-lint-action@v9
        with:
          version: latest
          working-directory: backend
          args: --timeout=5m --issues-exit-code=0
        continue-on-error: true

      - name: Backend - Test
        working-directory: backend
        run: go test ./... -v
        continue-on-error: true

      - name: Backend - Test Build
        working-directory: backend
        env:
          CGO_ENABLED: 0
          GO111MODULE: on
        run: |
          # Get version information
          LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
          PACKAGE_VER=${LATEST_TAG#v}
          CURRENT_COMMIT=$(git rev-parse HEAD)
          TAG_COMMIT=$(git rev-list -n 1 "$LATEST_TAG" 2>/dev/null || echo "")
          
          if [ "$CURRENT_COMMIT" != "$TAG_COMMIT" ]; then
            PACKAGE_REV=$(git rev-parse --short HEAD)
          else
            PACKAGE_REV=""
          fi
          
          LDFLAGS="-X pentagi/pkg/version.PackageName=pentagi -X pentagi/pkg/version.PackageVer=${PACKAGE_VER} -X pentagi/pkg/version.PackageRev=${PACKAGE_REV}"
          
          echo "Building with version: ${PACKAGE_VER}${PACKAGE_REV:+-$PACKAGE_REV}"
          
          # Build for AMD64
          GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "$LDFLAGS" -o /tmp/pentagi-amd64 ./cmd/pentagi
          echo "✓ Successfully built for linux/amd64"

          # Build for ARM64
          GOOS=linux GOARCH=arm64 go build -trimpath -ldflags "$LDFLAGS" -o /tmp/pentagi-arm64 ./cmd/pentagi
          echo "✓ Successfully built for linux/arm64"
        continue-on-error: true

  docker-build:
    needs: lint-and-test
    if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # Extract version from tag (without 'v' prefix) and split into parts
      - name: Extract version and revision
        id: version
        run: |
          # Get latest tag version (without 'v' prefix)
          LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
          VERSION=${LATEST_TAG#v}
          
          # Get current commit hash
          CURRENT_COMMIT=$(git rev-parse HEAD)
          
          # Get commit hash of the latest tag
          TAG_COMMIT=$(git rev-list -n 1 "$LATEST_TAG" 2>/dev/null || echo "")
          
          # Set revision only if current commit differs from tag commit
          if [ "$CURRENT_COMMIT" != "$TAG_COMMIT" ]; then
            PACKAGE_REV=$(git rev-parse --short HEAD)
            echo "revision=${PACKAGE_REV}" >> $GITHUB_OUTPUT
            echo "is_release=false" >> $GITHUB_OUTPUT
            echo "Building development version: ${VERSION}-${PACKAGE_REV}"
            echo " Docker tags: latest only"
          else
            echo "revision=" >> $GITHUB_OUTPUT
            echo "is_release=true" >> $GITHUB_OUTPUT
            echo "Building release version: ${VERSION}"
            
            # Split version into major.minor.patch for Docker tags (only for releases)
            IFS='.' read -r major minor patch <<< "$VERSION"
            echo "major=${major}" >> $GITHUB_OUTPUT
            echo "minor=${major}.${minor}" >> $GITHUB_OUTPUT
            echo "patch=${VERSION}" >> $GITHUB_OUTPUT
            echo "  Docker tags: latest, ${major}, ${major}.${minor}, ${VERSION}"
          fi
          
          echo "version=${VERSION}" >> $GITHUB_OUTPUT

      - name: Generate Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: vxcontrol/pentagi
          tags: |
            # For master branch - latest tag
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
            # For release builds only - tag with major, minor and patch versions
            type=raw,value=${{ steps.version.outputs.major }},enable=${{ steps.version.outputs.is_release == 'true' }}
            type=raw,value=${{ steps.version.outputs.minor }},enable=${{ steps.version.outputs.is_release == 'true' }}
            type=raw,value=${{ steps.version.outputs.patch }},enable=${{ steps.version.outputs.is_release == 'true' }}

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          context: .
          platforms: linux/amd64,linux/arm64/v8
          push: true
          provenance: true
          sbom: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          build-args: |
            PACKAGE_VER=${{ steps.version.outputs.version }}
            PACKAGE_REV=${{ steps.version.outputs.revision }}


================================================
FILE: .gitignore
================================================
.DS_Store
.env
.env.*
.state
!.env.example
!backend/cmd/installer/files/links/.env

backend/tmp
backend/build

frontend/coverage
frontend/dist
frontend/node_modules
frontend/ssl
node_modules

.cursorrules
.cursorignore
.cursor/

build/*
data/*
.bak/*
!.gitkeep
.claude/

# IDE
.idea/
*.swp
*.swo
*~

# OS
Thumbs.db



================================================
FILE: .vscode/launch.json
================================================
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "go",
            "request": "launch",
            "name": "Launch Go Backend",
            "program": "${workspaceFolder}/backend/cmd/pentagi/main.go",
            "envFile": "${workspaceFolder}/.env",
            "env": {
                "CORS_ORIGINS": "http://localhost:*,https://localhost:*",
                "SERVER_PORT": "8080",
                "SERVER_USE_SSL": "false",
                "DATABASE_URL": "postgres://postgres:postgres@localhost:5432/pentagidb?sslmode=disable",
                "PUBLIC_URL": "http://localhost:8080",
                "STATIC_URL": "http://localhost:8000",
                // Choose it instead of STATIC_URL to serve static files from a directory:
                // "STATIC_DIR": "${workspaceFolder}/frontend/dist",
                // Langfuse (optional) uncomment to enable
                // "LANGFUSE_BASE_URL": "http://localhost:4000",
                // Observability (optional) uncomment to enable
                // "OTEL_HOST": "localhost:8148",
                // Scraper (optional) uncomment to enable
                // "SCRAPER_PRIVATE_URL": "https://someuser:somepass@localhost:9443/",
            },
            "cwd": "${workspaceFolder}",
            "output": "${workspaceFolder}/build/__debug_bin_pentagi",
        },
        {
            "type": "node",
            "request": "launch",
            "name": "Launch Frontend",
            "runtimeExecutable": "npm",
            "runtimeArgs": ["run", "dev"],
            "env": {
                "VITE_APP_LOG_LEVEL": "DEBUG",
                "VITE_API_URL": "localhost:8080",
                "VITE_USE_HTTPS": "false",
                "VITE_PORT": "8000",
                "VITE_HOST": "0.0.0.0",
            },
            "cwd": "${workspaceFolder}/frontend",
        },
        {
            "type": "chrome",
            "request": "launch",
            "name": "Launch Browser",
            "url": "http://localhost:8000",
            "webRoot": "${workspaceFolder}/frontend/src",
        },
        {
            "type": "go",
            "request": "launch",
            "name": "Launch Agents Tests",
            "program": "${workspaceFolder}/backend/cmd/ctester/",
            "envFile": "${workspaceFolder}/.env",
            "env": {},
            "args": [
                // "-type", "openai",
                // "-type", "anthropic",
                // "-type", "gemini",
                // "-type", "bedrock",
                // "-type", "ollama",
                // "-type", "deepseek",
                // "-type", "glm",
                // "-type", "kimi",
                // "-type", "qwen",
                "-config", "${workspaceFolder}/examples/configs/moonshot.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/deepseek.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/ollama-llama318b.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/ollama-llama318b-instruct.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/ollama-qwq32b-fp16-tc.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/ollama-qwen332b-fp16-tc.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/vllm-qwen3.5-27b-fp8.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/vllm-qwen332b-fp16.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/custom-openai.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/openrouter.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/deepinfra.provider.yml",
                // "-config", "${workspaceFolder}/examples/configs/novita.provider.yml",
                // "-report", "${workspaceFolder}/examples/tests/openai-report.md",
                // "-report", "${workspaceFolder}/examples/tests/anthropic-report.md",
                // "-report", "${workspaceFolder}/examples/tests/gemini-report.md",
                // "-report", "${workspaceFolder}/examples/tests/bedrock-report.md",
                // "-report", "${workspaceFolder}/examples/tests/ollama-cloud-report.md",
                // "-report", "${workspaceFolder}/examples/tests/ollama-llama318b-report.md",
                // "-report", "${workspaceFolder}/examples/tests/ollama-llama318b-instruct-report.md",
                // "-report", "${workspaceFolder}/examples/tests/ollama-qwq-32b-fp16-tc-report.md",
                // "-report", "${workspaceFolder}/examples/tests/ollama-qwen332b-fp16-tc-report.md",
                // "-report", "${workspaceFolder}/examples/tests/vllm-qwen3.5-27b-fp8.report.md",
                // "-report", "${workspaceFolder}/examples/tests/vllm-qwen332b-fp16-report.md",
                "-report", "${workspaceFolder}/examples/tests/moonshot-report.md",
                // "-report", "${workspaceFolder}/examples/tests/deepseek-report.md",
                // "-report", "${workspaceFolder}/examples/tests/glm-report.md",
                // "-report", "${workspaceFolder}/examples/tests/kimi-report.md",
                // "-report", "${workspaceFolder}/examples/tests/qwen-report.md",
                // "-report", "${workspaceFolder}/examples/tests/custom-openai-report.md",
                // "-report", "${workspaceFolder}/examples/tests/openrouter-report.md",
                // "-report", "${workspaceFolder}/examples/tests/deepinfra-report.md",
                // "-report", "${workspaceFolder}/examples/tests/novita-report.md",
                "-agents", "all",
                "-groups", "all",
                "-workers", "8",
                "-verbose",
            ],
            "cwd": "${workspaceFolder}",
            "output": "${workspaceFolder}/build/__debug_bin_ctester",
        },
        {
            "type": "go",
            "request": "launch",
            "name": "Launch Installer",
            "program": "${workspaceFolder}/backend/cmd/installer/",
            "args": ["-e", "${workspaceFolder}/.env_test.example"],
            "cwd": "${workspaceFolder}",
            "output": "${workspaceFolder}/build/__debug_bin_installer",
        },
        {
            "type": "go",
            "request": "attach",
            "name": "Attach Installer",
            "mode": "local",
            "processId": "${command:PickProcess}",
            "cwd": "${workspaceFolder}",
        },
        {
            "type": "go",
            "request": "launch",
            "name": "Launch Tools Tests",
            "program": "${workspaceFolder}/backend/cmd/ftester/",
            "envFile": "${workspaceFolder}/.env",
            "env": {
                "LLM_SERVER_CONFIG_PATH": "${workspaceFolder}/examples/configs/openrouter.provider.yml",
                "DATABASE_URL": "postgres://postgres:postgres@localhost:5432/pentagidb?sslmode=disable",
                // Langfuse (optional) uncomment to enable
                "LANGFUSE_BASE_URL": "http://localhost:4000",
                // Observability (optional) uncomment to enable
                "OTEL_HOST": "localhost:8148",
            },
            "args": [
                "-flow", "0",
                // "describe", "-verbose",
                "perplexity", "-query", "how I can install burp suite on Kali Linux?", "-max_results", "10",
            ],
            "cwd": "${workspaceFolder}",
            "output": "${workspaceFolder}/build/__debug_bin_ftester",
        },
        {
            "type": "go",
            "request": "launch",
            "name": "Launch Embedding Tests",
            "program": "${workspaceFolder}/backend/cmd/etester/",
            "envFile": "${workspaceFolder}/.env",
            "env": {
                "DATABASE_URL": "postgres://postgres:postgres@localhost:5432/pentagidb?sslmode=disable",
            },
            "args": [
                "info", "-verbose",
            ],
            "cwd": "${workspaceFolder}",
            "output": "${workspaceFolder}/build/__debug_bin_etester",
        },
    ]
}

================================================
FILE: .vscode/settings.json
================================================
{
    "go.lintFlags": [
        "-checks=\"all,-ST1005\""
    ],
    "go.testTimeout": "300s",
    "go.testEnvVars": {
      "INSTALLER_LOG_FILE": "${workspaceFolder}/build/log.json"
    },
    "go.testExplorer.enable": true,
    "search.useIgnoreFiles": true,
    "search.exclude": {
      "**/frontend/coverage/**": true,
      "**/frontend/dist/**": true,
      "**/frontend/node_modules/**": true,
    },
    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": "explicit"
    },
    "eslint.validate": [
      "javascript",
      "javascriptreact",
      "typescript",
      "typescriptreact"
    ],
    "editor.formatOnSave": false,
    "[typescript]": {
      "editor.defaultFormatter": "esbenp.prettier-vscode",
      "editor.formatOnSave": true
    },
    "[typescriptreact]": {
      "editor.defaultFormatter": "esbenp.prettier-vscode",
      "editor.formatOnSave": true
    },
}


================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Core Interaction Rules

1. **Always use English** for all interactions, responses, explanations, and questions with users.
2. **Password Complexity Requirements**: For all password-related development (registration, password reset, API token generation, etc.), the following rules must be enforced:
   - Minimum 12 characters
   - Must contain at least 1 uppercase letter, 1 lowercase letter, 1 number, and 1 special character
   - Common weak passwords (e.g., `password`, `123456`) are prohibited
   - Both backend and frontend validation must be implemented; do not rely on frontend validation alone

## Project Overview

**PentAGI** is an automated security testing platform powered by AI agents. It runs autonomous penetration testing workflows using a multi-agent system (Researcher, Developer, Executor agents) that coordinates LLM providers, Docker-sandboxed tool execution, and a persistent vector memory store.

The application is a monorepo with:
- **`backend/`** — Go REST + GraphQL API server
- **`frontend/`** — React + TypeScript web UI
- **`observability/`** — Optional monitoring stack configs

## Build & Development Commands

### Backend (run from `backend/`)

```bash
go mod download                              # Install dependencies
go build -trimpath -o pentagi ./cmd/pentagi  # Build main binary
go test ./...                                # Run all tests
go test ./pkg/foo/... -v -run TestName       # Run specific test
golangci-lint run --timeout=5m               # Lint

# Code generation (run after schema changes)
go run github.com/99designs/gqlgen --config ./gqlgen/gqlgen.yml  # GraphQL resolvers
swag init -g ../../pkg/server/router.go -o pkg/server/docs/ --parseDependency --parseInternal --parseDepth 2 -d cmd/pentagi  # Swagger docs
```

### Frontend (run from `frontend/`)

```bash
npm ci                    # Install dependencies
npm run dev               # Dev server on http://localhost:8000
npm run build             # Production build
npm run lint              # ESLint check
npm run lint:fix          # ESLint auto-fix
npm run prettier          # Prettier check
npm run prettier:fix      # Prettier auto-format
npm run test              # Vitest
npm run test:coverage     # Coverage report
npm run graphql:generate  # Regenerate GraphQL types from schema
```

### Docker (run from repo root)

```bash
docker compose up -d                                                          # Start core services
docker compose -f docker-compose.yml -f docker-compose-observability.yml up -d  # + monitoring
docker compose -f docker-compose.yml -f docker-compose-langfuse.yml up -d       # + LLM analytics
docker compose -f docker-compose.yml -f docker-compose-graphiti.yml up -d       # + knowledge graph
docker build -t local/pentagi:latest .                                        # Build image
```

The full stack runs at `https://localhost:8443` when using Docker Compose. Copy `.env.example` to `.env` and fill in at minimum the database and at least one LLM provider key.

## Architecture

### Backend Package Structure

| Package | Role |
|---|---|
| `cmd/pentagi/` | Main entry point; initializes config, DB, server |
| `pkg/config/` | Environment-based config parsing |
| `pkg/server/` | Gin router, middleware, auth (JWT/OAuth2/API tokens), Swagger |
| `pkg/controller/` | Business logic for REST endpoints |
| `pkg/graph/` | gqlgen GraphQL schema (`schema.graphqls`) and resolvers |
| `pkg/database/` | GORM models, SQLC queries, goose migrations |
| `pkg/providers/` | LLM provider adapters (OpenAI, Anthropic, Gemini, Bedrock, Ollama, etc.) |
| `pkg/tools/` | Penetration testing tool integrations |
| `pkg/docker/` | Docker SDK wrapper for sandboxed container execution |
| `pkg/terminal/` | Terminal session and command execution management |
| `pkg/queue/` | Async task queue |
| `pkg/csum/` | Chain summarization for LLM context management |
| `pkg/graphiti/` | Knowledge graph (Neo4j via Graphiti) integration |
| `pkg/observability/` | OpenTelemetry tracing, metrics, structured logging |

Database migrations live in `backend/migrations/sql/` and run automatically via goose at startup.

### Frontend Structure

```
frontend/src/
├── app.tsx / main.tsx     # Entry points and router setup
├── pages/                 # Route-level page components
│   ├── flows/             # Flow management UI
│   └── settings/          # Provider, prompt, token settings
├── components/
│   ├── layouts/           # App shell layouts
│   └── ui/                # Base Radix UI components
├── graphql/               # Auto-generated Apollo types (do not edit)
├── hooks/                 # Custom React hooks
├── lib/                   # Apollo client, HTTP utilities
└── schemas/               # Zod validation schemas
```

State is managed primarily through Apollo Client (GraphQL) with real-time updates via GraphQL subscriptions over WebSocket.

### Data Flow

1. User creates a "flow" (penetration test) via the UI or REST API.
2. The backend queues the flow and spawns agent goroutines.
3. The Researcher agent gathers information; the Developer plans attack strategies; the Executor runs tools in isolated Docker containers.
4. Results, tool outputs, and LLM reasoning are stored in PostgreSQL (with pgvector for semantic search/memory).
5. Real-time progress is pushed to the frontend via GraphQL subscriptions.

### Authentication

- **Session cookies** for browser login (secure, httpOnly)
- **OAuth2** via Google and GitHub
- **Bearer tokens** (API tokens table) for programmatic API access

### Key Integrations

- **LLM Providers**: OpenAI, Anthropic, Gemini, AWS Bedrock, Ollama, DeepSeek, GLM, Kimi, Qwen, and custom HTTP endpoints — configured via environment variables or the Settings UI
- **Search**: DuckDuckGo, Google, Tavily, Traversaal, Perplexity, Searxng
- **Databases**: PostgreSQL + pgvector (required), Neo4j (optional, for knowledge graph)
- **Observability**: OpenTelemetry → VictoriaMetrics + Loki + Jaeger → Grafana; Langfuse for LLM analytics

### Adding a New LLM Provider

1. Create `backend/pkg/providers/<name>/<name>.go` implementing the `provider.Provider` interface.
2. Add a new `Provider<Name> ProviderType` constant and `DefaultProviderName<Name>` in `pkg/providers/provider/provider.go`.
3. Register the provider in `pkg/providers/providers.go` (`DefaultProviderConfig`, `NewProvider`, `buildProviderFromConfig`, `GetProvider`).
4. Add the new type to the `Valid()` whitelist in `pkg/server/models/providers.go` — **without this step, the REST API returns 422 Unprocessable Entity**.
5. Add the env var key to `pkg/config/config.go` (e.g., `<NAME>_API_KEY`, `<NAME>_SERVER_URL`).
6. Add the new `PROVIDER_TYPE` enum value via a goose migration in `backend/migrations/sql/`.
7. Add the provider icon in `frontend/src/components/icons/<name>.tsx` and register it in `frontend/src/components/icons/provider-icon.tsx`.
8. Update the GraphQL schema/types and frontend settings page if needed.

### Code Generation

When modifying `backend/pkg/graph/schema.graphqls`, re-run the gqlgen command to regenerate resolver stubs. When modifying REST handler annotations, re-run swag to update Swagger docs. When modifying `frontend/src/graphql/*.graphql` query files, re-run `npm run graphql:generate` to update TypeScript types.

### Utility Binaries

The backend contains helper binaries for development/testing:
- `cmd/ctester/` — tests container execution
- `cmd/ftester/` — tests LLM function/tool calling
- `cmd/etester/` — tests embedding providers
- `cmd/installer/` — interactive TUI wizard for guided deployment setup (configures `.env`, Docker Compose, DB, search engines, etc.)


================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1.4

# STEP 1: Build the frontend
FROM node:23-slim as fe-build

ENV NODE_ENV=production
ENV VITE_BUILD_MEMORY_LIMIT=4096
ENV NODE_OPTIONS="--max-old-space-size=4096"

WORKDIR /frontend

# Install build essentials
RUN apt-get update && apt-get install -y \
    ca-certificates \
    tzdata \
    gcc \
    g++ \
    make \
    git

COPY ./backend/pkg/graph/schema.graphqls ../backend/pkg/graph/
COPY frontend/ .

# Install dependencies with package manager detection for SBOM
RUN --mount=type=cache,target=/root/.npm \
    npm ci --include=dev

# Build frontend with optimizations and parallel processing
RUN npm run build -- \
    --mode production \
    --minify esbuild \
    --outDir dist \
    --emptyOutDir \
    --sourcemap false \
    --target es2020

# STEP 2: Build the backend
FROM golang:1.24-bookworm as be-build

# Build arguments for version information
ARG PACKAGE_VER=develop
ARG PACKAGE_REV=

ENV CGO_ENABLED=0
ENV GO111MODULE=on

# Install build essentials
RUN apt-get update && apt-get install -y \
    ca-certificates \
    tzdata \
    gcc \
    g++ \
    make \
    git \
    musl-dev

WORKDIR /backend

COPY backend/ .

# Download dependencies with module detection for SBOM
RUN --mount=type=cache,target=/go/pkg/mod \
    go mod download

# Build backend with version information
RUN go build -trimpath \
    -ldflags "\
        -X pentagi/pkg/version.PackageName=pentagi \
        -X pentagi/pkg/version.PackageVer=${PACKAGE_VER} \
        -X pentagi/pkg/version.PackageRev=${PACKAGE_REV}" \
    -o /pentagi ./cmd/pentagi

# Build ctester utility
RUN go build -trimpath \
    -ldflags "\
        -X pentagi/pkg/version.PackageName=ctester \
        -X pentagi/pkg/version.PackageVer=${PACKAGE_VER} \
        -X pentagi/pkg/version.PackageRev=${PACKAGE_REV}" \
    -o /ctester ./cmd/ctester

# Build ftester utility
RUN go build -trimpath \
    -ldflags "\
        -X pentagi/pkg/version.PackageName=ftester \
        -X pentagi/pkg/version.PackageVer=${PACKAGE_VER} \
        -X pentagi/pkg/version.PackageRev=${PACKAGE_REV}" \
    -o /ftester ./cmd/ftester

# Build etester utility
RUN go build -trimpath \
    -ldflags "\
        -X pentagi/pkg/version.PackageName=etester \
        -X pentagi/pkg/version.PackageVer=${PACKAGE_VER} \
        -X pentagi/pkg/version.PackageRev=${PACKAGE_REV}" \
    -o /etester ./cmd/etester

# STEP 3: Build the final image
FROM alpine:3.23.3

# Create non-root user and docker group with specific GID
RUN addgroup -g 998 docker && \
    addgroup -S pentagi && \
    adduser -S pentagi -G pentagi && \
    addgroup pentagi docker

# Install required packages
RUN apk --no-cache add ca-certificates openssl openssh-keygen shadow

ADD scripts/entrypoint.sh /opt/pentagi/bin/

RUN sed -i 's/\r//' /opt/pentagi/bin/entrypoint.sh && \
    chmod +x /opt/pentagi/bin/entrypoint.sh

RUN mkdir -p \
    /root/.ollama \
    /opt/pentagi/bin \
    /opt/pentagi/ssl \
    /opt/pentagi/fe \
    /opt/pentagi/logs \
    /opt/pentagi/data \
    /opt/pentagi/conf && \
    chmod 777 /root/.ollama

COPY --from=be-build /pentagi /opt/pentagi/bin/pentagi
COPY --from=be-build /ctester /opt/pentagi/bin/ctester
COPY --from=be-build /ftester /opt/pentagi/bin/ftester
COPY --from=be-build /etester /opt/pentagi/bin/etester
COPY --from=fe-build /frontend/dist /opt/pentagi/fe

# Copy provider configuration files
COPY examples/configs/custom-openai.provider.yml /opt/pentagi/conf/
COPY examples/configs/deepinfra.provider.yml /opt/pentagi/conf/
COPY examples/configs/deepseek.provider.yml /opt/pentagi/conf/
COPY examples/configs/moonshot.provider.yml /opt/pentagi/conf/
COPY examples/configs/ollama-llama318b-instruct.provider.yml /opt/pentagi/conf/
COPY examples/configs/ollama-llama318b.provider.yml /opt/pentagi/conf/
COPY examples/configs/ollama-qwen332b-fp16-tc.provider.yml /opt/pentagi/conf/
COPY examples/configs/ollama-qwq32b-fp16-tc.provider.yml /opt/pentagi/conf/
COPY examples/configs/openrouter.provider.yml /opt/pentagi/conf/
COPY examples/configs/novita.provider.yml /opt/pentagi/conf/
COPY examples/configs/vllm-qwen3.5-27b-fp8.provider.yml /opt/pentagi/conf/
COPY examples/configs/vllm-qwen3.5-27b-fp8-no-think.provider.yml /opt/pentagi/conf/
COPY examples/configs/vllm-qwen332b-fp16.provider.yml /opt/pentagi/conf/

COPY LICENSE /opt/pentagi/LICENSE
COPY NOTICE /opt/pentagi/NOTICE
COPY EULA.md /opt/pentagi/EULA
COPY EULA.md /opt/pentagi/fe/EULA.md

RUN chown -R pentagi:pentagi /opt/pentagi

WORKDIR /opt/pentagi

USER pentagi

ENTRYPOINT ["/opt/pentagi/bin/entrypoint.sh", "/opt/pentagi/bin/pentagi"]

# Image Metadata
LABEL org.opencontainers.image.source="https://github.com/vxcontrol/pentagi"
LABEL org.opencontainers.image.description="Fully autonomous AI Agents system capable of performing complex penetration testing tasks"
LABEL org.opencontainers.image.authors="PentAGI Development Team"
LABEL org.opencontainers.image.licenses="MIT License"


================================================
FILE: EULA.md
================================================
# PentAGI End User License Agreement

## Introduction

This **End User License Agreement (EULA)** governs the terms and conditions for the use of PentAGI, an advanced AI-powered penetration testing tool. This product is provided by the **PentAGI Development Team**, and is distributed in the form of [source code](https://github.com/vxcontrol/pentagi) available on GitHub under the MIT license as well as [pre-built Docker images](https://hub.docker.com/r/vxcontrol/pentagi) available on Docker Hub.

Users agree to this EULA when downloading either the source code or the Docker images or by accessing the product's interface through its web UI. It is the user's responsibility to ensure compliance with all applicable laws and standards when utilizing PentAGI. This product is intended for lawful penetration testing purposes and research purposes only and does not inherently possess tools used for executing cyber attacks. Instead, it facilitates the download of publicly available penetration testing tools such as those from Kali Linux or other similar distributions.

PentAGI operates independently of services provided by the Developers and allows users to self-deploy all components. Users initiate interaction through a web user interface, which is part of the product itself. Integration with external LLM providers and search systems requires careful oversight by the user to ensure data compliance, including regulations like GDPR.

The **PentAGI Development Team** can be contacted via GitHub or through the email address [info@pentagi.com](mailto:info@pentagi.com). This document should be reviewed in its entirety to fully understand the terms and legal obligations therein.

## License Grant

Under this EULA, the **PentAGI Development Team** grants you a non-exclusive, non-transferable, revocable license to use the PentAGI software solely for lawful penetration testing purposes. This license is effective when you download the source code or Docker images and remains in effect until terminated as outlined in this agreement.

The source code of PentAGI is provided under the MIT license, the terms of which are incorporated herein by reference. This EULA governs your use of the PentAGI software as a whole, including any pre-built Docker images and the web UI, and applies in addition to the MIT license. In the event of any conflict between this EULA and the MIT license, the terms of the MIT license shall prevail with respect to the source code.

You are permitted to use the PentAGI software on your own infrastructure, self-deploying all components according to provided documentation. The license covers usage as allowed by the MIT license under which the source code is distributed, but does not extend to any proprietary tools that may be downloaded or used in conjunction with the PentAGI software.

You may not sublicense, sell, lease, or distribute the PentAGI software or its derivatives in any form other than stated in the license agreement. Modification and redistribution are permitted under the MIT license conditions; however, the **PentAGI Development Team** holds no responsibility for any alterations not published by them through the official GitHub or Docker Hub pages.

## Acceptable Use

PentAGI is to be used exclusively for authorized penetration testing and security assessments in environments where you have explicit permission from the network owner. You must ensure that all usage complies with applicable laws, standards, and regulations, particularly those concerning cybersecurity and data protection.

You are solely responsible for the execution and outcomes of any tasks set for AI agents within the PentAGI interface. The logic and actions of the AI agents are strictly determined by the tasks and instructions you provide. The **PentAGI Development Team** does not supervise or control the actions of the AI agents and is not responsible for any consequences arising from their actions. You must verify that all data sent to AI agents, external LLM providers, search systems, or stored within PentAGI complies with legal standards and regulations, including but not limited to GDPR.

You must not use PentAGI in any critical infrastructure, emergency response systems, or other high-risk environments without proper testing and validation. The software is intended for research and testing purposes only and should not be deployed in production environments without thorough security assessment.

Using PentAGI for any activity that violates laws or regulations, including but not limited to unauthorized network access, is strictly prohibited. Users found using the software for illegal purposes may have their license revoked and could face further legal consequences, as determined by law enforcement.

## Data Privacy and Security

You acknowledge that PentAGI may process sensitive information during penetration testing activities. You are solely responsible for ensuring that all data processing complies with applicable privacy laws and regulations, including GDPR, CCPA, and other relevant data protection regulations.

The **PentAGI Development Team** does not collect, store, or process any user data through the software. All data processing occurs locally within your infrastructure or through third-party services that you configure. You are responsible for implementing appropriate security measures to protect any sensitive data processed through PentAGI.

When using PentAGI's integration capabilities with external services, you must ensure that all data transfers comply with applicable data protection regulations and that you have obtained necessary consents for data processing.

## Third-Party Services

PentAGI integrates with external third-party services, including but not limited to Large Language Model (LLM) providers such as OpenAI, Anthropic, Deep Infra, OpenRouter, and search engines such as Tavily, Traversaal, Perplexity, DuckDuckGo, Google, Sploitus and Searxng. You acknowledge and agree that your use of these third-party services is at your sole discretion and responsibility.

When using self-hosted or local LLM servers compatible with OpenAI API, you are solely responsible for ensuring the security and compliance of these deployments. The PentAGI Development Team bears no responsibility for any data leaks or security issues arising from the use of such local deployments.

The **PentAGI Development Team** does not control and is not responsible for any content, data, or privacy practices of these third-party services. You are responsible for ensuring that your use of these services, including any data you transmit to them, complies with all applicable laws and regulations, including data protection and privacy laws such as the General Data Protection Regulation (GDPR).

By using PentAGI's integration with third-party services, you agree to comply with any terms and conditions imposed by those services. The **PentAGI Development Team** disclaims any and all liability arising from your use of third-party services and makes no representations or warranties regarding the functionality or security of these services.

## Disclaimer of Warranties

PentAGI is provided "as is" and "as available," with all faults and without warranty of any kind. To the maximum extent permitted by applicable law, the **PentAGI Development Team** disclaims all warranties, whether express, implied, statutory, or otherwise, regarding the software, including without limitation any warranties of merchantability, fitness for a particular purpose, title, and non-infringement.

The **PentAGI Development Team** disclaims any liability for actions performed by AI agents within the software, or for any data transmitted to third-party services by the user.

The Developers do not warrant that the PentAGI software will operate uninterrupted or error-free, that defects will be corrected, or that the software is free of viruses or other harmful components. Your use of the software is at your sole risk, and you assume full responsibility for any costs or losses incurred.

## Limitation of Liability

To the fullest extent permitted by law, in no event shall the **PentAGI Development Team** be liable for any direct, indirect, incidental, special, consequential, or punitive damages, including but not limited to lost profits, lost savings, business interruption, or loss of data, arising out of your use or inability to use the PentAGI software, even if advised of the possibility of such damages.

The **PentAGI Development Team** shall not be liable for any damages or losses resulting from the actions of AI agents operated through PentAGI, or from the use of third-party services integrated with PentAGI.

The **PentAGI Development Team** shall not be liable for any damages or losses resulting from modifications to the source code, whether made by you or third parties, including but not limited to forks of the GitHub repository or modified Docker images not officially published by the PentAGI Development Team.

The total cumulative liability of the **PentAGI Development Team** arising from or related to this EULA, whether in contract, tort, or otherwise, shall not exceed the amount paid by you for the software.

## Indemnification

You agree to indemnify, defend, and hold harmless the **PentAGI Development Team**, its members, and any of its contractors, suppliers, or affiliates from and against any and all claims, liabilities, damages, losses, or expenses, including reasonable attorneys' fees and costs, arising out of or in any way connected to your use of the PentAGI software, your violation of this EULA, or your violation of any law or the rights of a third party.

## Termination

This EULA is effective until terminated either by you or by the **PentAGI Development Team**. You may terminate this agreement at any time by ceasing all use of the PentAGI software and destroying all copies in your possession.

The **PentAGI Development Team** reserves the right to terminate this EULA and your access to the software immediately, without notice, if you breach any term of this agreement. Upon termination, you must cease all use of the software and destroy all copies, whether full or partial, in your possession.

## Governing Law and Dispute Resolution

This EULA and any disputes arising out of or related to it shall be governed by and construed in accordance with the laws of the United Kingdom, without regard to its conflict of law principles.

Any and all disputes arising under or in connection with this EULA shall be resolved through negotiations. If the parties cannot resolve a dispute through good-faith negotiations within 90 days, they agree to submit the dispute to binding arbitration under the rules of an arbitration body in the United Kingdom. The language of arbitration shall be English.

## Miscellaneous Provisions

This EULA constitutes the entire agreement between you and the **PentAGI Development Team** regarding the use of PentAGI and supersedes all prior agreements and understandings. If any provision of this EULA is found to be invalid or unenforceable, the remainder shall continue to be fully enforceable and effective.

The **PentAGI Development Team** publishes official updates and versions of the software only on the GitHub repository at [vxcontrol/pentagi](https://github.com/vxcontrol/pentagi) and on Docker Hub at [vxcontrol/pentagi](https://hub.docker.com/r/vxcontrol/pentagi). Any forks, derivative works, or modified versions of the software are not endorsed by the **PentAGI Development Team**, and the team bears no responsibility for such versions.

The Developers reserve the right to modify this EULA at any time by posting the revised EULA on the official PentAGI GitHub page or notifying users via email. Any modifications will be effective immediately upon posting or notification for the next product versions.

Failure by either party to enforce any provision of this EULA shall not constitute a waiver of future enforcement of that or any other provision.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2025 PentAGI Development Team

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: NOTICE
================================================
PentAGI, Fully autonomous AI Agent capable of performing complex penetration testing tasks.

Copyright 2025 PentAGI Development Team

Licensed under MIT License. See LICENSE and EULA for terms.

NOTICE: This software integrates VXControl Cloud SDK for enhanced intelligence services.
VXControl Cloud SDK is licensed under AGPL-3.0 with a special exception for this official PentAGI project.
For more details, see the License section in README.md and VXControl Cloud SDK license terms.


================================================
FILE: README.md
================================================
# PentAGI

<div align="center" style="font-size: 1.5em; margin: 20px 0;">
    <strong>P</strong>enetration testing <strong>A</strong>rtificial <strong>G</strong>eneral <strong>I</strong>ntelligence
</div>
<br>
<div align="center">

> **Join the Community!** Connect with security researchers, AI enthusiasts, and fellow ethical hackers. Get support, share insights, and stay updated with the latest PentAGI developments.

[![Discord](https://img.shields.io/badge/Discord-7289DA?logo=discord&logoColor=white)](https://discord.gg/2xrMh7qX6m)⠀[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?logo=telegram&logoColor=white)](https://t.me/+Ka9i6CNwe71hMWQy)

<a href="https://trendshift.io/repositories/15161" target="_blank"><img src="https://trendshift.io/api/badge/repositories/15161" alt="vxcontrol%2Fpentagi | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>

</div>

## Table of Contents

- [Overview](#-overview)
- [Features](#-features)
- [Quick Start](#-quick-start)
- [API Access](#-api-access)
- [Advanced Setup](#-advanced-setup)
- [Development](#-development)
- [Testing LLM Agents](#-testing-llm-agents)
- [Embedding Configuration and Testing](#-embedding-configuration-and-testing)
- [Function Testing with ftester](#-function-testing-with-ftester)
- [Building](#%EF%B8%8F-building)
- [Credits](#-credits)
- [License](#-license)

## Overview

PentAGI is an innovative tool for automated security testing that leverages cutting-edge artificial intelligence technologies. The project is designed for information security professionals, researchers, and enthusiasts who need a powerful and flexible solution for conducting penetration tests.

You can watch the video **PentAGI overview**:
[![PentAGI Overview Video](https://github.com/user-attachments/assets/0828dc3e-15f1-4a1d-858e-9696a146e478)](https://youtu.be/R70x5Ddzs1o)

## Features

- Secure & Isolated. All operations are performed in a sandboxed Docker environment with complete isolation.
- Fully Autonomous. AI-powered agent that automatically determines and executes penetration testing steps with optional execution monitoring and intelligent task planning for enhanced reliability.
- Professional Pentesting Tools. Built-in suite of 20+ professional security tools including nmap, metasploit, sqlmap, and more.
- Smart Memory System. Long-term storage of research results and successful approaches for future use.
- Knowledge Graph Integration. Graphiti-powered knowledge graph using Neo4j for semantic relationship tracking and advanced context understanding.
- Web Intelligence. Built-in browser via [scraper](https://hub.docker.com/r/vxcontrol/scraper) for gathering latest information from web sources.
- External Search Systems. Integration with advanced search APIs including [Tavily](https://tavily.com), [Traversaal](https://traversaal.ai), [Perplexity](https://www.perplexity.ai), [DuckDuckGo](https://duckduckgo.com/), [Google Custom Search](https://programmablesearchengine.google.com/), [Sploitus Search](https://sploitus.com) and [Searxng](https://searxng.org) for comprehensive information gathering.
- Team of Specialists. Delegation system with specialized AI agents for research, development, and infrastructure tasks, enhanced with optional execution monitoring and intelligent task planning for optimal performance with smaller models.
- Comprehensive Monitoring. Detailed logging and integration with Grafana/Prometheus for real-time system observation.
- Detailed Reporting. Generation of thorough vulnerability reports with exploitation guides.
- Smart Container Management. Automatic Docker image selection based on specific task requirements.
- Modern Interface. Clean and intuitive web UI for system management and monitoring.
- Comprehensive APIs. Full-featured REST and GraphQL APIs with Bearer token authentication for automation and integration.
- Persistent Storage. All commands and outputs are stored in PostgreSQL with [pgvector](https://hub.docker.com/r/vxcontrol/pgvector) extension.
- Scalable Architecture. Microservices-based design supporting horizontal scaling.
- Self-Hosted Solution. Complete control over your deployment and data.
- Flexible Authentication. Support for 10+ LLM providers ([OpenAI](https://platform.openai.com/), [Anthropic](https://www.anthropic.com/), [Google AI/Gemini](https://ai.google.dev/), [AWS Bedrock](https://aws.amazon.com/bedrock/), [Ollama](https://ollama.com/), [DeepSeek](https://www.deepseek.com/en/), [GLM](https://z.ai/), [Kimi](https://platform.moonshot.ai/), [Qwen](https://www.alibabacloud.com/en/), Custom) plus aggregators ([OpenRouter](https://openrouter.ai/), [DeepInfra](https://deepinfra.com/)). For production local deployments, see our [vLLM + Qwen3.5-27B-FP8 guide](examples/guides/vllm-qwen35-27b-fp8.md).
- API Token Authentication. Secure Bearer token system for programmatic access to REST and GraphQL APIs.
- Quick Deployment. Easy setup through [Docker Compose](https://docs.docker.com/compose/) with comprehensive environment configuration.

## Architecture

### System Context

```mermaid
flowchart TB
    classDef person fill:#08427B,stroke:#073B6F,color:#fff
    classDef system fill:#1168BD,stroke:#0B4884,color:#fff
    classDef external fill:#666666,stroke:#0B4884,color:#fff

    pentester["👤 Security Engineer
    (User of the system)"]

    pentagi["✨ PentAGI
    (Autonomous penetration testing system)"]

    target["🎯 target-system
    (System under test)"]
    llm["🧠 llm-provider
    (OpenAI/Anthropic/Ollama/Bedrock/Gemini/Custom)"]
    search["🔍 search-systems
    (Google/DuckDuckGo/Tavily/Traversaal/Perplexity/Sploitus/Searxng)"]
    langfuse["📊 langfuse-ui
    (LLM Observability Dashboard)"]
    grafana["📈 grafana
    (System Monitoring Dashboard)"]

    pentester --> |Uses HTTPS| pentagi
    pentester --> |Monitors AI HTTPS| langfuse
    pentester --> |Monitors System HTTPS| grafana
    pentagi --> |Tests Various protocols| target
    pentagi --> |Queries HTTPS| llm
    pentagi --> |Searches HTTPS| search
    pentagi --> |Reports HTTPS| langfuse
    pentagi --> |Reports HTTPS| grafana

    class pentester person
    class pentagi system
    class target,llm,search,langfuse,grafana external

    linkStyle default stroke:#ffffff,color:#ffffff
```

<details>
<summary><b>Container Architecture</b> (click to expand)</summary>

```mermaid
graph TB
    subgraph Core Services
        UI[Frontend UI<br/>React + TypeScript]
        API[Backend API<br/>Go + GraphQL]
        DB[(Vector Store<br/>PostgreSQL + pgvector)]
        MQ[Task Queue<br/>Async Processing]
        Agent[AI Agents<br/>Multi-Agent System]
    end

    subgraph Knowledge Graph
        Graphiti[Graphiti<br/>Knowledge Graph API]
        Neo4j[(Neo4j<br/>Graph Database)]
    end

    subgraph Monitoring
        Grafana[Grafana<br/>Dashboards]
        VictoriaMetrics[VictoriaMetrics<br/>Time-series DB]
        Jaeger[Jaeger<br/>Distributed Tracing]
        Loki[Loki<br/>Log Aggregation]
        OTEL[OpenTelemetry<br/>Data Collection]
    end

    subgraph Analytics
        Langfuse[Langfuse<br/>LLM Analytics]
        ClickHouse[ClickHouse<br/>Analytics DB]
        Redis[Redis<br/>Cache + Rate Limiter]
        MinIO[MinIO<br/>S3 Storage]
    end

    subgraph Security Tools
        Scraper[Web Scraper<br/>Isolated Browser]
        PenTest[Security Tools<br/>20+ Pro Tools<br/>Sandboxed Execution]
    end

    UI --> |HTTP/WS| API
    API --> |SQL| DB
    API --> |Events| MQ
    MQ --> |Tasks| Agent
    Agent --> |Commands| PenTest
    Agent --> |Queries| DB
    Agent --> |Knowledge| Graphiti
    Graphiti --> |Graph| Neo4j

    API --> |Telemetry| OTEL
    OTEL --> |Metrics| VictoriaMetrics
    OTEL --> |Traces| Jaeger
    OTEL --> |Logs| Loki

    Grafana --> |Query| VictoriaMetrics
    Grafana --> |Query| Jaeger
    Grafana --> |Query| Loki

    API --> |Analytics| Langfuse
    Langfuse --> |Store| ClickHouse
    Langfuse --> |Cache| Redis
    Langfuse --> |Files| MinIO

    classDef core fill:#f9f,stroke:#333,stroke-width:2px,color:#000
    classDef knowledge fill:#ffa,stroke:#333,stroke-width:2px,color:#000
    classDef monitoring fill:#bbf,stroke:#333,stroke-width:2px,color:#000
    classDef analytics fill:#bfb,stroke:#333,stroke-width:2px,color:#000
    classDef tools fill:#fbb,stroke:#333,stroke-width:2px,color:#000

    class UI,API,DB,MQ,Agent core
    class Graphiti,Neo4j knowledge
    class Grafana,VictoriaMetrics,Jaeger,Loki,OTEL monitoring
    class Langfuse,ClickHouse,Redis,MinIO analytics
    class Scraper,PenTest tools
```

</details>

<details>
<summary><b>Entity Relationship</b> (click to expand)</summary>

```mermaid
erDiagram
    Flow ||--o{ Task : contains
    Task ||--o{ SubTask : contains
    SubTask ||--o{ Action : contains
    Action ||--o{ Artifact : produces
    Action ||--o{ Memory : stores

    Flow {
        string id PK
        string name "Flow name"
        string description "Flow description"
        string status "active/completed/failed"
        json parameters "Flow parameters"
        timestamp created_at
        timestamp updated_at
    }

    Task {
        string id PK
        string flow_id FK
        string name "Task name"
        string description "Task description"
        string status "pending/running/done/failed"
        json result "Task results"
        timestamp created_at
        timestamp updated_at
    }

    SubTask {
        string id PK
        string task_id FK
        string name "Subtask name"
        string description "Subtask description"
        string status "queued/running/completed/failed"
        string agent_type "researcher/developer/executor"
        json context "Agent context"
        timestamp created_at
        timestamp updated_at
    }

    Action {
        string id PK
        string subtask_id FK
        string type "command/search/analyze/etc"
        string status "success/failure"
        json parameters "Action parameters"
        json result "Action results"
        timestamp created_at
    }

    Artifact {
        string id PK
        string action_id FK
        string type "file/report/log"
        string path "Storage path"
        json metadata "Additional info"
        timestamp created_at
    }

    Memory {
        string id PK
        string action_id FK
        string type "observation/conclusion"
        vector embedding "Vector representation"
        text content "Memory content"
        timestamp created_at
    }
```

</details>

<details>
<summary><b>Agent Interaction</b> (click to expand)</summary>

```mermaid
sequenceDiagram
    participant O as Orchestrator
    participant R as Researcher
    participant D as Developer
    participant E as Executor
    participant VS as Vector Store
    participant KB as Knowledge Base

    Note over O,KB: Flow Initialization
    O->>VS: Query similar tasks
    VS-->>O: Return experiences
    O->>KB: Load relevant knowledge
    KB-->>O: Return context

    Note over O,R: Research Phase
    O->>R: Analyze target
    R->>VS: Search similar cases
    VS-->>R: Return patterns
    R->>KB: Query vulnerabilities
    KB-->>R: Return known issues
    R->>VS: Store findings
    R-->>O: Research results

    Note over O,D: Planning Phase
    O->>D: Plan attack
    D->>VS: Query exploits
    VS-->>D: Return techniques
    D->>KB: Load tools info
    KB-->>D: Return capabilities
    D-->>O: Attack plan

    Note over O,E: Execution Phase
    O->>E: Execute plan
    E->>KB: Load tool guides
    KB-->>E: Return procedures
    E->>VS: Store results
    E-->>O: Execution status
```

</details>

<details>
<summary><b>Memory System</b> (click to expand)</summary>

```mermaid
graph TB
    subgraph "Long-term Memory"
        VS[(Vector Store<br/>Embeddings DB)]
        KB[Knowledge Base<br/>Domain Expertise]
        Tools[Tools Knowledge<br/>Usage Patterns]
    end

    subgraph "Working Memory"
        Context[Current Context<br/>Task State]
        Goals[Active Goals<br/>Objectives]
        State[System State<br/>Resources]
    end

    subgraph "Episodic Memory"
        Actions[Past Actions<br/>Commands History]
        Results[Action Results<br/>Outcomes]
        Patterns[Success Patterns<br/>Best Practices]
    end

    Context --> |Query| VS
    VS --> |Retrieve| Context

    Goals --> |Consult| KB
    KB --> |Guide| Goals

    State --> |Record| Actions
    Actions --> |Learn| Patterns
    Patterns --> |Store| VS

    Tools --> |Inform| State
    Results --> |Update| Tools

    VS --> |Enhance| KB
    KB --> |Index| VS

    classDef ltm fill:#f9f,stroke:#333,stroke-width:2px,color:#000
    classDef wm fill:#bbf,stroke:#333,stroke-width:2px,color:#000
    classDef em fill:#bfb,stroke:#333,stroke-width:2px,color:#000

    class VS,KB,Tools ltm
    class Context,Goals,State wm
    class Actions,Results,Patterns em
```

</details>

<details>
<summary><b>Chain Summarization</b> (click to expand)</summary>

The chain summarization system manages conversation context growth by selectively summarizing older messages. This is critical for preventing token limits from being exceeded while maintaining conversation coherence.

```mermaid
flowchart TD
    A[Input Chain] --> B{Needs Summarization?}
    B -->|No| C[Return Original Chain]
    B -->|Yes| D[Convert to ChainAST]
    D --> E[Apply Section Summarization]
    E --> F[Process Oversized Pairs]
    F --> G[Manage Last Section Size]
    G --> H[Apply QA Summarization]
    H --> I[Rebuild Chain with Summaries]
    I --> J{Is New Chain Smaller?}
    J -->|Yes| K[Return Optimized Chain]
    J -->|No| C

    classDef process fill:#bbf,stroke:#333,stroke-width:2px,color:#000
    classDef decision fill:#bfb,stroke:#333,stroke-width:2px,color:#000
    classDef output fill:#fbb,stroke:#333,stroke-width:2px,color:#000

    class A,D,E,F,G,H,I process
    class B,J decision
    class C,K output
```

The algorithm operates on a structured representation of conversation chains (ChainAST) that preserves message types including tool calls and their responses. All summarization operations maintain critical conversation flow while reducing context size.

### Global Summarizer Configuration Options

| Parameter             | Environment Variable             | Default | Description                                                |
| --------------------- | -------------------------------- | ------- | ---------------------------------------------------------- |
| Preserve Last         | `SUMMARIZER_PRESERVE_LAST`       | `true`  | Whether to keep all messages in the last section intact    |
| Use QA Pairs          | `SUMMARIZER_USE_QA`              | `true`  | Whether to use QA pair summarization strategy              |
| Summarize Human in QA | `SUMMARIZER_SUM_MSG_HUMAN_IN_QA` | `false` | Whether to summarize human messages in QA pairs            |
| Last Section Size     | `SUMMARIZER_LAST_SEC_BYTES`      | `51200` | Maximum byte size for last section (50KB)                  |
| Max Body Pair Size    | `SUMMARIZER_MAX_BP_BYTES`        | `16384` | Maximum byte size for a single body pair (16KB)            |
| Max QA Sections       | `SUMMARIZER_MAX_QA_SECTIONS`     | `10`    | Maximum QA pair sections to preserve                       |
| Max QA Size           | `SUMMARIZER_MAX_QA_BYTES`        | `65536` | Maximum byte size for QA pair sections (64KB)              |
| Keep QA Sections      | `SUMMARIZER_KEEP_QA_SECTIONS`    | `1`     | Number of recent QA sections to keep without summarization |

### Assistant Summarizer Configuration Options

Assistant instances can use customized summarization settings to fine-tune context management behavior:

| Parameter          | Environment Variable                    | Default | Description                                                          |
| ------------------ | --------------------------------------- | ------- | -------------------------------------------------------------------- |
| Preserve Last      | `ASSISTANT_SUMMARIZER_PRESERVE_LAST`    | `true`  | Whether to preserve all messages in the assistant's last section     |
| Last Section Size  | `ASSISTANT_SUMMARIZER_LAST_SEC_BYTES`   | `76800` | Maximum byte size for assistant's last section (75KB)                |
| Max Body Pair Size | `ASSISTANT_SUMMARIZER_MAX_BP_BYTES`     | `16384` | Maximum byte size for a single body pair in assistant context (16KB) |
| Max QA Sections    | `ASSISTANT_SUMMARIZER_MAX_QA_SECTIONS`  | `7`     | Maximum QA sections to preserve in assistant context                 |
| Max QA Size        | `ASSISTANT_SUMMARIZER_MAX_QA_BYTES`     | `76800` | Maximum byte size for assistant's QA sections (75KB)                 |
| Keep QA Sections   | `ASSISTANT_SUMMARIZER_KEEP_QA_SECTIONS` | `3`     | Number of recent QA sections to preserve without summarization       |

The assistant summarizer configuration provides more memory for context retention compared to the global settings, preserving more recent conversation history while still ensuring efficient token usage.

### Summarizer Environment Configuration

```bash
# Default values for global summarizer logic
SUMMARIZER_PRESERVE_LAST=true
SUMMARIZER_USE_QA=true
SUMMARIZER_SUM_MSG_HUMAN_IN_QA=false
SUMMARIZER_LAST_SEC_BYTES=51200
SUMMARIZER_MAX_BP_BYTES=16384
SUMMARIZER_MAX_QA_SECTIONS=10
SUMMARIZER_MAX_QA_BYTES=65536
SUMMARIZER_KEEP_QA_SECTIONS=1

# Default values for assistant summarizer logic
ASSISTANT_SUMMARIZER_PRESERVE_LAST=true
ASSISTANT_SUMMARIZER_LAST_SEC_BYTES=76800
ASSISTANT_SUMMARIZER_MAX_BP_BYTES=16384
ASSISTANT_SUMMARIZER_MAX_QA_SECTIONS=7
ASSISTANT_SUMMARIZER_MAX_QA_BYTES=76800
ASSISTANT_SUMMARIZER_KEEP_QA_SECTIONS=3
```

</details>

<details>
<summary><b>Advanced Agent Supervision</b> (click to expand)</summary>

PentAGI includes sophisticated multi-layered agent supervision mechanisms to ensure efficient task execution, prevent infinite loops, and provide intelligent recovery from stuck states:

### Execution Monitoring (Beta)
- **Automatic Mentor Intervention**: Adviser agent (mentor) is automatically invoked when execution patterns indicate potential issues
- **Pattern Detection**: Monitors identical tool calls (threshold: 5, configurable) and total tool calls (threshold: 10, configurable)
- **Progress Analysis**: Evaluates whether agent advances toward subtask objective, detects loops and inefficiencies
- **Alternative Strategies**: Recommends different approaches when current strategy fails
- **Information Retrieval Guidance**: Suggests searching for established solutions instead of reinventing
- **Enhanced Response Format**: Tool responses include both `<original_result>` and `<mentor_analysis>` sections
- **Configurable**: Enable via `EXECUTION_MONITOR_ENABLED` (default: false), customize thresholds with `EXECUTION_MONITOR_SAME_TOOL_LIMIT` and `EXECUTION_MONITOR_TOTAL_TOOL_LIMIT`

**Best for**: Smaller models (< 32B parameters), complex attack scenarios requiring continuous guidance, preventing agents from getting stuck on single approach

**Performance Impact**: 2-3x increase in execution time and token usage, but delivers **2x improvement in result quality** based on testing with Qwen3.5-27B-FP8

### Intelligent Task Planning (Beta)
- **Automated Decomposition**: Planner (adviser in planning mode) generates 3-7 specific, actionable steps before specialist agents begin work
- **Context-Aware Plans**: Analyzes full execution context via enricher agent to create informed plans
- **Structured Assignment**: Original request wrapped in `<task_assignment>` structure with execution plan and instructions
- **Scope Management**: Prevents scope creep by keeping agents focused on current subtask only
- **Enriched Instructions**: Plans highlight critical actions, potential pitfalls, and verification points
- **Configurable**: Enable via `AGENT_PLANNING_STEP_ENABLED` (default: false)

**Best for**: Models < 32B parameters, complex penetration testing workflows, improving success rates on sophisticated tasks

**Enhanced Adviser Configuration**: Works exceptionally well when adviser agent uses stronger model or enhanced settings. Example: using same base model with maximum reasoning mode for adviser (see [`vllm-qwen3.5-27b-fp8.provider.yml`](examples/configs/vllm-qwen3.5-27b-fp8.provider.yml)) enables comprehensive task analysis and strategic planning from identical model architecture.

**Performance Impact**: Adds planning overhead but significantly improves completion rates and reduces redundant work

### Tool Call Limits (Always Active)
- **Hard Limits**: Prevent runaway executions regardless of supervision mode status
- **Differentiated by Agent Type**:
  - General agents (Assistant, Primary Agent, Pentester, Coder, Installer): `MAX_GENERAL_AGENT_TOOL_CALLS` (default: 100)
  - Limited agents (Searcher, Enricher, Memorist, Generator, Reporter, Adviser, Reflector, Planner): `MAX_LIMITED_AGENT_TOOL_CALLS` (default: 20)
- **Graceful Termination**: Reflector guides agents to proper completion when approaching limits
- **Resource Protection**: Ensures system stability and prevents resource exhaustion

### Reflector Integration (Always Active)
- **Automatic Correction**: Invoked when LLM fails to generate tool calls after 3 attempts
- **Strategic Guidance**: Analyzes failures and guides agents toward proper tool usage or barrier tools (`done`, `ask`)
- **Recovery Mechanism**: Provides contextual guidance based on specific failure patterns
- **Limit Enforcement**: Coordinates graceful termination when tool call limits are reached

### Recommendations for Open Source Models

**Must-Have for Models < 32B Parameters**:
Testing with Qwen3.5-27B-FP8 demonstrates that enabling both Execution Monitoring and Task Planning is **essential** for smaller open source models:
- **Quality Improvement**: 2x better results compared to baseline execution without supervision
- **Loop Prevention**: Significantly reduces infinite loops and redundant work
- **Attack Diversity**: Encourages exploration of multiple attack vectors instead of fixating on single approach
- **Air-Gapped Deployments**: Enables production-grade autonomous pentesting in closed network environments with local LLM inference

**Trade-offs**:
- Token consumption: 2-3x increase due to mentor/planner invocations
- Execution time: 2-3x longer due to analysis and planning steps
- Result quality: 2x improvement in completeness, accuracy, and attack coverage
- Model requirements: Works best when adviser uses enhanced configuration (higher reasoning parameters, stronger model variant, or different model)

**Configuration Strategy**:
For optimal performance with smaller models, configure adviser agent with enhanced settings:
- Use same model with maximum reasoning mode (example: [`vllm-qwen3.5-27b-fp8.provider.yml`](examples/configs/vllm-qwen3.5-27b-fp8.provider.yml))
- Or use stronger model for adviser while keeping base model for other agents
- Adjust monitoring thresholds based on task complexity and model capabilities



</details>

The architecture of PentAGI is designed to be modular, scalable, and secure. Here are the key components:

1. **Core Services**
   - Frontend UI: React-based web interface with TypeScript for type safety
   - Backend API: Go-based REST and GraphQL APIs with Bearer token authentication for programmatic access
   - Vector Store: PostgreSQL with pgvector for semantic search and memory storage
   - Task Queue: Async task processing system for reliable operation
   - AI Agent: Multi-agent system with specialized roles for efficient testing

2. **Knowledge Graph**
   - Graphiti: Knowledge graph API for semantic relationship tracking and contextual understanding
   - Neo4j: Graph database for storing and querying relationships between entities, actions, and outcomes
   - Automatic capturing of agent responses and tool executions for building comprehensive knowledge base

3. **Monitoring Stack**
   - OpenTelemetry: Unified observability data collection and correlation
   - Grafana: Real-time visualization and alerting dashboards
   - VictoriaMetrics: High-performance time-series metrics storage
   - Jaeger: End-to-end distributed tracing for debugging
   - Loki: Scalable log aggregation and analysis

4. **Analytics Platform**
   - Langfuse: Advanced LLM observability and performance analytics
   - ClickHouse: Column-oriented analytics data warehouse
   - Redis: High-speed caching and rate limiting
   - MinIO: S3-compatible object storage for artifacts

5. **Security Tools**
   - Web Scraper: Isolated browser environment for safe web interaction
   - Pentesting Tools: Comprehensive suite of 20+ professional security tools
   - Sandboxed Execution: All operations run in isolated containers

6. **Memory Systems**
   - Long-term Memory: Persistent storage of knowledge and experiences
   - Working Memory: Active context and goals for current operations
   - Episodic Memory: Historical actions and success patterns
   - Knowledge Base: Structured domain expertise and tool capabilities
   - Context Management: Intelligently manages growing LLM context windows using chain summarization

The system uses Docker containers for isolation and easy deployment, with separate networks for core services, monitoring, and analytics to ensure proper security boundaries. Each component is designed to scale horizontally and can be configured for high availability in production environments.

## Quick Start

### System Requirements

- Docker and Docker Compose (or Podman - see [Podman configuration](#running-pentagi-with-podman))
- Minimum 2 vCPU
- Minimum 4GB RAM
- 20GB free disk space
- Internet access for downloading images and updates

### Using Installer (Recommended)

PentAGI provides an interactive installer with a terminal-based UI for streamlined configuration and deployment. The installer guides you through system checks, LLM provider setup, search engine configuration, and security hardening.

**Supported Platforms:**
- **Linux**: amd64 [download](https://pentagi.com/downloads/linux/amd64/installer-latest.zip) | arm64 [download](https://pentagi.com/downloads/linux/arm64/installer-latest.zip)
- **Windows**: amd64 [download](https://pentagi.com/downloads/windows/amd64/installer-latest.zip)
- **macOS**: amd64 (Intel) [download](https://pentagi.com/downloads/darwin/amd64/installer-latest.zip) | arm64 (M-series) [download](https://pentagi.com/downloads/darwin/arm64/installer-latest.zip)

**Quick Installation (Linux amd64):**

```bash
# Create installation directory
mkdir -p pentagi && cd pentagi

# Download installer
wget -O installer.zip https://pentagi.com/downloads/linux/amd64/installer-latest.zip

# Extract
unzip installer.zip

# Run interactive installer
./installer
```

**Prerequisites & Permissions:**

The installer requires appropriate privileges to interact with the Docker API for proper operation. By default, it uses the Docker socket (`/var/run/docker.sock`) which requires either:

- **Option 1 (Recommended for production):** Run the installer as root:
  ```bash
  sudo ./installer
  ```

- **Option 2 (Development environments):** Grant your user access to the Docker socket by adding them to the `docker` group:
  ```bash
  # Add your user to the docker group
  sudo usermod -aG docker $USER
  
  # Log out and log back in, or activate the group immediately
  newgrp docker
  
  # Verify Docker access (should run without sudo)
  docker ps
  ```

  ⚠️ **Security Note:** Adding a user to the `docker` group grants root-equivalent privileges. Only do this for trusted users in controlled environments. For production deployments, consider using rootless Docker mode or running the installer with sudo.

The installer will:
1. **System Checks**: Verify Docker, network connectivity, and system requirements
2. **Environment Setup**: Create and configure `.env` file with optimal defaults
3. **Provider Configuration**: Set up LLM providers (OpenAI, Anthropic, Gemini, Bedrock, Ollama, Custom)
4. **Search Engines**: Configure DuckDuckGo, Google, Tavily, Traversaal, Perplexity, Sploitus, Searxng
5. **Security Hardening**: Generate secure credentials and configure SSL certificates
6. **Deployment**: Start PentAGI with docker-compose

**For Production & Enhanced Security:**

For production deployments or security-sensitive environments, we **strongly recommend** using a distributed two-node architecture where worker operations are isolated on a separate server. This prevents untrusted code execution and network access issues on your main system.

**See detailed guide**: [Worker Node Setup](examples/guides/worker_node.md)

The two-node setup provides:
- **Isolated Execution**: Worker containers run on dedicated hardware
- **Network Isolation**: Separate network boundaries for penetration testing
- **Security Boundaries**: Docker-in-Docker with TLS authentication
- **OOB Attack Support**: Dedicated port ranges for out-of-band techniques

### Manual Installation

1. Create a working directory or clone the repository:

```bash
mkdir pentagi && cd pentagi
```

2. Copy `.env.example` to `.env` or download it:

```bash
curl -o .env https://raw.githubusercontent.com/vxcontrol/pentagi/master/.env.example
```

3. Touch examples files (`example.custom.provider.yml`, `example.ollama.provider.yml`) or download it:

```bash
curl -o example.custom.provider.yml https://raw.githubusercontent.com/vxcontrol/pentagi/master/examples/configs/custom-openai.provider.yml
curl -o example.ollama.provider.yml https://raw.githubusercontent.com/vxcontrol/pentagi/master/examples/configs/ollama-llama318b.provider.yml
```

4. Fill in the required API keys in `.env` file.

```bash
# Required: At least one of these LLM providers
OPEN_AI_KEY=your_openai_key
ANTHROPIC_API_KEY=your_anthropic_key
GEMINI_API_KEY=your_gemini_key

# Optional: AWS Bedrock provider (enterprise-grade models)
BEDROCK_REGION=us-east-1
# Choose one authentication method:
BEDROCK_DEFAULT_AUTH=true                        # Option 1: Use AWS SDK default credential chain (recommended for EC2/ECS)
# BEDROCK_BEARER_TOKEN=your_bearer_token         # Option 2: Bearer token authentication
# BEDROCK_ACCESS_KEY_ID=your_aws_access_key      # Option 3: Static credentials
# BEDROCK_SECRET_ACCESS_KEY=your_aws_secret_key

# Optional: Ollama provider (local or cloud)
# OLLAMA_SERVER_URL=http://ollama-server:11434   # Local server
# OLLAMA_SERVER_URL=https://ollama.com           # Cloud service
# OLLAMA_SERVER_API_KEY=your_ollama_cloud_key    # Required for cloud, empty for local

# Optional: Chinese AI providers
# DEEPSEEK_API_KEY=your_deepseek_key             # DeepSeek (strong reasoning)
# GLM_API_KEY=your_glm_key                       # GLM (Zhipu AI)
# KIMI_API_KEY=your_kimi_key                     # Kimi (Moonshot AI, ultra-long context)
# QWEN_API_KEY=your_qwen_key                     # Qwen (Alibaba Cloud, multimodal)

# Optional: Local LLM provider (zero-cost inference)
OLLAMA_SERVER_URL=http://localhost:11434
OLLAMA_SERVER_MODEL=your_model_name

# Optional: Additional search capabilities
DUCKDUCKGO_ENABLED=true
DUCKDUCKGO_REGION=us-en
DUCKDUCKGO_SAFESEARCH=
DUCKDUCKGO_TIME_RANGE=
SPLOITUS_ENABLED=true
GOOGLE_API_KEY=your_google_key
GOOGLE_CX_KEY=your_google_cx
TAVILY_API_KEY=your_tavily_key
TRAVERSAAL_API_KEY=your_traversaal_key
PERPLEXITY_API_KEY=your_perplexity_key
PERPLEXITY_MODEL=sonar-pro
PERPLEXITY_CONTEXT_SIZE=medium

# Searxng meta search engine (aggregates results from multiple sources)
SEARXNG_URL=http://your-searxng-instance:8080
SEARXNG_CATEGORIES=general
SEARXNG_LANGUAGE=
SEARXNG_SAFESEARCH=0
SEARXNG_TIME_RANGE=
SEARXNG_TIMEOUT=

## Graphiti knowledge graph settings
GRAPHITI_ENABLED=true
GRAPHITI_TIMEOUT=30
GRAPHITI_URL=http://graphiti:8000
GRAPHITI_MODEL_NAME=gpt-5-mini

# Neo4j settings (used by Graphiti stack)
NEO4J_USER=neo4j
NEO4J_DATABASE=neo4j
NEO4J_PASSWORD=devpassword
NEO4J_URI=bolt://neo4j:7687

# Assistant configuration
ASSISTANT_USE_AGENTS=false         # Default value for agent usage when creating new assistants
```

5. Change all security related environment variables in `.env` file to improve security.

<details>
    <summary>Security related environment variables</summary>

### Main Security Settings
- `COOKIE_SIGNING_SALT` - Salt for cookie signing, change to random value
- `PUBLIC_URL` - Public URL of your server (eg. `https://pentagi.example.com`)
- `SERVER_SSL_CRT` and `SERVER_SSL_KEY` - Custom paths to your existing SSL certificate and key for HTTPS (these paths should be used in the docker-compose.yml file to mount as volumes)

### Scraper Access
- `SCRAPER_PUBLIC_URL` - Public URL for scraper if you want to use different scraper server for public URLs
- `SCRAPER_PRIVATE_URL` - Private URL for scraper (local scraper server in docker-compose.yml file to access it to local URLs)

### Access Credentials
- `PENTAGI_POSTGRES_USER` and `PENTAGI_POSTGRES_PASSWORD` - PostgreSQL credentials
- `NEO4J_USER` and `NEO4J_PASSWORD` - Neo4j credentials (for Graphiti knowledge graph)

</details>

6. Remove all inline comments from `.env` file if you want to use it in VSCode or other IDEs as a envFile option:

```bash
perl -i -pe 's/\s+#.*$//' .env
```

7. Run the PentAGI stack:

```bash
curl -O https://raw.githubusercontent.com/vxcontrol/pentagi/master/docker-compose.yml
docker compose up -d
```

Visit [localhost:8443](https://localhost:8443) to access PentAGI Web UI (default is `admin@pentagi.com` / `admin`)

> [!NOTE]
> If you caught an error about `pentagi-network` or `observability-network` or `langfuse-network` you need to run `docker-compose.yml` firstly to create these networks and after that run `docker-compose-langfuse.yml`, `docker-compose-graphiti.yml`, and `docker-compose-observability.yml` to use Langfuse, Graphiti, and Observability services.
>
> You have to set at least one Language Model provider (OpenAI, Anthropic, Gemini, AWS Bedrock, or Ollama) to use PentAGI. AWS Bedrock provides enterprise-grade access to multiple foundation models from leading AI companies, while Ollama provides zero-cost local inference if you have sufficient computational resources. Additional API keys for search engines are optional but recommended for better results.
>
> **For fully local deployment with advanced models**: See our comprehensive guide on [Running PentAGI with vLLM and Qwen3.5-27B-FP8](examples/guides/vllm-qwen35-27b-fp8.md) for a production-grade local LLM setup. This configuration achieves ~13,000 TPS for prompt processing and ~650 TPS for completion on 4× RTX 5090 GPUs, supporting 12+ concurrent flows with complete independence from cloud providers.
>
> `LLM_SERVER_*` environment variables are experimental feature and will be changed in the future. Right now you can use them to specify custom LLM server URL and one model for all agent types.
>
> `PROXY_URL` is a global proxy URL for all LLM providers and external search systems. You can use it for isolation from external networks.
>
> The `docker-compose.yml` file runs the PentAGI service as root user because it needs access to docker.sock for container management. If you're using TCP/IP network connection to Docker instead of socket file, you can remove root privileges and use the default `pentagi` user for better security.

### Accessing PentAGI from External Networks

By default, PentAGI binds to `127.0.0.1` (localhost only) for security. To access PentAGI from other machines on your network, you need to configure external access.

#### Configuration Steps

1. **Update `.env` file** with your server's IP address:

```bash
# Network binding - allow external connections
PENTAGI_LISTEN_IP=0.0.0.0
PENTAGI_LISTEN_PORT=8443

# Public URL - use your actual server IP or hostname
# Replace 192.168.1.100 with your server's IP address
PUBLIC_URL=https://192.168.1.100:8443

# CORS origins - list all URLs that will access PentAGI
# Include localhost for local access AND your server IP for external access
CORS_ORIGINS=https://localhost:8443,https://192.168.1.100:8443
```

> [!IMPORTANT]
> - Replace `192.168.1.100` with your actual server's IP address
> - Do NOT use `0.0.0.0` in `PUBLIC_URL` or `CORS_ORIGINS` - use the actual IP address
> - Include both localhost and your server IP in `CORS_ORIGINS` for flexibility

2. **Recreate containers** to apply the changes:

```bash
docker compose down
docker compose up -d --force-recreate
```

3. **Verify port binding:**

```bash
docker ps | grep pentagi
```

You should see `0.0.0.0:8443->8443/tcp` or `:::8443->8443/tcp`.

If you see `127.0.0.1:8443->8443/tcp`, the environment variable wasn't picked up. In this case, directly edit `docker-compose.yml` line 31:

```yaml
ports:
  - "0.0.0.0:8443:8443"
```

Then recreate containers again.

4. **Configure firewall** to allow incoming connections on port 8443:

```bash
# Ubuntu/Debian with UFW
sudo ufw allow 8443/tcp
sudo ufw reload

# CentOS/RHEL with firewalld
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --reload
```

5. **Access PentAGI:**

- **Local access:** `https://localhost:8443`
- **Network access:** `https://your-server-ip:8443`

> [!NOTE]
> You'll need to accept the self-signed SSL certificate warning in your browser when accessing via IP address.

---

### Running PentAGI with Podman

PentAGI fully supports Podman as a Docker alternative. However, when using **Podman in rootless mode**, the scraper service requires special configuration because rootless containers cannot bind privileged ports (ports below 1024).

#### Podman Rootless Configuration

The default scraper configuration uses port 443 (HTTPS), which is a privileged port. For Podman rootless, reconfigure the scraper to use a non-privileged port:

**1. Edit `docker-compose.yml`** - modify the `scraper` service (around line 199):

```yaml
scraper:
  image: vxcontrol/scraper:latest
  restart: unless-stopped
  container_name: scraper
  hostname: scraper
  expose:
    - 3000/tcp  # Changed from 443 to 3000
  ports:
    - "${SCRAPER_LISTEN_IP:-127.0.0.1}:${SCRAPER_LISTEN_PORT:-9443}:3000"  # Map to port 3000
  environment:
    - MAX_CONCURRENT_SESSIONS=${LOCAL_SCRAPER_MAX_CONCURRENT_SESSIONS:-10}
    - USERNAME=${LOCAL_SCRAPER_USERNAME:-someuser}
    - PASSWORD=${LOCAL_SCRAPER_PASSWORD:-somepass}
  logging:
    options:
      max-size: 50m
      max-file: "7"
  volumes:
    - scraper-ssl:/usr/src/app/ssl
  networks:
    - pentagi-network
  shm_size: 2g
```

**2. Update `.env` file** - change the scraper URL to use HTTP and port 3000:

```bash
# Scraper configuration for Podman rootless
SCRAPER_PRIVATE_URL=http://someuser:somepass@scraper:3000/
LOCAL_SCRAPER_USERNAME=someuser
LOCAL_SCRAPER_PASSWORD=somepass
```

> [!IMPORTANT]
> Key changes for Podman:
> - Use **HTTP** instead of HTTPS for `SCRAPER_PRIVATE_URL`
> - Use port **3000** instead of 443
> - Change internal `expose` to `3000/tcp`
> - Update port mapping to target `3000` instead of `443`

**3. Recreate containers:**

```bash
podman-compose down
podman-compose up -d --force-recreate
```

**4. Test scraper connectivity:**

```bash
# Test from within the pentagi container
podman exec -it pentagi wget -O- "http://someuser:somepass@scraper:3000/html?url=http://example.com"
```

If you see HTML output, the scraper is working correctly.

#### Podman Rootful Mode

If you're running Podman in rootful mode (with sudo), you can use the default configuration without modifications. The scraper will work on port 443 as intended.

#### Docker Compatibility

All Podman configurations remain fully compatible with Docker. The non-privileged port approach works identically on both container runtimes.

### Assistant Configuration

PentAGI allows you to configure default behavior for assistants:

| Variable               | Default | Description                                                             |
| ---------------------- | ------- | ----------------------------------------------------------------------- |
| `ASSISTANT_USE_AGENTS` | `false` | Controls the default value for agent usage when creating new assistants |

The `ASSISTANT_USE_AGENTS` setting affects the initial state of the "Use Agents" toggle when creating a new assistant in the UI:
- `false` (default): New assistants are created with agent delegation disabled by default
- `true`: New assistants are created with agent delegation enabled by default

Note that users can always override this setting by toggling the "Use Agents" button in the UI when creating or editing an assistant. This environment variable only controls the initial default state.

## 🔌 API Access

PentAGI provides comprehensive programmatic access through both REST and GraphQL APIs, allowing you to integrate penetration testing workflows into your automation pipelines, CI/CD processes, and custom applications.

### Generating API Tokens

API tokens are managed through the PentAGI web interface:

1. Navigate to **Settings** → **API Tokens** in the web UI
2. Click **Create Token** to generate a new API token
3. Configure token properties:
   - **Name** (optional): A descriptive name for the token
   - **Expiration Date**: When the token will expire (minimum 1 minute, maximum 3 years)
4. Click **Create** and **copy the token immediately** - it will only be shown once for security reasons
5. Use the token as a Bearer token in your API requests

Each token is associated with your user account and inherits your role's permissions.

### Using API Tokens

Include the API token in the `Authorization` header of your HTTP requests:

```bash
# GraphQL API example
curl -X POST https://your-pentagi-instance:8443/api/v1/graphql \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "{ flows { id title status } }"}'

# REST API example
curl https://your-pentagi-instance:8443/api/v1/flows \
  -H "Authorization: Bearer YOUR_API_TOKEN"
```

### API Exploration and Testing

PentAGI provides interactive documentation for exploring and testing API endpoints:

#### GraphQL Playground

Access the GraphQL Playground at `https://your-pentagi-instance:8443/api/v1/graphql/playground`

1. Click the **HTTP Headers** tab at the bottom
2. Add your authorization header:
   ```json
   {
     "Authorization": "Bearer YOUR_API_TOKEN"
   }
   ```
3. Explore the schema, run queries, and test mutations interactively

#### Swagger UI

Access the REST API documentation at `https://your-pentagi-instance:8443/api/v1/swagger/index.html`

1. Click the **Authorize** button
2. Enter your token in the format: `Bearer YOUR_API_TOKEN`
3. Click **Authorize** to apply
4. Test endpoints directly from the Swagger UI

### Generating API Clients

You can generate type-safe API clients for your preferred programming language using the schema files included with PentAGI:

#### GraphQL Clients

The GraphQL schema is available at:
- **Web UI**: Navigate to Settings to download `schema.graphqls`
- **Direct file**: `backend/pkg/graph/schema.graphqls` in the repository

Generate clients using tools like:
- **GraphQL Code Generator** (JavaScript/TypeScript): [https://the-guild.dev/graphql/codegen](https://the-guild.dev/graphql/codegen)
- **genqlient** (Go): [https://github.com/Khan/genqlient](https://github.com/Khan/genqlient)
- **Apollo iOS** (Swift): [https://www.apollographql.com/docs/ios](https://www.apollographql.com/docs/ios)

#### REST API Clients

The OpenAPI specification is available at:
- **Swagger JSON**: `https://your-pentagi-instance:8443/api/v1/swagger/doc.json`
- **Swagger YAML**: Available in `backend/pkg/server/docs/swagger.yaml`

Generate clients using:
- **OpenAPI Generator**: [https://openapi-generator.tech](https://openapi-generator.tech)
  ```bash
  openapi-generator-cli generate \
    -i https://your-pentagi-instance:8443/api/v1/swagger/doc.json \
    -g python \
    -o ./pentagi-client
  ```

- **Swagger Codegen**: [https://github.com/swagger-api/swagger-codegen](https://github.com/swagger-api/swagger-codegen)
  ```bash
  swagger-codegen generate \
    -i https://your-pentagi-instance:8443/api/v1/swagger/doc.json \
    -l typescript-axios \
    -o ./pentagi-client
  ```

- **swagger-typescript-api** (TypeScript): [https://github.com/acacode/swagger-typescript-api](https://github.com/acacode/swagger-typescript-api)
  ```bash
  npx swagger-typescript-api \
    -p https://your-pentagi-instance:8443/api/v1/swagger/doc.json \
    -o ./src/api \
    -n pentagi-api.ts
  ```

### API Usage Examples

<details>
<summary><b>Creating a New Flow (GraphQL)</b></summary>

```graphql
mutation CreateFlow {
  createFlow(
    modelProvider: "openai"
    input: "Test the security of https://example.com"
  ) {
    id
    title
    status
    createdAt
  }
}
```

</details>

<details>
<summary><b>Listing Flows (REST API)</b></summary>

```bash
curl https://your-pentagi-instance:8443/api/v1/flows \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  | jq '.flows[] | {id, title, status}'
```

</details>

<details>
<summary><b>Python Client Example</b></summary>

```python
import requests

class PentAGIClient:
    def __init__(self, base_url, api_token):
        self.base_url = base_url
        self.headers = {
            "Authorization": f"Bearer {api_token}",
            "Content-Type": "application/json"
        }
    
    def create_flow(self, provider, target):
        query = """
        mutation CreateFlow($provider: String!, $input: String!) {
          createFlow(modelProvider: $provider, input: $input) {
            id
            title
            status
          }
        }
        """
        response = requests.post(
            f"{self.base_url}/api/v1/graphql",
            json={
                "query": query,
                "variables": {
                    "provider": provider,
                    "input": target
                }
            },
            headers=self.headers
        )
        return response.json()
    
    def get_flows(self):
        response = requests.get(
            f"{self.base_url}/api/v1/flows",
            headers=self.headers
        )
        return response.json()

# Usage
client = PentAGIClient(
    "https://your-pentagi-instance:8443",
    "your_api_token_here"
)

# Create a new flow
flow = client.create_flow("openai", "Scan https://example.com for vulnerabilities")
print(f"Created flow: {flow}")

# List all flows
flows = client.get_flows()
print(f"Total flows: {len(flows['flows'])}")
```

</details>

<details>
<summary><b>TypeScript Client Example</b></summary>

```typescript
import axios, { AxiosInstance } from 'axios';

interface Flow {
  id: string;
  title: string;
  status: string;
  createdAt: string;
}

class PentAGIClient {
  private client: AxiosInstance;

  constructor(baseURL: string, apiToken: string) {
    this.client = axios.create({
      baseURL: `${baseURL}/api/v1`,
      headers: {
        'Authorization': `Bearer ${apiToken}`,
        'Content-Type': 'application/json',
      },
    });
  }

  async createFlow(provider: string, input: string): Promise<Flow> {
    const query = `
      mutation CreateFlow($provider: String!, $input: String!) {
        createFlow(modelProvider: $provider, input: $input) {
          id
          title
          status
          createdAt
        }
      }
    `;

    const response = await this.client.post('/graphql', {
      query,
      variables: { provider, input },
    });

    return response.data.data.createFlow;
  }

  async getFlows(): Promise<Flow[]> {
    const response = await this.client.get('/flows');
    return response.data.flows;
  }

  async getFlow(flowId: string): Promise<Flow> {
    const response = await this.client.get(`/flows/${flowId}`);
    return response.data;
  }
}

// Usage
const client = new PentAGIClient(
  'https://your-pentagi-instance:8443',
  'your_api_token_here'
);

// Create a new flow
const flow = await client.createFlow(
  'openai',
  'Perform penetration test on https://example.com'
);
console.log('Created flow:', flow);

// List all flows
const flows = await client.getFlows();
console.log(`Total flows: ${flows.length}`);
```

</details>

### Security Best Practices

When working with API tokens:

- **Never commit tokens to version control** - use environment variables or secrets management
- **Rotate tokens regularly** - set appropriate expiration dates and create new tokens periodically
- **Use separate tokens for different applications** - makes it easier to revoke access if needed
- **Monitor token usage** - review API token activity in the Settings page
- **Revoke unused tokens** - disable or delete tokens that are no longer needed
- **Use HTTPS only** - never send API tokens over unencrypted connections

### Token Management

- **View tokens**: See all your active tokens in Settings → API Tokens
- **Edit tokens**: Update token names or revoke tokens
- **Delete tokens**: Permanently remove tokens (this action cannot be undone)
- **Token ID**: Each token has a unique ID that can be copied for reference

The token list shows:
- Token name (if provided)
- Token ID (unique identifier)
- Status (active/revoked/expired)
- Creation date
- Expiration date

### Custom LLM Provider Configuration

When using custom LLM providers with the `LLM_SERVER_*` variables, you can fine-tune the reasoning format used in requests.

> [!TIP]
> For production-grade local deployments, consider using **vLLM** with **Qwen3.5-27B-FP8** for optimal performance. See our [comprehensive deployment guide](examples/guides/vllm-qwen35-27b-fp8.md) which includes hardware requirements, configuration templates ([thinking mode](examples/configs/vllm-qwen3.5-27b-fp8.provider.yml) and [non-thinking mode](examples/configs/vllm-qwen3.5-27b-fp8-no-think.provider.yml)), and performance benchmarks showing 13K TPS prompt processing on 4× RTX 5090 GPUs.

| Variable                        | Default | Description                                                                             |
| ------------------------------- | ------- | --------------------------------------------------------------------------------------- |
| `LLM_SERVER_URL`                |         | Base URL for the custom LLM API endpoint                                                |
| `LLM_SERVER_KEY`                |         | API key for the custom LLM provider                                                     |
| `LLM_SERVER_MODEL`              |         | Default model to use (can be overridden in provider config)                             |
| `LLM_SERVER_CONFIG_PATH`        |         | Path to the YAML configuration file for agent-specific models                           |
| `LLM_SERVER_PROVIDER`           |         | Provider name prefix for model names (e.g., `openrouter`, `deepseek` for LiteLLM proxy) |
| `LLM_SERVER_LEGACY_REASONING`   | `false` | Controls reasoning format in API requests                                               |
| `LLM_SERVER_PRESERVE_REASONING` | `false` | Preserve reasoning content in multi-turn conversations (required by some providers)     |

The `LLM_SERVER_PROVIDER` setting is particularly useful when using **LiteLLM proxy**, which adds a provider prefix to model names. For example, when connecting to Moonshot API through LiteLLM, models like `kimi-2.5` become `moonshot/kimi-2.5`. By setting `LLM_SERVER_PROVIDER=moonshot`, you can use the same provider configuration file for both direct API access and LiteLLM proxy access without modifications.

The `LLM_SERVER_LEGACY_REASONING` setting affects how reasoning parameters are sent to the LLM:
- `false` (default): Uses modern format where reasoning is sent as a structured object with `max_tokens` parameter
- `true`: Uses legacy format with string-based `reasoning_effort` parameter

This setting is important when working with different LLM providers as they may expect different reasoning formats in their API requests. If you encounter reasoning-related errors with custom providers, try changing this setting.

The `LLM_SERVER_PRESERVE_REASONING` setting controls whether reasoning content is preserved in multi-turn conversations:
- `false` (default): Reasoning content is not preserved in conversation history
- `true`: Reasoning content is preserved and sent in subsequent API calls

This setting is required by some LLM providers (e.g., Moonshot) that return errors like "thinking is enabled but reasoning_content is missing in assistant tool call message" when reasoning content is not included in multi-turn conversations. Enable this setting if your provider requires reasoning content to be preserved.

### Ollama Provider Configuration

PentAGI supports Ollama for both local LLM inference (zero-cost, enhanced privacy) and Ollama Cloud (managed service with free tier).

#### Configuration Variables

| Variable                            | Default     | Description                               |
| ----------------------------------- | ----------- | ----------------------------------------- |
| `OLLAMA_SERVER_URL`                 |             | URL of your Ollama server or Ollama Cloud |
| `OLLAMA_SERVER_API_KEY`             |             | API key for Ollama Cloud authentication   |
| `OLLAMA_SERVER_MODEL`               |             | Default model for inference               |
| `OLLAMA_SERVER_CONFIG_PATH`         |             | Path to custom agent configuration file   |
| `OLLAMA_SERVER_PULL_MODELS_TIMEOUT` | `600`       | Timeout for model downloads (seconds)     |
| `OLLAMA_SERVER_PULL_MODELS_ENABLED` | `false`     | Auto-download models on startup           |
| `OLLAMA_SERVER_LOAD_MODELS_ENABLED` | `false`     | Query server for available models         |

#### Ollama Cloud Configuration

Ollama Cloud provides managed inference with a generous free tier and scalable paid plans.

**Free Tier Setup (Single Model)**

```bash
# Free tier allows one model at a time
OLLAMA_SERVER_URL=https://ollama.com
OLLAMA_SERVER_API_KEY=your_ollama_cloud_api_key
OLLAMA_SERVER_MODEL=gpt-oss:120b  # Example: OpenAI OSS 120B model
```

**Paid Tier Setup (Multi-Model with Custom Configuration)**

For paid tiers supporting multiple concurrent models, use custom agent configuration:

```bash
# Using custom provider configuration
OLLAMA_SERVER_URL=https://ollama.com
OLLAMA_SERVER_API_KEY=your_ollama_cloud_api_key
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama.provider.yml

# Mount custom configuration from host filesystem (in .env or docker-compose override)
PENTAGI_OLLAMA_SERVER_CONFIG_PATH=/path/on/host/my-ollama-config.yml
```

The `PENTAGI_OLLAMA_SERVER_CONFIG_PATH` environment variable maps your host configuration file to `/opt/pentagi/conf/ollama.provider.yml` inside the container. Create a custom configuration file defining models for each agent type (simple, primary_agent, coder, etc.) and reference it using this variable.

**Example custom configuration** (`my-ollama-config.yml`):

```yaml
simple:
  model: "llama3.1:8b-instruct-q8_0"
  temperature: 0.6
  max_tokens: 4096

primary_agent:
  model: "gpt-oss:120b"
  temperature: 1.0
  max_tokens: 16384

coder:
  model: "qwen3-coder:32b"
  temperature: 1.0
  max_tokens: 20480
```

#### Local Ollama Configuration

For self-hosted Ollama instances:

```bash
# Basic local Ollama setup
OLLAMA_SERVER_URL=http://localhost:11434
OLLAMA_SERVER_MODEL=llama3.1:8b-instruct-q8_0

# Production setup with auto-pull and model discovery
OLLAMA_SERVER_URL=http://ollama-server:11434
OLLAMA_SERVER_PULL_MODELS_ENABLED=true
OLLAMA_SERVER_PULL_MODELS_TIMEOUT=900
OLLAMA_SERVER_LOAD_MODELS_ENABLED=true

# Using pre-built configurations from Docker image
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-llama318b.provider.yml
# or
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-qwen332b-fp16-tc.provider.yml
# or
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-qwq32b-fp16-tc.provider.yml
```

**Performance Considerations:**

- **Model Discovery** (`OLLAMA_SERVER_LOAD_MODELS_ENABLED=true`): Adds 1-2s startup latency querying Ollama API
- **Auto-pull** (`OLLAMA_SERVER_PULL_MODELS_ENABLED=true`): First startup may take several minutes downloading models
- **Pull timeout** (`OLLAMA_SERVER_PULL_MODELS_TIMEOUT=900`): 15 minutes in seconds
- **Static Config**: Disable both flags and specify models in config file for fastest startup

#### Creating Custom Ollama Models with Extended Context

PentAGI requires models with larger context windows than the default Ollama configurations. You need to create custom models with increased `num_ctx` parameter through Modelfiles. While typical agent workflows consume around 64K tokens, PentAGI uses 110K context size for safety margin and handling complex penetration testing scenarios.

**Important**: The `num_ctx` parameter can only be set during model creation via Modelfile - it cannot be changed after model creation or overridden at runtime.

##### Example: Qwen3 32B FP16 with Extended Context

Create a Modelfile named `Modelfile_qwen3_32b_fp16_tc`:

```dockerfile
FROM qwen3:32b-fp16
PARAMETER num_ctx 110000
PARAMETER temperature 0.3
PARAMETER top_p 0.8
PARAMETER min_p 0.0
PARAMETER top_k 20
PARAMETER repeat_penalty 1.1
```

Build the custom model:

```bash
ollama create qwen3:32b-fp16-tc -f Modelfile_qwen3_32b_fp16_tc
```

##### Example: QwQ 32B FP16 with Extended Context

Create a Modelfile named `Modelfile_qwq_32b_fp16_tc`:

```dockerfile
FROM qwq:32b-fp16
PARAMETER num_ctx 110000
PARAMETER temperature 0.2
PARAMETER top_p 0.7
PARAMETER min_p 0.0
PARAMETER top_k 40
PARAMETER repeat_penalty 1.2
```

Build the custom model:

```bash
ollama create qwq:32b-fp16-tc -f Modelfile_qwq_32b_fp16_tc
```

> **Note**: The QwQ 32B FP16 model requires approximately **71.3 GB VRAM** for inference. Ensure your system has sufficient GPU memory before attempting to use this model.

These custom models are referenced in the pre-built provider configuration files (`ollama-qwen332b-fp16-tc.provider.yml` and `ollama-qwq32b-fp16-tc.provider.yml`) that are included in the Docker image at `/opt/pentagi/conf/`.

### OpenAI Provider Configuration

PentAGI integrates with OpenAI's comprehensive model lineup, featuring advanced reasoning capabilities with extended chain-of-thought, agentic models with enhanced tool integration, and specialized code models for security engineering.

#### Configuration Variables

| Variable             | Default                     | Description                 |
| -------------------- | --------------------------- | --------------------------- |
| `OPEN_AI_KEY`        |                             | API key for OpenAI services |
| `OPEN_AI_SERVER_URL` | `https://api.openai.com/v1` | OpenAI API endpoint         |

#### Configuration Examples

```bash
# Basic OpenAI setup
OPEN_AI_KEY=your_openai_api_key
OPEN_AI_SERVER_URL=https://api.openai.com/v1

# Using with proxy for enhanced security
OPEN_AI_KEY=your_openai_api_key
PROXY_URL=http://your-proxy:8080
```

#### Supported Models

PentAGI supports 31 OpenAI models with tool calling, streaming, reasoning modes, and prompt caching. Models marked with `*` are used in default configuration.

**GPT-5.2 Series - Latest Flagship Agentic (December 2025)**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `gpt-5.2`*            | ✅        | $1.75/$14.00/$0.18         | Latest flagship with enhanced reasoning and tool integration, autonomous security research |
| `gpt-5.2-pro`         | ✅        | $21.00/$168.00/$0.00       | Premium version with superior agentic coding, mission-critical security research, zero-day discovery |
| `gpt-5.2-codex`       | ✅        | $1.75/$14.00/$0.18         | Most advanced code-specialized, context compaction, strong cybersecurity capabilities |

**GPT-5/5.1 Series - Advanced Agentic Models**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `gpt-5`               | ✅        | $1.25/$10.00/$0.13         | Premier agentic with advanced reasoning, autonomous security research, exploit chain development |
| `gpt-5.1`             | ✅        | $1.25/$10.00/$0.13         | Enhanced agentic with adaptive reasoning, balanced penetration testing with strong tool coordination |
| `gpt-5-pro`           | ✅        | $15.00/$120.00/$0.00       | Premium version with major reasoning improvements, reduced hallucinations, critical security operations |
| `gpt-5-mini`          | ✅        | $0.25/$2.00/$0.03          | Efficient balancing speed and intelligence, automated vulnerability analysis, exploit generation |
| `gpt-5-nano`          | ✅        | $0.05/$0.40/$0.01          | Fastest for high-throughput scanning, reconnaissance, bulk vulnerability detection |

**GPT-5/5.1 Codex Series - Code-Specialized**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `gpt-5.1-codex-max`   | ✅        | $1.25/$10.00/$0.13         | Enhanced reasoning for sophisticated coding, proven CVE findings, systematic exploit development |
| `gpt-5.1-codex`       | ✅        | $1.25/$10.00/$0.13         | Standard code-optimized with strong reasoning, exploit generation, vulnerability analysis |
| `gpt-5-codex`         | ✅        | $1.25/$10.00/$0.13         | Foundational code-specialized, vulnerability scanning, basic exploit generation |
| `gpt-5.1-codex-mini`  | ✅        | $0.25/$2.00/$0.03          | Compact high-performance, 4x higher capacity, rapid vulnerability detection |
| `codex-mini-latest`   | ✅        | $1.50/$6.00/$0.38          | Latest compact code model, automated code review, basic vulnerability analysis |

**GPT-4.1 Series - Enhanced Intelligence**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `gpt-4.1`             | ❌        | $2.00/$8.00/$0.50          | Enhanced flagship with superior function calling, complex threat analysis, sophisticated exploit development |
| `gpt-4.1-mini`*       | ❌        | $0.40/$1.60/$0.10          | Balanced performance with improved efficiency, routine security assessments, automated code analysis |
| `gpt-4.1-nano`        | ❌        | $0.10/$0.40/$0.03          | Ultra-fast lightweight, bulk security scanning, rapid reconnaissance, continuous monitoring |

**GPT-4o Series - Multimodal Flagship**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `gpt-4o`              | ❌        | $2.50/$10.00/$1.25         | Multimodal flagship with vision, image analysis, web UI assessment, multi-tool orchestration |
| `gpt-4o-mini`         | ❌        | $0.15/$0.60/$0.08          | Compact multimodal with strong function calling, high-frequency scanning, cost-effective bulk operations |

**o-Series - Advanced Reasoning Models**

| Model ID              | Thinking | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | -------------------------- | ----------------------------------------------- |
| `o4-mini`*            | ✅        | $1.10/$4.40/$0.28          | Next-gen reasoning with enhanced speed, methodical security assessments, systematic exploit development |
| `o3`*                 | ✅        | $2.00/$8.00/$0.50          | Advanced reasoning powerhouse, multi-stage attack chains, deep vulnerability analysis |
| `o3-mini`             | ✅        | $1.10/$4.40/$0.55          | Compact reasoning with extended thinking, step-by-step attack planning, logical vulnerability chaining |
| `o1`                  | ✅        | $15.00/$60.00/$7.50        | Premier reasoning with maximum depth, advanced penetration testing, novel exploit research |
| `o3-pro`              | ✅        | $20.00/$80.00/$0.00        | Most advanced reasoning, 80% cheaper than o1-pro, zero-day research, critical security investigations |
| `o1-pro`              | ✅        | $150.00/$600.00/$0.00      | Previous-gen premium reasoning, exhaustive security analysis, mission-critical challenges |

**Prices**: Per 1M tokens. Reasoning models include thinking tokens in output pricing.

> [!WARNING]
> **GPT-5* Models - Trusted Access Required**
>
> All GPT-5 series models (`gpt-5`, `gpt-5.1`, `gpt-5.2`, `gpt-5-pro`, `gpt-5.2-pro`, and all Codex variants) work **unstably with PentAGI** and may trigger OpenAI's cybersecurity safety mechanisms without verified access.
>
> **To use GPT-5* models reliably:**
> 1. **Individual users**: Verify your identity at [chatgpt.com/cyber](https://chatgpt.com/cyber)
> 2. **Enterprise teams**: Request trusted access through your OpenAI representative
> 3. **Security researchers**: Apply for the [Cybersecurity Grant Program](https://openai.com/form/cybersecurity-grant-program/) (includes $10M in API credits)
>
> **Recommended alternatives without verification:**
> - Use `o-series` models (o3, o4-mini, o1) for reasoning tasks
> - Use `gpt-4.1` series for general intelligence and function calling
> - All o-series and gpt-4.x models work reliably without special access

**Reasoning Effort Levels**:
- **High**: Maximum reasoning depth (refiner - o3 with high effort)
- **Medium**: Balanced reasoning (primary_agent, assistant, reflector - o4-mini/o3 with medium effort)
- **Low**: Efficient targeted reasoning (coder, installer, pentester - o3/o4-mini with low effort; adviser - gpt-5.2 with low effort)

**Key Features**:
- **Extended Reasoning**: o-series models with chain-of-thought for complex security analysis
- **Agentic Intelligence**: GPT-5/5.1/5.2 series with enhanced tool integration and autonomous capabilities
- **Prompt Caching**: Cost reduction on repeated context (10-50% of input price)
- **Code Specialization**: Dedicated Codex models for vulnerability discovery and exploit development
- **Multimodal Support**: GPT-4o series for vision-based security assessments
- **Tool Calling**: Robust function calling across all models for pentesting tool orchestration
- **Streaming**: Real-time response streaming for interactive workflows
- **Proven Track Record**: Industry-leading models with CVE discoveries and real-world security applications

### Anthropic Provider Configuration

PentAGI integrates with Anthropic's Claude models, featuring advanced extended thinking capabilities, exceptional safety mechanisms, and sophisticated understanding of complex security contexts with prompt caching.

#### Configuration Variables

| Variable               | Default                        | Description                    |
| ---------------------- | ------------------------------ | ------------------------------ |
| `ANTHROPIC_API_KEY`    |                                | API key for Anthropic services |
| `ANTHROPIC_SERVER_URL` | `https://api.anthropic.com/v1` | Anthropic API endpoint         |

#### Configuration Examples

```bash
# Basic Anthropic setup
ANTHROPIC_API_KEY=your_anthropic_api_key
ANTHROPIC_SERVER_URL=https://api.anthropic.com/v1

# Using with proxy for secure environments
ANTHROPIC_API_KEY=your_anthropic_api_key
PROXY_URL=http://your-proxy:8080
```

#### Supported Models

PentAGI supports 10 Claude models with tool calling, streaming, extended thinking, adaptive thinking, and prompt caching. Models marked with `*` are used in default configuration.

**Claude 4 Series - Latest Models (2025-2026)**

| Model ID                 | Thinking | Release Date | Price (Input/Output/Cache R/W) | Use Case                                        |
| ------------------------ | -------- | ------------ | ------------------------------ | ----------------------------------------------- |
| `claude-opus-4-6`*       | ✅        | May 2025     | $5.00/$25.00/$0.50/$6.25       | Most intelligent model for autonomous agents and coding. Extended + adaptive thinking for complex exploit development, multi-stage attack simulation |
| `claude-sonnet-4-6`*     | ✅        | Aug 2025     | $3.00/$15.00/$0.30/$3.75       | Best speed/intelligence balance with adaptive thinking. Multi-phase security assessments, intelligent vulnerability analysis, real-time threat hunting |
| `claude-haiku-4-5`*      | ✅        | Oct 2025     | $1.00/$5.00/$0.10/$1.25        | Fastest model with near-frontier intelligence. High-frequency scanning, real-time monitoring, bulk automated testing |

**Legacy Models - Still Supported**

| Model ID                 | Thinking | Release Date | Price (Input/Output/Cache R/W) | Use Case                                        |
| ------------------------ | -------- | ------------ | ------------------------------ | ----------------------------------------------- |
| `claude-sonnet-4-5`      | ✅        | Sep 2025     | $3.00/$15.00/$0.30/$3.75       | State-of-the-art reasoning (superseded by 4-6). Sophisticated penetration testing, advanced threat analysis |
| `claude-opus-4-5`        | ✅        | Nov 2025     | $5.00/$25.00/$0.50/$6.25       | Ultimate reasoning (superseded by opus-4-6). Critical security research, zero-day discovery, red team operations |
| `claude-opus-4-1`        | ✅        | Aug 2025     | $15.00/$75.00/$1.50/$18.75     | Advanced reasoning (superseded). Complex penetration testing, sophisticated threat modeling |
| `claude-sonnet-4-0`      | ✅        | May 2025     | $3.00/$15.00/$0.30/$3.75       | High-performance reasoning (superseded). Complex threat modeling, multi-tool coordination |
| `claude-opus-4-0`        | ✅        | May 2025     | $15.00/$75.00/$1.50/$18.75     | First generation Opus (superseded). Multi-step exploit development, autonomous pentesting workflows |

**Deprecated Models - Migrate to Current Models**

| Model ID                     | Thinking | Release Date | Price (Input/Output/Cache R/W) | Notes                                        |
| ---------------------------- | -------- | ------------ | ------------------------------ | -------------------------------------------- |
| `claude-3-haiku-20240307`    | ❌        | Mar 2024     | $0.25/$1.25/$0.03/$0.30        | Will be retired April 19, 2026. Migrate to claude-haiku-4-5 |

**Prices**: Per 1M tokens. Cache pricing includes both Read and Write costs.

**Extended Thinking Configuration**:
- **Max Tokens 4096**: Generator (claude-opus-4-6) for maximum reasoning depth on complex exploit development
- **Max Tokens 2048**: Coder (claude-sonnet-4-6) for balanced code analysis and vulnerability research  
- **Max Tokens 1024**: Primary agent, assistant, refiner, adviser, reflector, searcher, installer, pentester for focused reasoning on specific tasks
- **Extended Thinking**: All Claude 4.5+ and 4.6 models support configurable extended thinking for deep reasoning tasks

**Key Features**:
- **Extended Thinking**: All Claude 4.5+ and 4.6 models with configurable chain-of-thought reasoning depths for complex security analysis
- **Adaptive Thinking**: Claude 4.6 series (Opus/Sonnet) dynamically adjusts reasoning depth based on task complexity for optimal performance
- **Prompt Caching**: Significant cost reduction with separate read/write pricing (10% read, 125% write of input)
- **Extended Context Window**: 200K tokens standard, up to 1M tokens (beta) for Claude Opus/Sonnet 4.6 for comprehensive codebase analysis
- **Tool Calling**: Robust function calling with exceptional accuracy for security tool orchestration
- **Streaming**: Real-time response streaming for interactive penetration testing workflows
- **Safety-First Design**: Built-in safety mechanisms ensuring responsible security testing practices
- **Multimodal Support**: Vision capabilities in latest models for screenshot analysis and UI security assessment
- **Constitutional AI**: Advanced safety training providing reliable and ethical security guidance

### Google AI (Gemini) Provider Configuration

PentAGI integrates with Google's Gemini models through the Google AI API, offering state-of-the-art multimodal reasoning capabilities with extended thinking and context caching.

#### Configuration Variables

| Variable            | Default                                     | Description                    |
| ------------------- | ------------------------------------------- | ------------------------------ |
| `GEMINI_API_KEY`    |                                             | API key for Google AI services |
| `GEMINI_SERVER_URL` | `https://generativelanguage.googleapis.com` | Google AI API endpoint         |

#### Configuration Examples

```bash
# Basic Gemini setup
GEMINI_API_KEY=your_gemini_api_key
GEMINI_SERVER_URL=https://generativelanguage.googleapis.com

# Using with proxy
GEMINI_API_KEY=your_gemini_api_key
PROXY_URL=http://your-proxy:8080
```

#### Supported Models

PentAGI supports 13 Gemini models with tool calling, streaming, thinking modes, and context caching. Models marked with `*` are used in default configuration.

**Gemini 3.1 Series - Latest Flagship (February 2026)**

| Model ID                              | Thinking | Context | Price (Input/Output/Cache) | Use Case                                        |
| ------------------------------------- | -------- | ------- | -------------------------- | ----------------------------------------------- |
| `gemini-3.1-pro-preview`*             | ✅        | 1M      | $2.00/$12.00/$0.20         | Latest flagship with refined thinking, improved token efficiency, optimized for software engineering and agentic workflows |
| `gemini-3.1-pro-preview-customtools`  | ✅        | 1M      | $2.00/$12.00/$0.20         | Custom tools endpoint optimized for bash and custom tools (view_file, search_code) prioritization |
| `gemini-3.1-flash-lite-preview`*      | ✅        | 1M      | $0.25/$1.50/$0.03          | Most cost-efficient with fastest performance for high-volume agentic tasks and low-latency applications |

**Gemini 3 Series (⚠️ gemini-3-pro-preview DEPRECATED - Shutdown March 9, 2026)**

| Model ID                              | Thinking | Context | Price (Input/Output/Cache) | Use Case                                        |
| ------------------------------------- | -------- | ------- | -------------------------- | ----------------------------------------------- |
| `gemini-3-pro-preview`                | ✅        | 1M      | $2.00/$12.00/$0.20         | ⚠️ DEPRECATED - Migrate to gemini-3.1-pro-preview before March 9, 2026 |
| `gemini-3-flash-preview`*             | ✅        | 1M      | $0.50/$3.00/$0.05          | Frontier intelligence with superior search grounding, high-throughput security scanning |

**Gemini 2.5 Series - Advanced Thinking Models**

| Model ID                                 | Thinking | Context | Price (Input/Output/Cache) | Use Case                                        |
| ---------------------------------------- | -------- | ------- | -------------------------- | ----------------------------------------------- |
| `gemini-2.5-pro`                         | ✅        | 1M      | $1.25/$10.00/$0.13         | State-of-the-art for complex coding and reasoning, sophisticated threat modeling |
| `gemini-2.5-flash`                       | ✅        | 1M      | $0.30/$2.50/$0.03          | First hybrid reasoning model with thinking budgets, best price-performance for large-scale assessments |
| `gemini-2.5-flash-lite`                  | ✅        | 1M      | $0.10/$0.40/$0.01          | Smallest and most cost-effective for at-scale usage, high-throughput scanning |
| `gemini-2.5-flash-lite-preview-09-2025`  | ✅        | 1M      | $0.10/$0.40/$0.01          | Latest preview optimized for cost-efficiency, high throughput, and quality |

**Gemini 2.0 Series - Balanced Multimodal for Agents**

| Model ID                              | Thinking | Context | Price (Input/Output/Cache) | Use Case                                        |
| ------------------------------------- | -------- | ------- | -------------------------- | ----------------------------------------------- |
| `gemini-2.0-flash`                    | ❌        | 1M      | $0.10/$0.40/$0.03          | Balanced multimodal built for agents era, diverse security tasks and real-time monitoring |
| `gemini-2.0-flash-lite`               | ❌        | 1M      | $0.08/$0.30/$0.00          | Lightweight for continuous monitoring, basic scanning, automated alert processing |

**Specialized Open-Source Models (Free)**

| Model ID                              | Thinking | Context | Price (Input/Output/Cache) | Use Case                                        |
| ------------------------------------- | -------- | ------- | -------------------------- | ----------------------------------------------- |
| `gemma-3-27b-it`                      | ❌        | 128K    | Free/Free/Free             | Open-source from Gemini tech, on-premises security operations, privacy-sensitive testing |
| `gemma-3n-4b-it`                      | ❌        | 128K    | Free/Free/Free             | Efficient for edge devices (mobile/laptops/tablets), offline vulnerability scanning |

**Prices**: Per 1M tokens (Standard Paid tier). Context window is input token limit.

> [!WARNING]
> **Gemini 3 Pro Preview Deprecation**
>
> `gemini-3-pro-preview` will be **shut down on March 9, 2026**. Migrate to `gemini-3.1-pro-preview` to avoid service disruption. The new model offers:
>
> - Refined performance and reliability
> - Improved thinking and token efficiency
> - Better grounded, factually consistent responses
> - Enhanced software engineering behavior

**Key Features**:
- **Extended Thinking**: Step-by-step reasoning for complex security analysis (all Gemini 3.x and 2.5 series)
- **Context Caching**: Significant cost reduction on repeated context (10-90% of input price)
- **Ultra-Long Context**: 1M tokens for comprehensive codebase analysis and documentation review
- **Multimodal Support**: Text, image, video, audio, and PDF processing for comprehensive assessments
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming for interactive security workflows
- **Code Execution**: Built-in code execution for offensive tool testing and exploit validation
- **Search Grounding**: Google Search integration for threat intelligence and CVE research
- **File Search**: Document retrieval and RAG capabilities for knowledge-based assessments
- **Batch API**: 50% cost reduction for non-real-time batch processing

**Reasoning Effort Levels**:
- **High**: Maximum thinking depth for complex multi-step analysis (generator)
- **Medium**: Balanced reasoning for general agentic tasks (primary_agent, assistant, refiner, adviser)
- **Low**: Efficient thinking for focused tasks (coder, installer, pentester)

### AWS Bedrock Provider Configuration

PentAGI integrates with Amazon Bedrock, offering access to 20+ foundation models from leading AI companies including Anthropic, Amazon, Cohere, DeepSeek, OpenAI, Qwen, Mistral, and Moonshot.

#### Configuration Variables

| Variable                    | Default     | Description                                                                                         |
| --------------------------- | ----------- | --------------------------------------------------------------------------------------------------- |
| `BEDROCK_REGION`            | `us-east-1` | AWS region for Bedrock service                                                                      |
| `BEDROCK_DEFAULT_AUTH`      | `false`     | Use AWS SDK default credential chain (environment, EC2 role, ~/.aws/credentials) - highest priority |
| `BEDROCK_BEARER_TOKEN`      |             | Bearer token authentication - priority over static credentials                                      |
| `BEDROCK_ACCESS_KEY_ID`     |             | AWS access key ID for static credentials                                                            |
| `BEDROCK_SECRET_ACCESS_KEY` |             | AWS secret access key for static credentials                                                        |
| `BEDROCK_SESSION_TOKEN`     |             | AWS session token for temporary credentials (optional, used with static credentials)                |
| `BEDROCK_SERVER_URL`        |             | Custom Bedrock endpoint (VPC endpoints, local testing)                                              |

**Authentication Priority**: `BEDROCK_DEFAULT_AUTH` → `BEDROCK_BEARER_TOKEN` → `BEDROCK_ACCESS_KEY_ID`+`BEDROCK_SECRET_ACCESS_KEY`

#### Configuration Examples

```bash
# Recommended: Default AWS SDK authentication (EC2/ECS/Lambda roles)
BEDROCK_REGION=us-east-1
BEDROCK_DEFAULT_AUTH=true

# Bearer token authentication (AWS STS, custom auth)
BEDROCK_REGION=us-east-1
BEDROCK_BEARER_TOKEN=your_bearer_token

# Static credentials (development, testing)
BEDROCK_REGION=us-east-1
BEDROCK_ACCESS_KEY_ID=your_aws_access_key
BEDROCK_SECRET_ACCESS_KEY=your_aws_secret_key

# With proxy and custom endpoint
BEDROCK_REGION=us-east-1
BEDROCK_DEFAULT_AUTH=true
BEDROCK_SERVER_URL=https://bedrock-runtime.us-east-1.vpce-xxx.amazonaws.com
PROXY_URL=http://your-proxy:8080
```

#### Supported Models

PentAGI supports 21 AWS Bedrock models with tool calling, streaming, and multimodal capabilities. Models marked with `*` are used in default configuration.

| Model ID                                         | Provider        | Thinking | Multimodal | Price (Input/Output) | Use Case                                |
| ------------------------------------------------ | --------------- | -------- | ---------- | -------------------- | --------------------------------------- |
| `us.amazon.nova-2-lite-v1:0`                     | Amazon Nova     | ❌        | ✅          | $0.33/$2.75          | Adaptive reasoning, efficient thinking  |
| `us.amazon.nova-premier-v1:0`                    | Amazon Nova     | ❌        | ✅          | $2.50/$12.50         | Complex reasoning, advanced analysis    |
| `us.amazon.nova-pro-v1:0`                        | Amazon Nova     | ❌        | ✅          | $0.80/$3.20          | Balanced accuracy, speed, cost          |
| `us.amazon.nova-lite-v1:0`                       | Amazon Nova     | ❌        | ✅          | $0.06/$0.24          | Fast processing, high-volume operations |
| `us.amazon.nova-micro-v1:0`                      | Amazon Nova     | ❌        | ❌          | $0.035/$0.14         | Ultra-low latency, real-time monitoring |
| `us.anthropic.claude-opus-4-6-v1`*               | Anthropic       | ✅        | ✅          | $5.00/$25.00         | World-class coding, enterprise agents   |
| `us.anthropic.claude-sonnet-4-6`                 | Anthropic       | ✅        | ✅          | $3.00/$15.00         | Frontier intelligence, enterprise scale |
| `us.anthropic.claude-opus-4-5-20251101-v1:0`     | Anthropic       | ✅        | ✅          | $5.00/$25.00         | Multi-day software development          |
| `us.anthropic.claude-haiku-4-5-20251001-v1:0`*   | Anthropic       | ✅        | ✅          | $1.00/$5.00          | Near-frontier performance, high speed   |
| `us.anthropic.claude-sonnet-4-5-20250929-v1:0`*  | Anthropic       | ✅        | ✅          | $3.00/$15.00         | Real-world agents, coding excellence    |
| `us.anthropic.claude-sonnet-4-20250514-v1:0`     | Anthropic       | ✅        | ✅          | $3.00/$15.00         | Balanced performance, production-ready  |
| `us.anthropic.claude-3-5-haiku-20241022-v1:0`    | Anthropic       | ❌        | ❌          | $0.80/$4.00          | Fastest model, cost-effective scanning  |
| `cohere.command-r-plus-v1:0`                     | Cohere          | ❌        | ❌          | $3.00/$15.00         | Large-scale operations, superior RAG    |
| `deepseek.v3.2`                                  | DeepSeek        | ❌        | ❌          | $0.58/$1.68          | Long-context reasoning, efficiency      |
| `openai.gpt-oss-120b-1:0`*                       | OpenAI (OSS)    | ✅        | ❌          | $0.15/$0.60          | Strong reasoning, scientific analysis   |
| `openai.gpt-oss-20b-1:0`                         | OpenAI (OSS)    | ✅        | ❌          | $0.07/$0.30          | Efficient coding, software development  |
| `qwen.qwen3-next-80b-a3b`                        | Qwen            | ❌        | ❌          | $0.15/$1.20          | Ultra-long context, flagship reasoning  |
| `qwen.qwen3-32b-v1:0`                            | Qwen            | ❌        | ❌          | $0.15/$0.60          | Balanced reasoning, research use cases  |
| `qwen.qwen3-coder-30b-a3b-v1:0`                  | Qwen            | ❌        | ❌          | $0.15/$0.60          | Vibe coding, natural-language first     |
| `qwen.qwen3-coder-next`                          | Qwen            | ❌        | ❌          | $0.45/$1.80          | Tool use, function calling optimized    |
| `mistral.mistral-large-3-675b-instruct`          | Mistral         | ❌        | ✅          | $4.00/$12.00         | Advanced multimodal, long-context       |
| `moonshotai.kimi-k2.5`                           | Moonshot        | ❌        | ✅          | $0.60/$3.00          | Vision, language, code in one model     |

**Prices**: Per 1M tokens. Models with thinking/reasoning support additional compute costs during reasoning phase.

#### Tested but Incompatible Models

Some AWS Bedrock models were tested but are **not supported** due to technical limitations:

| Model Family              | Reason for Incompatibility                                                                |
| ------------------------- | ----------------------------------------------------------------------------------------- |
| **GLM (Z.AI)**            | Tool calling format incompatible with Converse API (expects string instead of JSON)       |
| **AI21 Jamba**            | Severe rate limits (1-2 req/min) prevent reliable testing and production use              |
| **Meta Llama 3.3/3.1**    | Unstable tool call result processing, causes unexpected failures in multi-turn workflows  |
| **Mistral Magistral**     | Tool calling not supported by the model                                                   |
| **Moonshot K2-Thinking**  | Unstable streaming behavior with tool calls, unreliable in production                     |
| **Qwen3-VL**              | Unstable streaming with tool calling, multimodal + tools combination fails intermittently |

> [!IMPORTANT]
> **Rate Limits & Quota Management**
>
> Default AWS Bedrock quotas for Claude models are **extremely restrictive** (2-20 requests/minute for new accounts). For production penetration testing:
>
> 1. **Request quota increases** through AWS Service Quotas console for models you plan to use
> 2. **Use Amazon Nova models** - higher default quotas and excellent performance
> 3. **Enable provisioned throughput** for consistent high-volume testing
> 4. **Monitor usage** - AWS throttles aggressively at quota limits
>
> Without quota increases, expect frequent delays and workflow interruptions.

> [!WARNING]
> **Converse API Requirements**
>
> PentAGI uses Amazon Bedrock **Converse API** for unified model access. All supported models require:
>
> - ✅ Converse/ConverseStream API support
> - ✅ Tool use (function calling) for penetration testing workflows
> - ✅ Streaming tool use for real-time feedback
>
> Verify model capabilities at: [AWS Bedrock Model Features](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-supported-models-features.html)

**Key Features**:
- **Automatic Prompt Caching**: 40-70% cost reduction on repeated context (Claude 4.x models)
- **Extended Thinking**: Step-by-step reasoning for complex security analysis (Claude, DeepSeek R1, OpenAI GPT)
- **Multimodal Analysis**: Process screenshots, diagrams, video for comprehensive testing (Nova, Claude, Mistral, Kimi)
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming for interactive security assessment workflows

### DeepSeek Provider Configuration

PentAGI integrates with DeepSeek, providing access to advanced AI models with strong reasoning, coding capabilities, and context caching at competitive prices.

#### Configuration Variables

| Variable              | Default Value              | Description                                         |
| --------------------- | -------------------------- | --------------------------------------------------- |
| `DEEPSEEK_API_KEY`    |                            | DeepSeek API key for authentication                 |
| `DEEPSEEK_SERVER_URL` | `https://api.deepseek.com` | DeepSeek API endpoint URL                           |
| `DEEPSEEK_PROVIDER`   |                            | Provider prefix for LiteLLM integration (optional)  |

#### Configuration Examples

```bash
# Direct API usage
DEEPSEEK_API_KEY=your_deepseek_api_key
DEEPSEEK_SERVER_URL=https://api.deepseek.com

# With LiteLLM proxy
DEEPSEEK_API_KEY=your_litellm_key
DEEPSEEK_SERVER_URL=http://litellm-proxy:4000
DEEPSEEK_PROVIDER=deepseek  # Adds prefix to model names (deepseek/deepseek-chat) for LiteLLM
```

#### Supported Models

PentAGI supports 2 DeepSeek-V3.2 models with tool calling, streaming, thinking modes, and context caching. Both models are used in default configuration.

| Model ID              | Thinking | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| --------------------- | -------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `deepseek-chat`*      | ❌        | 128K    | 8K         | $0.28/$0.42/$0.03          | General dialogue, code generation, tool calling |
| `deepseek-reasoner`*  | ✅        | 128K    | 64K        | $0.28/$0.42/$0.03          | Advanced reasoning, complex logic, security analysis |

**Prices**: Per 1M tokens. Cache pricing is for prompt caching (10% of input cost). Models with thinking support include reinforcement learning chain-of-thought reasoning.

**Key Features**:
- **Automatic Prompt Caching**: 40-60% cost reduction on repeated context (10% of input price)
- **Extended Thinking**: Reinforcement learning CoT for complex security analysis (deepseek-reasoner)
- **Strong Coding**: Optimized for code generation and exploit development
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming for interactive workflows
- **Multilingual**: Strong Chinese and English support
- **Additional Features**: JSON Output, Chat Prefix Completion, FIM (Fill-in-the-Middle) Completion

**LiteLLM Integration**: Set `DEEPSEEK_PROVIDER=deepseek` to enable model name prefixing when using default PentAGI configurations with LiteLLM proxy. Leave empty for direct API usage.

### GLM Provider Configuration

PentAGI integrates with GLM from Zhipu AI (Z.AI), providing advanced language models with MoE architecture, strong reasoning, and agentic capabilities developed by Tsinghua University.

#### Configuration Variables

| Variable          | Default Value                   | Description                                                |
| ----------------- | ------------------------------- | ---------------------------------------------------------- |
| `GLM_API_KEY`     |                                 | GLM API key for authentication                             |
| `GLM_SERVER_URL`  | `https://api.z.ai/api/paas/v4`  | GLM API endpoint URL (international)                       |
| `GLM_PROVIDER`    |                                 | Provider prefix for LiteLLM integration (optional)         |

#### Configuration Examples

```bash
# Direct API usage (international endpoint)
GLM_API_KEY=your_glm_api_key
GLM_SERVER_URL=https://api.z.ai/api/paas/v4

# Alternative endpoints
GLM_SERVER_URL=https://open.bigmodel.cn/api/paas/v4  # China
GLM_SERVER_URL=https://api.z.ai/api/coding/paas/v4   # Coding-specific

# With LiteLLM proxy
GLM_API_KEY=your_litellm_key
GLM_SERVER_URL=http://litellm-proxy:4000
GLM_PROVIDER=zai  # Adds prefix to model names (zai/glm-4) for LiteLLM
```

#### Supported Models

PentAGI supports 12 GLM models with tool calling, streaming, thinking modes, and prompt caching. Models marked with `*` are used in default configuration.

**GLM-5 Series - Flagship MoE (744B/40B active)**

| Model ID                | Thinking      | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| ----------------------- | ------------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `glm-5`*                | ✅ Forced      | 200K    | 128K       | $1.00/$3.20/$0.20          | Flagship agentic engineering, complex multi-stage tasks |
| `glm-5-code`†           | ✅ Forced      | 200K    | 128K       | $1.20/$5.00/$0.30          | Code-specialized, exploit development (requires Coding Plan) |

**GLM-4.7 Series - Premium with Interleaved Thinking**

| Model ID                | Thinking      | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| ----------------------- | ------------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `glm-4.7`*              | ✅ Forced      | 200K    | 128K       | $0.60/$2.20/$0.11          | Premium with thinking before each response/tool call |
| `glm-4.7-flashx`*       | ✅ Hybrid      | 200K    | 128K       | $0.07/$0.40/$0.01          | High-speed with priority GPU, best price/performance |
| `glm-4.7-flash`         | ✅ Hybrid      | 200K    | 128K       | Free/Free/Free             | Free ~30B SOTA model, 1 concurrent request      |

**GLM-4.6 Series - Balanced with Auto-Thinking**

| Model ID                | Thinking      | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| ----------------------- | ------------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `glm-4.6`               | ✅ Auto        | 200K    | 128K       | $0.60/$2.20/$0.11          | Balanced, streaming tool calls, 30% token efficient |

**GLM-4.5 Series - Unified Reasoning/Coding/Agents**

| Model ID                | Thinking      | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| ----------------------- | ------------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `glm-4.5`               | ✅ Auto        | 128K    | 96K        | $0.60/$2.20/$0.11          | Unified model, MoE 355B/32B active              |
| `glm-4.5-x`             | ✅ Auto        | 128K    | 96K        | $2.20/$8.90/$0.45          | Ultra-fast premium, lowest latency              |
| `glm-4.5-air`*          | ✅ Auto        | 128K    | 96K        | $0.20/$1.10/$0.03          | Cost-effective, MoE 106B/12B, best price/quality |
| `glm-4.5-airx`          | ✅ Auto        | 128K    | 96K        | $1.10/$4.50/$0.22          | Accelerated Air with priority GPU               |
| `glm-4.5-flash`         | ✅ Auto        | 128K    | 96K        | Free/Free/Free             | Free with reasoning/coding/agents support       |

**GLM-4 Legacy - Dense Architecture**

| Model ID                | Thinking      | Context | Max Output | Price (Input/Output/Cache) | Use Case                                        |
| ----------------------- | ------------- | ------- | ---------- | -------------------------- | ----------------------------------------------- |
| `glm-4-32b-0414-128k`   | ❌             | 128K    | 16K        | $0.10/$0.10/$0.00          | Ultra-budget dense 32B, high-volume parsing     |

**Prices**: Per 1M tokens. Cache pricing is for prompt caching. † Model requires **Coding Plan subscription**.

> [!WARNING]
> **Coding Plan Requirement**
>
> The `glm-5-code` model requires an active **Coding Plan subscription**. Attempting to use this model without the subscription will result in:
>
> ```
> API returned unexpected status code: 403: You do not have permission to access glm-5-code
> ```
>
> For code-specialized tasks without Coding Plan, use `glm-5` (general flagship) or `glm-4.7` (premium with interleaved thinking) instead.

**Thinking Modes**:
- **Forced**: Model always uses thinking mode before responding (GLM-5, GLM-4.7)
- **Hybrid**: Model intelligently decides when to use thinking (GLM-4.7-FlashX, GLM-4.7-Flash)
- **Auto**: Model automatically determines when reasoning is needed (GLM-4.6, GLM-4.5 series)

**Key Features**:
- **Prompt Caching**: Significant cost reduction on repeated context (cached input pricing shown)
- **Interleaved Thinking**: GLM-4.7 thinks before each response and tool call with preserved reasoning across multi-turn dialogues
- **Ultra-Long Context**: 200K tokens for GLM-5 and GLM-4.7/4.6 series for massive codebase analysis
- **MoE Architecture**: Efficient 744B parameters with 40B active (GLM-5), 355B/32B (GLM-4.5), 106B/12B (GLM-4.5-Air)
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming with streaming tool calls support (GLM-4.6+)
- **Multilingual**: Exceptional Chinese and English NLP capabilities
- **Free Options**: GLM-4.7-Flash and GLM-4.5-Flash for prototyping and experimentation

**LiteLLM Integration**: Set `GLM_PROVIDER=zai` to enable model name prefixing when using default PentAGI configurations with LiteLLM proxy. Leave empty for direct API usage.

### Kimi Provider Configuration

PentAGI integrates with Kimi from Moonshot AI, providing ultra-long context models with multimodal capabilities perfect for analyzing extensive codebases and documentation.

#### Configuration Variables

| Variable           | Default Value                | Description                                         |
| ------------------ | -----------------------------| --------------------------------------------------- |
| `KIMI_API_KEY`     |                              | Kimi API key for authentication                     |
| `KIMI_SERVER_URL`  | `https://api.moonshot.ai/v1` | Kimi API endpoint URL (international)               |
| `KIMI_PROVIDER`    |                              | Provider prefix for LiteLLM integration (optional)  |

#### Configuration Examples

```bash
# Direct API usage (international endpoint)
KIMI_API_KEY=your_kimi_api_key
KIMI_SERVER_URL=https://api.moonshot.ai/v1

# Alternative endpoint
KIMI_SERVER_URL=https://api.moonshot.cn/v1  # China

# With LiteLLM proxy
KIMI_API_KEY=your_litellm_key
KIMI_SERVER_URL=http://litellm-proxy:4000
KIMI_PROVIDER=moonshot  # Adds prefix to model names (moonshot/kimi-k2.5) for LiteLLM
```

#### Supported Models

PentAGI supports 11 Kimi/Moonshot models with tool calling, streaming, thinking modes, and multimodal capabilities. Models marked with `*` are used in default configuration.

**Kimi K2.5 Series - Advanced Multimodal**

| Model ID                   | Thinking | Multimodal | Context | Speed      | Price (Input/Output) | Use Case                                        |
| -------------------------- | -------- | ---------- | ------- | ---------- | -------------------- | ----------------------------------------------- |
| `kimi-k2.5`*               | ✅        | ✅          | 256K    | Standard   | $0.60/$3.00          | Most intelligent, versatile, vision+text+code   |

**Kimi K2 Series - MoE Foundation (1T params, 32B activated)**

| Model ID                   | Thinking | Multimodal | Context | Speed      | Price (Input/Output) | Use Case                                        |
| -------------------------- | -------- | ---------- | ------- | ---------- | -------------------- | ----------------------------------------------- |
| `kimi-k2-0905-preview`*    | ❌        | ❌          | 256K    | Standard   | $0.60/$2.50          | Enhanced agentic coding, improved frontend      |
| `kimi-k2-0711-preview`     | ❌        | ❌          | 128K    | Standard   | $0.60/$2.50          | Powerful code and agent capabilities            |
| `kimi-k2-turbo-preview`*   | ❌        | ❌          | 256K    | Turbo      | $1.15/$8.00          | High-speed version, 60-100 tokens/sec           |
| `kimi-k2-thinking`         | ✅        | ❌          | 256K    | Standard   | $0.60/$2.50          | Long-term thinking, multi-step tool usage       |
| `kimi-k2-thinking-turbo`   | ✅        | ❌          | 256K    | Turbo      | $1.15/$8.00          | High-speed thinking, deep reasoning             |

**Moonshot V1 Series - General Text Generation**

| Model ID                   | Thinking | Multimodal | Context | Speed      | Price (Input/Output) | Use Case                                        |
| -------------------------- | -------- | ---------- | ------- | ---------- | -------------------- | ----------------------------------------------- |
| `moonshot-v1-8k`           | ❌        | ❌          | 8K      | Standard   | $0.20/$2.00          | Short text generation, cost-effective           |
| `moonshot-v1-32k`          | ❌        | ❌          | 32K     | Standard   | $1.00/$3.00          | Long text generation, balanced                  |
| `moonshot-v1-128k`         | ❌        | ❌          | 128K    | Standard   | $2.00/$5.00          | Very long text generation, extensive context    |

**Moonshot V1 Vision Series - Multimodal**

| Model ID                      | Thinking | Multimodal | Context | Speed      | Price (Input/Output) | Use Case                                        |
| ----------------------------- | -------- | ---------- | ------- | ---------- | -------------------- | ----------------------------------------------- |
| `moonshot-v1-8k-vision-preview`   | ❌        | ✅          | 8K      | Standard   | $0.20/$2.00          | Vision understanding, short context             |
| `moonshot-v1-32k-vision-preview`  | ❌        | ✅          | 32K     | Standard   | $1.00/$3.00          | Vision understanding, medium context            |
| `moonshot-v1-128k-vision-preview` | ❌        | ✅          | 128K    | Standard   | $2.00/$5.00          | Vision understanding, long context              |

**Prices**: Per 1M tokens. Turbo models offer 60-100 tokens/sec output speed with higher pricing.

**Key Features**:
- **Ultra-Long Context**: Up to 256K tokens for comprehensive codebase analysis
- **Multimodal Capabilities**: Vision models support image understanding for screenshot analysis (Kimi K2.5, V1 Vision series)
- **Extended Thinking**: Deep reasoning with multi-step tool usage (kimi-k2.5, kimi-k2-thinking models)
- **High-Speed Turbo**: 60-100 tokens/sec output for real-time workflows (Turbo variants)
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming for interactive security assessment
- **Multilingual**: Strong Chinese and English language support
- **MoE Architecture**: Efficient 1T total parameters with 32B activated for K2 series

**LiteLLM Integration**: Set `KIMI_PROVIDER=moonshot` to enable model name prefixing when using default PentAGI configurations with LiteLLM proxy. Leave empty for direct API usage.

### Qwen Provider Configuration

PentAGI integrates with Qwen from Alibaba Cloud Model Studio (DashScope), providing powerful multilingual models with reasoning capabilities and context caching support.

#### Configuration Variables

| Variable           | Default Value                                          | Description                                         |
| ------------------ | ------------------------------------------------------ | --------------------------------------------------- |
| `QWEN_API_KEY`     |                                                        | Qwen API key for authentication                     |
| `QWEN_SERVER_URL`  | `https://dashscope-us.aliyuncs.com/compatible-mode/v1` | Qwen API endpoint URL (international)               |
| `QWEN_PROVIDER`    |                                                        | Provider prefix for LiteLLM integration (optional)  |

#### Configuration Examples

```bash
# Direct API usage (Global/US endpoint)
QWEN_API_KEY=your_qwen_api_key
QWEN_SERVER_URL=https://dashscope-us.aliyuncs.com/compatible-mode/v1

# Alternative endpoints
QWEN_SERVER_URL=https://dashscope-intl.aliyuncs.com/compatible-mode/v1  # International (Singapore)
QWEN_SERVER_URL=https://dashscope.aliyuncs.com/compatible-mode/v1       # Chinese Mainland (Beijing)

# With LiteLLM proxy
QWEN_API_KEY=your_litellm_key
QWEN_SERVER_URL=http://litellm-proxy:4000
QWEN_PROVIDER=dashscope  # Adds prefix to model names (dashscope/qwen-plus) for LiteLLM
```

#### Supported Models

PentAGI supports 32 Qwen models with tool calling, streaming, thinking modes, and context caching. Models marked with `*` are used in default configuration.

**Wide Availability Models (All Regions)**

| Model ID                     | Thinking | Intl | Global/US | China | Price (Input/Output/Cache) | Use Case                                        |
| ---------------------------- | -------- | ---- | --------- | ----- | -------------------------- | ----------------------------------------------- |
| `qwen3-max`*                 | ✅        | ✅    | ✅         | ✅     | $2.40/$12.00/$0.48         | Flagship reasoning, complex security analysis   |
| `qwen3-max-preview`          | ✅        | ✅    | ✅         | ✅     | $2.40/$12.00/$0.48         | Preview version with extended thinking          |
| `qwen-max`                   | ❌        | ✅    | ❌         | ✅     | $1.60/$6.40/$0.32          | Strong instruction following, legacy flagship   |
| `qwen3.5-plus`*              | ✅        | ✅    | ✅         | ✅     | $0.40/$2.40/$0.08          | Balanced reasoning, general dialogue, coding    |
| `qwen-plus`                  | ✅        | ✅    | ✅         | ✅     | $0.40/$4.00/$0.08          | Cost-effective balanced performance             |
| `qwen3.5-flash`*             | ✅        | ✅    | ✅         | ✅     | $0.10/$0.40/$0.02          | Ultra-fast lightweight, high-throughput         |
| `qwen-flash`                 | ❌        | ✅    | ✅         | ✅     | $0.05/$0.40/$0.01          | Fast with context caching, cost-optimized       |
| `qwen-turbo`                 | ✅        | ✅    | ❌         | ✅     | $0.05/$0.50/$0.01          | Deprecated, use qwen-flash instead              |
| `qwq-plus`                   | ✅        | ✅    | ❌         | ✅     | $0.80/$2.40/$0.16          | Deep reasoning, chain-of-thought analysis       |

**Region-Specific Models**

| Model ID                     | Thinking | Intl | Global/US | China | Price (Input/Output/Cache) | Use Case                                        |
| ---------------------------- | -------- | ---- | --------- | ----- | -------------------------- | ----------------------------------------------- |
| `qwen-plus-us`               | ✅        | ❌    | ✅         | ❌     | $0.40/$4.00/$0.08          | US region optimized balanced model              |
| `qwen-long-latest`           | ❌        | ❌    | ❌         | ✅     | $0.07/$0.29/$0.01          | Ultra-long context (10M tokens)                 |

**Open Source - Qwen3.5 Series**

| Model ID                     | Thinking | Intl | Global/US | China | Price (Input/Output/Cache) | Use Case                                        |
| ---------------------------- | -------- | ---- | --------- | ----- | -------------------------- | ----------------------------------------------- |
| `qwen3.5-397b-a17b`          | ✅        | ✅    | ✅         | ✅     | $0.60/$3.60/$0.12          | Largest 397B parameters, exceptional reasoning  |
| `qwen3.5-122b-a10b`          | ✅        | ✅    | ✅         | ✅     | $0.40/$3.20/$0.08          | Large 122B parameters, strong performance       |
| `qwen3.5-27b`                | ✅        | ✅    | ✅         | ✅     | $0.30/$2.40/$0.06          | Medium 27B parameters, balanced                 |
| `qwen3.5-35b-a3b`            | ✅        | ✅    | ✅         | ✅     | $0.25/$2.00/$0.05          | Efficient 35B with 3B active MoE                |

**Open Source - Qwen3 Series**

| Model ID                       | Thinking | Intl | Global/US | China | Price (Input/Output/Cache) | Use Case                                        |
| ------------------------------ | -------- | ---- | --------- | ----- | -------------------------- | ----------------------------------------------- |
| `qwen3-next-80b-a3b-thinking`  | ✅        | ✅    | ✅         | ✅     | $0.15/$1.43/$0.03          | Next-gen 80B thinking-only mode                 |
| `qwen3-next-80b-a3b-instruct`  | ❌        | ✅    | ✅         | ✅     | $0.15/$1.20/$0.03          | Next-gen 80B instruction following              |
| `qwen3-235b-a22b`              | ✅        | ✅    | ✅         | ✅     | $0.70/$8.40/$0.14          | Dual-mode 235B with 22B active                  |
| `qwen3-32b`                    | ✅        | ✅    | ✅         | ✅     | $0.29/$2.87/$0.06          | Versatile 32B dual-mode                         |
| `qwen3-30b-a3b`                | ✅        | ✅    | ✅         | ✅     | $0.20/$2.40/$0.04          | Efficient 30B MoE architecture                  |
| `qwen3-14b`                    | ✅        | ✅    | ✅         | ✅     | $0.35/$4.20/$0.07          | Medium 14B performance-cost balance             |
| `qwen3-8b`                     | ✅        | ✅    | ✅         | ✅     | $0.18/$2.10/$0.04          | Compact 8B efficiency optimized                 |
| `qwen3-4b`                     | ✅        | ✅    | ❌         | ✅     | $0.11/$1.26/$0.02          | Lightweight 4B for simple tasks                 |
| `qwen3-1.7b`                   | ✅        | ✅    | ❌         | ✅     | $0.11/$1.26/$0.02          | Ultra-compact 1.7B basic tasks                  |
| `qwen3-0.6b`                   | ✅        | ✅    | ❌         | ✅     | $0.11/$1.26/$0.02          | Smallest 0.6B minimal resources                 |

**Open Source - QwQ & Qwen2.5 Series**

| Model ID                     | Thinking | Intl | Global/US | China | Price (Input/Output/Cache) | Use Case                                        |
| ---------------------------- | -------- | ---- | --------- | ----- | -------------------------- | ----------------------------------------------- |
| `qwq-32b`                    | ✅        | ✅    | ✅         | ✅     | $0.29/$0.86/$0.06          | Open 32B reasoning, deep research               |
| `qwen2.5-14b-instruct-1m`    | ❌        | ✅    | ❌         | ✅     | $0.81/$3.22/$0.16          | Extended 1M context, 14B parameters             |
| `qwen2.5-7b-instruct-1m`     | ❌        | ✅    | ❌         | ✅     | $0.37/$1.47/$0.07          | Extended 1M context, 7B parameters              |
| `qwen2.5-72b-instruct`       | ❌        | ✅    | ❌         | ✅     | $1.40/$5.60/$0.28          | Large 72B instruction following                 |
| `qwen2.5-32b-instruct`       | ❌        | ✅    | ❌         | ✅     | $0.70/$2.80/$0.14          | Medium 32B instruction following                |
| `qwen2.5-14b-instruct`       | ❌        | ✅    | ❌         | ✅     | $0.35/$1.40/$0.07          | Compact 14B instruction following               |
| `qwen2.5-7b-instruct`        | ❌        | ✅    | ❌         | ✅     | $0.18/$0.70/$0.04          | Small 7B instruction following                  |
| `qwen2.5-3b-instruct`        | ❌        | ❌    | ❌         | ✅     | $0.04/$0.13/$0.01          | Lightweight 3B Chinese Mainland only            |

**Prices**: Per 1M tokens. Cache pricing is for implicit context caching (20% of input cost). Models with thinking support include additional reasoning computation during CoT phase.

**Region Availability**:
- **Intl** (International): Singapore region (`dashscope-intl.aliyuncs.com`)
- **Global/US**: US Virginia region (`dashscope-us.aliyuncs.com`)
- **China**: Chinese Mainland Beijing region (`dashscope.aliyuncs.com`)

**Key Features**:
- **Automatic Context Caching**: 30-50% cost reduction on repeated context with implicit cache (20% of input price)
- **Extended Thinking**: Chain-of-thought reasoning for complex security analysis (Qwen3-Max, QwQ, Qwen3.5-Plus)
- **Tool Calling**: Seamless integration with 20+ pentesting tools via function calling
- **Streaming**: Real-time response streaming for interactive workflows
- **Multilingual**: Strong Chinese, English, and multi-language support
- **Ultra-Long Context**: Up to 10M tokens with qwen-long-latest for massive codebase analysis

**LiteLLM Integration**: Set `QWEN_PROVIDER=dashscope` to enable model name prefixing when using default PentAGI configurations with LiteLLM proxy. Leave empty for direct API usage.

## 🔧 Advanced Setup

### Langfuse Integration

Langfuse provides advanced capabilities for monitoring and analyzing AI agent operations.

1. Configure Langfuse environment variables in existing `.env` file.

<details>
    <summary>Langfuse valuable environment variables</summary>

### Database Credentials
- `LANGFUSE_POSTGRES_USER` and `LANGFUSE_POSTGRES_PASSWORD` - Langfuse PostgreSQL credentials
- `LANGFUSE_CLICKHOUSE_USER` and `LANGFUSE_CLICKHOUSE_PASSWORD` - ClickHouse credentials
- `LANGFUSE_REDIS_AUTH` - Redis password

### Encryption and Security Keys
- `LANGFUSE_SALT` - Salt for hashing in Langfuse Web UI
- `LANGFUSE_ENCRYPTION_KEY` - Encryption key (32 bytes in hex)
- `LANGFUSE_NEXTAUTH_SECRET` - Secret key for NextAuth

### Admin Credentials
- `LANGFUSE_INIT_USER_EMAIL` - Admin email
- `LANGFUSE_INIT_USER_PASSWORD` - Admin password
- `LANGFUSE_INIT_USER_NAME` - Admin username

### API Keys and Tokens
- `LANGFUSE_INIT_PROJECT_PUBLIC_KEY` - Project public key (used from PentAGI side too)
- `LANGFUSE_INIT_PROJECT_SECRET_KEY` - Project secret key (used from PentAGI side too)

### S3 Storage
- `LANGFUSE_S3_ACCESS_KEY_ID` - S3 access key ID
- `LANGFUSE_S3_SECRET_ACCESS_KEY` - S3 secret access key

</details>

2. Enable integration with Langfuse for PentAGI service in `.env` file.

```bash
LANGFUSE_BASE_URL=http://langfuse-web:3000
LANGFUSE_PROJECT_ID= # default: value from ${LANGFUSE_INIT_PROJECT_ID}
LANGFUSE_PUBLIC_KEY= # default: value from ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY}
LANGFUSE_SECRET_KEY= # default: value from ${LANGFUSE_INIT_PROJECT_SECRET_KEY}
```

3. Run the Langfuse stack:

```bash
curl -O https://raw.githubusercontent.com/vxcontrol/pentagi/master/docker-compose-langfuse.yml
docker compose -f docker-compose.yml -f docker-compose-langfuse.yml up -d
```

Visit [localhost:4000](http://localhost:4000) to access Langfuse Web UI with credentials from `.env` file:

- `LANGFUSE_INIT_USER_EMAIL` - Admin email
- `LANGFUSE_INIT_USER_PASSWORD` - Admin password

### Monitoring and Observability

For detailed system operation tracking, integration with monitoring tools is available.

1. Enable integration with OpenTelemetry and all observability services for PentAGI in `.env` file.

```bash
OTEL_HOST=otelcol:8148
```

2. Run the observability stack:

```bash
curl -O https://raw.githubusercontent.com/vxcontrol/pentagi/master/docker-compose-observability.yml
docker compose -f docker-compose.yml -f docker-compose-observability.yml up -d
```

Visit [localhost:3000](http://localhost:3000) to access Grafana Web UI.

> [!NOTE]
> If you want to use Observability stack with Langfuse, you need to enable integration in `.env` file to set `LANGFUSE_OTEL_EXPORTER_OTLP_ENDPOINT` to `http://otelcol:4318`.
>
> To run all available stacks together (Langfuse, Graphiti, and Observability):
>
> ```bash
> docker compose -f docker-compose.yml -f docker-compose-langfuse.yml -f docker-compose-graphiti.yml -f docker-compose-observability.yml up -d
> ```
>
> You can also register aliases for these commands in your shell to run it faster:
>
> ```bash
> alias pentagi="docker compose -f docker-compose.yml -f docker-compose-langfuse.yml -f docker-compose-graphiti.yml -f docker-compose-observability.yml"
> alias pentagi-up="docker compose -f docker-compose.yml -f docker-compose-langfuse.yml -f docker-compose-graphiti.yml -f docker-compose-observability.yml up -d"
> alias pentagi-down="docker compose -f docker-compose.yml -f docker-compose-langfuse.yml -f docker-compose-graphiti.yml -f docker-compose-observability.yml down"
> ```

### Knowledge Graph Integration (Graphiti)

PentAGI integrates with [Graphiti](https://github.com/vxcontrol/pentagi-graphiti), a temporal knowledge graph system powered by Neo4j, to provide advanced semantic understanding and relationship tracking for AI agent operations. The vxcontrol fork provides custom entity and edge types that are specific to pentesting purposes.

#### What is Graphiti?

Graphiti automatically extracts and stores structured knowledge from agent interactions, building a graph of entities, relationships, and temporal context. This enables:

- **Semantic Memory**: Store and recall relationships between tools, targets, vulnerabilities, and techniques
- **Contextual Understanding**: Track how different pentesting actions relate to each other over time
- **Knowledge Reuse**: Learn from past penetration tests and apply insights to new assessments
- **Advanced Querying**: Search for complex patterns like "What tools were effective against similar targets?"

#### Enabling Graphiti

The Graphiti knowledge graph is **optional** and disabled by default. To enable it:

1. Configure Graphiti environment variables in `.env` file:

```bash
## Graphiti knowledge graph settings
GRAPHITI_ENABLED=true
GRAPHITI_TIMEOUT=30
GRAPHITI_URL=http://graphiti:8000
GRAPHITI_MODEL_NAME=gpt-5-mini

# Neo4j settings (used by Graphiti stack)
NEO4J_USER=neo4j
NEO4J_DATABASE=neo4j
NEO4J_PASSWORD=devpassword
NEO4J_URI=bolt://neo4j:7687

# OpenAI API key (required by Graphiti for entity extraction)
OPEN_AI_KEY=your_openai_api_key
```

2. Run the Graphiti stack along with the main PentAGI services:

```bash
# Download the Graphiti compose file if needed
curl -O https://raw.githubusercontent.com/vxcontrol/pentagi/master/docker-compose-graphiti.yml

# Start PentAGI with Graphiti
docker compose -f docker-compose.yml -f docker-compose-graphiti.yml up -d
```

3. Verify Graphiti is running:

```bash
# Check service health
docker compose -f docker-compose.yml -f docker-compose-graphiti.yml ps graphiti neo4j

# View Graphiti logs
docker compose -f docker-compose.yml -f docker-compose-graphiti.yml logs -f graphiti

# Access Neo4j Browser (optional)
# Visit http://localhost:7474 and login with NEO4J_USER/NEO4J_PASSWORD

# Access Graphiti API (optional, for debugging)
# Visit http://localhost:8000/docs for Swagger API documentation
```

> [!NOTE]
> The Graphiti service is defined in `docker-compose-graphiti.yml` as a separate stack. You must run both compose files together to enable the knowledge graph functionality. The pre-built Docker image `vxcontrol/graphiti:latest` is used by default.

#### What Gets Stored

When enabled, PentAGI automatically captures:

- **Agent Responses**: All agent reasoning, analysis, and decisions
- **Tool Executions**: Commands executed, tools used, and their results
- **Context Information**: Flow, task, and subtask hierarchy

### GitHub and Google OAuth Integration

OAuth integration with GitHub and Google allows users to authenticate using their existing accounts on these platforms. This provides several benefits:

- Simplified login process without need to create separate credentials
- Enhanced security through trusted identity providers
- Access to user profile information from GitHub/Google accounts
- Seamless integration with existing development workflows

For using GitHub OAuth you need to create a new OAuth application in your GitHub account and set the `OAUTH_GITHUB_CLIENT_ID` and `OAUTH_GITHUB_CLIENT_SECRET` in `.env` file.

For using Google OAuth you need to create a new OAuth application in your Google account and set the `OAUTH_GOOGLE_CLIENT_ID` and `OAUTH_GOOGLE_CLIENT_SECRET` in `.env` file.

### Docker Image Configuration

PentAGI allows you to configure Docker image selection for executing various tasks. The system automatically chooses the most appropriate image based on the task type, but you can constrain this selection by specifying your preferred images:

| Variable                           | Default                | Description                                                 |
| ---------------------------------- | ---------------------- | ----------------------------------------------------------- |
| `DOCKER_DEFAULT_IMAGE`             | `debian:latest`        | Default Docker image for general tasks and ambiguous cases  |
| `DOCKER_DEFAULT_IMAGE_FOR_PENTEST` | `vxcontrol/kali-linux` | Default Docker image for security/penetration testing tasks |

When these environment variables are set, AI agents will be limited to the image choices you specify. This is particularly useful for:

- **Security Enforcement**: Restricting usage to only verified and trusted images
- **Environment Standardization**: Using corporate or customized images across all operations
- **Performance Optimization**: Utilizing pre-built images with necessary tools already installed

Configuration examples:

```bash
# Using a custom image for general tasks
DOCKER_DEFAULT_IMAGE=mycompany/custom-debian:latest

# Using a specialized image for penetration testing
DOCKER_DEFAULT_IMAGE_FOR_PENTEST=mycompany/pentest-tools:v2.0
```

> [!NOTE]
> If a user explicitly specifies a particular Docker image in their task, the system will try to use that exact image, ignoring these settings. These variables only affect the system's automatic image selection process.

## 💻 Development

### Development Requirements

- golang
- nodejs
- docker
- postgres
- commitlint

### Environment Setup

#### Backend Setup

Run once `cd backend && go mod download` to install needed packages.

For generating swagger files have to run

```bash
swag init -g ../../pkg/server/router.go -o pkg/server/docs/ --parseDependency --parseInternal --parseDepth 2 -d cmd/pentagi
```

before installing `swag` package via

```bash
go install github.com/swaggo/swag/cmd/swag@v1.8.7
```

For generating graphql resolver files have to run

```bash
go run github.com/99designs/gqlgen --config ./gqlgen/gqlgen.yml
```

after that you can see the generated files in `pkg/graph` folder.

For generating ORM methods (database package) from sqlc configuration

```bash
docker run --rm -v $(pwd):/src -w /src --network pentagi-network -e DATABASE_URL="{URL}" sqlc/sqlc:1.27.0 generate -f sqlc/sqlc.yml
```

For generating Langfuse SDK from OpenAPI specification

```bash
fern generate --local
```

and to install fern-cli

```bash
npm install -g fern-api
```

#### Testing

For running tests `cd backend && go test -v ./...`

#### Frontend Setup

Run once `cd frontend && npm install` to install needed packages.

For generating graphql files have to run `npm run graphql:generate` which using `graphql-codegen.ts` file.

Be sure that you have `graphql-codegen` installed globally:

```bash
npm install -g graphql-codegen
```

After that you can run:
* `npm run prettier` to check if your code is formatted correctly
* `npm run prettier:fix` to fix it
* `npm run lint` to check if your code is linted correctly
* `npm run lint:fix` to fix it

For generating SSL certificates you need to run `npm run ssl:generate` which using `generate-ssl.ts` file or it will be generated automatically when you run `npm run dev`.

#### Backend Configuration

Edit the configuration for `backend` in `.vscode/launch.json` file:
- `DATABASE_URL` - PostgreSQL database URL (eg. `postgres://postgres:postgres@localhost:5432/pentagidb?sslmode=disable`)
- `DOCKER_HOST` - Docker SDK API (eg. for macOS `DOCKER_HOST=unix:///Users/<my-user>/Library/Containers/com.docker.docker/Data/docker.raw.sock`) [more info](https://stackoverflow.com/a/62757128/5922857)

Optional:
- `SERVER_PORT` - Port to run the server (default: `8443`)
- `SERVER_USE_SSL` - Enable SSL for the server (default: `false`)

#### Frontend Configuration

Edit the configuration for `frontend` in `.vscode/launch.json` file:
- `VITE_API_URL` - Backend API URL. *Omit* the URL scheme (e.g., `localhost:8080` *NOT* `http://localhost:8080`)
- `VITE_USE_HTTPS` - Enable SSL for the server (default: `false`)
- `VITE_PORT` - Port to run the server (default: `8000`)
- `VITE_HOST` - Host to run the server (default: `0.0.0.0`)

### Running the Application

#### Backend

Run the command(s) in `backend` folder:
- Use `.env` file to set environment variables like a `source .env`
- Run `go run cmd/pentagi/main.go` to start the server

> [!NOTE]
> The first run can take a while as dependencies and docker images need to be downloaded to setup the backend environment.

#### Frontend

Run the command(s) in `frontend` folder:
- Run `npm install` to install the dependencies
- Run `npm run dev` to run the web app
- Run `npm run build` to build the web app

Open your browser and visit the web app URL.

## Testing LLM Agents

PentAGI includes a powerful utility called `ctester` for testing and validating LLM agent capabilities. This tool helps ensure your LLM provider configurations work correctly with different agent types, allowing you to optimize model selection for each specific agent role.

The utility features parallel testing of multiple agents, detailed reporting, and flexible configuration options.

### Key Features

- **Parallel Testing**: Tests multiple agents simultaneously for faster results
- **Comprehensive Test Suite**: Evalua
Download .txt
gitextract_pdoz2d7b/

├── .dockerignore
├── .env.example
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1-bug-report.yml
│   │   └── 2-enhancement.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SAVED_REPLIES.md
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .vscode/
│   ├── launch.json
│   └── settings.json
├── CLAUDE.md
├── Dockerfile
├── EULA.md
├── LICENSE
├── NOTICE
├── README.md
├── backend/
│   ├── cmd/
│   │   ├── ctester/
│   │   │   ├── main.go
│   │   │   ├── models.go
│   │   │   ├── report.go
│   │   │   └── utils.go
│   │   ├── etester/
│   │   │   ├── flush.go
│   │   │   ├── info.go
│   │   │   ├── main.go
│   │   │   ├── reindex.go
│   │   │   ├── search.go
│   │   │   ├── test.go
│   │   │   └── tester.go
│   │   ├── ftester/
│   │   │   ├── main.go
│   │   │   ├── mocks/
│   │   │   │   ├── logs.go
│   │   │   │   └── tools.go
│   │   │   └── worker/
│   │   │       ├── args.go
│   │   │       ├── executor.go
│   │   │       ├── interactive.go
│   │   │       └── tester.go
│   │   ├── installer/
│   │   │   ├── checker/
│   │   │   │   ├── checker.go
│   │   │   │   ├── helpers.go
│   │   │   │   └── helpers_test.go
│   │   │   ├── files/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── files.go
│   │   │   │   ├── files_test.go
│   │   │   │   └── generate.go
│   │   │   ├── hardening/
│   │   │   │   ├── hardening.go
│   │   │   │   ├── hardening_test.go
│   │   │   │   ├── migrations.go
│   │   │   │   ├── migrations_test.go
│   │   │   │   ├── network.go
│   │   │   │   └── network_test.go
│   │   │   ├── loader/
│   │   │   │   ├── example_test.go
│   │   │   │   ├── file.go
│   │   │   │   ├── loader.go
│   │   │   │   └── loader_test.go
│   │   │   ├── main.go
│   │   │   ├── main_test.go
│   │   │   ├── navigator/
│   │   │   │   ├── navigator.go
│   │   │   │   └── navigator_test.go
│   │   │   ├── processor/
│   │   │   │   ├── compose.go
│   │   │   │   ├── docker.go
│   │   │   │   ├── fs.go
│   │   │   │   ├── fs_test.go
│   │   │   │   ├── locale.go
│   │   │   │   ├── logic.go
│   │   │   │   ├── logic_test.go
│   │   │   │   ├── mock_test.go
│   │   │   │   ├── model.go
│   │   │   │   ├── pg.go
│   │   │   │   ├── processor.go
│   │   │   │   ├── state.go
│   │   │   │   └── update.go
│   │   │   ├── state/
│   │   │   │   ├── example_test.go
│   │   │   │   ├── state.go
│   │   │   │   └── state_test.go
│   │   │   └── wizard/
│   │   │       ├── app.go
│   │   │       ├── controller/
│   │   │       │   └── controller.go
│   │   │       ├── locale/
│   │   │       │   └── locale.go
│   │   │       ├── logger/
│   │   │       │   └── logger.go
│   │   │       ├── models/
│   │   │       │   ├── ai_agents_settings_form.go
│   │   │       │   ├── apply_changes.go
│   │   │       │   ├── base_controls.go
│   │   │       │   ├── base_screen.go
│   │   │       │   ├── docker_form.go
│   │   │       │   ├── embedder_form.go
│   │   │       │   ├── eula.go
│   │   │       │   ├── graphiti_form.go
│   │   │       │   ├── helpers/
│   │   │       │   │   ├── calc_context.go
│   │   │       │   │   └── calc_context_test.go
│   │   │       │   ├── langfuse_form.go
│   │   │       │   ├── list_screen.go
│   │   │       │   ├── llm_provider_form.go
│   │   │       │   ├── llm_providers.go
│   │   │       │   ├── main_menu.go
│   │   │       │   ├── maintenance.go
│   │   │       │   ├── mock_form.go
│   │   │       │   ├── monitoring.go
│   │   │       │   ├── observability_form.go
│   │   │       │   ├── processor_operation_form.go
│   │   │       │   ├── reset_password.go
│   │   │       │   ├── scraper_form.go
│   │   │       │   ├── search_engines_form.go
│   │   │       │   ├── server_settings_form.go
│   │   │       │   ├── summarizer.go
│   │   │       │   ├── summarizer_form.go
│   │   │       │   ├── tools.go
│   │   │       │   ├── types.go
│   │   │       │   └── welcome.go
│   │   │       ├── registry/
│   │   │       │   └── registry.go
│   │   │       ├── styles/
│   │   │       │   └── styles.go
│   │   │       ├── terminal/
│   │   │       │   ├── key2uv.go
│   │   │       │   ├── pty_unix.go
│   │   │       │   ├── pty_windows.go
│   │   │       │   ├── teacmd.go
│   │   │       │   ├── teacmd_test.go
│   │   │       │   ├── terminal.go
│   │   │       │   ├── terminal_test.go
│   │   │       │   └── vt/
│   │   │       │       ├── callbacks.go
│   │   │       │       ├── cc.go
│   │   │       │       ├── charset.go
│   │   │       │       ├── csi.go
│   │   │       │       ├── csi_cursor.go
│   │   │       │       ├── csi_mode.go
│   │   │       │       ├── csi_screen.go
│   │   │       │       ├── csi_sgr.go
│   │   │       │       ├── cursor.go
│   │   │       │       ├── dcs.go
│   │   │       │       ├── esc.go
│   │   │       │       ├── focus.go
│   │   │       │       ├── handlers.go
│   │   │       │       ├── key.go
│   │   │       │       ├── mode.go
│   │   │       │       ├── mouse.go
│   │   │       │       ├── osc.go
│   │   │       │       ├── screen.go
│   │   │       │       ├── terminal.go
│   │   │       │       ├── terminal_test.go
│   │   │       │       ├── utf8.go
│   │   │       │       └── utils.go
│   │   │       └── window/
│   │   │           ├── window.go
│   │   │           └── window_test.go
│   │   └── pentagi/
│   │       ├── main.go
│   │       └── tools.go
│   ├── docs/
│   │   ├── analytics_api.md
│   │   ├── chain_ast.md
│   │   ├── chain_summary.md
│   │   ├── charm.md
│   │   ├── config.md
│   │   ├── controller.md
│   │   ├── database.md
│   │   ├── docker.md
│   │   ├── flow_execution.md
│   │   ├── gemini.md
│   │   ├── installer/
│   │   │   ├── charm-architecture-patterns.md
│   │   │   ├── charm-best-practices.md
│   │   │   ├── charm-core-libraries.md
│   │   │   ├── charm-debugging-guide.md
│   │   │   ├── charm-form-patterns.md
│   │   │   ├── charm-navigation-patterns.md
│   │   │   ├── checker-test-scenarios.md
│   │   │   ├── checker.md
│   │   │   ├── installer-architecture-design.md
│   │   │   ├── installer-base-screen.md
│   │   │   ├── installer-overview.md
│   │   │   ├── installer-troubleshooting.md
│   │   │   ├── processor-implementation.md
│   │   │   ├── processor-logic-implementation.md
│   │   │   ├── processor-wizard-integration.md
│   │   │   ├── processor.md
│   │   │   ├── reference-config-pattern.md
│   │   │   └── terminal-wizard-integration.md
│   │   ├── installer.md
│   │   ├── langfuse.md
│   │   ├── llms_how_to.md
│   │   ├── observability.md
│   │   ├── ollama.md
│   │   ├── prompt_engineering_openai.md
│   │   └── prompt_engineering_pentagi.md
│   ├── fern/
│   │   ├── fern.config.json
│   │   ├── generators.yml
│   │   └── langfuse/
│   │       └── openapi.yml
│   ├── go.mod
│   ├── go.sum
│   ├── gqlgen/
│   │   └── gqlgen.yml
│   ├── migrations/
│   │   ├── migrations.go
│   │   └── sql/
│   │       ├── 20241026_115120_initial_state.sql
│   │       ├── 20241130_183411_new_type_logs.sql
│   │       ├── 20241215_132209_new_user_role.sql
│   │       ├── 20241222_171335_msglog_result_format.sql
│   │       ├── 20250102_152614_flow_trace_id.sql
│   │       ├── 20250103_1215631_new_msgchain_type_fixer.sql
│   │       ├── 20250322_172248_new_searchengine_types.sql
│   │       ├── 20250331_200137_assistant_mode.sql
│   │       ├── 20250412_181121_subtask_context copy.sql
│   │       ├── 20250414_213004_thinking_msg_part.sql
│   │       ├── 20250419_100249_new_logs_indices.sql
│   │       ├── 20250420_120356_settings_permission.sql
│   │       ├── 20250701_094823_base_settings.sql
│   │       ├── 20250821_123456_add_searxng_search_type.sql
│   │       ├── 20250901_165149_remove_input_idx.sql
│   │       ├── 20251028_113516_remove_result_idx.sql
│   │       ├── 20251102_194813_remove_description_idx.sql
│   │       ├── 20260128_153000_tool_call_id_template.sql
│   │       ├── 20260129_120000_add_tracking_fields.sql
│   │       ├── 20260218_150000_api_tokens.sql
│   │       ├── 20260222_140000_user_preferences.sql
│   │       ├── 20260223_120000_add_sploitus_search_type.sql
│   │       ├── 20260227_120000_add_cn_providers.sql
│   │       └── 20260310_153000_agent_supervision.sql
│   ├── pkg/
│   │   ├── cast/
│   │   │   ├── chain_ast.go
│   │   │   ├── chain_ast_test.go
│   │   │   └── chain_data_test.go
│   │   ├── config/
│   │   │   ├── config.go
│   │   │   └── config_test.go
│   │   ├── controller/
│   │   │   ├── alog.go
│   │   │   ├── alogs.go
│   │   │   ├── aslog.go
│   │   │   ├── aslogs.go
│   │   │   ├── assistant.go
│   │   │   ├── context.go
│   │   │   ├── flow.go
│   │   │   ├── flows.go
│   │   │   ├── msglog.go
│   │   │   ├── msglogs.go
│   │   │   ├── screenshot.go
│   │   │   ├── screenshots.go
│   │   │   ├── slog.go
│   │   │   ├── slogs.go
│   │   │   ├── subtask.go
│   │   │   ├── subtasks.go
│   │   │   ├── task.go
│   │   │   ├── tasks.go
│   │   │   ├── termlog.go
│   │   │   ├── termlogs.go
│   │   │   ├── vslog.go
│   │   │   └── vslogs.go
│   │   ├── csum/
│   │   │   ├── chain_summary.go
│   │   │   ├── chain_summary_e2e_test.go
│   │   │   ├── chain_summary_reasoning_test.go
│   │   │   └── chain_summary_split_test.go
│   │   ├── database/
│   │   │   ├── agentlogs.sql.go
│   │   │   ├── analytics.sql.go
│   │   │   ├── api_token_with_secret.go
│   │   │   ├── api_tokens.sql.go
│   │   │   ├── assistantlogs.sql.go
│   │   │   ├── assistants.sql.go
│   │   │   ├── containers.sql.go
│   │   │   ├── converter/
│   │   │   │   ├── analytics.go
│   │   │   │   ├── analytics_test.go
│   │   │   │   ├── converter.go
│   │   │   │   └── converter_test.go
│   │   │   ├── database.go
│   │   │   ├── db.go
│   │   │   ├── flows.sql.go
│   │   │   ├── models.go
│   │   │   ├── msgchains.sql.go
│   │   │   ├── msglogs.sql.go
│   │   │   ├── prompts.sql.go
│   │   │   ├── providers.sql.go
│   │   │   ├── querier.go
│   │   │   ├── roles.sql.go
│   │   │   ├── screenshots.sql.go
│   │   │   ├── searchlogs.sql.go
│   │   │   ├── subtasks.sql.go
│   │   │   ├── tasks.sql.go
│   │   │   ├── termlogs.sql.go
│   │   │   ├── toolcalls.sql.go
│   │   │   ├── user_preferences.sql.go
│   │   │   ├── users.sql.go
│   │   │   └── vecstorelogs.sql.go
│   │   ├── docker/
│   │   │   └── client.go
│   │   ├── graph/
│   │   │   ├── context.go
│   │   │   ├── context_test.go
│   │   │   ├── generated.go
│   │   │   ├── model/
│   │   │   │   └── models_gen.go
│   │   │   ├── resolver.go
│   │   │   ├── schema.graphqls
│   │   │   ├── schema.resolvers.go
│   │   │   └── subscriptions/
│   │   │       ├── controller.go
│   │   │       ├── publisher.go
│   │   │       └── subscriber.go
│   │   ├── graphiti/
│   │   │   └── client.go
│   │   ├── observability/
│   │   │   ├── collector.go
│   │   │   ├── langfuse/
│   │   │   │   ├── agent.go
│   │   │   │   ├── api/
│   │   │   │   │   ├── .fern/
│   │   │   │   │   │   └── metadata.json
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── annotationqueues/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── annotationqueues.go
│   │   │   │   │   ├── blobstorageintegrations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── blobstorageintegrations.go
│   │   │   │   │   ├── client/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── client_test.go
│   │   │   │   │   ├── comments/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── comments.go
│   │   │   │   │   ├── core/
│   │   │   │   │   │   ├── api_error.go
│   │   │   │   │   │   ├── http.go
│   │   │   │   │   │   └── request_option.go
│   │   │   │   │   ├── datasetitems/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasetitems.go
│   │   │   │   │   ├── datasetrunitems/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasetrunitems.go
│   │   │   │   │   ├── datasets/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── datasets.go
│   │   │   │   │   ├── error_codes.go
│   │   │   │   │   ├── errors.go
│   │   │   │   │   ├── file_param.go
│   │   │   │   │   ├── health/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── health.go
│   │   │   │   │   ├── ingestion/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── ingestion.go
│   │   │   │   │   ├── internal/
│   │   │   │   │   │   ├── caller.go
│   │   │   │   │   │   ├── caller_test.go
│   │   │   │   │   │   ├── error_decoder.go
│   │   │   │   │   │   ├── error_decoder_test.go
│   │   │   │   │   │   ├── explicit_fields.go
│   │   │   │   │   │   ├── explicit_fields_test.go
│   │   │   │   │   │   ├── extra_properties.go
│   │   │   │   │   │   ├── extra_properties_test.go
│   │   │   │   │   │   ├── http.go
│   │   │   │   │   │   ├── query.go
│   │   │   │   │   │   ├── query_test.go
│   │   │   │   │   │   ├── retrier.go
│   │   │   │   │   │   ├── retrier_test.go
│   │   │   │   │   │   ├── stringer.go
│   │   │   │   │   │   └── time.go
│   │   │   │   │   ├── llmconnections/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── llmconnections.go
│   │   │   │   │   ├── media/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── media.go
│   │   │   │   │   ├── metrics/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── metrics.go
│   │   │   │   │   ├── metricsv2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── metricsv2.go
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── models.go
│   │   │   │   │   ├── observations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── observations.go
│   │   │   │   │   ├── observationsv2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── observationsv2.go
│   │   │   │   │   ├── opentelemetry/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── opentelemetry.go
│   │   │   │   │   ├── option/
│   │   │   │   │   │   └── request_option.go
│   │   │   │   │   ├── organizations/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── organizations.go
│   │   │   │   │   ├── pointer.go
│   │   │   │   │   ├── projects/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── projects.go
│   │   │   │   │   ├── prompts/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── prompts.go
│   │   │   │   │   ├── promptversion/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── promptversion.go
│   │   │   │   │   ├── reference.md
│   │   │   │   │   ├── scim/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scim.go
│   │   │   │   │   ├── score/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── score.go
│   │   │   │   │   ├── scoreconfigs/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scoreconfigs.go
│   │   │   │   │   ├── scorev2/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── scorev2.go
│   │   │   │   │   ├── sessions/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── sessions.go
│   │   │   │   │   ├── trace/
│   │   │   │   │   │   ├── client.go
│   │   │   │   │   │   └── raw_client.go
│   │   │   │   │   ├── trace.go
│   │   │   │   │   └── types.go
│   │   │   │   ├── chain.go
│   │   │   │   ├── client.go
│   │   │   │   ├── context.go
│   │   │   │   ├── converter.go
│   │   │   │   ├── converter_test.go
│   │   │   │   ├── embedding.go
│   │   │   │   ├── evaluator.go
│   │   │   │   ├── event.go
│   │   │   │   ├── generation.go
│   │   │   │   ├── guardrail.go
│   │   │   │   ├── helpers.go
│   │   │   │   ├── noop.go
│   │   │   │   ├── observation.go
│   │   │   │   ├── observer.go
│   │   │   │   ├── options.go
│   │   │   │   ├── retriever.go
│   │   │   │   ├── score.go
│   │   │   │   ├── span.go
│   │   │   │   ├── tool.go
│   │   │   │   └── trace.go
│   │   │   ├── lfclient.go
│   │   │   ├── obs.go
│   │   │   ├── otelclient.go
│   │   │   └── profiling/
│   │   │       └── profiling.go
│   │   ├── providers/
│   │   │   ├── anthropic/
│   │   │   │   ├── anthropic.go
│   │   │   │   ├── anthropic_test.go
│   │   │   │   ├── config.yml
│   │   │   │   └── models.yml
│   │   │   ├── assistant.go
│   │   │   ├── bedrock/
│   │   │   │   ├── bedrock.go
│   │   │   │   ├── bedrock_test.go
│   │   │   │   ├── config.yml
│   │   │   │   └── models.yml
│   │   │   ├── custom/
│   │   │   │   ├── custom.go
│   │   │   │   ├── custom_test.go
│   │   │   │   └── example_test.go
│   │   │   ├── deepseek/
│   │   │   │   ├── config.yml
│   │   │   │   ├── deepseek.go
│   │   │   │   ├── deepseek_test.go
│   │   │   │   └── models.yml
│   │   │   ├── embeddings/
│   │   │   │   ├── embedder.go
│   │   │   │   ├── embedder_test.go
│   │   │   │   └── wrapper.go
│   │   │   ├── gemini/
│   │   │   │   ├── config.yml
│   │   │   │   ├── gemini.go
│   │   │   │   ├── gemini_test.go
│   │   │   │   └── models.yml
│   │   │   ├── glm/
│   │   │   │   ├── config.yml
│   │   │   │   ├── glm.go
│   │   │   │   ├── glm_test.go
│   │   │   │   └── models.yml
│   │   │   ├── handlers.go
│   │   │   ├── helpers.go
│   │   │   ├── helpers_test.go
│   │   │   ├── kimi/
│   │   │   │   ├── config.yml
│   │   │   │   ├── kimi.go
│   │   │   │   ├── kimi_test.go
│   │   │   │   └── models.yml
│   │   │   ├── ollama/
│   │   │   │   ├── config.yml
│   │   │   │   ├── ollama.go
│   │   │   │   └── ollama_test.go
│   │   │   ├── openai/
│   │   │   │   ├── config.yml
│   │   │   │   ├── models.yml
│   │   │   │   ├── openai.go
│   │   │   │   └── openai_test.go
│   │   │   ├── pconfig/
│   │   │   │   ├── config.go
│   │   │   │   └── config_test.go
│   │   │   ├── performer.go
│   │   │   ├── performers.go
│   │   │   ├── provider/
│   │   │   │   ├── agents.go
│   │   │   │   ├── agents_test.go
│   │   │   │   ├── litellm.go
│   │   │   │   ├── litellm_test.go
│   │   │   │   ├── provider.go
│   │   │   │   └── wrapper.go
│   │   │   ├── provider.go
│   │   │   ├── providers.go
│   │   │   ├── qwen/
│   │   │   │   ├── config.yml
│   │   │   │   ├── models.yml
│   │   │   │   ├── qwen.go
│   │   │   │   └── qwen_test.go
│   │   │   ├── subtask_patch.go
│   │   │   ├── subtask_patch_test.go
│   │   │   └── tester/
│   │   │       ├── config.go
│   │   │       ├── mock/
│   │   │       │   └── provider.go
│   │   │       ├── result.go
│   │   │       ├── runner.go
│   │   │       ├── runner_test.go
│   │   │       └── testdata/
│   │   │           ├── completion.go
│   │   │           ├── completion_test.go
│   │   │           ├── json.go
│   │   │           ├── json_test.go
│   │   │           ├── models.go
│   │   │           ├── registry.go
│   │   │           ├── registry_test.go
│   │   │           ├── result.go
│   │   │           ├── tests.yml
│   │   │           ├── tool.go
│   │   │           └── tool_test.go
│   │   ├── queue/
│   │   │   ├── queue.go
│   │   │   └── queue_test.go
│   │   ├── schema/
│   │   │   └── schema.go
│   │   ├── server/
│   │   │   ├── auth/
│   │   │   │   ├── api_token_cache.go
│   │   │   │   ├── api_token_cache_test.go
│   │   │   │   ├── api_token_id.go
│   │   │   │   ├── api_token_id_test.go
│   │   │   │   ├── api_token_jwt.go
│   │   │   │   ├── api_token_test.go
│   │   │   │   ├── auth_middleware.go
│   │   │   │   ├── auth_middleware_test.go
│   │   │   │   ├── integration_test.go
│   │   │   │   ├── permissions.go
│   │   │   │   ├── permissions_test.go
│   │   │   │   ├── session.go
│   │   │   │   ├── session_test.go
│   │   │   │   ├── users_cache.go
│   │   │   │   └── users_cache_test.go
│   │   │   ├── context/
│   │   │   │   ├── context.go
│   │   │   │   └── context_test.go
│   │   │   ├── docs/
│   │   │   │   ├── docs.go
│   │   │   │   ├── swagger.json
│   │   │   │   └── swagger.yaml
│   │   │   ├── logger/
│   │   │   │   └── logger.go
│   │   │   ├── middleware.go
│   │   │   ├── models/
│   │   │   │   ├── agentlogs.go
│   │   │   │   ├── analytics.go
│   │   │   │   ├── api_tokens.go
│   │   │   │   ├── assistantlogs.go
│   │   │   │   ├── assistants.go
│   │   │   │   ├── containers.go
│   │   │   │   ├── flows.go
│   │   │   │   ├── init.go
│   │   │   │   ├── msgchains.go
│   │   │   │   ├── msglogs.go
│   │   │   │   ├── prompts.go
│   │   │   │   ├── providers.go
│   │   │   │   ├── roles.go
│   │   │   │   ├── screenshots.go
│   │   │   │   ├── searchlogs.go
│   │   │   │   ├── subtasks.go
│   │   │   │   ├── tasks.go
│   │   │   │   ├── termlogs.go
│   │   │   │   ├── users.go
│   │   │   │   └── vecstorelogs.go
│   │   │   ├── oauth/
│   │   │   │   ├── client.go
│   │   │   │   ├── github.go
│   │   │   │   └── google.go
│   │   │   ├── rdb/
│   │   │   │   └── table.go
│   │   │   ├── response/
│   │   │   │   ├── errors.go
│   │   │   │   ├── http.go
│   │   │   │   └── http_test.go
│   │   │   ├── router.go
│   │   │   └── services/
│   │   │       ├── agentlogs.go
│   │   │       ├── analytics.go
│   │   │       ├── api_tokens.go
│   │   │       ├── api_tokens_test.go
│   │   │       ├── assistantlogs.go
│   │   │       ├── assistants.go
│   │   │       ├── auth.go
│   │   │       ├── containers.go
│   │   │       ├── flows.go
│   │   │       ├── graphql.go
│   │   │       ├── msglogs.go
│   │   │       ├── prompts.go
│   │   │       ├── providers.go
│   │   │       ├── roles.go
│   │   │       ├── screenshots.go
│   │   │       ├── searchlogs.go
│   │   │       ├── subtasks.go
│   │   │       ├── tasks.go
│   │   │       ├── termlogs.go
│   │   │       ├── users.go
│   │   │       ├── users_test.go
│   │   │       └── vecstorelogs.go
│   │   ├── system/
│   │   │   ├── host_id.go
│   │   │   ├── utils.go
│   │   │   ├── utils_darwin.go
│   │   │   ├── utils_linux.go
│   │   │   ├── utils_test.go
│   │   │   └── utils_windows.go
│   │   ├── templates/
│   │   │   ├── graphiti/
│   │   │   │   ├── agent_response.tmpl
│   │   │   │   └── tool_execution.tmpl
│   │   │   ├── prompts/
│   │   │   │   ├── adviser.tmpl
│   │   │   │   ├── assistant.tmpl
│   │   │   │   ├── coder.tmpl
│   │   │   │   ├── enricher.tmpl
│   │   │   │   ├── execution_logs.tmpl
│   │   │   │   ├── flow_descriptor.tmpl
│   │   │   │   ├── full_execution_context.tmpl
│   │   │   │   ├── generator.tmpl
│   │   │   │   ├── image_chooser.tmpl
│   │   │   │   ├── input_toolcall_fixer.tmpl
│   │   │   │   ├── installer.tmpl
│   │   │   │   ├── language_chooser.tmpl
│   │   │   │   ├── memorist.tmpl
│   │   │   │   ├── pentester.tmpl
│   │   │   │   ├── primary_agent.tmpl
│   │   │   │   ├── question_adviser.tmpl
│   │   │   │   ├── question_coder.tmpl
│   │   │   │   ├── question_enricher.tmpl
│   │   │   │   ├── question_execution_monitor.tmpl
│   │   │   │   ├── question_installer.tmpl
│   │   │   │   ├── question_memorist.tmpl
│   │   │   │   ├── question_pentester.tmpl
│   │   │   │   ├── question_reflector.tmpl
│   │   │   │   ├── question_searcher.tmpl
│   │   │   │   ├── question_task_planner.tmpl
│   │   │   │   ├── refiner.tmpl
│   │   │   │   ├── reflector.tmpl
│   │   │   │   ├── reporter.tmpl
│   │   │   │   ├── searcher.tmpl
│   │   │   │   ├── short_execution_context.tmpl
│   │   │   │   ├── subtasks_generator.tmpl
│   │   │   │   ├── subtasks_refiner.tmpl
│   │   │   │   ├── summarizer.tmpl
│   │   │   │   ├── task_assignment_wrapper.tmpl
│   │   │   │   ├── task_descriptor.tmpl
│   │   │   │   ├── task_reporter.tmpl
│   │   │   │   ├── tool_call_id_collector.tmpl
│   │   │   │   ├── tool_call_id_detector.tmpl
│   │   │   │   └── toolcall_fixer.tmpl
│   │   │   ├── templates.go
│   │   │   ├── templates_test.go
│   │   │   └── validator/
│   │   │       ├── testdata.go
│   │   │       ├── validator.go
│   │   │       └── validator_test.go
│   │   ├── terminal/
│   │   │   ├── output.go
│   │   │   └── output_test.go
│   │   ├── tools/
│   │   │   ├── args.go
│   │   │   ├── args_test.go
│   │   │   ├── browser.go
│   │   │   ├── browser_test.go
│   │   │   ├── code.go
│   │   │   ├── context.go
│   │   │   ├── context_test.go
│   │   │   ├── duckduckgo.go
│   │   │   ├── duckduckgo_test.go
│   │   │   ├── executor.go
│   │   │   ├── executor_test.go
│   │   │   ├── google.go
│   │   │   ├── google_test.go
│   │   │   ├── graphiti_search.go
│   │   │   ├── guide.go
│   │   │   ├── memory.go
│   │   │   ├── memory_utils.go
│   │   │   ├── memory_utils_test.go
│   │   │   ├── perplexity.go
│   │   │   ├── perplexity_test.go
│   │   │   ├── proxy_test.go
│   │   │   ├── registry.go
│   │   │   ├── registry_test.go
│   │   │   ├── search.go
│   │   │   ├── searxng.go
│   │   │   ├── searxng_test.go
│   │   │   ├── sploitus.go
│   │   │   ├── sploitus_test.go
│   │   │   ├── tavily.go
│   │   │   ├── tavily_test.go
│   │   │   ├── terminal.go
│   │   │   ├── terminal_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── ddg_result_docker_security.html
│   │   │   │   ├── ddg_result_golang_http_client.html
│   │   │   │   ├── ddg_result_owasp_vulnerabilities.html
│   │   │   │   ├── ddg_result_site_github_golang.html
│   │   │   │   ├── ddg_result_sql_injection.html
│   │   │   │   ├── sploitus_result_cve_2026.json
│   │   │   │   ├── sploitus_result_metasploit.json
│   │   │   │   ├── sploitus_result_nginx.json
│   │   │   │   └── sploitus_result_nmap.json
│   │   │   ├── tools.go
│   │   │   ├── traversaal.go
│   │   │   └── traversaal_test.go
│   │   └── version/
│   │       ├── version.go
│   │       └── version_test.go
│   └── sqlc/
│       ├── models/
│       │   ├── agentlogs.sql
│       │   ├── analytics.sql
│       │   ├── api_tokens.sql
│       │   ├── assistantlogs.sql
│       │   ├── assistants.sql
│       │   ├── containers.sql
│       │   ├── flows.sql
│       │   ├── msgchains.sql
│       │   ├── msglogs.sql
│       │   ├── prompts.sql
│       │   ├── providers.sql
│       │   ├── roles.sql
│       │   ├── screenshots.sql
│       │   ├── searchlogs.sql
│       │   ├── subtasks.sql
│       │   ├── tasks.sql
│       │   ├── termlogs.sql
│       │   ├── toolcalls.sql
│       │   ├── user_preferences.sql
│       │   ├── users.sql
│       │   └── vecstorelogs.sql
│       └── sqlc.yml
├── build/
│   └── .gitkeep
├── docker-compose-graphiti.yml
├── docker-compose-langfuse.yml
├── docker-compose-observability.yml
├── docker-compose.yml
├── examples/
│   ├── configs/
│   │   ├── custom-openai.provider.yml
│   │   ├── deepinfra.provider.yml
│   │   ├── deepseek.provider.yml
│   │   ├── moonshot.provider.yml
│   │   ├── novita.provider.yml
│   │   ├── ollama-llama318b-instruct.provider.yml
│   │   ├── ollama-llama318b.provider.yml
│   │   ├── ollama-qwen332b-fp16-tc.provider.yml
│   │   ├── ollama-qwq32b-fp16-tc.provider.yml
│   │   ├── openrouter.provider.yml
│   │   ├── vllm-qwen3.5-27b-fp8-no-think.provider.yml
│   │   ├── vllm-qwen3.5-27b-fp8.provider.yml
│   │   └── vllm-qwen332b-fp16.provider.yml
│   ├── guides/
│   │   ├── vllm-qwen35-27b-fp8.md
│   │   └── worker_node.md
│   ├── prompts/
│   │   └── base_web_pentest.md
│   ├── reports/
│   │   ├── ollama_qwen3_32b_fp16_base_web_pentest.md
│   │   └── openai_base_web_pentest.md
│   └── tests/
│       ├── anthropic-report.md
│       ├── bedrock-report.md
│       ├── custom-openai-report.md
│       ├── deepinfra-report.md
│       ├── deepseek-report.md
│       ├── gemini-report.md
│       ├── glm-report.md
│       ├── kimi-report.md
│       ├── moonshot-report.md
│       ├── novita-report.md
│       ├── ollama-cloud-report.md
│       ├── ollama-llama318b-instruct-report.md
│       ├── ollama-llama318b-report.md
│       ├── ollama-qwen332b-fp16-tc-report.md
│       ├── ollama-qwq-32b-fp16-tc-report.md
│       ├── openai-report.md
│       ├── openrouter-report.md
│       ├── qwen-report.md
│       └── vllm-qwen332b-fp16-report.md
├── frontend/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── .prettierrc
│   ├── README.md
│   ├── components.json
│   ├── eslint.config.mjs
│   ├── graphql-codegen.ts
│   ├── graphql-schema.graphql
│   ├── index.html
│   ├── package.json
│   ├── postcss.config.cjs
│   ├── public/
│   │   └── favicon/
│   │       └── site.webmanifest
│   ├── scripts/
│   │   ├── generate-ssl.ts
│   │   └── lib.ts
│   ├── src/
│   │   ├── app.tsx
│   │   ├── components/
│   │   │   ├── icons/
│   │   │   │   ├── anthropic.tsx
│   │   │   │   ├── bedrock.tsx
│   │   │   │   ├── custom.tsx
│   │   │   │   ├── deepseek.tsx
│   │   │   │   ├── flow-status-icon.tsx
│   │   │   │   ├── gemini.tsx
│   │   │   │   ├── github.tsx
│   │   │   │   ├── glm.tsx
│   │   │   │   ├── google.tsx
│   │   │   │   ├── kimi.tsx
│   │   │   │   ├── logo.tsx
│   │   │   │   ├── ollama.tsx
│   │   │   │   ├── open-ai.tsx
│   │   │   │   ├── provider-icon.tsx
│   │   │   │   └── qwen.tsx
│   │   │   ├── layouts/
│   │   │   │   ├── app-layout.tsx
│   │   │   │   ├── flows-layout.tsx
│   │   │   │   ├── main-layout.tsx
│   │   │   │   ├── main-sidebar.tsx
│   │   │   │   └── settings-layout.tsx
│   │   │   ├── routes/
│   │   │   │   ├── protected-route.tsx
│   │   │   │   └── public-route.tsx
│   │   │   ├── shared/
│   │   │   │   ├── confirmation-dialog.tsx
│   │   │   │   ├── markdown.tsx
│   │   │   │   ├── page-loader.tsx
│   │   │   │   └── terminal.tsx
│   │   │   └── ui/
│   │   │       ├── accordion.tsx
│   │   │       ├── alert.tsx
│   │   │       ├── avatar.tsx
│   │   │       ├── badge.tsx
│   │   │       ├── breadcrumb.tsx
│   │   │       ├── button.tsx
│   │   │       ├── calendar.tsx
│   │   │       ├── card.tsx
│   │   │       ├── collapsible.tsx
│   │   │       ├── command.tsx
│   │   │       ├── data-table.tsx
│   │   │       ├── dialog.tsx
│   │   │       ├── dropdown-menu.tsx
│   │   │       ├── empty.tsx
│   │   │       ├── form.tsx
│   │   │       ├── input-group.tsx
│   │   │       ├── input.tsx
│   │   │       ├── label.tsx
│   │   │       ├── popover.tsx
│   │   │       ├── progress.tsx
│   │   │       ├── resizable.tsx
│   │   │       ├── scroll-area.tsx
│   │   │       ├── select.tsx
│   │   │       ├── separator.tsx
│   │   │       ├── sheet.tsx
│   │   │       ├── sidebar.tsx
│   │   │       ├── skeleton.tsx
│   │   │       ├── sonner.tsx
│   │   │       ├── spinner.tsx
│   │   │       ├── status-card.tsx
│   │   │       ├── switch.tsx
│   │   │       ├── table.tsx
│   │   │       ├── tabs.tsx
│   │   │       ├── textarea-autosize.tsx
│   │   │       ├── textarea.tsx
│   │   │       ├── toggle-group.tsx
│   │   │       ├── toggle.tsx
│   │   │       └── tooltip.tsx
│   │   ├── features/
│   │   │   ├── authentication/
│   │   │   │   ├── login-form.tsx
│   │   │   │   └── password-change-form.tsx
│   │   │   └── flows/
│   │   │       ├── agents/
│   │   │       │   ├── flow-agent-icon.tsx
│   │   │       │   ├── flow-agent.tsx
│   │   │       │   └── flow-agents.tsx
│   │   │       ├── flow-central-tabs.tsx
│   │   │       ├── flow-form.tsx
│   │   │       ├── flow-tabs.tsx
│   │   │       ├── flow-tasks-dropdown.tsx
│   │   │       ├── messages/
│   │   │       │   ├── flow-assistant-messages.tsx
│   │   │       │   ├── flow-automation-messages.tsx
│   │   │       │   ├── flow-message-type-icon.tsx
│   │   │       │   └── flow-message.tsx
│   │   │       ├── screenshots/
│   │   │       │   ├── flow-screenshot.tsx
│   │   │       │   └── flow-screenshots.tsx
│   │   │       ├── tasks/
│   │   │       │   ├── flow-subtask.tsx
│   │   │       │   ├── flow-task-status-icon.tsx
│   │   │       │   ├── flow-task.tsx
│   │   │       │   └── flow-tasks.tsx
│   │   │       ├── terminal/
│   │   │       │   └── flow-terminal.tsx
│   │   │       ├── tools/
│   │   │       │   ├── flow-tool.tsx
│   │   │       │   └── flow-tools.tsx
│   │   │       └── vector-stores/
│   │   │           ├── flow-vector-store-action-icon.tsx
│   │   │           ├── flow-vector-store.tsx
│   │   │           └── flow-vector-stores.tsx
│   │   ├── graphql/
│   │   │   └── types.ts
│   │   ├── hooks/
│   │   │   ├── use-adaptive-column-visibility.ts
│   │   │   ├── use-auto-scroll.ts
│   │   │   ├── use-breakpoint.ts
│   │   │   └── use-theme.ts
│   │   ├── lib/
│   │   │   ├── apollo.ts
│   │   │   ├── axios.ts
│   │   │   ├── log.ts
│   │   │   ├── report-pdf.tsx
│   │   │   ├── report.ts
│   │   │   ├── utils/
│   │   │   │   ├── auth.ts
│   │   │   │   └── format.ts
│   │   │   ├── utils.test.ts
│   │   │   ├── utils.ts
│   │   │   └── сlipboard.ts
│   │   ├── main.tsx
│   │   ├── models/
│   │   │   ├── api.ts
│   │   │   ├── info.ts
│   │   │   ├── provider.tsx
│   │   │   └── user.ts
│   │   ├── pages/
│   │   │   ├── flows/
│   │   │   │   ├── flow-report.tsx
│   │   │   │   ├── flow.tsx
│   │   │   │   ├── flows.tsx
│   │   │   │   └── new-flow.tsx
│   │   │   ├── login.tsx
│   │   │   ├── oauth-result.tsx
│   │   │   └── settings/
│   │   │       ├── settings-api-tokens.tsx
│   │   │       ├── settings-mcp-server.tsx
│   │   │       ├── settings-mcp-servers.tsx
│   │   │       ├── settings-prompt.tsx
│   │   │       ├── settings-prompts.tsx
│   │   │       ├── settings-provider.tsx
│   │   │       └── settings-providers.tsx
│   │   ├── providers/
│   │   │   ├── favorites-provider.tsx
│   │   │   ├── flow-provider.tsx
│   │   │   ├── flows-provider.tsx
│   │   │   ├── providers-provider.tsx
│   │   │   ├── sidebar-flows-provider.tsx
│   │   │   ├── system-settings-provider.tsx
│   │   │   ├── theme-provider.tsx
│   │   │   └── user-provider.tsx
│   │   ├── schemas/
│   │   │   └── user-schema.ts
│   │   └── styles/
│   │       └── index.css
│   ├── tsconfig.app.json
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   ├── types/
│   │   └── vite-env.d.ts
│   └── vite.config.ts
├── observability/
│   ├── clickhouse/
│   │   └── prometheus.xml
│   ├── grafana/
│   │   ├── config/
│   │   │   ├── grafana.ini
│   │   │   └── provisioning/
│   │   │       ├── dashboards/
│   │   │       │   └── dashboard.yml
│   │   │       └── datasources/
│   │   │           └── datasource.yml
│   │   └── dashboards/
│   │       ├── components/
│   │       │   ├── pentagi_service.json
│   │       │   └── victoriametrics.json
│   │       ├── home.json
│   │       └── server/
│   │           ├── docker_containers.json
│   │           ├── docker_engine.json
│   │           └── node_exporter_full.json
│   ├── jaeger/
│   │   ├── bin/
│   │   │   ├── SOURCE.md
│   │   │   ├── jaeger-clickhouse-linux-amd64
│   │   │   └── jaeger-clickhouse-linux-arm64
│   │   ├── config.yml
│   │   ├── plugin-config.yml
│   │   └── sampling_strategies.json
│   ├── loki/
│   │   └── config.yml
│   └── otel/
│       └── config.yml
└── scripts/
    ├── entrypoint.sh
    ├── version.ps1
    └── version.sh
Download .txt
Showing preview only (1,550K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (15612 symbols across 597 files)

FILE: backend/cmd/ctester/main.go
  function main (line 33) | func main() {
  function createProvider (line 125) | func createProvider(providerType string, cfg *config.Config) (provider.P...
  function parseAgentTypes (line 232) | func parseAgentTypes(agentStrings []string) []pconfig.ProviderOptionsType {
  function parseTestGroups (line 262) | func parseTestGroups(groupStrings []string) []testdata.TestGroup {
  function convertToAgentResults (line 283) | func convertToAgentResults(results tester.ProviderTestResults, prv provi...
  function loadCustomTests (line 362) | func loadCustomTests(path string) (*testdata.TestRegistry, error) {

FILE: backend/cmd/ctester/models.go
  type TestResult (line 6) | type TestResult struct
  type AgentTestResult (line 19) | type AgentTestResult struct

FILE: backend/cmd/ctester/report.go
  function PrintAgentResults (line 11) | func PrintAgentResults(result AgentTestResult) {
  function PrintSummaryReport (line 63) | func PrintSummaryReport(results []AgentTestResult) {
  function WriteReportToFile (line 104) | func WriteReportToFile(results []AgentTestResult, filePath string) error {

FILE: backend/cmd/ctester/utils.go
  function TruncateString (line 10) | func TruncateString(s string, maxLength int) string {
  function EscapeMarkdown (line 22) | func EscapeMarkdown(text string) string {

FILE: backend/cmd/etester/flush.go
  method flush (line 11) | func (t *Tester) flush() error {

FILE: backend/cmd/etester/info.go
  method info (line 12) | func (t *Tester) info() error {
  function printTableHeader (line 195) | func printTableHeader(column1, column2 string) {
  function printTableRow (line 201) | func printTableRow(value string, count int) {

FILE: backend/cmd/etester/main.go
  constant defaultEmbeddingTableName (line 23) | defaultEmbeddingTableName  = "langchain_pg_embedding"
  constant defaultCollectionTableName (line 24) | defaultCollectionTableName = "langchain_pg_collection"
  function main (line 27) | func main() {
  function showHelp (line 114) | func showHelp() {

FILE: backend/cmd/etester/reindex.go
  type Document (line 14) | type Document struct
  method reindex (line 20) | func (t *Tester) reindex() error {

FILE: backend/cmd/etester/search.go
  type SearchOptions (line 16) | type SearchOptions struct
  function validateSearchOptions (line 27) | func validateSearchOptions(opts *SearchOptions) error {
  function parseSearchArgs (line 94) | func parseSearchArgs(args []string) (*SearchOptions, error) {
  method search (line 157) | func (t *Tester) search(args []string) error {
  method createVectorStore (line 253) | func (t *Tester) createVectorStore() (*pgvector.Store, error) {
  function printSearchUsage (line 272) | func printSearchUsage() {

FILE: backend/cmd/etester/test.go
  constant testText (line 12) | testText  = "This is a test text for embedding"
  constant testTexts (line 13) | testTexts = "This is a test text for embedding\nThis is another test tex...
  method test (line 17) | func (t *Tester) test() error {

FILE: backend/cmd/etester/tester.go
  type Tester (line 14) | type Tester struct
    method executeCommand (line 47) | func (t *Tester) executeCommand(args []string) error {
  function NewTester (line 26) | func NewTester(
  function formatSize (line 65) | func formatSize(bytes int64) string {

FILE: backend/cmd/ftester/main.go
  function main (line 30) | func main() {

FILE: backend/cmd/ftester/mocks/logs.go
  type ProxyProviders (line 12) | type ProxyProviders interface
  type proxyProviders (line 22) | type proxyProviders struct
    method GetScreenshotProvider (line 43) | func (p *proxyProviders) GetScreenshotProvider() tools.ScreenshotProvi...
    method GetAgentLogProvider (line 47) | func (p *proxyProviders) GetAgentLogProvider() tools.AgentLogProvider {
    method GetMsgLogProvider (line 51) | func (p *proxyProviders) GetMsgLogProvider() tools.MsgLogProvider {
    method GetSearchLogProvider (line 55) | func (p *proxyProviders) GetSearchLogProvider() tools.SearchLogProvider {
    method GetTermLogProvider (line 59) | func (p *proxyProviders) GetTermLogProvider() tools.TermLogProvider {
    method GetVectorStoreLogProvider (line 63) | func (p *proxyProviders) GetVectorStoreLogProvider() tools.VectorStore...
  function NewProxyProviders (line 32) | func NewProxyProviders() ProxyProviders {
  type proxyScreenshotProvider (line 68) | type proxyScreenshotProvider struct
    method PutScreenshot (line 71) | func (p *proxyScreenshotProvider) PutScreenshot(ctx context.Context, n...
  type proxyAgentLogProvider (line 87) | type proxyAgentLogProvider struct
    method PutLog (line 90) | func (p *proxyAgentLogProvider) PutLog(
  type proxyMsgLogProvider (line 119) | type proxyMsgLogProvider struct
    method PutMsg (line 122) | func (p *proxyMsgLogProvider) PutMsg(
    method UpdateMsgResult (line 147) | func (p *proxyMsgLogProvider) UpdateMsgResult(
  type proxySearchLogProvider (line 166) | type proxySearchLogProvider struct
    method PutLog (line 169) | func (p *proxySearchLogProvider) PutLog(
  type proxyTermLogProvider (line 200) | type proxyTermLogProvider struct
    method PutMsg (line 203) | func (p *proxyTermLogProvider) PutMsg(
  type proxyVectorStoreLogProvider (line 229) | type proxyVectorStoreLogProvider struct
    method PutLog (line 232) | func (p *proxyVectorStoreLogProvider) PutLog(

FILE: backend/cmd/ftester/mocks/tools.go
  function MockResponse (line 13) | func MockResponse(funcName string, args json.RawMessage) (string, error) {

FILE: backend/cmd/ftester/worker/args.go
  type FunctionInfo (line 14) | type FunctionInfo struct
  type ArgumentInfo (line 21) | type ArgumentInfo struct
  type DescribeParams (line 31) | type DescribeParams struct
  function GetAvailableFunctions (line 49) | func GetAvailableFunctions() []FunctionInfo {
  function GetFunctionInfo (line 72) | func GetFunctionInfo(funcName string) (FunctionInfo, error) {
  function ParseFunctionArgs (line 176) | func ParseFunctionArgs(funcName string, args []string) (any, error) {
  function getStructTypeForFunction (line 287) | func getStructTypeForFunction(funcName string) (reflect.Type, error) {
  function isToolAvailableForCall (line 335) | func isToolAvailableForCall(toolName string) bool {

FILE: backend/cmd/ftester/worker/executor.go
  type agentTool (line 24) | type agentTool struct
    method Handle (line 28) | func (at *agentTool) Handle(ctx context.Context, name string, args jso...
    method IsAvailable (line 35) | func (at *agentTool) IsAvailable() bool {
  type toolExecutor (line 40) | type toolExecutor struct
    method GetTool (line 112) | func (te *toolExecutor) GetTool(ctx context.Context, funcName string) ...
    method ExecuteFunctionWrapper (line 376) | func (te *toolExecutor) ExecuteFunctionWrapper(ctx context.Context, fu...
    method ExecuteRealFunction (line 389) | func (te *toolExecutor) ExecuteRealFunction(ctx context.Context, funcN...
    method ExecuteFunctionWithMode (line 409) | func (te *toolExecutor) ExecuteFunctionWithMode(ctx context.Context, f...
    method GetSummarizer (line 441) | func (te *toolExecutor) GetSummarizer() tools.SummarizeHandler {
  function newToolExecutor (line 56) | func newToolExecutor(

FILE: backend/cmd/ftester/worker/interactive.go
  function InteractiveFillArgs (line 15) | func InteractiveFillArgs(ctx context.Context, funcName string, taskID, s...
  function fillStructFromMap (line 146) | func fillStructFromMap(structPtr any, data map[string]any) error {

FILE: backend/cmd/ftester/worker/tester.go
  type Tester (line 23) | type Tester interface
  type tester (line 28) | type tester struct
    method initFlowProviderController (line 122) | func (t *tester) initFlowProviderController() error {
    method Execute (line 220) | func (t *tester) Execute(args []string) error {
    method executeDescribe (line 286) | func (t *tester) executeDescribe(ctx context.Context, params *Describe...
    method executeDescribeFlows (line 307) | func (t *tester) executeDescribeFlows(ctx context.Context, params *Des...
    method executeDescribeSubtask (line 350) | func (t *tester) executeDescribeSubtask(ctx context.Context, params *D...
    method executeDescribeTask (line 410) | func (t *tester) executeDescribeTask(ctx context.Context, params *Desc...
    method executeDescribeFlowTasks (line 481) | func (t *tester) executeDescribeFlowTasks(ctx context.Context, params ...
    method showGeneralHelp (line 559) | func (t *tester) showGeneralHelp() error {
    method getModeDescription (line 629) | func (t *tester) getModeDescription() string {
    method showFunctionHelp (line 637) | func (t *tester) showFunctionHelp(funcName string) error {
    method needsTeminalPrepare (line 663) | func (t *tester) needsTeminalPrepare(funcName string) bool {
  function NewTester (line 49) | func NewTester(
  function wrapErrorEndSpan (line 675) | func wrapErrorEndSpan(ctx context.Context, span langfuse.Span, msg strin...

FILE: backend/cmd/installer/checker/checker.go
  constant DockerComposeFile (line 23) | DockerComposeFile            = "docker-compose.yml"
  constant GraphitiComposeFile (line 24) | GraphitiComposeFile          = "docker-compose-graphiti.yml"
  constant LangfuseComposeFile (line 25) | LangfuseComposeFile          = "docker-compose-langfuse.yml"
  constant ObservabilityComposeFile (line 26) | ObservabilityComposeFile     = "docker-compose-observability.yml"
  constant ExampleCustomConfigLLMFile (line 27) | ExampleCustomConfigLLMFile   = "example.custom.provider.yml"
  constant ExampleOllamaConfigLLMFile (line 28) | ExampleOllamaConfigLLMFile   = "example.ollama.provider.yml"
  constant PentagiScriptFile (line 29) | PentagiScriptFile            = "/usr/local/bin/pentagi"
  constant PentagiContainerName (line 30) | PentagiContainerName         = "pentagi"
  constant GraphitiContainerName (line 31) | GraphitiContainerName        = "graphiti"
  constant Neo4jContainerName (line 32) | Neo4jContainerName           = "neo4j"
  constant LangfuseWorkerContainerName (line 33) | LangfuseWorkerContainerName  = "langfuse-worker"
  constant LangfuseWebContainerName (line 34) | LangfuseWebContainerName     = "langfuse-web"
  constant GrafanaContainerName (line 35) | GrafanaContainerName         = "grafana"
  constant OpenTelemetryContainerName (line 36) | OpenTelemetryContainerName   = "otel"
  constant DefaultImage (line 37) | DefaultImage                 = "debian:latest"
  constant DefaultImageForPentest (line 38) | DefaultImageForPentest       = "vxcontrol/kali-linux"
  constant DefaultGraphitiEndpoint (line 39) | DefaultGraphitiEndpoint      = "http://graphiti:8000"
  constant DefaultLangfuseEndpoint (line 40) | DefaultLangfuseEndpoint      = "http://langfuse-web:3000"
  constant DefaultObservabilityEndpoint (line 41) | DefaultObservabilityEndpoint = "otelcol:8148"
  constant DefaultLangfuseOtelEndpoint (line 42) | DefaultLangfuseOtelEndpoint  = "http://otelcol:4318"
  constant DefaultUpdateServerEndpoint (line 43) | DefaultUpdateServerEndpoint  = "https://update.pentagi.com"
  constant UpdatesCheckEndpoint (line 44) | UpdatesCheckEndpoint         = "/api/v1/updates/check"
  constant MinFreeMemGB (line 45) | MinFreeMemGB                 = 0.5
  constant MinFreeMemGBForPentagi (line 46) | MinFreeMemGBForPentagi       = 0.5
  constant MinFreeMemGBForGraphiti (line 47) | MinFreeMemGBForGraphiti      = 2.0
  constant MinFreeMemGBForLangfuse (line 48) | MinFreeMemGBForLangfuse      = 1.5
  constant MinFreeMemGBForObservability (line 49) | MinFreeMemGBForObservability = 1.5
  constant MinFreeDiskGB (line 50) | MinFreeDiskGB                = 5.0
  constant MinFreeDiskGBForComponents (line 51) | MinFreeDiskGBForComponents   = 10.0
  constant MinFreeDiskGBPerComponents (line 52) | MinFreeDiskGBPerComponents   = 2.0
  constant MinFreeDiskGBForWorkerImages (line 53) | MinFreeDiskGBForWorkerImages = 25.0
  type CheckResult (line 61) | type CheckResult struct
    method GatherAllInfo (line 134) | func (c *CheckResult) GatherAllInfo(ctx context.Context) error {
    method GatherDockerInfo (line 141) | func (c *CheckResult) GatherDockerInfo(ctx context.Context) error {
    method GatherWorkerInfo (line 148) | func (c *CheckResult) GatherWorkerInfo(ctx context.Context) error {
    method GatherPentagiInfo (line 155) | func (c *CheckResult) GatherPentagiInfo(ctx context.Context) error {
    method GatherGraphitiInfo (line 162) | func (c *CheckResult) GatherGraphitiInfo(ctx context.Context) error {
    method GatherLangfuseInfo (line 169) | func (c *CheckResult) GatherLangfuseInfo(ctx context.Context) error {
    method GatherObservabilityInfo (line 176) | func (c *CheckResult) GatherObservabilityInfo(ctx context.Context) err...
    method GatherSystemInfo (line 183) | func (c *CheckResult) GatherSystemInfo(ctx context.Context) error {
    method GatherUpdatesInfo (line 190) | func (c *CheckResult) GatherUpdatesInfo(ctx context.Context) error {
    method IsReadyToContinue (line 197) | func (c *CheckResult) IsReadyToContinue() bool {
    method CanStartAll (line 215) | func (c *CheckResult) CanStartAll() bool {
    method CanStopAll (line 232) | func (c *CheckResult) CanStopAll() bool {
    method CanRestartAll (line 237) | func (c *CheckResult) CanRestartAll() bool { return c.CanStopAll() }
    method CanDownloadWorker (line 240) | func (c *CheckResult) CanDownloadWorker() bool { return !c.WorkerImage...
    method CanUpdateWorker (line 243) | func (c *CheckResult) CanUpdateWorker() bool { return c.WorkerImageExi...
    method CanUpdateAll (line 246) | func (c *CheckResult) CanUpdateAll() bool {
    method CanUpdateInstaller (line 263) | func (c *CheckResult) CanUpdateInstaller() bool {
    method CanFactoryReset (line 268) | func (c *CheckResult) CanFactoryReset() bool {
    method CanRemoveAll (line 273) | func (c *CheckResult) CanRemoveAll() bool { return c.CanFactoryReset() }
    method CanPurgeAll (line 276) | func (c *CheckResult) CanPurgeAll() bool { return c.CanFactoryReset() }
    method CanResetPassword (line 279) | func (c *CheckResult) CanResetPassword() bool { return c.PentagiRunning }
    method CanInstallAll (line 282) | func (c *CheckResult) CanInstallAll() bool { return !c.PentagiInstalled }
  type CheckHandler (line 121) | type CheckHandler interface
  type defaultCheckHandler (line 285) | type defaultCheckHandler struct
    method GatherAllInfo (line 292) | func (h *defaultCheckHandler) GatherAllInfo(ctx context.Context, c *Ch...
    method GatherDockerInfo (line 331) | func (h *defaultCheckHandler) GatherDockerInfo(ctx context.Context, c ...
    method GatherWorkerInfo (line 363) | func (h *defaultCheckHandler) GatherWorkerInfo(ctx context.Context, c ...
    method GatherPentagiInfo (line 394) | func (h *defaultCheckHandler) GatherPentagiInfo(ctx context.Context, c...
    method GatherGraphitiInfo (line 418) | func (h *defaultCheckHandler) GatherGraphitiInfo(ctx context.Context, ...
    method GatherLangfuseInfo (line 447) | func (h *defaultCheckHandler) GatherLangfuseInfo(ctx context.Context, ...
    method GatherObservabilityInfo (line 478) | func (h *defaultCheckHandler) GatherObservabilityInfo(ctx context.Cont...
    method GatherSystemInfo (line 499) | func (h *defaultCheckHandler) GatherSystemInfo(ctx context.Context, c ...
    method GatherUpdatesInfo (line 553) | func (h *defaultCheckHandler) GatherUpdatesInfo(ctx context.Context, c...
  function Gather (line 656) | func Gather(ctx context.Context, appState state.State) (CheckResult, err...
  function GatherWithHandler (line 676) | func GatherWithHandler(ctx context.Context, handler CheckHandler) (Check...

FILE: backend/cmd/installer/checker/helpers.go
  type DockerVersion (line 31) | type DockerVersion struct
  type ImageInfo (line 36) | type ImageInfo struct
  type CheckUpdatesRequest (line 42) | type CheckUpdatesRequest struct
  type CheckUpdatesResponse (line 80) | type CheckUpdatesResponse struct
  function checkFileExists (line 89) | func checkFileExists(path string) bool {
  function checkFileIsReadable (line 94) | func checkFileIsReadable(path string) bool {
  function checkDirIsWritable (line 104) | func checkDirIsWritable(dirPath string) bool {
  function getEnvVar (line 118) | func getEnvVar(appState state.State, key, defaultValue string) string {
  function getProxyURL (line 133) | func getProxyURL(appState state.State) string {
  function createDockerClient (line 140) | func createDockerClient(host, certPath string, tlsVerify bool) (*client....
  function createDockerClientFromEnv (line 161) | func createDockerClientFromEnv(ctx context.Context) (*client.Client, Doc...
  type DockerErrorType (line 197) | type DockerErrorType
  constant DockerErrorNone (line 201) | DockerErrorNone         DockerErrorType = ""
  constant DockerErrorNotInstalled (line 202) | DockerErrorNotInstalled DockerErrorType = "not_installed"
  constant DockerErrorNotRunning (line 203) | DockerErrorNotRunning   DockerErrorType = "not_running"
  constant DockerErrorAPIError (line 204) | DockerErrorAPIError     DockerErrorType = "api_error"
  constant DockerErrorPermission (line 205) | DockerErrorPermission   DockerErrorType = "permission"
  function checkDockerVersion (line 208) | func checkDockerVersion(ctx context.Context, cli *client.Client) DockerV...
  function checkDockerCliVersion (line 220) | func checkDockerCliVersion() DockerVersion {
  function checkDockerComposeVersion (line 238) | func checkDockerComposeVersion() DockerVersion {
  function extractVersionFromOutput (line 255) | func extractVersionFromOutput(output string) string {
  function checkVersionCompatibility (line 264) | func checkVersionCompatibility(version, minVersion string) bool {
  function checkContainerExists (line 291) | func checkContainerExists(ctx context.Context, cli *client.Client, name ...
  function checkVolumesExist (line 310) | func checkVolumesExist(ctx context.Context, cli *client.Client, volumeNa...
  function checkCPUResources (line 340) | func checkCPUResources() bool {
  function determineComponentNeeds (line 345) | func determineComponentNeeds(c *CheckResult) (needsForPentagi, needsForG...
  function calculateRequiredMemoryGB (line 354) | func calculateRequiredMemoryGB(needsForPentagi, needsForGraphiti, needsF...
  function checkMemoryResources (line 371) | func checkMemoryResources(needsForPentagi, needsForGraphiti, needsForLan...
  function getAvailableMemoryGB (line 390) | func getAvailableMemoryGB() float64 {
  function getLinuxAvailableMemoryGB (line 402) | func getLinuxAvailableMemoryGB() float64 {
  function getDarwinAvailableMemoryGB (line 442) | func getDarwinAvailableMemoryGB() float64 {
  function checkLinuxMemory (line 492) | func checkLinuxMemory(requiredGB float64) bool {
  function checkDarwinMemory (line 532) | func checkDarwinMemory(requiredGB float64) bool {
  function calculateRequiredDiskGB (line 584) | func calculateRequiredDiskGB(workerImageExists bool, localComponents int...
  function countLocalComponentsToInstall (line 598) | func countLocalComponentsToInstall(
  function checkDiskSpaceWithContext (line 620) | func checkDiskSpaceWithContext(
  function getAvailableDiskGB (line 649) | func getAvailableDiskGB(ctx context.Context) float64 {
  function getLinuxAvailableDiskGB (line 661) | func getLinuxAvailableDiskGB(ctx context.Context) float64 {
  function getDarwinAvailableDiskGB (line 687) | func getDarwinAvailableDiskGB(ctx context.Context) float64 {
  function checkLinuxDiskSpace (line 711) | func checkLinuxDiskSpace(ctx context.Context, requiredGB float64) bool {
  function checkDarwinDiskSpace (line 736) | func checkDarwinDiskSpace(ctx context.Context, requiredGB float64) bool {
  function getNetworkFailures (line 760) | func getNetworkFailures(ctx context.Context, proxyURL string, dockerClie...
  function getContainerImageInfo (line 784) | func getContainerImageInfo(ctx context.Context, cli *client.Client, cont...
  function checkImageExists (line 801) | func checkImageExists(ctx context.Context, cli *client.Client, imageName...
  function getImageInfo (line 806) | func getImageInfo(ctx context.Context, cli *client.Client, imageName str...
  function parseImageRef (line 834) | func parseImageRef(imageRef, imageID string) *ImageInfo {
  function checkUpdatesServer (line 912) | func checkUpdatesServer(
  function checkDNSResolution (line 961) | func checkDNSResolution(hostname string) bool {
  function checkHTTPConnectivity (line 966) | func checkHTTPConnectivity(ctx context.Context, proxyURL string) bool {
  function checkDockerPullConnectivity (line 993) | func checkDockerPullConnectivity(ctx context.Context, dockerClient, work...
  function checkSingleDockerPull (line 1011) | func checkSingleDockerPull(ctx context.Context, cli *client.Client, imag...

FILE: backend/cmd/installer/checker/helpers_test.go
  type mockState (line 18) | type mockState struct
    method GetVar (line 23) | func (m *mockState) GetVar(key string) (loader.EnvVar, bool) {
    method GetVars (line 30) | func (m *mockState) GetVars(names []string) (map[string]loader.EnvVar,...
    method GetEnvPath (line 34) | func (m *mockState) GetEnvPath() string {
    method Exists (line 38) | func (m *mockState) Exists() bool                         { return true }
    method Reset (line 39) | func (m *mockState) Reset() error                         { return nil }
    method Commit (line 40) | func (m *mockState) Commit() error                        { return nil }
    method IsDirty (line 41) | func (m *mockState) IsDirty() bool                        { return fal...
    method GetEulaConsent (line 42) | func (m *mockState) GetEulaConsent() bool                 { return true }
    method SetEulaConsent (line 43) | func (m *mockState) SetEulaConsent() error                { return nil }
    method SetStack (line 44) | func (m *mockState) SetStack(stack []string) error        { return nil }
    method GetStack (line 45) | func (m *mockState) GetStack() []string                   { return []s...
    method SetVar (line 46) | func (m *mockState) SetVar(name, value string) error      { return nil }
    method ResetVar (line 47) | func (m *mockState) ResetVar(name string) error           { return nil }
    method SetVars (line 48) | func (m *mockState) SetVars(vars map[string]string) error { return nil }
    method ResetVars (line 49) | func (m *mockState) ResetVars(names []string) error       { return nil }
    method GetAllVars (line 50) | func (m *mockState) GetAllVars() map[string]loader.EnvVar { return m.v...
  function TestCheckFileExistsAndReadable (line 52) | func TestCheckFileExistsAndReadable(t *testing.T) {
  function TestGetEnvVar (line 83) | func TestGetEnvVar(t *testing.T) {
  function TestExtractVersionFromOutput (line 136) | func TestExtractVersionFromOutput(t *testing.T) {
  function TestCheckVersionCompatibility (line 160) | func TestCheckVersionCompatibility(t *testing.T) {
  function TestParseImageRef (line 190) | func TestParseImageRef(t *testing.T) {
  function TestCheckCPUResources (line 241) | func TestCheckCPUResources(t *testing.T) {
  function TestCheckMemoryResources (line 249) | func TestCheckMemoryResources(t *testing.T) {
  function TestCheckDiskSpaceWithContext (line 296) | func TestCheckDiskSpaceWithContext(t *testing.T) {
  function TestCheckUpdatesServer (line 375) | func TestCheckUpdatesServer(t *testing.T) {
  function TestCreateTempFileForTesting (line 512) | func TestCreateTempFileForTesting(t *testing.T) {
  function TestConstants (line 536) | func TestConstants(t *testing.T) {
  function TestCheckImageExistsEdgeCases (line 569) | func TestCheckImageExistsEdgeCases(t *testing.T) {
  function TestGetImageInfoEdgeCases (line 583) | func TestGetImageInfoEdgeCases(t *testing.T) {
  function TestCheckUpdatesRequestStructure (line 596) | func TestCheckUpdatesRequestStructure(t *testing.T) {
  function TestImageInfoStructure (line 627) | func TestImageInfoStructure(t *testing.T) {
  function TestCheckVolumesExist (line 646) | func TestCheckVolumesExist(t *testing.T) {
  type mockDockerVolume (line 681) | type mockDockerVolume struct
  function TestCheckVolumesExist_MatchingLogic (line 685) | func TestCheckVolumesExist_MatchingLogic(t *testing.T) {

FILE: backend/cmd/installer/files/files.go
  type FileStatus (line 16) | type FileStatus
  constant FileStatusMissing (line 19) | FileStatusMissing  FileStatus = "missing"
  constant FileStatusModified (line 20) | FileStatusModified FileStatus = "modified"
  constant FileStatusOK (line 21) | FileStatusOK       FileStatus = "ok"
  type Files (line 25) | type Files interface
  type EmbeddedProvider (line 50) | type EmbeddedProvider interface
  function shouldCheckPermissions (line 64) | func shouldCheckPermissions() bool {
  type files (line 71) | type files struct
    method GetContent (line 82) | func (f *files) GetContent(name string) ([]byte, error) {
    method Exists (line 110) | func (f *files) Exists(name string) bool {
    method ExistsInFS (line 118) | func (f *files) ExistsInFS(name string) bool {
    method Stat (line 125) | func (f *files) Stat(name string) (fs.FileInfo, error) {
    method Copy (line 153) | func (f *files) Copy(src, dst string, rewrite bool) error {
    method Check (line 181) | func (f *files) Check(name string, workingDir string) FileStatus {
    method List (line 246) | func (f *files) List(prefix string) ([]string, error) {
    method getContentFromFS (line 256) | func (f *files) getContentFromFS(name string) ([]byte, error) {
    method statFromFS (line 262) | func (f *files) statFromFS(name string) (fs.FileInfo, error) {
    method copyFromFS (line 268) | func (f *files) copyFromFS(src, dst string, rewrite bool) error {
    method copyFileFromFS (line 285) | func (f *files) copyFileFromFS(src, dst string, rewrite bool) error {
    method copyDirFromFS (line 333) | func (f *files) copyDirFromFS(src, dst string, rewrite bool) error {
    method listFromFS (line 361) | func (f *files) listFromFS(prefix string) ([]string, error) {
  function NewFiles (line 75) | func NewFiles() Files {

FILE: backend/cmd/installer/files/files_test.go
  function newTestFiles (line 12) | func newTestFiles(linksDir string) Files {
  function TestNewFiles (line 18) | func TestNewFiles(t *testing.T) {
  function TestGetContent_FromFS (line 25) | func TestGetContent_FromFS(t *testing.T) {
  function TestExistsInFS (line 46) | func TestExistsInFS(t *testing.T) {
  function TestStat_FromFS (line 65) | func TestStat_FromFS(t *testing.T) {
  function TestCopy_File (line 88) | func TestCopy_File(t *testing.T) {
  function TestCopy_PreservesExecutable_FromFS (line 119) | func TestCopy_PreservesExecutable_FromFS(t *testing.T) {
  function TestCheck_DetectsPermissionMismatch_FromFS (line 162) | func TestCheck_DetectsPermissionMismatch_FromFS(t *testing.T) {
  function TestCopy_Directory (line 233) | func TestCopy_Directory(t *testing.T) {
  function TestCopy_WithoutRewrite (line 264) | func TestCopy_WithoutRewrite(t *testing.T) {
  function TestCopy_WithRewrite (line 291) | func TestCopy_WithRewrite(t *testing.T) {
  function TestExists_WithoutEmbedded (line 329) | func TestExists_WithoutEmbedded(t *testing.T) {
  function TestCopy_FromEmbedded (line 338) | func TestCopy_FromEmbedded(t *testing.T) {
  function TestCheck_Missing (line 376) | func TestCheck_Missing(t *testing.T) {
  function TestCheck_OK (line 394) | func TestCheck_OK(t *testing.T) {
  function TestCheck_Modified (line 418) | func TestCheck_Modified(t *testing.T) {
  function TestList (line 443) | func TestList(t *testing.T) {
  function TestList_NonExistentPrefix (line 482) | func TestList_NonExistentPrefix(t *testing.T) {
  function TestCheck_HashComparison_Embedded (line 501) | func TestCheck_HashComparison_Embedded(t *testing.T) {
  function TestCheck_HashComparison_SameSize_DifferentContent (line 522) | func TestCheck_HashComparison_SameSize_DifferentContent(t *testing.T) {
  function TestCheck_HashComparison_DifferentSize (line 556) | func TestCheck_HashComparison_DifferentSize(t *testing.T) {
  function setupTestLinksInDir (line 581) | func setupTestLinksInDir(t *testing.T, linksDir string) {
  function setupTestLinksWithDirInDir (line 595) | func setupTestLinksWithDirInDir(t *testing.T, linksDir string) {

FILE: backend/cmd/installer/files/generate.go
  type FileMetadata (line 19) | type FileMetadata struct
  type MetadataFile (line 27) | type MetadataFile struct
  function main (line 31) | func main() {
  function readSymlinkWindows (line 765) | func readSymlinkWindows(symlinkPath string) (string, error) {
  function resolveSymlink (line 782) | func resolveSymlink(entryPath string) (string, error) {
  function evalSymlink (line 790) | func evalSymlink(entryPath string) (string, error) {
  function readFileContentWithMetadata (line 798) | func readFileContentWithMetadata(filename string) (string, FileMetadata,...

FILE: backend/cmd/installer/hardening/hardening.go
  type HardeningArea (line 18) | type HardeningArea
  constant HardeningAreaPentagi (line 21) | HardeningAreaPentagi  HardeningArea = "pentagi"
  constant HardeningAreaLangfuse (line 22) | HardeningAreaLangfuse HardeningArea = "langfuse"
  constant HardeningAreaGraphiti (line 23) | HardeningAreaGraphiti HardeningArea = "graphiti"
  type HardeningPolicyType (line 26) | type HardeningPolicyType
  constant HardeningPolicyTypeDefault (line 29) | HardeningPolicyTypeDefault   HardeningPolicyType = "default"
  constant HardeningPolicyTypeHex (line 30) | HardeningPolicyTypeHex       HardeningPolicyType = "hex"
  constant HardeningPolicyTypeUUID (line 31) | HardeningPolicyTypeUUID      HardeningPolicyType = "uuid"
  constant HardeningPolicyTypeBoolTrue (line 32) | HardeningPolicyTypeBoolTrue  HardeningPolicyType = "bool_true"
  constant HardeningPolicyTypeBoolFalse (line 33) | HardeningPolicyTypeBoolFalse HardeningPolicyType = "bool_false"
  type HardeningPolicy (line 36) | type HardeningPolicy struct
  function DoHardening (line 130) | func DoHardening(s state.State, c checker.CheckResult) error {
  function syncValueToState (line 210) | func syncValueToState(s state.State, curVar loader.EnvVar, newValue stri...
  function syncScraperState (line 222) | func syncScraperState(s state.State, vars map[string]loader.EnvVar) (boo...
  function syncLangfuseState (line 254) | func syncLangfuseState(s state.State, vars map[string]loader.EnvVar) (bo...
  function replaceDefaultValues (line 283) | func replaceDefaultValues(
  function updateDefaultValues (line 311) | func updateDefaultValues(vars map[string]loader.EnvVar) {
  function randomString (line 320) | func randomString(policy HardeningPolicy) (string, error) {
  function randStringAlpha (line 337) | func randStringAlpha(length int) (string, error) {
  function randStringHex (line 352) | func randStringHex(length int) (string, error) {
  function randStringUUID (line 364) | func randStringUUID(prefix string) (string, error) {

FILE: backend/cmd/installer/hardening/hardening_test.go
  type mockState (line 17) | type mockState struct
    method GetVar (line 22) | func (m *mockState) GetVar(key string) (loader.EnvVar, bool) {
    method GetVars (line 29) | func (m *mockState) GetVars(names []string) (map[string]loader.EnvVar,...
    method GetEnvPath (line 44) | func (m *mockState) GetEnvPath() string                   { return m.e...
    method Exists (line 45) | func (m *mockState) Exists() bool                         { return true }
    method Reset (line 46) | func (m *mockState) Reset() error                         { return nil }
    method IsDirty (line 47) | func (m *mockState) IsDirty() bool                        { return fal...
    method GetEulaConsent (line 48) | func (m *mockState) GetEulaConsent() bool                 { return true }
    method SetEulaConsent (line 49) | func (m *mockState) SetEulaConsent() error                { return nil }
    method SetStack (line 50) | func (m *mockState) SetStack(stack []string) error        { return nil }
    method GetStack (line 51) | func (m *mockState) GetStack() []string                   { return []s...
    method ResetVar (line 52) | func (m *mockState) ResetVar(name string) error           { return nil }
    method ResetVars (line 53) | func (m *mockState) ResetVars(names []string) error       { return nil }
    method GetAllVars (line 54) | func (m *mockState) GetAllVars() map[string]loader.EnvVar { return m.v...
    method Commit (line 55) | func (m *mockState) Commit() error                        { return nil }
    method SetVar (line 57) | func (m *mockState) SetVar(name, value string) error {
    method SetVars (line 69) | func (m *mockState) SetVars(vars map[string]string) error {
  function getEnvExamplePath (line 79) | func getEnvExamplePath() string {
  function createTempEnvFile (line 87) | func createTempEnvFile(t *testing.T, content string) string {
  function TestRandomString (line 102) | func TestRandomString(t *testing.T) {
  function TestRandStringAlpha (line 168) | func TestRandStringAlpha(t *testing.T) {
  function TestRandStringHex (line 195) | func TestRandStringHex(t *testing.T) {
  function TestRandStringUUID (line 223) | func TestRandStringUUID(t *testing.T) {
  function TestUpdateDefaultValues (line 252) | func TestUpdateDefaultValues(t *testing.T) {
  function TestReplaceDefaultValues (line 309) | func TestReplaceDefaultValues(t *testing.T) {
  function TestSyncValueToState (line 398) | func TestSyncValueToState(t *testing.T) {
  function TestVarsExistInEnvExample (line 458) | func TestVarsExistInEnvExample(t *testing.T) {
  function TestDefaultValuesMatchEnvExample (line 482) | func TestDefaultValuesMatchEnvExample(t *testing.T) {
  function TestDoHardening (line 518) | func TestDoHardening(t *testing.T) {
  function TestDoHardening_ScraperURLLogic (line 718) | func TestDoHardening_ScraperURLLogic(t *testing.T) {
  function TestSyncLangfuseState (line 865) | func TestSyncLangfuseState(t *testing.T) {
  function TestSyncScraperState (line 1030) | func TestSyncScraperState(t *testing.T) {
  function TestDoHardening_IntegrationWithRealEnvFile (line 1243) | func TestDoHardening_IntegrationWithRealEnvFile(t *testing.T) {
  function validateHardenedValue (line 1471) | func validateHardenedValue(varName, value string) error {
  function verifyLangfuseSyncRelationships (line 1525) | func verifyLangfuseSyncRelationships(t *testing.T, state *mockState) {
  function verifyScraperURLConsistency (line 1542) | func verifyScraperURLConsistency(t *testing.T, state *mockState) {
  function isAlphanumeric (line 1565) | func isAlphanumeric(s string) bool {
  function isHexString (line 1574) | func isHexString(s string) bool {

FILE: backend/cmd/installer/hardening/migrations.go
  type checkPathType (line 12) | type checkPathType
  constant directory (line 15) | directory checkPathType = "directory"
  constant file (line 16) | file      checkPathType = "file"
  function DoMigrateSettings (line 19) | func DoMigrateSettings(s state.State) error {
  function checkPathInHostFS (line 74) | func checkPathInHostFS(path string, pathType checkPathType) bool {

FILE: backend/cmd/installer/hardening/migrations_test.go
  function TestDoMigrateSettings_SuccessfulMigrations (line 14) | func TestDoMigrateSettings_SuccessfulMigrations(t *testing.T) {
  function TestDoMigrateSettings_VariableNotSet (line 121) | func TestDoMigrateSettings_VariableNotSet(t *testing.T) {
  function TestDoMigrateSettings_EmptyVariable (line 163) | func TestDoMigrateSettings_EmptyVariable(t *testing.T) {
  function TestDoMigrateSettings_PathNotExist (line 216) | func TestDoMigrateSettings_PathNotExist(t *testing.T) {
  function TestDoMigrateSettings_AlreadyDefaultValue (line 273) | func TestDoMigrateSettings_AlreadyDefaultValue(t *testing.T) {
  function TestDoMigrateSettings_EmbeddedConfigs (line 342) | func TestDoMigrateSettings_EmbeddedConfigs(t *testing.T) {
  function TestDoMigrateSettings_WrongPathType (line 404) | func TestDoMigrateSettings_WrongPathType(t *testing.T) {
  function TestDoMigrateSettings_ErrorHandling (line 488) | func TestDoMigrateSettings_ErrorHandling(t *testing.T) {
  function TestDoMigrateSettings_CombinedMigrations (line 610) | func TestDoMigrateSettings_CombinedMigrations(t *testing.T) {
  function TestCheckPathInHostFS (line 846) | func TestCheckPathInHostFS(t *testing.T) {

FILE: backend/cmd/installer/hardening/network.go
  function DoSyncNetworkSettings (line 10) | func DoSyncNetworkSettings(s state.State) error {

FILE: backend/cmd/installer/hardening/network_test.go
  type mockStateWithErrors (line 15) | type mockStateWithErrors struct
    method GetVar (line 22) | func (m *mockStateWithErrors) GetVar(key string) (loader.EnvVar, bool) {
    method GetVars (line 29) | func (m *mockStateWithErrors) GetVars(names []string) (map[string]load...
    method SetVar (line 44) | func (m *mockStateWithErrors) SetVar(name, value string) error {
    method SetVars (line 62) | func (m *mockStateWithErrors) SetVars(vars map[string]string) error {
    method GetEnvPath (line 75) | func (m *mockStateWithErrors) GetEnvPath() string                   { ...
    method Exists (line 76) | func (m *mockStateWithErrors) Exists() bool                         { ...
    method Reset (line 77) | func (m *mockStateWithErrors) Reset() error                         { ...
    method Commit (line 78) | func (m *mockStateWithErrors) Commit() error                        { ...
    method IsDirty (line 79) | func (m *mockStateWithErrors) IsDirty() bool                        { ...
    method GetEulaConsent (line 80) | func (m *mockStateWithErrors) GetEulaConsent() bool                 { ...
    method SetEulaConsent (line 81) | func (m *mockStateWithErrors) SetEulaConsent() error                { ...
    method SetStack (line 82) | func (m *mockStateWithErrors) SetStack(stack []string) error        { ...
    method GetStack (line 83) | func (m *mockStateWithErrors) GetStack() []string                   { ...
    method ResetVar (line 84) | func (m *mockStateWithErrors) ResetVar(name string) error           { ...
    method ResetVars (line 85) | func (m *mockStateWithErrors) ResetVars(names []string) error       { ...
    method GetAllVars (line 86) | func (m *mockStateWithErrors) GetAllVars() map[string]loader.EnvVar { ...
  function TestDoSyncNetworkSettings_ProxySettings (line 89) | func TestDoSyncNetworkSettings_ProxySettings(t *testing.T) {
  function TestDoSyncNetworkSettings_DockerEnvVars (line 222) | func TestDoSyncNetworkSettings_DockerEnvVars(t *testing.T) {
  function TestDoSyncNetworkSettings_CombinedScenarios (line 423) | func TestDoSyncNetworkSettings_CombinedScenarios(t *testing.T) {
  function TestDoSyncNetworkSettings_ErrorHandling (line 580) | func TestDoSyncNetworkSettings_ErrorHandling(t *testing.T) {
  function TestDoSyncNetworkSettings_EdgeCases (line 655) | func TestDoSyncNetworkSettings_EdgeCases(t *testing.T) {
  function TestDoSyncNetworkSettings_DockerCertPathMigration (line 768) | func TestDoSyncNetworkSettings_DockerCertPathMigration(t *testing.T) {
  function TestDoSyncNetworkSettings_PreventOverrideExistingSettings (line 894) | func TestDoSyncNetworkSettings_PreventOverrideExistingSettings(t *testin...

FILE: backend/cmd/installer/loader/example_test.go
  function ExampleEnvFile_workflow (line 10) | func ExampleEnvFile_workflow() {

FILE: backend/cmd/installer/loader/file.go
  type EnvVar (line 12) | type EnvVar struct
    method IsDefault (line 21) | func (e *EnvVar) IsDefault() bool {
    method IsPresent (line 25) | func (e *EnvVar) IsPresent() bool {
  type EnvFile (line 29) | type EnvFile interface
  type envFile (line 39) | type envFile struct
    method Del (line 46) | func (e *envFile) Del(name string) {
    method Set (line 53) | func (e *envFile) Set(name, value string) {
    method Get (line 74) | func (e *envFile) Get(name string) (EnvVar, bool) {
    method GetAll (line 88) | func (e *envFile) GetAll() map[string]EnvVar {
    method SetAll (line 100) | func (e *envFile) SetAll(vars map[string]EnvVar) {
    method Save (line 110) | func (e *envFile) Save(path string) error {
    method Clone (line 155) | func (e *envFile) Clone() EnvFile {
    method patchRaw (line 174) | func (e *envFile) patchRaw() {
  function trim (line 241) | func trim(value string) string {

FILE: backend/cmd/installer/loader/loader.go
  function LoadEnvFile (line 17) | func LoadEnvFile(path string) (EnvFile, error) {
  function loadVars (line 44) | func loadVars(raw string) map[string]*EnvVar {
  function stripComments (line 74) | func stripComments(value string) string {
  function setDefaultVars (line 83) | func setDefaultVars(envFile *envFile) error {

FILE: backend/cmd/installer/loader/loader_test.go
  function containsLine (line 11) | func containsLine(content, line string) bool {
  function TestLoadEnvFile (line 21) | func TestLoadEnvFile(t *testing.T) {
  function TestLoadEnvFileErrors (line 79) | func TestLoadEnvFileErrors(t *testing.T) {
  function TestEnvVarMethods (line 98) | func TestEnvVarMethods(t *testing.T) {
  function TestEnvFileSetGet (line 125) | func TestEnvFileSetGet(t *testing.T) {
  function TestEnvFileSave (line 288) | func TestEnvFileSave(t *testing.T) {
  function TestEnvFileSaveNewFile (line 351) | func TestEnvFileSaveNewFile(t *testing.T) {
  function TestEnvFileSaveErrors (line 381) | func TestEnvFileSaveErrors(t *testing.T) {
  function TestEnvFileClone (line 449) | func TestEnvFileClone(t *testing.T) {
  function TestLoadVarsEdgeCases (line 491) | func TestLoadVarsEdgeCases(t *testing.T) {
  function TestPatchRaw (line 547) | func TestPatchRaw(t *testing.T) {
  function TestEnvFileDelInSave (line 588) | func TestEnvFileDelInSave(t *testing.T) {
  function TestSetDefaultVarsNilURL (line 640) | func TestSetDefaultVarsNilURL(t *testing.T) {
  function TestSetDefaultVars (line 660) | func TestSetDefaultVars(t *testing.T) {
  function createTempFile (line 683) | func createTempFile(t *testing.T, content string) string {

FILE: backend/cmd/installer/main.go
  type Config (line 21) | type Config struct
  function main (line 26) | func main() {
  function parseFlags (line 75) | func parseFlags(args []string) Config {
  function setupSignalHandler (line 101) | func setupSignalHandler(cancel context.CancelFunc) {
  function validateEnvPath (line 112) | func validateEnvPath(envPath string) (string, error) {
  function createInitialEnvFile (line 144) | func createInitialEnvFile(path string) error {
  function initializeState (line 167) | func initializeState(envPath string) (state.State, error) {
  function gatherSystemFacts (line 176) | func gatherSystemFacts(ctx context.Context, appState state.State) (check...
  function printStartupInfo (line 185) | func printStartupInfo(envPath string, checkResult checker.CheckResult) {
  function runApplication (line 196) | func runApplication(ctx context.Context, appState state.State, checkResu...
  function cleanup (line 200) | func cleanup(appState state.State) {

FILE: backend/cmd/installer/main_test.go
  function TestParseFlags (line 11) | func TestParseFlags(t *testing.T) {
  function TestValidateEnvPath (line 58) | func TestValidateEnvPath(t *testing.T) {
  function TestCreateEmptyEnvFile (line 126) | func TestCreateEmptyEnvFile(t *testing.T) {
  function TestInitializeState (line 155) | func TestInitializeState(t *testing.T) {
  function containsString (line 184) | func containsString(s, substr string) bool {

FILE: backend/cmd/installer/navigator/navigator.go
  type Navigator (line 12) | type Navigator interface
  type navigator (line 22) | type navigator struct
    method Push (line 63) | func (n *navigator) Push(screenID models.ScreenID) {
    method Pop (line 69) | func (n *navigator) Pop() models.ScreenID {
    method Current (line 82) | func (n *navigator) Current() models.ScreenID {
    method CanGoBack (line 89) | func (n *navigator) CanGoBack() bool {
    method GetStack (line 93) | func (n *navigator) GetStack() NavigatorStack {
    method String (line 97) | func (n *navigator) String() string {
  type NavigatorStack (line 27) | type NavigatorStack
    method Strings (line 29) | func (s NavigatorStack) Strings() []string {
    method String (line 37) | func (s NavigatorStack) String() string {
  function NewNavigator (line 41) | func NewNavigator(state state.State, checkResult checker.CheckResult) Na...

FILE: backend/cmd/installer/navigator/navigator_test.go
  type mockState (line 13) | type mockState struct
    method Exists (line 17) | func (m *mockState) Exists() bool                        { return true }
    method Reset (line 18) | func (m *mockState) Reset() error                        { return nil }
    method Commit (line 19) | func (m *mockState) Commit() error                       { return nil }
    method IsDirty (line 20) | func (m *mockState) IsDirty() bool                       { return false }
    method GetEulaConsent (line 21) | func (m *mockState) GetEulaConsent() bool                { return false }
    method SetEulaConsent (line 22) | func (m *mockState) SetEulaConsent() error               { return nil }
    method GetStack (line 23) | func (m *mockState) GetStack() []string                  { return m.st...
    method SetStack (line 24) | func (m *mockState) SetStack(stack []string) error       { m.stack = s...
    method GetVar (line 25) | func (m *mockState) GetVar(string) (loader.EnvVar, bool) { return load...
    method SetVar (line 26) | func (m *mockState) SetVar(string, string) error         { return nil }
    method ResetVar (line 27) | func (m *mockState) ResetVar(string) error               { return nil }
    method GetVars (line 28) | func (m *mockState) GetVars([]string) (map[string]loader.EnvVar, map[s...
    method SetVars (line 31) | func (m *mockState) SetVars(map[string]string) error      { return nil }
    method ResetVars (line 32) | func (m *mockState) ResetVars([]string) error             { return nil }
    method GetAllVars (line 33) | func (m *mockState) GetAllVars() map[string]loader.EnvVar { return nil }
    method GetEnvPath (line 34) | func (m *mockState) GetEnvPath() string                   { return "" }
  function newMockCheckResult (line 36) | func newMockCheckResult() checker.CheckResult {
  function newTestNavigator (line 52) | func newTestNavigator() (Navigator, *mockState) {
  function TestNewNavigator (line 58) | func TestNewNavigator(t *testing.T) {
  function TestPushSingleScreen (line 74) | func TestPushSingleScreen(t *testing.T) {
  function TestPushMultipleScreens (line 89) | func TestPushMultipleScreens(t *testing.T) {
  function TestCanGoBack (line 117) | func TestCanGoBack(t *testing.T) {
  function TestPopNormalCase (line 135) | func TestPopNormalCase(t *testing.T) {
  function TestPopEmptyStack (line 158) | func TestPopEmptyStack(t *testing.T) {
  function TestPopSingleScreen (line 172) | func TestPopSingleScreen(t *testing.T) {
  function TestCurrentEmptyStack (line 187) | func TestCurrentEmptyStack(t *testing.T) {
  function TestGetStack (line 195) | func TestGetStack(t *testing.T) {
  function TestNavigatorStackStrings (line 216) | func TestNavigatorStackStrings(t *testing.T) {
  function TestNavigatorStackString (line 231) | func TestNavigatorStackString(t *testing.T) {
  function TestNavigatorStackStringEmpty (line 242) | func TestNavigatorStackStringEmpty(t *testing.T) {
  function TestNavigatorString (line 253) | func TestNavigatorString(t *testing.T) {
  function TestComplexNavigationFlow (line 267) | func TestComplexNavigationFlow(t *testing.T) {
  function TestStateIntegrationWithExistingStack (line 306) | func TestStateIntegrationWithExistingStack(t *testing.T) {

FILE: backend/cmd/installer/processor/compose.go
  constant composeFilePentagi (line 13) | composeFilePentagi       = "docker-compose.yml"
  constant composeFileGraphiti (line 14) | composeFileGraphiti      = "docker-compose-graphiti.yml"
  constant composeFileLangfuse (line 15) | composeFileLangfuse      = "docker-compose-langfuse.yml"
  constant composeFileObservability (line 16) | composeFileObservability = "docker-compose-observability.yml"
  type composeOperationsImpl (line 28) | type composeOperationsImpl struct
    method startStack (line 37) | func (c *composeOperationsImpl) startStack(ctx context.Context, stack ...
    method stopStack (line 42) | func (c *composeOperationsImpl) stopStack(ctx context.Context, stack P...
    method restartStack (line 47) | func (c *composeOperationsImpl) restartStack(ctx context.Context, stac...
    method updateStack (line 63) | func (c *composeOperationsImpl) updateStack(ctx context.Context, stack...
    method downloadStack (line 67) | func (c *composeOperationsImpl) downloadStack(ctx context.Context, sta...
    method removeStack (line 71) | func (c *composeOperationsImpl) removeStack(ctx context.Context, stack...
    method purgeStack (line 75) | func (c *composeOperationsImpl) purgeStack(ctx context.Context, stack ...
    method purgeImagesStack (line 80) | func (c *composeOperationsImpl) purgeImagesStack(ctx context.Context, ...
    method performStackOperation (line 84) | func (c *composeOperationsImpl) performStackOperation(
    method wrapPerformStackCommand (line 117) | func (c *composeOperationsImpl) wrapPerformStackCommand(
    method performStackCommand (line 133) | func (c *composeOperationsImpl) performStackCommand(
    method determineComposeFile (line 166) | func (c *composeOperationsImpl) determineComposeFile(stack ProductStac...
    method getMessages (line 181) | func (c *composeOperationsImpl) getMessages(stack ProductStack, operat...
  function newComposeOperations (line 32) | func newComposeOperations(p *processor) composeOperations {

FILE: backend/cmd/installer/processor/docker.go
  type dockerOperationsImpl (line 19) | type dockerOperationsImpl struct
    method pullWorkerImage (line 27) | func (d *dockerOperationsImpl) pullWorkerImage(ctx context.Context, st...
    method pullDefaultImage (line 31) | func (d *dockerOperationsImpl) pullDefaultImage(ctx context.Context, s...
    method pullImage (line 35) | func (d *dockerOperationsImpl) pullImage(ctx context.Context, state *o...
    method removeWorkerContainers (line 50) | func (d *dockerOperationsImpl) removeWorkerContainers(ctx context.Cont...
    method removeWorkerImages (line 102) | func (d *dockerOperationsImpl) removeWorkerImages(ctx context.Context,...
    method purgeWorkerImages (line 109) | func (d *dockerOperationsImpl) purgeWorkerImages(ctx context.Context, ...
    method removeImages (line 116) | func (d *dockerOperationsImpl) removeImages(
    method createMainDockerClient (line 148) | func (d *dockerOperationsImpl) createMainDockerClient() (*client.Clien...
    method checkMainDockerNetwork (line 156) | func (d *dockerOperationsImpl) checkMainDockerNetwork(ctx context.Cont...
    method createMainDockerNetwork (line 170) | func (d *dockerOperationsImpl) createMainDockerNetwork(ctx context.Con...
    method ensureMainDockerNetworks (line 229) | func (d *dockerOperationsImpl) ensureMainDockerNetworks(ctx context.Co...
    method removeMainDockerNetwork (line 258) | func (d *dockerOperationsImpl) removeMainDockerNetwork(ctx context.Con...
    method removeMainImages (line 288) | func (d *dockerOperationsImpl) removeMainImages(ctx context.Context, s...
    method removeWorkerVolumes (line 315) | func (d *dockerOperationsImpl) removeWorkerVolumes(ctx context.Context...
    method createWorkerDockerClient (line 334) | func (d *dockerOperationsImpl) createWorkerDockerClient() (*client.Cli...
    method getWorkerDockerEnv (line 377) | func (d *dockerOperationsImpl) getWorkerDockerEnv() []string {
    method getWorkerImageName (line 410) | func (d *dockerOperationsImpl) getWorkerImageName() string {
    method getDefaultImageName (line 421) | func (d *dockerOperationsImpl) getDefaultImageName() string {
  function newDockerOperations (line 23) | func newDockerOperations(p *processor) dockerOperations {

FILE: backend/cmd/installer/processor/fs.go
  constant observabilityDirectory (line 17) | observabilityDirectory        = "observability"
  constant pentagiExampleCustomConfigLLM (line 18) | pentagiExampleCustomConfigLLM = "example.custom.provider.yml"
  constant pentagiExampleOllamaConfigLLM (line 19) | pentagiExampleOllamaConfigLLM = "example.ollama.provider.yml"
  type fileSystemOperationsImpl (line 36) | type fileSystemOperationsImpl struct
    method ensureStackIntegrity (line 44) | func (fs *fileSystemOperationsImpl) ensureStackIntegrity(ctx context.C...
    method verifyStackIntegrity (line 80) | func (fs *fileSystemOperationsImpl) verifyStackIntegrity(ctx context.C...
    method checkStackIntegrity (line 115) | func (fs *fileSystemOperationsImpl) checkStackIntegrity(ctx context.Co...
    method cleanupStackFiles (line 153) | func (fs *fileSystemOperationsImpl) cleanupStackFiles(ctx context.Cont...
    method ensureFileFromEmbed (line 198) | func (fs *fileSystemOperationsImpl) ensureFileFromEmbed(filename strin...
    method ensureDirectoryFromEmbed (line 216) | func (fs *fileSystemOperationsImpl) ensureDirectoryFromEmbed(dirname s...
    method checkFileIntegrity (line 233) | func (fs *fileSystemOperationsImpl) checkFileIntegrity(filename string...
    method checkDirectoryIntegrity (line 238) | func (fs *fileSystemOperationsImpl) checkDirectoryIntegrity(dirname st...
    method checkDirectoryContentIntegrity (line 244) | func (fs *fileSystemOperationsImpl) checkDirectoryContentIntegrity(emb...
    method verifyFileIntegrity (line 278) | func (fs *fileSystemOperationsImpl) verifyFileIntegrity(filename strin...
    method verifyDirectoryIntegrity (line 301) | func (fs *fileSystemOperationsImpl) verifyDirectoryIntegrity(dirname s...
    method verifyDirectoryContentIntegrity (line 319) | func (fs *fileSystemOperationsImpl) verifyDirectoryContentIntegrity(em...
    method isExcludedFromVerification (line 395) | func (fs *fileSystemOperationsImpl) isExcludedFromVerification(path st...
    method fileExists (line 405) | func (fs *fileSystemOperationsImpl) fileExists(path string) bool {
    method directoryExists (line 410) | func (fs *fileSystemOperationsImpl) directoryExists(path string) bool {
    method validateYamlFile (line 415) | func (fs *fileSystemOperationsImpl) validateYamlFile(path string) error {
  function newFileSystemOperations (line 40) | func newFileSystemOperations(p *processor) fileSystemOperations {

FILE: backend/cmd/installer/processor/fs_test.go
  function testStackIntegrityOperation (line 14) | func testStackIntegrityOperation(t *testing.T, operation func(*fileSyste...
  function TestFileSystemOperationsImpl_EnsureStackIntegrity (line 48) | func TestFileSystemOperationsImpl_EnsureStackIntegrity(t *testing.T) {
  function TestFileSystemOperationsImpl_VerifyStackIntegrity (line 52) | func TestFileSystemOperationsImpl_VerifyStackIntegrity(t *testing.T) {
  function TestFileSystemOperationsImpl_CleanupStackFiles (line 56) | func TestFileSystemOperationsImpl_CleanupStackFiles(t *testing.T) {
  function TestFileSystemOperationsImpl_EnsureFileFromEmbed (line 60) | func TestFileSystemOperationsImpl_EnsureFileFromEmbed(t *testing.T) {
  function TestFileSystemOperationsImpl_VerifyDirectoryContentIntegrity (line 120) | func TestFileSystemOperationsImpl_VerifyDirectoryContentIntegrity(t *tes...
  function TestFileSystemOperationsImpl_ExcludedFilesHandling (line 232) | func TestFileSystemOperationsImpl_ExcludedFilesHandling(t *testing.T) {
  function TestFileSystemOperationsImpl_FileExists (line 340) | func TestFileSystemOperationsImpl_FileExists(t *testing.T) {
  function TestFileSystemOperationsImpl_DirectoryExists (line 373) | func TestFileSystemOperationsImpl_DirectoryExists(t *testing.T) {
  function TestFileSystemOperationsImpl_ValidateYamlFile (line 406) | func TestFileSystemOperationsImpl_ValidateYamlFile(t *testing.T) {
  function TestCheckStackIntegrity (line 463) | func TestCheckStackIntegrity(t *testing.T) {
  function TestCheckStackIntegrity_RealFiles (line 606) | func TestCheckStackIntegrity_RealFiles(t *testing.T) {
  function TestFileSystemOperations_IntegrityWithForceMode (line 648) | func TestFileSystemOperations_IntegrityWithForceMode(t *testing.T) {
  function TestFileSystemOperations_StackSpecificBehavior (line 682) | func TestFileSystemOperations_StackSpecificBehavior(t *testing.T) {

FILE: backend/cmd/installer/processor/locale.go
  constant MsgPullingImage (line 5) | MsgPullingImage                = "Pulling image: %s"
  constant MsgImagePullCompleted (line 6) | MsgImagePullCompleted          = "Completed pulling %s"
  constant MsgImagePullFailed (line 7) | MsgImagePullFailed             = "Failed to pull image %s: %v"
  constant MsgRemovingWorkerContainers (line 8) | MsgRemovingWorkerContainers    = "Removing worker containers"
  constant MsgStoppingContainer (line 9) | MsgStoppingContainer           = "Stopping container %s"
  constant MsgRemovingContainer (line 10) | MsgRemovingContainer           = "Removing container %s"
  constant MsgContainerRemoved (line 11) | MsgContainerRemoved            = "Removed container %s"
  constant MsgNoWorkerContainersFound (line 12) | MsgNoWorkerContainersFound     = "No worker containers found"
  constant MsgWorkerContainersRemoved (line 13) | MsgWorkerContainersRemoved     = "Removed %d worker containers"
  constant MsgRemovingImage (line 14) | MsgRemovingImage               = "Removing image: %s"
  constant MsgImageRemoved (line 15) | MsgImageRemoved                = "Successfully removed image %s"
  constant MsgImageNotFound (line 16) | MsgImageNotFound               = "Image %s not found (already removed)"
  constant MsgWorkerImagesRemoveCompleted (line 17) | MsgWorkerImagesRemoveCompleted = "Worker images removal completed"
  constant MsgEnsuringDockerNetworks (line 18) | MsgEnsuringDockerNetworks      = "Ensuring docker networks exist"
  constant MsgDockerNetworkExists (line 19) | MsgDockerNetworkExists         = "Docker network exists: %s"
  constant MsgCreatingDockerNetwork (line 20) | MsgCreatingDockerNetwork       = "Creating docker network: %s"
  constant MsgDockerNetworkCreated (line 21) | MsgDockerNetworkCreated        = "Docker network created: %s"
  constant MsgDockerNetworkCreateFailed (line 22) | MsgDockerNetworkCreateFailed   = "Failed to create docker network %s: %v"
  constant MsgRecreatingDockerNetwork (line 23) | MsgRecreatingDockerNetwork     = "Recreating docker network with compose...
  constant MsgDockerNetworkRemoved (line 24) | MsgDockerNetworkRemoved        = "Docker network removed: %s"
  constant MsgDockerNetworkRemoveFailed (line 25) | MsgDockerNetworkRemoveFailed   = "Failed to remove docker network %s: %v"
  constant MsgDockerNetworkInUse (line 26) | MsgDockerNetworkInUse          = "Docker network %s is in use by contain...
  constant MsgExtractingDockerCompose (line 31) | MsgExtractingDockerCompose          = "Extracting docker-compose.yml"
  constant MsgExtractingLangfuseCompose (line 32) | MsgExtractingLangfuseCompose        = "Extracting docker-compose-langfus...
  constant MsgExtractingObservabilityCompose (line 33) | MsgExtractingObservabilityCompose   = "Extracting docker-compose-observa...
  constant MsgExtractingObservabilityDirectory (line 34) | MsgExtractingObservabilityDirectory = "Extracting observability directory"
  constant MsgSkippingExternalLangfuse (line 35) | MsgSkippingExternalLangfuse         = "Skipping external Langfuse deploy...
  constant MsgSkippingExternalObservability (line 36) | MsgSkippingExternalObservability    = "Skipping external Observability d...
  constant MsgPatchingComposeFile (line 37) | MsgPatchingComposeFile              = "Patching docker-compose file: %s"
  constant MsgComposePatchCompleted (line 38) | MsgComposePatchCompleted            = "Docker-compose file patching comp...
  constant MsgCleaningUpStackFiles (line 39) | MsgCleaningUpStackFiles             = "Cleaning up stack files for %s"
  constant MsgStackFilesCleanupCompleted (line 40) | MsgStackFilesCleanupCompleted       = "Stack files cleanup completed"
  constant MsgEnsurngStackIntegrity (line 41) | MsgEnsurngStackIntegrity            = "Ensuring %s stack integrity"
  constant MsgVerifyingStackIntegrity (line 42) | MsgVerifyingStackIntegrity          = "Verifying %s stack integrity"
  constant MsgStackIntegrityVerified (line 43) | MsgStackIntegrityVerified           = "Stack %s integrity verified"
  constant MsgUpdatingExistingFile (line 44) | MsgUpdatingExistingFile             = "Updating existing file: %s"
  constant MsgCreatingMissingFile (line 45) | MsgCreatingMissingFile              = "Creating missing file: %s"
  constant MsgFileIntegrityValid (line 46) | MsgFileIntegrityValid               = "File integrity valid: %s"
  constant MsgSkippingModifiedFile (line 47) | MsgSkippingModifiedFile             = "Skipping modified files: %s"
  constant MsgDirectoryCheckedWithModified (line 48) | MsgDirectoryCheckedWithModified     = "Directory checked with modified f...
  constant MsgCheckingUpdates (line 53) | MsgCheckingUpdates            = "Checking for updates"
  constant MsgDownloadingInstaller (line 54) | MsgDownloadingInstaller       = "Downloading installer update"
  constant MsgInstallerDownloadCompleted (line 55) | MsgInstallerDownloadCompleted = "Installer download completed"
  constant MsgUpdatingInstaller (line 56) | MsgUpdatingInstaller          = "Updating installer"
  constant MsgRemovingInstaller (line 57) | MsgRemovingInstaller          = "Removing installer"
  constant MsgInstallerUpdateCompleted (line 58) | MsgInstallerUpdateCompleted   = "Installer update completed"
  constant MsgVerifyingBinaryChecksum (line 59) | MsgVerifyingBinaryChecksum    = "Verifying binary checksum"
  constant MsgReplacingInstallerBinary (line 60) | MsgReplacingInstallerBinary   = "Replacing installer binary"
  constant MsgRemovingStack (line 65) | MsgRemovingStack          = "Removing stack: %s"
  constant MsgStackRemovalCompleted (line 66) | MsgStackRemovalCompleted  = "Stack removal completed for %s"
  constant MsgPurgingStack (line 67) | MsgPurgingStack           = "Purging stack: %s"
  constant MsgStackPurgeCompleted (line 68) | MsgStackPurgeCompleted    = "Stack purge completed for %s"
  constant MsgExecutingDockerCompose (line 69) | MsgExecutingDockerCompose = "Executing docker-compose command: %s"
  constant MsgDockerComposeCompleted (line 70) | MsgDockerComposeCompleted = "Docker-compose command completed"
  constant MsgFactoryResetStarting (line 71) | MsgFactoryResetStarting   = "Starting factory reset"
  constant MsgFactoryResetCompleted (line 72) | MsgFactoryResetCompleted  = "Factory reset completed"
  constant MsgRestoringDefaultEnv (line 73) | MsgRestoringDefaultEnv    = "Restoring default .env from embedded"
  constant MsgDefaultEnvRestored (line 74) | MsgDefaultEnvRestored     = "Default .env restored"
  type Subsystem (line 77) | type Subsystem
  constant SubsystemDocker (line 80) | SubsystemDocker     Subsystem = "docker"
  constant SubsystemCompose (line 81) | SubsystemCompose    Subsystem = "compose"
  constant SubsystemFileSystem (line 82) | SubsystemFileSystem Subsystem = "file-system"
  constant SubsystemUpdate (line 83) | SubsystemUpdate     Subsystem = "update"
  type SubsystemOperationMessage (line 86) | type SubsystemOperationMessage struct

FILE: backend/cmd/installer/processor/logic.go
  constant minTerminalWidthForCompose (line 19) | minTerminalWidthForCompose = 56
  method validateOperation (line 23) | func (p *processor) validateOperation(stack ProductStack, operation Proc...
  method isEmbeddedDeployment (line 48) | func (p *processor) isEmbeddedDeployment(stack ProductStack) bool {
  method runCommand (line 90) | func (p *processor) runCommand(cmd *exec.Cmd, stack ProductStack, state ...
  method appendLog (line 122) | func (p *processor) appendLog(msg string, stack ProductStack, state *ope...
  method isFileExists (line 131) | func (p *processor) isFileExists(path string) error {
  method applyChanges (line 143) | func (p *processor) applyChanges(ctx context.Context, state *operationSt...
  method applyObservabilityChanges (line 202) | func (p *processor) applyObservabilityChanges(ctx context.Context, state...
  method applyLangfuseChanges (line 239) | func (p *processor) applyLangfuseChanges(ctx context.Context, state *ope...
  method applyGraphitiChanges (line 276) | func (p *processor) applyGraphitiChanges(ctx context.Context, state *ope...
  method applyPentagiChanges (line 313) | func (p *processor) applyPentagiChanges(ctx context.Context, state *oper...
  method checkFiles (line 343) | func (p *processor) checkFiles(
  method factoryReset (line 384) | func (p *processor) factoryReset(ctx context.Context, state *operationSt...
  method install (line 440) | func (p *processor) install(ctx context.Context, state *operationState) ...
  method update (line 494) | func (p *processor) update(ctx context.Context, stack ProductStack, stat...
  method download (line 591) | func (p *processor) download(ctx context.Context, stack ProductStack, st...
  method remove (line 657) | func (p *processor) remove(ctx context.Context, stack ProductStack, stat...
  method purge (line 728) | func (p *processor) purge(ctx context.Context, stack ProductStack, state...
  method start (line 813) | func (p *processor) start(ctx context.Context, stack ProductStack, state...
  method stop (line 832) | func (p *processor) stop(ctx context.Context, stack ProductStack, state ...
  method restart (line 851) | func (p *processor) restart(ctx context.Context, stack ProductStack, sta...
  method resetPassword (line 870) | func (p *processor) resetPassword(ctx context.Context, stack ProductStac...

FILE: backend/cmd/installer/processor/logic_test.go
  function newProcessorForLogicTests (line 15) | func newProcessorForLogicTests(t *testing.T) (*processor, *baseMockCompo...
  function newProcessorForLogicTestsWithConfig (line 33) | func newProcessorForLogicTestsWithConfig(t *testing.T, configFunc func(*...
  function injectComposeError (line 56) | func injectComposeError(p *processor, errorMethods map[string]error) {
  function injectDockerError (line 64) | func injectDockerError(p *processor, errorMethods map[string]error) {
  function injectFSError (line 72) | func injectFSError(p *processor, errorMethods map[string]error) {
  function testStackOperation (line 80) | func testStackOperation(t *testing.T,
  function TestStart (line 118) | func TestStart(t *testing.T) {
  function TestStop (line 122) | func TestStop(t *testing.T) {
  function TestRestart (line 126) | func TestRestart(t *testing.T) {
  function TestUpdate (line 130) | func TestUpdate(t *testing.T) {
  function TestRemove (line 324) | func TestRemove(t *testing.T) {
  function TestApplyChanges_ErrorPropagation_FromEnsureNetworks (line 328) | func TestApplyChanges_ErrorPropagation_FromEnsureNetworks(t *testing.T) {
  function TestPurge_StrictAndDockerCleanup (line 348) | func TestPurge_StrictAndDockerCleanup(t *testing.T) {
  function TestApplyChanges_Embedded_AllStacksUpdated (line 382) | func TestApplyChanges_Embedded_AllStacksUpdated(t *testing.T) {
  function TestApplyChanges_Disabled_RemovesInstalled (line 436) | func TestApplyChanges_Disabled_RemovesInstalled(t *testing.T) {
  function TestDownload_ComposeStacks (line 469) | func TestDownload_ComposeStacks(t *testing.T) {
  function TestDownload_AllStacks (line 506) | func TestDownload_AllStacks(t *testing.T) {
  function TestDownload_WorkerStack (line 543) | func TestDownload_WorkerStack(t *testing.T) {
  function TestDownload_InvalidStack (line 557) | func TestDownload_InvalidStack(t *testing.T) {
  function TestValidateOperation_ErrorCases (line 566) | func TestValidateOperation_ErrorCases(t *testing.T) {
  function TestIsEmbeddedDeployment (line 602) | func TestIsEmbeddedDeployment(t *testing.T) {
  function TestFactoryReset_FullSequence (line 644) | func TestFactoryReset_FullSequence(t *testing.T) {
  function TestApplyChanges_StateMachine_PhaseErrors (line 671) | func TestApplyChanges_StateMachine_PhaseErrors(t *testing.T) {
  function TestApplyChanges_CleanState_NoOp (line 754) | func TestApplyChanges_CleanState_NoOp(t *testing.T) {
  function TestInstall_FullScenario (line 777) | func TestInstall_FullScenario(t *testing.T) {
  function TestPreviewFilesStatus_Behavior (line 860) | func TestPreviewFilesStatus_Behavior(t *testing.T) {
  function TestDownload_EdgeCases (line 925) | func TestDownload_EdgeCases(t *testing.T) {
  function TestPurge_AllStacks_Detailed (line 954) | func TestPurge_AllStacks_Detailed(t *testing.T) {
  function TestRemove_PreservesData (line 1005) | func TestRemove_PreservesData(t *testing.T) {
  function TestApplyChanges_ComplexScenarios (line 1046) | func TestApplyChanges_ComplexScenarios(t *testing.T) {

FILE: backend/cmd/installer/processor/mock_test.go
  type mockState (line 21) | type mockState struct
    method Exists (line 41) | func (m *mockState) Exists() bool                             { return...
    method Reset (line 42) | func (m *mockState) Reset() error                             { m.dirt...
    method Commit (line 43) | func (m *mockState) Commit() error                            { m.dirt...
    method IsDirty (line 44) | func (m *mockState) IsDirty() bool                            { return...
    method GetEulaConsent (line 45) | func (m *mockState) GetEulaConsent() bool                     { return...
    method SetEulaConsent (line 46) | func (m *mockState) SetEulaConsent() error                    { return...
    method SetStack (line 47) | func (m *mockState) SetStack(stack []string) error            { m.stac...
    method GetStack (line 48) | func (m *mockState) GetStack() []string                       { return...
    method GetVar (line 49) | func (m *mockState) GetVar(name string) (loader.EnvVar, bool) { v, ok ...
    method SetVar (line 50) | func (m *mockState) SetVar(name, value string) error {
    method ResetVar (line 55) | func (m *mockState) ResetVar(name string) error { delete(m.vars, name)...
    method GetVars (line 56) | func (m *mockState) GetVars(names []string) (map[string]loader.EnvVar,...
    method SetVars (line 66) | func (m *mockState) SetVars(vars map[string]string) error {
    method ResetVars (line 73) | func (m *mockState) ResetVars(names []string) error {
    method GetAllVars (line 79) | func (m *mockState) GetAllVars() map[string]loader.EnvVar { return m.v...
    method GetEnvPath (line 80) | func (m *mockState) GetEnvPath() string                   { return m.e...
  function newMockState (line 28) | func newMockState() *mockState {
  type mockFiles (line 83) | type mockFiles struct
    method GetContent (line 101) | func (m *mockFiles) GetContent(name string) ([]byte, error) {
    method Exists (line 108) | func (m *mockFiles) Exists(name string) bool {
    method ExistsInFS (line 119) | func (m *mockFiles) ExistsInFS(name string) bool {
    method Stat (line 123) | func (m *mockFiles) Stat(name string) (fs.FileInfo, error) {
    method Copy (line 135) | func (m *mockFiles) Copy(src, dst string, rewrite bool) error {
    method Check (line 144) | func (m *mockFiles) Check(name string, workingDir string) files.FileSt...
    method List (line 152) | func (m *mockFiles) List(prefix string) ([]string, error) {
    method AddFile (line 160) | func (m *mockFiles) AddFile(name string, content []byte) {
  function newMockFiles (line 93) | func newMockFiles() *mockFiles {
  type mockFileInfo (line 165) | type mockFileInfo struct
    method Name (line 170) | func (m *mockFileInfo) Name() string       { return m.name }
    method Size (line 171) | func (m *mockFileInfo) Size() int64        { return 100 }
    method Mode (line 172) | func (m *mockFileInfo) Mode() fs.FileMode  { return 0644 }
    method ModTime (line 173) | func (m *mockFileInfo) ModTime() time.Time { return time.Now() }
    method IsDir (line 174) | func (m *mockFileInfo) IsDir() bool        { return m.isDir }
    method Sys (line 175) | func (m *mockFileInfo) Sys() interface{}   { return nil }
  type call (line 178) | type call struct
  type baseMockFileSystemOperations (line 187) | type baseMockFileSystemOperations struct
    method record (line 200) | func (m *baseMockFileSystemOperations) record(method string, stack Pro...
    method checkError (line 207) | func (m *baseMockFileSystemOperations) checkError(method string, stack...
    method getCalls (line 222) | func (m *baseMockFileSystemOperations) getCalls() []call {
    method setError (line 230) | func (m *baseMockFileSystemOperations) setError(method string, err err...
    method ensureStackIntegrity (line 239) | func (m *baseMockFileSystemOperations) ensureStackIntegrity(ctx contex...
    method verifyStackIntegrity (line 247) | func (m *baseMockFileSystemOperations) verifyStackIntegrity(ctx contex...
    method checkStackIntegrity (line 255) | func (m *baseMockFileSystemOperations) checkStackIntegrity(ctx context...
    method cleanupStackFiles (line 265) | func (m *baseMockFileSystemOperations) cleanupStackFiles(ctx context.C...
  function newBaseMockFileSystemOperations (line 193) | func newBaseMockFileSystemOperations() *baseMockFileSystemOperations {
  type baseMockDockerOperations (line 274) | type baseMockDockerOperations struct
    method record (line 287) | func (m *baseMockDockerOperations) record(method string, name string, ...
    method checkError (line 294) | func (m *baseMockDockerOperations) checkError(method string) error {
    method getCalls (line 303) | func (m *baseMockDockerOperations) getCalls() []call {
    method setError (line 311) | func (m *baseMockDockerOperations) setError(method string, err error) {
    method pullWorkerImage (line 320) | func (m *baseMockDockerOperations) pullWorkerImage(ctx context.Context...
    method pullDefaultImage (line 328) | func (m *baseMockDockerOperations) pullDefaultImage(ctx context.Contex...
    method removeWorkerContainers (line 336) | func (m *baseMockDockerOperations) removeWorkerContainers(ctx context....
    method removeWorkerImages (line 344) | func (m *baseMockDockerOperations) removeWorkerImages(ctx context.Cont...
    method purgeWorkerImages (line 352) | func (m *baseMockDockerOperations) purgeWorkerImages(ctx context.Conte...
    method ensureMainDockerNetworks (line 360) | func (m *baseMockDockerOperations) ensureMainDockerNetworks(ctx contex...
    method removeMainDockerNetwork (line 368) | func (m *baseMockDockerOperations) removeMainDockerNetwork(ctx context...
    method removeMainImages (line 376) | func (m *baseMockDockerOperations) removeMainImages(ctx context.Contex...
    method removeWorkerVolumes (line 384) | func (m *baseMockDockerOperations) removeWorkerVolumes(ctx context.Con...
  function newBaseMockDockerOperations (line 280) | func newBaseMockDockerOperations() *baseMockDockerOperations {
  type baseMockComposeOperations (line 393) | type baseMockComposeOperations struct
    method record (line 406) | func (m *baseMockComposeOperations) record(method string, stack Produc...
    method checkError (line 413) | func (m *baseMockComposeOperations) checkError(method string) error {
    method getCalls (line 424) | func (m *baseMockComposeOperations) getCalls() []call {
    method setError (line 432) | func (m *baseMockComposeOperations) setError(method string, err error) {
    method startStack (line 445) | func (m *baseMockComposeOperations) startStack(ctx context.Context, st...
    method stopStack (line 453) | func (m *baseMockComposeOperations) stopStack(ctx context.Context, sta...
    method restartStack (line 461) | func (m *baseMockComposeOperations) restartStack(ctx context.Context, ...
    method updateStack (line 469) | func (m *baseMockComposeOperations) updateStack(ctx context.Context, s...
    method downloadStack (line 477) | func (m *baseMockComposeOperations) downloadStack(ctx context.Context,...
    method removeStack (line 485) | func (m *baseMockComposeOperations) removeStack(ctx context.Context, s...
    method purgeStack (line 493) | func (m *baseMockComposeOperations) purgeStack(ctx context.Context, st...
    method purgeImagesStack (line 501) | func (m *baseMockComposeOperations) purgeImagesStack(ctx context.Conte...
    method determineComposeFile (line 509) | func (m *baseMockComposeOperations) determineComposeFile(stack Product...
    method performStackCommand (line 518) | func (m *baseMockComposeOperations) performStackCommand(ctx context.Co...
  function newBaseMockComposeOperations (line 399) | func newBaseMockComposeOperations() *baseMockComposeOperations {
  type baseMockUpdateOperations (line 527) | type baseMockUpdateOperations struct
    method record (line 540) | func (m *baseMockUpdateOperations) record(method string, err error) er...
    method checkError (line 547) | func (m *baseMockUpdateOperations) checkError(method string) error {
    method getCalls (line 556) | func (m *baseMockUpdateOperations) getCalls() []call {
    method setError (line 564) | func (m *baseMockUpdateOperations) setError(method string, err error) {
    method checkUpdates (line 573) | func (m *baseMockUpdateOperations) checkUpdates(ctx context.Context, s...
    method downloadInstaller (line 582) | func (m *baseMockUpdateOperations) downloadInstaller(ctx context.Conte...
    method updateInstaller (line 590) | func (m *baseMockUpdateOperations) updateInstaller(ctx context.Context...
    method removeInstaller (line 598) | func (m *baseMockUpdateOperations) removeInstaller(ctx context.Context...
  function newBaseMockUpdateOperations (line 533) | func newBaseMockUpdateOperations() *baseMockUpdateOperations {
  function testState (line 607) | func testState(t *testing.T) *mockState {
  function defaultCheckResult (line 621) | func defaultCheckResult() *checker.CheckResult {
  function createCheckResultWithHandler (line 659) | func createCheckResultWithHandler(handler *mockCheckHandler) *checker.Ch...
  type defaultStateHandler (line 666) | type defaultStateHandler struct
    method GatherAllInfo (line 671) | func (h *defaultStateHandler) GatherAllInfo(ctx context.Context, c *ch...
    method GatherDockerInfo (line 681) | func (h *defaultStateHandler) GatherDockerInfo(ctx context.Context, c ...
    method GatherWorkerInfo (line 688) | func (h *defaultStateHandler) GatherWorkerInfo(ctx context.Context, c ...
    method GatherPentagiInfo (line 695) | func (h *defaultStateHandler) GatherPentagiInfo(ctx context.Context, c...
    method GatherGraphitiInfo (line 702) | func (h *defaultStateHandler) GatherGraphitiInfo(ctx context.Context, ...
    method GatherLangfuseInfo (line 709) | func (h *defaultStateHandler) GatherLangfuseInfo(ctx context.Context, ...
    method GatherObservabilityInfo (line 716) | func (h *defaultStateHandler) GatherObservabilityInfo(ctx context.Cont...
    method GatherSystemInfo (line 723) | func (h *defaultStateHandler) GatherSystemInfo(ctx context.Context, c ...
    method GatherUpdatesInfo (line 730) | func (h *defaultStateHandler) GatherUpdatesInfo(ctx context.Context, c...
  function createTestProcessor (line 738) | func createTestProcessor() *processor {
  function createProcessorWithState (line 744) | func createProcessorWithState(state *mockState, checkResult *checker.Che...
  type stackTestCase (line 784) | type stackTestCase struct
  function generateStackTestCases (line 792) | func generateStackTestCases(operation ProcessorOperation) []stackTestCase {
  function testOperationState (line 835) | func testOperationState(t *testing.T) *operationState {
  function assertNoError (line 841) | func assertNoError(t *testing.T, err error) {
  function assertError (line 849) | func assertError(t *testing.T, err error, expectErr bool, expectedMsg st...
  type mockCheckHandler (line 865) | type mockCheckHandler struct
    method setConfig (line 956) | func (m *mockCheckHandler) setConfig(config mockCheckConfig) {
    method setGatherError (line 962) | func (m *mockCheckHandler) setGatherError(err error) {
    method getCalls (line 968) | func (m *mockCheckHandler) getCalls() []string {
    method recordCall (line 976) | func (m *mockCheckHandler) recordCall(method string) {
    method GatherAllInfo (line 982) | func (m *mockCheckHandler) GatherAllInfo(ctx context.Context, c *check...
    method GatherDockerInfo (line 1018) | func (m *mockCheckHandler) GatherDockerInfo(ctx context.Context, c *ch...
    method GatherWorkerInfo (line 1038) | func (m *mockCheckHandler) GatherWorkerInfo(ctx context.Context, c *ch...
    method GatherPentagiInfo (line 1053) | func (m *mockCheckHandler) GatherPentagiInfo(ctx context.Context, c *c...
    method GatherGraphitiInfo (line 1070) | func (m *mockCheckHandler) GatherGraphitiInfo(ctx context.Context, c *...
    method GatherLangfuseInfo (line 1088) | func (m *mockCheckHandler) GatherLangfuseInfo(ctx context.Context, c *...
    method GatherObservabilityInfo (line 1106) | func (m *mockCheckHandler) GatherObservabilityInfo(ctx context.Context...
    method GatherSystemInfo (line 1124) | func (m *mockCheckHandler) GatherSystemInfo(ctx context.Context, c *ch...
    method GatherUpdatesInfo (line 1141) | func (m *mockCheckHandler) GatherUpdatesInfo(ctx context.Context, c *c...
  type mockCheckConfig (line 873) | type mockCheckConfig struct
  function newMockCheckHandler (line 928) | func newMockCheckHandler() *mockCheckHandler {
  function TestMockCheckHandler_BasicFunctionality (line 1162) | func TestMockCheckHandler_BasicFunctionality(t *testing.T) {
  function TestMockCheckHandler_CustomConfiguration (line 1201) | func TestMockCheckHandler_CustomConfiguration(t *testing.T) {
  function TestMockCheckHandler_ErrorInjection (line 1237) | func TestMockCheckHandler_ErrorInjection(t *testing.T) {
  function TestMockCheckHandler_GatherAllInfo (line 1265) | func TestMockCheckHandler_GatherAllInfo(t *testing.T) {
  function TestMockOperations_CallAccumulation (line 1317) | func TestMockOperations_CallAccumulation(t *testing.T) {
  function TestMockOperations_ErrorIsolation (line 1376) | func TestMockOperations_ErrorIsolation(t *testing.T) {
  function TestMockState_ComplexOperations (line 1418) | func TestMockState_ComplexOperations(t *testing.T) {
  function TestMockFiles_ComplexOperations (line 1500) | func TestMockFiles_ComplexOperations(t *testing.T) {
  function TestMockOperations_ConcurrentAccess (line 1598) | func TestMockOperations_ConcurrentAccess(t *testing.T) {
  function TestMockState_EdgeCases (line 1667) | func TestMockState_EdgeCases(t *testing.T) {
  function TestMockFiles_EdgeCases (line 1713) | func TestMockFiles_EdgeCases(t *testing.T) {
  function TestMockCheckHandler_CompleteScenarios (line 1752) | func TestMockCheckHandler_CompleteScenarios(t *testing.T) {
  type mockCtxStateFunc (line 1826) | type mockCtxStateFunc
  type mockCtxStackStateFunc (line 1827) | type mockCtxStackStateFunc
  type mockBaseTest (line 1829) | type mockBaseTest struct
  function TestBaseMockFileSystemOperations (line 1835) | func TestBaseMockFileSystemOperations(t *testing.T) {
  function TestBaseMockDockerOperations (line 1883) | func TestBaseMockDockerOperations(t *testing.T) {
  function TestBaseMockDockerOperations_WithParameters (line 1941) | func TestBaseMockDockerOperations_WithParameters(t *testing.T) {
  function TestBaseMockComposeOperations (line 1985) | func TestBaseMockComposeOperations(t *testing.T) {
  function TestBaseMockComposeOperations_SpecialMethods (line 2060) | func TestBaseMockComposeOperations_SpecialMethods(t *testing.T) {
  function TestBaseMockUpdateOperations (line 2110) | func TestBaseMockUpdateOperations(t *testing.T) {

FILE: backend/cmd/installer/processor/model.go
  type processorModel (line 15) | type processorModel struct
    method ApplyChanges (line 85) | func (pm *processorModel) ApplyChanges(ctx context.Context, opts ...Op...
    method CheckFiles (line 92) | func (pm *processorModel) CheckFiles(ctx context.Context, stack Produc...
    method FactoryReset (line 100) | func (pm *processorModel) FactoryReset(ctx context.Context, opts ...Op...
    method Install (line 107) | func (pm *processorModel) Install(ctx context.Context, opts ...Operati...
    method Update (line 114) | func (pm *processorModel) Update(ctx context.Context, stack ProductSta...
    method Download (line 121) | func (pm *processorModel) Download(ctx context.Context, stack ProductS...
    method Remove (line 128) | func (pm *processorModel) Remove(ctx context.Context, stack ProductSta...
    method Purge (line 135) | func (pm *processorModel) Purge(ctx context.Context, stack ProductStac...
    method Start (line 142) | func (pm *processorModel) Start(ctx context.Context, stack ProductStac...
    method Stop (line 149) | func (pm *processorModel) Stop(ctx context.Context, stack ProductStack...
    method Restart (line 156) | func (pm *processorModel) Restart(ctx context.Context, stack ProductSt...
    method ResetPassword (line 163) | func (pm *processorModel) ResetPassword(ctx context.Context, stack Pro...
    method HandleMsg (line 170) | func (pm *processorModel) HandleMsg(msg tea.Msg) tea.Cmd {
  type ProcessorModel (line 19) | type ProcessorModel interface
  function NewProcessorModel (line 35) | func NewProcessorModel(state state.State, checker *checker.CheckResult, ...
  function wrapCommand (line 52) | func wrapCommand(

FILE: backend/cmd/installer/processor/pg.go
  constant PostgreSQLHost (line 14) | PostgreSQLHost = "127.0.0.1"
  constant PostgreSQLPort (line 15) | PostgreSQLPort = "5432"
  constant DefaultPostgreSQLUser (line 18) | DefaultPostgreSQLUser     = "postgres"
  constant DefaultPostgreSQLPassword (line 19) | DefaultPostgreSQLPassword = "postgres"
  constant DefaultPostgreSQLDatabase (line 20) | DefaultPostgreSQLDatabase = "pentagidb"
  constant AdminEmail (line 23) | AdminEmail = "admin@pentagi.com"
  constant EnvPostgreSQLUser (line 26) | EnvPostgreSQLUser     = "PENTAGI_POSTGRES_USER"
  constant EnvPostgreSQLPassword (line 27) | EnvPostgreSQLPassword = "PENTAGI_POSTGRES_PASSWORD"
  constant EnvPostgreSQLDatabase (line 28) | EnvPostgreSQLDatabase = "PENTAGI_POSTGRES_DB"
  method performPasswordReset (line 32) | func (p *processor) performPasswordReset(ctx context.Context, newPasswor...

FILE: backend/cmd/installer/processor/processor.go
  type ProductStack (line 13) | type ProductStack
  constant ProductStackPentagi (line 16) | ProductStackPentagi       ProductStack = "pentagi"
  constant ProductStackGraphiti (line 17) | ProductStackGraphiti      ProductStack = "graphiti"
  constant ProductStackLangfuse (line 18) | ProductStackLangfuse      ProductStack = "langfuse"
  constant ProductStackObservability (line 19) | ProductStackObservability ProductStack = "observability"
  constant ProductStackCompose (line 20) | ProductStackCompose       ProductStack = "compose"
  constant ProductStackWorker (line 21) | ProductStackWorker        ProductStack = "worker"
  constant ProductStackInstaller (line 22) | ProductStackInstaller     ProductStack = "installer"
  constant ProductStackAll (line 23) | ProductStackAll           ProductStack = "all"
  type ProcessorOperation (line 26) | type ProcessorOperation
  constant ProcessorOperationApplyChanges (line 29) | ProcessorOperationApplyChanges  ProcessorOperation = "apply_changes"
  constant ProcessorOperationCheckFiles (line 30) | ProcessorOperationCheckFiles    ProcessorOperation = "check_files"
  constant ProcessorOperationFactoryReset (line 31) | ProcessorOperationFactoryReset  ProcessorOperation = "factory_reset"
  constant ProcessorOperationInstall (line 32) | ProcessorOperationInstall       ProcessorOperation = "install"
  constant ProcessorOperationUpdate (line 33) | ProcessorOperationUpdate        ProcessorOperation = "update"
  constant ProcessorOperationDownload (line 34) | ProcessorOperationDownload      ProcessorOperation = "download"
  constant ProcessorOperationRemove (line 35) | ProcessorOperationRemove        ProcessorOperation = "remove"
  constant ProcessorOperationPurge (line 36) | ProcessorOperationPurge         ProcessorOperation = "purge"
  constant ProcessorOperationStart (line 37) | ProcessorOperationStart         ProcessorOperation = "start"
  constant ProcessorOperationStop (line 38) | ProcessorOperationStop          ProcessorOperation = "stop"
  constant ProcessorOperationRestart (line 39) | ProcessorOperationRestart       ProcessorOperation = "restart"
  constant ProcessorOperationResetPassword (line 40) | ProcessorOperationResetPassword ProcessorOperation = "reset_password"
  type ProductDockerNetwork (line 43) | type ProductDockerNetwork
  constant ProductDockerNetworkPentagi (line 46) | ProductDockerNetworkPentagi       ProductDockerNetwork = "pentagi-network"
  constant ProductDockerNetworkObservability (line 47) | ProductDockerNetworkObservability ProductDockerNetwork = "observability-...
  constant ProductDockerNetworkLangfuse (line 48) | ProductDockerNetworkLangfuse      ProductDockerNetwork = "langfuse-network"
  type FilesCheckResult (line 51) | type FilesCheckResult
  type Processor (line 53) | type Processor interface
  function WithForce (line 69) | func WithForce() OperationOption {
  function WithTerminal (line 74) | func WithTerminal(term terminal.Terminal) OperationOption {
  function WithPasswordValue (line 83) | func WithPasswordValue(password string) OperationOption {
  type fileSystemOperations (line 90) | type fileSystemOperations interface
  type dockerOperations (line 97) | type dockerOperations interface
  type composeOperations (line 109) | type composeOperations interface
  type updateOperations (line 122) | type updateOperations interface
  type processor (line 129) | type processor struct
    method ApplyChanges (line 159) | func (p *processor) ApplyChanges(ctx context.Context, opts ...Operatio...
    method CheckFiles (line 167) | func (p *processor) CheckFiles(ctx context.Context, stack ProductStack...
    method FactoryReset (line 175) | func (p *processor) FactoryReset(ctx context.Context, opts ...Operatio...
    method Install (line 183) | func (p *processor) Install(ctx context.Context, opts ...OperationOpti...
    method Update (line 191) | func (p *processor) Update(ctx context.Context, stack ProductStack, op...
    method Download (line 199) | func (p *processor) Download(ctx context.Context, stack ProductStack, ...
    method Remove (line 207) | func (p *processor) Remove(ctx context.Context, stack ProductStack, op...
    method Purge (line 215) | func (p *processor) Purge(ctx context.Context, stack ProductStack, opt...
    method Start (line 223) | func (p *processor) Start(ctx context.Context, stack ProductStack, opt...
    method Stop (line 231) | func (p *processor) Stop(ctx context.Context, stack ProductStack, opts...
    method Restart (line 239) | func (p *processor) Restart(ctx context.Context, stack ProductStack, o...
    method ResetPassword (line 247) | func (p *processor) ResetPassword(ctx context.Context, stack ProductSt...
  function NewProcessor (line 142) | func NewProcessor(state state.State, checker *checker.CheckResult, files...

FILE: backend/cmd/installer/processor/state.go
  type operationState (line 15) | type operationState struct
    method sendOutput (line 129) | func (state *operationState) sendOutput(output string, isPartial bool,...
    method sendCompletion (line 152) | func (state *operationState) sendCompletion(stack ProductStack, err er...
    method sendStarted (line 167) | func (state *operationState) sendStarted(stack ProductStack) {
    method sendFilesCheck (line 181) | func (state *operationState) sendFilesCheck(stack ProductStack, result...
  type ProcessorOutputMsg (line 30) | type ProcessorOutputMsg struct
  type ProcessorCompletionMsg (line 42) | type ProcessorCompletionMsg struct
  type ProcessorStartedMsg (line 54) | type ProcessorStartedMsg struct
  type ProcessorWaitMsg (line 65) | type ProcessorWaitMsg struct
  type ProcessorFilesCheckMsg (line 77) | type ProcessorFilesCheckMsg struct
  type OperationOption (line 88) | type OperationOption
  function withID (line 90) | func withID(id string) OperationOption {
  function withOperation (line 94) | func withOperation(operation ProcessorOperation) OperationOption {
  function withContext (line 98) | func withContext(ctx context.Context) OperationOption {
  function newOperationState (line 103) | func newOperationState(opts []OperationOption) *operationState {

FILE: backend/cmd/installer/processor/update.go
  constant updateServerURL (line 18) | updateServerURL = "https://update.pentagi.com"
  type updateOperationsImpl (line 20) | type updateOperationsImpl struct
    method checkUpdates (line 28) | func (u *updateOperationsImpl) checkUpdates(ctx context.Context, state...
    method downloadInstaller (line 43) | func (u *updateOperationsImpl) downloadInstaller(ctx context.Context, ...
    method updateInstaller (line 68) | func (u *updateOperationsImpl) updateInstaller(ctx context.Context, st...
    method removeInstaller (line 97) | func (u *updateOperationsImpl) removeInstaller(ctx context.Context, st...
    method buildUpdateCheckRequest (line 105) | func (u *updateOperationsImpl) buildUpdateCheckRequest() checker.Check...
    method callUpdateServer (line 126) | func (u *updateOperationsImpl) callUpdateServer(
    method getInstallerDownloadURL (line 147) | func (u *updateOperationsImpl) getInstallerDownloadURL(ctx context.Con...
    method downloadBinaryToTemp (line 160) | func (u *updateOperationsImpl) downloadBinaryToTemp(ctx context.Contex...
    method verifyBinaryChecksum (line 189) | func (u *updateOperationsImpl) verifyBinaryChecksum(filePath string) e...
    method replaceInstallerBinary (line 204) | func (u *updateOperationsImpl) replaceInstallerBinary(newBinaryPath st...
    method getUpdateServerURL (line 228) | func (u *updateOperationsImpl) getUpdateServerURL() string {
    method getProxyURL (line 236) | func (u *updateOperationsImpl) getProxyURL() string {
    method copyFile (line 244) | func (u *updateOperationsImpl) copyFile(src, dst string) error {
    method callExistingUpdateChecker (line 264) | func (u *updateOperationsImpl) callExistingUpdateChecker(
  function newUpdateOperations (line 24) | func newUpdateOperations(p *processor) updateOperations {

FILE: backend/cmd/installer/state/example_test.go
  function ExampleState_transactionWorkflow (line 10) | func ExampleState_transactionWorkflow() {
  function ExampleState_rollbackWorkflow (line 99) | func ExampleState_rollbackWorkflow() {
  function ExampleState_persistenceWorkflow (line 148) | func ExampleState_persistenceWorkflow() {
  function countChangedVars (line 200) | func countChangedVars(state State) int {
  function showCurrentConfig (line 210) | func showCurrentConfig(state State) {

FILE: backend/cmd/installer/state/state.go
  constant EULAConsentFile (line 14) | EULAConsentFile = "eula-consent"
  type State (line 16) | type State interface
  type stateData (line 40) | type stateData struct
  type state (line 45) | type state struct
    method Exists (line 86) | func (s *state) Exists() bool {
    method Reset (line 95) | func (s *state) Reset() error {
    method Commit (line 102) | func (s *state) Commit() error {
    method IsDirty (line 113) | func (s *state) IsDirty() bool {
    method GetEulaConsent (line 135) | func (s *state) GetEulaConsent() bool {
    method SetEulaConsent (line 147) | func (s *state) SetEulaConsent() error {
    method SetStack (line 160) | func (s *state) SetStack(stack []string) error {
    method GetStack (line 169) | func (s *state) GetStack() []string {
    method GetVar (line 176) | func (s *state) GetVar(name string) (loader.EnvVar, bool) {
    method SetVar (line 183) | func (s *state) SetVar(name, value string) error {
    method ResetVar (line 192) | func (s *state) ResetVar(name string) error {
    method GetVars (line 196) | func (s *state) GetVars(names []string) (map[string]loader.EnvVar, map...
    method SetVars (line 212) | func (s *state) SetVars(vars map[string]string) error {
    method ResetVars (line 223) | func (s *state) ResetVars(names []string) error {
    method GetAllVars (line 245) | func (s *state) GetAllVars() map[string]loader.EnvVar {
    method GetEnvPath (line 252) | func (s *state) GetEnvPath() string {
    method loadState (line 256) | func (s *state) loadState(stateFile string) error {
    method flushState (line 275) | func (s *state) flushState() error {
    method resetState (line 294) | func (s *state) resetState() error {
  function NewState (line 54) | func NewState(envPath string) (State, error) {

FILE: backend/cmd/installer/state/state_test.go
  function TestNewState (line 10) | func TestNewState(t *testing.T) {
  function TestStateExists (line 67) | func TestStateExists(t *testing.T) {
  function TestStateStepManagement (line 100) | func TestStateStepManagement(t *testing.T) {
  function TestStateVariableManagement (line 142) | func TestStateVariableManagement(t *testing.T) {
  function TestStateCommit (line 348) | func TestStateCommit(t *testing.T) {
  function TestStateReset (line 422) | func TestStateReset(t *testing.T) {
  function TestStatePersistence (line 477) | func TestStatePersistence(t *testing.T) {
  function TestStateErrors (line 525) | func TestStateErrors(t *testing.T) {
  function containsLine (line 693) | func containsLine(content, line string) bool {

FILE: backend/cmd/installer/wizard/app.go
  constant BaseHeaderHeight (line 25) | BaseHeaderHeight = 2
  constant BaseFooterHeight (line 26) | BaseFooterHeight = 1
  constant MinHeaderHeight (line 27) | MinHeaderHeight  = 1
  type App (line 31) | type App struct
    method initHotkeysLocale (line 73) | func (app *App) initHotkeysLocale() {
    method updateScreenMargins (line 90) | func (app *App) updateScreenMargins() {
    method Init (line 95) | func (app *App) Init() tea.Cmd {
    method Update (line 103) | func (app *App) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    method View (line 154) | func (app *App) View() string {
    method forwardMsgToCurrentModel (line 175) | func (app *App) forwardMsgToCurrentModel(msg tea.Msg) tea.Cmd {
    method renderHeader (line 188) | func (app *App) renderHeader() string {
    method renderFooter (line 202) | func (app *App) renderFooter() string {
    method getScreenTitle (line 238) | func (app *App) getScreenTitle() string {
  function NewApp (line 43) | func NewApp(appState state.State, checkResult checker.CheckResult, files...
  function Run (line 245) | func Run(ctx context.Context, appState state.State, checkResult checker....

FILE: backend/cmd/installer/wizard/controller/controller.go
  constant EmbeddedLLMConfigsPath (line 18) | EmbeddedLLMConfigsPath   = "providers-configs"
  constant DefaultDockerCertPath (line 19) | DefaultDockerCertPath    = "/opt/pentagi/docker/ssl"
  constant DefaultCustomConfigsPath (line 20) | DefaultCustomConfigsPath = "/opt/pentagi/conf/custom.provider.yml"
  constant DefaultOllamaConfigsPath (line 21) | DefaultOllamaConfigsPath = "/opt/pentagi/conf/ollama.provider.yml"
  constant DefaultLLMConfigsPath (line 22) | DefaultLLMConfigsPath    = "/opt/pentagi/conf/"
  constant DefaultScraperBaseURL (line 23) | DefaultScraperBaseURL    = "https://scraper/"
  constant DefaultScraperDomain (line 24) | DefaultScraperDomain     = "scraper"
  constant DefaultScraperSchema (line 25) | DefaultScraperSchema     = "https"
  type Controller (line 28) | type Controller interface
  type LLMProviderConfigController (line 48) | type LLMProviderConfigController interface
  type LangfuseConfigController (line 55) | type LangfuseConfigController interface
  type GraphitiConfigController (line 61) | type GraphitiConfigController interface
  type ObservabilityConfigController (line 67) | type ObservabilityConfigController interface
  type SummarizerConfigController (line 73) | type SummarizerConfigController interface
  type EmbedderConfigController (line 79) | type EmbedderConfigController interface
  type AIAgentsConfigController (line 85) | type AIAgentsConfigController interface
  type ScraperConfigController (line 91) | type ScraperConfigController interface
  type SearchEnginesConfigController (line 97) | type SearchEnginesConfigController interface
  type DockerConfigController (line 103) | type DockerConfigController interface
  type ChangesConfigController (line 109) | type ChangesConfigController interface
  type ServerSettingsConfigController (line 113) | type ServerSettingsConfigController interface
  type controller (line 120) | type controller struct
    method GetState (line 135) | func (c *controller) GetState() state.State {
    method GetChecker (line 140) | func (c *controller) GetChecker() *checker.CheckResult {
    method GetLLMProviders (line 194) | func (c *controller) GetLLMProviders() map[string]*LLMProviderConfig {
    method GetLLMProviderConfig (line 210) | func (c *controller) GetLLMProviderConfig(providerID string) *LLMProvi...
    method UpdateLLMProviderConfig (line 314) | func (c *controller) UpdateLLMProviderConfig(providerID string, config...
    method ResetLLMProviderConfig (line 488) | func (c *controller) ResetLLMProviderConfig(providerID string) map[str...
    method GetLangfuseConfig (line 568) | func (c *controller) GetLangfuseConfig() *LangfuseConfig {
    method UpdateLangfuseConfig (line 646) | func (c *controller) UpdateLangfuseConfig(config *LangfuseConfig) error {
    method ResetLangfuseConfig (line 716) | func (c *controller) ResetLangfuseConfig() *LangfuseConfig {
    method GetGraphitiConfig (line 766) | func (c *controller) GetGraphitiConfig() *GraphitiConfig {
    method UpdateGraphitiConfig (line 831) | func (c *controller) UpdateGraphitiConfig(config *GraphitiConfig) error {
    method ResetGraphitiConfig (line 892) | func (c *controller) ResetGraphitiConfig() *GraphitiConfig {
    method GetObservabilityConfig (line 929) | func (c *controller) GetObservabilityConfig() *ObservabilityConfig {
    method UpdateObservabilityConfig (line 982) | func (c *controller) UpdateObservabilityConfig(config *ObservabilityCo...
    method ResetObservabilityConfig (line 1033) | func (c *controller) ResetObservabilityConfig() *ObservabilityConfig {
    method GetSummarizerConfig (line 1081) | func (c *controller) GetSummarizerConfig(summarizerType SummarizerType...
    method UpdateSummarizerConfig (line 1114) | func (c *controller) UpdateSummarizerConfig(config *SummarizerConfig) ...
    method ResetSummarizerConfig (line 1159) | func (c *controller) ResetSummarizerConfig(summarizerType SummarizerTy...
    method GetEmbedderConfig (line 1207) | func (c *controller) GetEmbedderConfig() *EmbedderConfig {
    method UpdateEmbedderConfig (line 1238) | func (c *controller) UpdateEmbedderConfig(config *EmbedderConfig) error {
    method ResetEmbedderConfig (line 1266) | func (c *controller) ResetEmbedderConfig() *EmbedderConfig {
    method GetAIAgentsConfig (line 1297) | func (c *controller) GetAIAgentsConfig() *AIAgentsConfig {
    method UpdateAIAgentsConfig (line 1312) | func (c *controller) UpdateAIAgentsConfig(config *AIAgentsConfig) error {
    method ResetAIAgentsConfig (line 1345) | func (c *controller) ResetAIAgentsConfig() *AIAgentsConfig {
    method GetScraperConfig (line 1380) | func (c *controller) GetScraperConfig() *ScraperConfig {
    method determineScraperMode (line 1409) | func (c *controller) determineScraperMode(privateURL, publicURL string...
    method extractCredentialsFromURL (line 1429) | func (c *controller) extractCredentialsFromURL(urlStr string) (usernam...
    method UpdateScraperConfig (line 1450) | func (c *controller) UpdateScraperConfig(config *ScraperConfig) error {
    method addCredentialsToURL (line 1524) | func (c *controller) addCredentialsToURL(urlStr, username, password st...
    method ResetScraperConfig (line 1547) | func (c *controller) ResetScraperConfig() *ScraperConfig {
    method GetSearchEnginesConfig (line 1599) | func (c *controller) GetSearchEnginesConfig() *SearchEnginesConfig {
    method UpdateSearchEnginesConfig (line 1676) | func (c *controller) UpdateSearchEnginesConfig(config *SearchEnginesCo...
    method ResetSearchEnginesConfig (line 1744) | func (c *controller) ResetSearchEnginesConfig() *SearchEnginesConfig {
    method GetDockerConfig (line 1798) | func (c *controller) GetDockerConfig() *DockerConfig {
    method UpdateDockerConfig (line 1842) | func (c *controller) UpdateDockerConfig(config *DockerConfig) error {
    method ResetDockerConfig (line 1880) | func (c *controller) ResetDockerConfig() *DockerConfig {
    method GetServerSettingsConfig (line 1927) | func (c *controller) GetServerSettingsConfig() *ServerSettingsConfig {
    method UpdateServerSettingsConfig (line 1989) | func (c *controller) UpdateServerSettingsConfig(config *ServerSettings...
    method ResetServerSettingsConfig (line 2024) | func (c *controller) ResetServerSettingsConfig() *ServerSettingsConfig {
    method GetApplyChangesConfig (line 2072) | func (c *controller) GetApplyChangesConfig() *ApplyChangesConfig {
    method getVariableDescription (line 2122) | func (c *controller) getVariableDescription(varName string) string {
    method isVariableMasked (line 2374) | func (c *controller) isVariableMasked(varName string) bool {
    method isCriticalVariable (line 2539) | func (c *controller) isCriticalVariable(varName string) bool {
  function NewController (line 126) | func NewController(state state.State, files files.Files, checker checker...
  type LLMProviderConfig (line 145) | type LLMProviderConfig struct
  function GetEmbeddedLLMConfigsPath (line 180) | func GetEmbeddedLLMConfigsPath(files files.Files) []string {
  type LangfuseConfig (line 541) | type LangfuseConfig struct
  type GraphitiConfig (line 746) | type GraphitiConfig struct
  type ObservabilityConfig (line 912) | type ObservabilityConfig struct
  type SummarizerType (line 1053) | type SummarizerType
  constant SummarizerTypeGeneral (line 1056) | SummarizerTypeGeneral   SummarizerType = "general"
  constant SummarizerTypeAssistant (line 1057) | SummarizerTypeAssistant SummarizerType = "assistant"
  type SummarizerConfig (line 1061) | type SummarizerConfig struct
  type EmbedderConfig (line 1191) | type EmbedderConfig struct
  type AIAgentsConfig (line 1284) | type AIAgentsConfig struct
  type ScraperConfig (line 1359) | type ScraperConfig struct
  type SearchEnginesConfig (line 1565) | type SearchEnginesConfig struct
  type DockerConfig (line 1776) | type DockerConfig struct
  type ServerSettingsConfig (line 1906) | type ServerSettingsConfig struct
  type ChangeInfo (line 2048) | type ChangeInfo struct
  type ApplyChangesConfig (line 2056) | type ApplyChangesConfig struct
  function RemoveCredentialsFromURL (line 2544) | func RemoveCredentialsFromURL(urlStr string) string {

FILE: backend/cmd/installer/wizard/locale/locale.go
  constant UIStatistics (line 6) | UIStatistics       = "Statistics"
  constant UIStatus (line 7) | UIStatus           = "Status: "
  constant UIMode (line 8) | UIMode             = "Mode: "
  constant UINoConfigSelected (line 9) | UINoConfigSelected = "No configuration selected"
  constant UILoading (line 10) | UILoading          = "Loading..."
  constant UINotImplemented (line 11) | UINotImplemented   = "Not implemented yet"
  constant UIUnsavedChanges (line 12) | UIUnsavedChanges   = "Unsaved changes"
  constant UIConfigSaved (line 13) | UIConfigSaved      = "Configuration saved"
  constant StatusEnabled (line 16) | StatusEnabled       = "Enabled"
  constant StatusDisabled (line 17) | StatusDisabled      = "Disabled"
  constant StatusConfigured (line 18) | StatusConfigured    = "Configured"
  constant StatusNotConfigured (line 19) | StatusNotConfigured = "Not configured"
  constant StatusEmbedded (line 20) | StatusEmbedded      = "Embedded"
  constant StatusExternal (line 21) | StatusExternal      = "External"
  constant MessageSearchEnginesNone (line 24) | MessageSearchEnginesNone       = "⚠ No search engines configured"
  constant MessageSearchEnginesConfigured (line 25) | MessageSearchEnginesConfigured = "✓ %d search engines configured"
  constant MessageDockerConfigured (line 26) | MessageDockerConfigured        = "✓ Docker environment configured"
  constant MessageDockerNotConfigured (line 27) | MessageDockerNotConfigured     = "⚠ Docker environment not configured"
  constant LegendConfigured (line 32) | LegendConfigured    = "✓ Configured"
  constant LegendNotConfigured (line 33) | LegendNotConfigured = "✗ Not configured"
  constant NavBack (line 38) | NavBack       = "Esc: Back"
  constant NavExit (line 39) | NavExit       = "Ctrl+Q: Exit"
  constant NavUpDown (line 40) | NavUpDown     = "↑/↓: Scroll/Select"
  constant NavLeftRight (line 41) | NavLeftRight  = "←/→: Move"
  constant NavPgUpPgDown (line 42) | NavPgUpPgDown = "PgUp/PgDn: Page"
  constant NavHomeEnd (line 43) | NavHomeEnd    = "Home/End: Start/End"
  constant NavEnter (line 44) | NavEnter      = "Enter: Continue"
  constant NavYn (line 45) | NavYn         = "Y/N: Accept/Reject"
  constant NavCtrlC (line 46) | NavCtrlC      = "Ctrl+C: Cancel"
  constant NavCtrlS (line 47) | NavCtrlS      = "Ctrl+S: Save"
  constant NavCtrlR (line 48) | NavCtrlR      = "Ctrl+R: Reset"
  constant NavCtrlH (line 49) | NavCtrlH      = "Ctrl+H: Show/Hide"
  constant NavTab (line 50) | NavTab        = "Tab: Complete"
  constant NavSeparator (line 51) | NavSeparator  = " • "
  constant WelcomeFormTitle (line 57) | WelcomeFormTitle       = "Welcome to PentAGI"
  constant WelcomeFormDescription (line 58) | WelcomeFormDescription = "PentAGI is an autonomous penetration testing p...
  constant WelcomeFormName (line 59) | WelcomeFormName        = "Welcome"
  constant WelcomeFormOverview (line 60) | WelcomeFormOverview    = `System checks verify:
  constant WelcomeConfigurationFailed (line 72) | WelcomeConfigurationFailed = "⚠ Failed checks: %s"
  constant WelcomeConfigurationPassed (line 73) | WelcomeConfigurationPassed = "✓ All system checks passed"
  constant WelcomeWorkflowTitle (line 76) | WelcomeWorkflowTitle = "Installation Workflow:"
  constant WelcomeWorkflowStep1 (line 77) | WelcomeWorkflowStep1 = "1. Accept End User License Agreement"
  constant WelcomeWorkflowStep2 (line 78) | WelcomeWorkflowStep2 = "2. Configure LLM providers (OpenAI, Anthropic, e...
  constant WelcomeWorkflowStep3 (line 79) | WelcomeWorkflowStep3 = "3. Set up integrations (Langfuse, Observability)"
  constant WelcomeWorkflowStep4 (line 80) | WelcomeWorkflowStep4 = "4. Configure security settings"
  constant WelcomeWorkflowStep5 (line 81) | WelcomeWorkflowStep5 = "5. Deploy and start PentAGI services"
  constant WelcomeSystemReady (line 82) | WelcomeSystemReady   = "✓ System ready - Press Enter to continue"
  constant TroubleshootTitle (line 87) | TroubleshootTitle = "System Requirements Not Met"
  constant TroubleshootEnvFileTitle (line 90) | TroubleshootEnvFileTitle = "Environment Configuration Missing"
  constant TroubleshootEnvFileDesc (line 91) | TroubleshootEnvFileDesc  = "The .env file is required for PentAGI config...
  constant TroubleshootEnvFileFix (line 92) | TroubleshootEnvFileFix   = `To fix:
  constant TroubleshootWritePermTitle (line 101) | TroubleshootWritePermTitle = "Write Permissions Required"
  constant TroubleshootWritePermDesc (line 102) | TroubleshootWritePermDesc  = "The installer needs write access to the co...
  constant TroubleshootWritePermFix (line 103) | TroubleshootWritePermFix   = `To fix:
  constant TroubleshootDockerNotInstalledTitle (line 110) | TroubleshootDockerNotInstalledTitle = "Docker Not Installed"
  constant TroubleshootDockerNotInstalledDesc (line 111) | TroubleshootDockerNotInstalledDesc  = "Docker is not installed on this s...
  constant TroubleshootDockerNotInstalledFix (line 112) | TroubleshootDockerNotInstalledFix   = `To fix:
  constant TroubleshootDockerNotRunningTitle (line 119) | TroubleshootDockerNotRunningTitle = "Docker Daemon Not Running"
  constant TroubleshootDockerNotRunningDesc (line 120) | TroubleshootDockerNotRunningDesc  = "Docker is installed but the daemon ...
  constant TroubleshootDockerNotRunningFix (line 121) | TroubleshootDockerNotRunningFix   = `To fix:
  constant TroubleshootDockerPermissionTitle (line 128) | TroubleshootDockerPermissionTitle = "Docker Permission Denied"
  constant TroubleshootDockerPermissionDesc (line 129) | TroubleshootDockerPermissionDesc  = "Your user account lacks permission ...
  constant TroubleshootDockerPermissionFix (line 130) | TroubleshootDockerPermissionFix   = `To fix:
  constant TroubleshootDockerAPITitle (line 137) | TroubleshootDockerAPITitle = "Docker API Connection Failed"
  constant TroubleshootDockerAPIDesc (line 138) | TroubleshootDockerAPIDesc  = "Cannot establish connection to Docker API....
  constant TroubleshootDockerAPIFix (line 139) | TroubleshootDockerAPIFix   = `To fix:
  constant TroubleshootDockerVersionTitle (line 147) | TroubleshootDockerVersionTitle = "Docker Version Too Old"
  constant TroubleshootDockerVersionDesc (line 148) | TroubleshootDockerVersionDesc  = "Your Docker version is incompatible. P...
  constant TroubleshootDockerVersionFix (line 149) | TroubleshootDockerVersionFix   = `To fix:
  constant TroubleshootComposeTitle (line 157) | TroubleshootComposeTitle = "Docker Compose Not Found"
  constant TroubleshootComposeDesc (line 158) | TroubleshootComposeDesc  = "Docker Compose is required but not installed...
  constant TroubleshootComposeFix (line 159) | TroubleshootComposeFix   = `To fix:
  constant TroubleshootComposeVersionTitle (line 166) | TroubleshootComposeVersionTitle = "Docker Compose Version Too Old"
  constant TroubleshootComposeVersionDesc (line 167) | TroubleshootComposeVersionDesc  = "Your Docker Compose version is incomp...
  constant TroubleshootComposeVersionFix (line 168) | TroubleshootComposeVersionFix   = `Current version: %s
  constant TroubleshootWorkerTitle (line 177) | TroubleshootWorkerTitle = "Worker Docker Environment Not Accessible"
  constant TroubleshootWorkerDesc (line 178) | TroubleshootWorkerDesc  = "Cannot connect to the Docker environment for ...
  constant TroubleshootWorkerFix (line 179) | TroubleshootWorkerFix   = `To fix:
  constant TroubleshootCPUTitle (line 190) | TroubleshootCPUTitle = "Insufficient CPU Cores"
  constant TroubleshootCPUDesc (line 191) | TroubleshootCPUDesc  = "PentAGI requires at least 2 CPU cores for proper...
  constant TroubleshootCPUFix (line 192) | TroubleshootCPUFix   = `Your system has %d CPU core(s), but 2+ are requi...
  constant TroubleshootMemoryTitle (line 202) | TroubleshootMemoryTitle = "Insufficient Memory"
  constant TroubleshootMemoryDesc (line 203) | TroubleshootMemoryDesc  = "Not enough free memory for selected components."
  constant TroubleshootMemoryFix (line 204) | TroubleshootMemoryFix   = `Memory requirements:
  constant TroubleshootDiskTitle (line 219) | TroubleshootDiskTitle = "Insufficient Disk Space"
  constant TroubleshootDiskDesc (line 220) | TroubleshootDiskDesc  = "Not enough free disk space for installation and...
  constant TroubleshootDiskFix (line 221) | TroubleshootDiskFix   = `Disk requirements:
  constant TroubleshootNetworkTitle (line 236) | TroubleshootNetworkTitle = "Network Connectivity Failed"
  constant TroubleshootNetworkDesc (line 237) | TroubleshootNetworkDesc  = "Cannot reach required external services. Thi...
  constant TroubleshootNetworkFix (line 238) | TroubleshootNetworkFix   = `Failed checks:
  constant TroubleshootFixHint (line 253) | TroubleshootFixHint = "\nResolve the issues above and run the installer ...
  constant NetworkFailureDNS (line 256) | NetworkFailureDNS        = "• DNS resolution failed for docker.io"
  constant NetworkFailureHTTPS (line 257) | NetworkFailureHTTPS      = "• Cannot reach external services via HTTPS"
  constant NetworkFailureDockerPull (line 258) | NetworkFailureDockerPull = "• Cannot pull Docker images from registry"
  constant ChecksTitle (line 263) | ChecksTitle               = "System Checks"
  constant ChecksWarningFailed (line 264) | ChecksWarningFailed       = "⚠ Some checks failed"
  constant CheckEnvironmentFile (line 265) | CheckEnvironmentFile      = "Environment file"
  constant CheckWritePermissions (line 266) | CheckWritePermissions     = "Write permissions"
  constant CheckDockerAPI (line 267) | CheckDockerAPI            = "Docker API"
  constant CheckDockerVersion (line 268) | CheckDockerVersion        = "Docker version"
  constant CheckDockerCompose (line 269) | CheckDockerCompose        = "Docker Compose"
  constant CheckDockerComposeVersion (line 270) | CheckDockerComposeVersion = "Docker Compose version"
  constant CheckWorkerEnvironment (line 271) | CheckWorkerEnvironment    = "Worker environment"
  constant CheckSystemResources (line 272) | CheckSystemResources      = "System resources"
  constant CheckNetworkConnectivity (line 273) | CheckNetworkConnectivity  = "Network connectivity"
  constant EULAFormDescription (line 279) | EULAFormDescription = "Legal terms and conditions for PentAGI usage"
  constant EULAFormName (line 280) | EULAFormName        = "EULA"
  constant EULAFormOverview (line 281) | EULAFormOverview    = `Review and accept the End User License Agreement ...
  constant EULAErrorLoadingTitle (line 295) | EULAErrorLoadingTitle     = "# Error Loading EULA\n\nFailed to load EULA...
  constant EULAContentFallback (line 296) | EULAContentFallback       = "# EULA Content\n\n%s\n\n---\n\n*Note: Markd...
  constant EULAConfigurationRead (line 297) | EULAConfigurationRead     = "✓ EULA reviewed"
  constant EULAConfigurationAccepted (line 298) | EULAConfigurationAccepted = "✓ EULA accepted"
  constant EULAConfigurationPending (line 299) | EULAConfigurationPending  = "⚠ EULA not reviewed"
  constant EULALoading (line 300) | EULALoading               = "Loading EULA..."
  constant EULAProgress (line 301) | EULAProgress              = "Progress: %d%%"
  constant EULAProgressComplete (line 302) | EULAProgressComplete      = " • Complete"
  constant MainMenuTitle (line 307) | MainMenuTitle       = "PentAGI Configuration"
  constant MainMenuDescription (line 308) | MainMenuDescription = "Configure all PentAGI components and settings"
  constant MainMenuName (line 309) | MainMenuName        = "Main Menu"
  constant MainMenuOverview (line 310) | MainMenuOverview    = `Welcome to PentAGI Configuration Center.
  constant MenuTitle (line 320) | MenuTitle        = "Configuration Menu"
  constant MenuSystemStatus (line 321) | MenuSystemStatus = "System Status"
  constant MainMenuStatusPentagiRunning (line 326) | MainMenuStatusPentagiRunning     = "PentAGI is already running"
  constant MainMenuStatusPentagiNotRunning (line 327) | MainMenuStatusPentagiNotRunning  = "Ready to start PentAGI services"
  constant MainMenuStatusUpToDate (line 328) | MainMenuStatusUpToDate           = "PentAGI is up to date"
  constant MainMenuStatusUpdatesAvailable (line 329) | MainMenuStatusUpdatesAvailable   = "Updates are available"
  constant MainMenuStatusReadyToStart (line 330) | MainMenuStatusReadyToStart       = "Ready to start"
  constant MainMenuStatusAllServicesRunning (line 331) | MainMenuStatusAllServicesRunning = "All services are running"
  constant MainMenuStatusNoUpdatesAvailable (line 332) | MainMenuStatusNoUpdatesAvailable = "No updates available"
  constant LLMProvidersTitle (line 337) | LLMProvidersTitle       = "LLM Providers Configuration"
  constant LLMProvidersDescription (line 338) | LLMProvidersDescription = "Configure Large Language Model providers for ...
  constant LLMProvidersName (line 339) | LLMProvidersName        = "LLM Providers"
  constant LLMProvidersOverview (line 340) | LLMProvidersOverview    = `PentAGI uses specialized AI agents (researche...
  constant LLMProviderOpenAI (line 357) | LLMProviderOpenAI        = "OpenAI"
  constant LLMProviderAnthropic (line 358) | LLMProviderAnthropic     = "Anthropic"
  constant LLMProviderGemini (line 359) | LLMProviderGemini        = "Google Gemini"
  constant LLMProviderBedrock (line 360) | LLMProviderBedrock       = "AWS Bedrock"
  constant LLMProviderOllama (line 361) | LLMProviderOllama        = "Ollama"
  constant LLMProviderDeepSeek (line 362) | LLMProviderDeepSeek      = "DeepSeek"
  constant LLMProviderGLM (line 363) | LLMProviderGLM           = "GLM Zhipu AI"
  constant LLMProviderKimi (line 364) | LLMProviderKimi          = "Kimi Moonshot AI"
  constant LLMProviderQwen (line 365) | LLMProviderQwen          = "Qwen Alibaba Cloud"
  constant LLMProviderCustom (line 366) | LLMProviderCustom        = "Custom"
  constant LLMProviderOpenAIDesc (line 367) | LLMProviderOpenAIDesc    = "Industry-leading GPT models with excellent g...
  constant LLMProviderAnthropicDesc (line 368) | LLMProviderAnthropicDesc = "Claude models with superior reasoning and sa...
  constant LLMProviderGeminiDesc (line 369) | LLMProviderGeminiDesc    = "Google's advanced multimodal models with bro...
  constant LLMProviderBedrockDesc (line 370) | LLMProviderBedrockDesc   = "Enterprise AWS access to multiple foundation...
  constant LLMProviderOllamaDesc (line 371) | LLMProviderOllamaDesc    = "Local and cloud open-source models for priva...
  constant LLMProviderDeepSeekDesc (line 372) | LLMProviderDeepSeekDesc  = "Advanced Chinese AI models with strong reaso...
  constant LLMProviderGLMDesc (line 373) | LLMProviderGLMDesc       = "Zhipu AI's GLM models for Chinese and Englis...
  constant LLMProviderKimiDesc (line 374) | LLMProviderKimiDesc      = "Moonshot AI's long-context models for docume...
  constant LLMProviderQwenDesc (line 375) | LLMProviderQwenDesc      = "Alibaba Cloud's Qwen models for multilingual...
  constant LLMProviderCustomDesc (line 376) | LLMProviderCustomDesc    = "Custom OpenAI-compatible endpoint for maximu...
  constant LLMFormOpenAIHelp (line 381) | LLMFormOpenAIHelp = `OpenAI delivers industry-leading models with cuttin...
  constant LLMFormAnthropicHelp (line 399) | LLMFormAnthropicHelp = `Anthropic Claude models excel in safety-consciou...
  constant LLMFormGeminiHelp (line 417) | LLMFormGeminiHelp = `Google Gemini combines multimodal capabilities with...
  constant LLMFormBedrockHelp (line 436) | LLMFormBedrockHelp = `AWS Bedrock provides enterprise-grade access to 20...
  constant LLMFormOllamaHelp (line 462) | LLMFormOllamaHelp = `Ollama supports two deployment scenarios for comple...
  constant LLMFormDeepSeekHelp (line 492) | LLMFormDeepSeekHelp = `DeepSeek provides advanced AI models with strong ...
  constant LLMFormGLMHelp (line 515) | LLMFormGLMHelp = `GLM from Zhipu AI provides advanced language models wi...
  constant LLMFormKimiHelp (line 543) | LLMFormKimiHelp = `Kimi from Moonshot AI provides ultra-long context mod...
  constant LLMFormQwenHelp (line 570) | LLMFormQwenHelp = `Qwen from Alibaba Cloud Model Studio (DashScope) prov...
  constant LLMFormCustomHelp (line 600) | LLMFormCustomHelp = `Configure any OpenAI-compatible API endpoint for ma...
  constant LLMFormFieldBaseURL (line 629) | LLMFormFieldBaseURL           = "Base URL"
  constant LLMFormFieldAPIKey (line 630) | LLMFormFieldAPIKey            = "API Key"
  constant LLMFormFieldDefaultAuth (line 631) | LLMFormFieldDefaultAuth       = "Use Default AWS Auth"
  constant LLMFormFieldBearerToken (line 632) | LLMFormFieldBearerToken       = "Bearer Token"
  constant LLMFormFieldAccessKey (line 633) | LLMFormFieldAccessKey         = "Access Key ID"
  constant LLMFormFieldSecretKey (line 634) | LLMFormFieldSecretKey         = "Secret Access Key"
  constant LLMFormFieldSessionToken (line 635) | LLMFormFieldSessionToken      = "Session Token"
  constant LLMFormFieldRegion (line 636) | LLMFormFieldRegion            = "Region"
  constant LLMFormFieldModel (line 637) | LLMFormFieldModel             = "Model"
  constant LLMFormFieldConfigPath (line 638) | LLMFormFieldConfigPath        = "Config Path"
  constant LLMFormFieldLegacyReasoning (line 639) | LLMFormFieldLegacyReasoning   = "Legacy Reasoning"
  constant LLMFormFieldPreserveReasoning (line 640) | LLMFormFieldPreserveReasoning = "Preserve Reasoning"
  constant LLMFormFieldProviderName (line 641) | LLMFormFieldProviderName      = "Provider Name"
  constant LLMFormFieldPullTimeout (line 642) | LLMFormFieldPullTimeout       = "Model Pull Timeout"
  constant LLMFormFieldPullEnabled (line 643) | LLMFormFieldPullEnabled       = "Auto-pull Models"
  constant LLMFormFieldLoadModelsEnabled (line 644) | LLMFormFieldLoadModelsEnabled = "Load Models from Server"
  constant LLMFormBaseURLDesc (line 645) | LLMFormBaseURLDesc            = "API endpoint URL for the provider"
  constant LLMFormAPIKeyDesc (line 646) | LLMFormAPIKeyDesc             = "Your API key for authentication"
  constant LLMFormDefaultAuthDesc (line 647) | LLMFormDefaultAuthDesc        = "Use AWS SDK default credential chain (e...
  constant LLMFormBearerTokenDesc (line 648) | LLMFormBearerTokenDesc        = "Bearer token for authentication - takes...
  constant LLMFormAccessKeyDesc (line 649) | LLMFormAccessKeyDesc          = "AWS Access Key ID for static credential...
  constant LLMFormSecretKeyDesc (line 650) | LLMFormSecretKeyDesc          = "AWS Secret Access Key for static creden...
  constant LLMFormSessionTokenDesc (line 651) | LLMFormSessionTokenDesc       = "AWS Session Token for temporary credent...
  constant LLMFormRegionDesc (line 652) | LLMFormRegionDesc             = "AWS region for Bedrock service"
  constant LLMFormModelDesc (line 653) | LLMFormModelDesc              = "Default model to use for this provider"
  constant LLMFormConfigPathDesc (line 654) | LLMFormConfigPathDesc         = "Path to configuration file (optional)"
  constant LLMFormLegacyReasoningDesc (line 655) | LLMFormLegacyReasoningDesc    = "Enable legacy reasoning mode (true/false)"
  constant LLMFormPreserveReasoningDesc (line 656) | LLMFormPreserveReasoningDesc  = "Preserve reasoning content in multi-tur...
  constant LLMFormProviderNameDesc (line 657) | LLMFormProviderNameDesc       = "Provider name prefix for model names (u...
  constant LLMFormPullTimeoutDesc (line 658) | LLMFormPullTimeoutDesc        = "Timeout in seconds for downloading mode...
  constant LLMFormPullEnabledDesc (line 659) | LLMFormPullEnabledDesc        = "Automatically download required models ...
  constant LLMFormLoadModelsEnabledDesc (line 660) | LLMFormLoadModelsEnabledDesc  = "Load available models list from Ollama ...
  constant LLMFormOllamaAPIKeyDesc (line 661) | LLMFormOllamaAPIKeyDesc       = "Ollama Cloud API key (optional, leave e...
  constant LLMProviderFormTitle (line 666) | LLMProviderFormTitle       = "LLM Provider %s Configuration"
  constant LLMProviderFormDescription (line 667) | LLMProviderFormDescription = "Configure your Large Language Model provid...
  constant LLMProviderFormName (line 668) | LLMProviderFormName        = "LLM Provider %s"
  constant LLMProviderFormOverview (line 669) | LLMProviderFormOverview    = `Agent Role Assignment:
  constant MonitoringTitle (line 686) | MonitoringTitle       = "Monitoring Configuration"
  constant MonitoringDescription (line 687) | MonitoringDescription = "Configure monitoring and observability platform...
  constant MonitoringName (line 688) | MonitoringName        = "Monitoring"
  constant MonitoringOverview (line 689) | MonitoringOverview    = `Comprehensive monitoring and observability for ...
  constant MonitoringLangfuseFormTitle (line 709) | MonitoringLangfuseFormTitle       = "Langfuse Configuration"
  constant MonitoringLangfuseFormDescription (line 710) | MonitoringLangfuseFormDescription = "Configuration of Langfuse integrati...
  constant MonitoringLangfuseFormName (line 711) | MonitoringLangfuseFormName        = "Langfuse"
  constant MonitoringLangfuseFormOverview (line 712) | MonitoringLangfuseFormOverview    = `Langfuse provides:
  constant MonitoringLangfuseEmbedded (line 722) | MonitoringLangfuseEmbedded = "Embedded Server"
  constant MonitoringLangfuseExternal (line 723) | MonitoringLangfuseExternal = "External Server"
  constant MonitoringLangfuseDisabled (line 724) | MonitoringLangfuseDisabled = "Disabled"
  constant MonitoringLangfuseDeploymentType (line 727) | MonitoringLangfuseDeploymentType     = "Deployment Type"
  constant MonitoringLangfuseDeploymentTypeDesc (line 728) | MonitoringLangfuseDeploymentTypeDesc = "Select the deployment type for L...
  constant MonitoringLangfuseBaseURL (line 729) | MonitoringLangfuseBaseURL            = "Server URL"
  constant MonitoringLangfuseBaseURLDesc (line 730) | MonitoringLangfuseBaseURLDesc        = "Address of the Langfuse server (...
  constant MonitoringLangfuseProjectID (line 731) | MonitoringLangfuseProjectID          = "Project ID"
  constant MonitoringLangfuseProjectIDDesc (line 732) | MonitoringLangfuseProjectIDDesc      = "Project identifier in Langfuse"
  constant MonitoringLangfusePublicKey (line 733) | MonitoringLangfusePublicKey          = "Public Key"
  constant MonitoringLangfusePublicKeyDesc (line 734) | MonitoringLangfusePublicKeyDesc      = "Public API key for project access"
  constant MonitoringLangfuseSecretKey (line 735) | MonitoringLangfuseSecretKey          = "Secret Key"
  constant MonitoringLangfuseSecretKeyDesc (line 736) | MonitoringLangfuseSecretKeyDesc      = "Secret API key for project access"
  constant MonitoringLangfuseListenIP (line 737) | MonitoringLangfuseListenIP           = "Listen IP"
  constant MonitoringLangfuseListenIPDesc (line 738) | MonitoringLangfuseListenIPDesc       = "Bind address used by Docker port...
  constant MonitoringLangfuseListenPort (line 739) | MonitoringLangfuseListenPort         = "Listen Port"
  constant MonitoringLangfuseListenPortDesc (line 740) | MonitoringLangfuseListenPortDesc     = "External TCP port exposed by Doc...
  constant MonitoringLangfuseAdminEmail (line 743) | MonitoringLangfuseAdminEmail        = "Admin Email"
  constant MonitoringLangfuseAdminEmailDesc (line 744) | MonitoringLangfuseAdminEmailDesc    = "Email for accessing the Langfuse ...
  constant MonitoringLangfuseAdminPassword (line 745) | MonitoringLangfuseAdminPassword     = "Admin Password"
  constant MonitoringLangfuseAdminPasswordDesc (line 746) | MonitoringLangfuseAdminPasswordDesc = "Password for accessing the Langfu...
  constant MonitoringLangfuseAdminName (line 747) | MonitoringLangfuseAdminName         = "Admin Username"
  constant MonitoringLangfuseAdminNameDesc (line 748) | MonitoringLangfuseAdminNameDesc     = "Administrator username in Langfuse"
  constant MonitoringLangfuseLicenseKey (line 749) | MonitoringLangfuseLicenseKey        = "Enterprise License Key"
  constant MonitoringLangfuseLicenseKeyDesc (line 750) | MonitoringLangfuseLicenseKeyDesc    = "Langfuse Enterprise license key (...
  constant MonitoringLangfuseModeGuide (line 753) | MonitoringLangfuseModeGuide    = "Choose deployment: Embedded (local con...
  constant MonitoringLangfuseEmbeddedHelp (line 754) | MonitoringLangfuseEmbeddedHelp = `Embedded deploys complete Langfuse stack:
  constant MonitoringLangfuseExternalHelp (line 772) | MonitoringLangfuseExternalHelp = `External connects to cloud.langfuse.co...
  constant MonitoringLangfuseDisabledHelp (line 786) | MonitoringLangfuseDisabledHelp = `Langfuse is disabled. Without LLM obse...
  constant MonitoringGraphitiFormTitle (line 802) | MonitoringGraphitiFormTitle       = "Graphiti Configuration (beta)"
  constant MonitoringGraphitiFormDescription (line 803) | MonitoringGraphitiFormDescription = "Configuration of Graphiti knowledge...
  constant MonitoringGraphitiFormName (line 804) | MonitoringGraphitiFormName        = "Graphiti (beta)"
  constant MonitoringGraphitiFormOverview (line 805) | MonitoringGraphitiFormOverview    = `⚠️  BETA FEATURE: This functionalit...
  constant MonitoringGraphitiEmbedded (line 818) | MonitoringGraphitiEmbedded = "Embedded Stack"
  constant MonitoringGraphitiExternal (line 819) | MonitoringGraphitiExternal = "External Service"
  constant MonitoringGraphitiDisabled (line 820) | MonitoringGraphitiDisabled = "Disabled"
  constant MonitoringGraphitiDeploymentType (line 823) | MonitoringGraphitiDeploymentType     = "Deployment Type"
  constant MonitoringGraphitiDeploymentTypeDesc (line 824) | MonitoringGraphitiDeploymentTypeDesc = "Select the deployment type for G...
  constant MonitoringGraphitiURL (line 825) | MonitoringGraphitiURL                = "Graphiti Server URL"
  constant MonitoringGraphitiURLDesc (line 826) | MonitoringGraphitiURLDesc            = "Address of the Graphiti API server"
  constant MonitoringGraphitiTimeout (line 827) | MonitoringGraphitiTimeout            = "Request Timeout"
  constant MonitoringGraphitiTimeoutDesc (line 828) | MonitoringGraphitiTimeoutDesc        = "Timeout in seconds for Graphiti ...
  constant MonitoringGraphitiModelName (line 829) | MonitoringGraphitiModelName          = "Extraction Model"
  constant MonitoringGraphitiModelNameDesc (line 830) | MonitoringGraphitiModelNameDesc      = "LLM model for entity extraction ...
  constant MonitoringGraphitiNeo4jUser (line 831) | MonitoringGraphitiNeo4jUser          = "Neo4j Username"
  constant MonitoringGraphitiNeo4jUserDesc (line 832) | MonitoringGraphitiNeo4jUserDesc      = "Username for Neo4j database access"
  constant MonitoringGraphitiNeo4jPassword (line 833) | MonitoringGraphitiNeo4jPassword      = "Neo4j Password"
  constant MonitoringGraphitiNeo4jPasswordDesc (line 834) | MonitoringGraphitiNeo4jPasswordDesc  = "Password for Neo4j database access"
  constant MonitoringGraphitiNeo4jDatabase (line 835) | MonitoringGraphitiNeo4jDatabase      = "Neo4j Database"
  constant MonitoringGraphitiNeo4jDatabaseDesc (line 836) | MonitoringGraphitiNeo4jDatabaseDesc  = "Neo4j database name"
  constant MonitoringGraphitiModeGuide (line 839) | MonitoringGraphitiModeGuide    = "Choose deployment: Embedded (local Neo...
  constant MonitoringGraphitiEmbeddedHelp (line 840) | MonitoringGraphitiEmbeddedHelp = `⚠️  BETA: This feature is under active...
  constant MonitoringGraphitiExternalHelp (line 861) | MonitoringGraphitiExternalHelp = `⚠️  BETA: This feature is under active...
  constant MonitoringGraphitiDisabledHelp (line 877) | MonitoringGraphitiDisabledHelp = `Graphiti is disabled. You will not have:
  constant MonitoringObservabilityFormTitle (line 893) | MonitoringObservabilityFormTitle       = "Observability Configuration"
  constant MonitoringObservabilityFormDescription (line 894) | MonitoringObservabilityFormDescription = "Configuration of monitoring an...
  constant MonitoringObservabilityFormName (line 895) | MonitoringObservabilityFormName        = "Observability"
  constant MonitoringObservabilityFormOverview (line 896) | MonitoringObservabilityFormOverview    = `Observability stack includes:
  constant MonitoringObservabilityEmbedded (line 906) | MonitoringObservabilityEmbedded = "Embedded Stack"
  constant MonitoringObservabilityExternal (line 907) | MonitoringObservabilityExternal = "External Collector"
  constant MonitoringObservabilityDisabled (line 908) | MonitoringObservabilityDisabled = "Disabled"
  constant MonitoringObservabilityDeploymentType (line 911) | MonitoringObservabilityDeploymentType     = "Deployment Type"
  constant MonitoringObservabilityDeploymentTypeDesc (line 912) | MonitoringObservabilityDeploymentTypeDesc = "Select the deployment type ...
  constant MonitoringObservabilityOTelHost (line 913) | MonitoringObservabilityOTelHost           = "OpenTelemetry Host"
  constant MonitoringObservabilityOTelHostDesc (line 914) | MonitoringObservabilityOTelHostDesc       = "Address of the external Ope...
  constant MonitoringObservabilityGrafanaListenIP (line 917) | MonitoringObservabilityGrafanaListenIP        = "Grafana Listen IP"
  constant MonitoringObservabilityGrafanaListenIPDesc (line 918) | MonitoringObservabilityGrafanaListenIPDesc    = "Bind address used by Do...
  constant MonitoringObservabilityGrafanaListenPort (line 919) | MonitoringObservabilityGrafanaListenPort      = "Grafana Listen Port"
  constant MonitoringObservabilityGrafanaListenPortDesc (line 920) | MonitoringObservabilityGrafanaListenPortDesc  = "External TCP port expos...
  constant MonitoringObservabilityOTelGrpcListenIP (line 921) | MonitoringObservabilityOTelGrpcListenIP       = "OTel gRPC Listen IP"
  constant MonitoringObservabilityOTelGrpcListenIPDesc (line 922) | MonitoringObservabilityOTelGrpcListenIPDesc   = "Bind address used by Do...
  constant MonitoringObservabilityOTelGrpcListenPort (line 923) | MonitoringObservabilityOTelGrpcListenPort     = "OTel gRPC Listen Port"
  constant MonitoringObservabilityOTelGrpcListenPortDesc (line 924) | MonitoringObservabilityOTelGrpcListenPortDesc = "External TCP port expos...
  constant MonitoringObservabilityOTelHttpListenIP (line 925) | MonitoringObservabilityOTelHttpListenIP       = "OTel HTTP Listen IP"
  constant MonitoringObservabilityOTelHttpListenIPDesc (line 926) | MonitoringObservabilityOTelHttpListenIPDesc   = "Bind address used by Do...
  constant MonitoringObservabilityOTelHttpListenPort (line 927) | MonitoringObservabilityOTelHttpListenPort     = "OTel HTTP Listen Port"
  constant MonitoringObservabilityOTelHttpListenPortDesc (line 928) | MonitoringObservabilityOTelHttpListenPortDesc = "External TCP port expos...
  constant MonitoringObservabilityModeGuide (line 931) | MonitoringObservabilityModeGuide    = "Choose monitoring: Embedded (full...
  constant MonitoringObservabilityEmbeddedHelp (line 932) | MonitoringObservabilityEmbeddedHelp = `Embedded deploys complete monitor...
  constant MonitoringObservabilityExternalHelp (line 952) | MonitoringObservabilityExternalHelp = `External sends telemetry to your ...
  constant MonitoringObservabilityDisabledHelp (line 972) | MonitoringObservabilityDisabledHelp = `Observability is disabled. You wi...
  constant SummarizerTitle (line 988) | SummarizerTitle       = "Summarizer Configuration"
  constant SummarizerDescription (line 989) | SummarizerDescription = "Enable conversation summarization to reduce LLM...
  constant SummarizerName (line 990) | SummarizerName        = "Summarizer"
  constant SummarizerOverview (line 991) | SummarizerOverview    = `Optimize context usage, reduce LLM costs, and m...
  constant SummarizerTypeGeneralName (line 1007) | SummarizerTypeGeneralName = "General Summarization"
  constant SummarizerTypeGeneralDesc (line 1008) | SummarizerTypeGeneralDesc = "Global summarization settings for conversat...
  constant SummarizerTypeGeneralInfo (line 1010) | SummarizerTypeGeneralInfo = `Choose this for maximum cost control and sh...
  constant SummarizerTypeAssistantName (line 1029) | SummarizerTypeAssistantName = "Assistant Summarization"
  constant SummarizerTypeAssistantDesc (line 1030) | SummarizerTypeAssistantDesc = "Specialized summarization settings for AI...
  constant SummarizerTypeAssistantInfo (line 1032) | SummarizerTypeAssistantInfo = `Choose this for optimal conversation qual...
  constant SummarizerFormGeneralTitle (line 1055) | SummarizerFormGeneralTitle   = "General Summarizer Configuration"
  constant SummarizerFormAssistantTitle (line 1056) | SummarizerFormAssistantTitle = "Assistant Summarizer Configuration"
  constant SummarizerFormDescription (line 1057) | SummarizerFormDescription    = "Configure %s Settings"
  constant SummarizerFormPreserveLast (line 1060) | SummarizerFormPreserveLast     = "Size Management"
  constant SummarizerFormPreserveLastDesc (line 1061) | SummarizerFormPreserveLastDesc = "Controls last section compression. Ena...
  constant SummarizerFormUseQA (line 1063) | SummarizerFormUseQA     = "QA Summarization"
  constant SummarizerFormUseQADesc (line 1064) | SummarizerFormUseQADesc = "Enables question-answer pair compression when...
  constant SummarizerFormSumHumanInQA (line 1066) | SummarizerFormSumHumanInQA     = "Compress User Messages"
  constant SummarizerFormSumHumanInQADesc (line 1067) | SummarizerFormSumHumanInQADesc = "Include user messages in QA compressio...
  constant SummarizerFormLastSecBytes (line 1069) | SummarizerFormLastSecBytes     = "Section Size Limit"
  constant SummarizerFormLastSecBytesDesc (line 1070) | SummarizerFormLastSecBytesDesc = "Maximum bytes per recent section when ...
  constant SummarizerFormMaxBPBytes (line 1072) | SummarizerFormMaxBPBytes     = "Response Size Limit"
  constant SummarizerFormMaxBPBytesDesc (line 1073) | SummarizerFormMaxBPBytesDesc = "Maximum bytes for individual AI response...
  constant SummarizerFormMaxQASections (line 1075) | SummarizerFormMaxQASections     = "QA Section Limit"
  constant SummarizerFormMaxQASectionsDesc (line 1076) | SummarizerFormMaxQASectionsDesc = "Maximum question-answer sections befo...
  constant SummarizerFormMaxQABytes (line 1078) | SummarizerFormMaxQABytes     = "Total QA Memory"
  constant SummarizerFormMaxQABytesDesc (line 1079) | SummarizerFormMaxQABytesDesc = "Maximum bytes for all QA sections combin...
  constant SummarizerFormKeepQASections (line 1081) | SummarizerFormKeepQASections     = "Recent Sections"
  constant SummarizerFormKeepQASectionsDesc (line 1082) | SummarizerFormKeepQASectionsDesc = "Number of most recent conversation s...
  constant SummarizerFormGeneralHelp (line 1085) | SummarizerFormGeneralHelp = `Context estimation: 4K-22K tokens (typical)...
  constant SummarizerFormAssistantHelp (line 1112) | SummarizerFormAssistantHelp = `Optimized for interactive conversations r...
  constant SummarizerContextEstimatedSize (line 1138) | SummarizerContextEstimatedSize    = "Estimated context size: %s\n%s"
  constant SummarizerContextTokenRange (line 1139) | SummarizerContextTokenRange       = "~%s tokens"
  constant SummarizerContextTokenRangeMinMax (line 1140) | SummarizerContextTokenRangeMinMax = "~%s-%s tokens"
  constant SummarizerContextRequires256K (line 1141) | SummarizerContextRequires256K     = "Requires 256K+ context model"
  constant SummarizerContextRequires128K (line 1142) | SummarizerContextRequires128K     = "Requires 128K+ context model"
  constant SummarizerContextRequires64K (line 1143) | SummarizerContextRequires64K      = "Requires 64K+ context model"
  constant SummarizerContextRequires32K (line 1144) | SummarizerContextRequires32K      = "Requires 32K+ context model"
  constant SummarizerContextRequires16K (line 1145) | SummarizerContextRequires16K      = "Requires 16K+ context model"
  constant SummarizerContextFitsIn8K (line 1146) | SummarizerContextFitsIn8K         = "Fits in 8K+ context model"
  constant ToolsTitle (line 1151) | ToolsTitle       = "Tools Configuration"
  constant ToolsDescription (line 1152) | ToolsDescription = "Enhance agent capabilities with additional tools and...
  constant ToolsName (line 1153) | ToolsName        = "Tools"
  constant ToolsOverview (line 1154) | ToolsOverview    = `Configure additional tools and capabilities for AI a...
  constant ServerSettingsFormTitle (line 1168) | ServerSettingsFormTitle       = "Server Settings"
  constant ServerSettingsFormDescription (line 1169) | ServerSettingsFormDescription = "Configure PentAGI server network access...
  constant ServerSettingsFormName (line 1170) | ServerSettingsFormName        = "Server Settings"
  constant ServerSettingsFormOverview (line 1171) | ServerSettingsFormOverview    = `• Network binding - control which inter...
  constant ServerSettingsLicenseKey (line 1179) | ServerSettingsLicenseKey     = "License Key"
  constant ServerSettingsLicenseKeyDesc (line 1180) | ServerSettingsLicenseKeyDesc = "PentAGI License Key in format of XXXX-XX...
  constant ServerSettingsHost (line 1182) | ServerSettingsHost     = "Server Host (Listen IP)"
  constant ServerSettingsHostDesc (line 1183) | ServerSettingsHostDesc = "Bind address used by Docker port mapping (e.g....
  constant ServerSettingsPort (line 1185) | ServerSettingsPort     = "Server Port (Listen Port)"
  constant ServerSettingsPortDesc (line 1186) | ServerSettingsPortDesc = "External TCP port exposed by Docker for PentAG...
  constant ServerSettingsPublicURL (line 1188) | ServerSettingsPublicURL     = "Public URL"
  constant ServerSettingsPublicURLDesc (line 1189) | ServerSettingsPublicURLDesc = "Base public URL for redirects and links (...
  constant ServerSettingsCORSOrigins (line 1191) | ServerSettingsCORSOrigins     = "CORS Origins"
  constant ServerSettingsCORSOriginsDesc (line 1192) | ServerSettingsCORSOriginsDesc = "Comma-separated list of allowed origins...
  constant ServerSettingsProxyURL (line 1194) | ServerSettingsProxyURL     = "HTTP/HTTPS Proxy"
  constant ServerSettingsProxyURLDesc (line 1195) | ServerSettingsProxyURLDesc = "Proxy for outbound requests to LLMs and ex...
  constant ServerSettingsProxyUsername (line 1197) | ServerSettingsProxyUsername     = "Proxy Username"
  constant ServerSettingsProxyUsernameDesc (line 1198) | ServerSettingsProxyUsernameDesc = "Username for proxy authentication (op...
  constant ServerSettingsProxyPassword (line 1199) | ServerSettingsProxyPassword     = "Proxy Password"
  constant ServerSettingsProxyPasswordDesc (line 1200) | ServerSettingsProxyPasswordDesc = "Password for proxy authentication (op...
  constant ServerSettingsHTTPClientTimeout (line 1202) | ServerSettingsHTTPClientTimeout     = "HTTP Client Timeout"
  constant ServerSettingsHTTPClientTimeoutDesc (line 1203) | ServerSettingsHTTPClientTimeoutDesc = "Timeout in seconds for external A...
  constant ServerSettingsExternalSSLCAPath (line 1205) | ServerSettingsExternalSSLCAPath     = "Custom CA Certificate Path"
  constant ServerSettingsExternalSSLCAPathDesc (line 1206) | ServerSettingsExternalSSLCAPathDesc = "Path inside container to custom r...
  constant ServerSettingsExternalSSLInsecure (line 1208) | ServerSettingsExternalSSLInsecure     = "Skip SSL Verification"
  constant ServerSettingsExternalSSLInsecureDesc (line 1209) | ServerSettingsExternalSSLInsecureDesc = "Disable SSL/TLS certificate val...
  constant ServerSettingsSSLDir (line 1211) | ServerSettingsSSLDir     = "SSL Directory"
  constant ServerSettingsSSLDirDesc (line 1212) | ServerSettingsSSLDirDesc = "Directory containing server.crt and server.k...
  constant ServerSettingsDataDir (line 1214) | ServerSettingsDataDir     = "Data Directory"
  constant ServerSettingsDataDirDesc (line 1215) | ServerSettingsDataDirDesc = "Directory for all agent-generated files; co...
  constant ServerSettingsCookieSigningSalt (line 1217) | ServerSettingsCookieSigningSalt     = "Cookie Signing Salt"
  constant ServerSettingsCookieSigningSaltDesc (line 1218) | ServerSettingsCookieSigningSaltDesc = "Secret used to sign cookies (keep...
  constant ServerSettingsLicenseKeyHint (line 1221) | ServerSettingsLicenseKeyHint          = "License Key"
  constant ServerSettingsHostHint (line 1222) | ServerSettingsHostHint                = "Listen IP"
  constant ServerSettingsPortHint (line 1223) | ServerSettingsPortHint                = "Listen Port"
  constant ServerSettingsPublicURLHint (line 1224) | ServerSettingsPublicURLHint           = "Public URL"
  constant ServerSettingsCORSOriginsHint (line 1225) | ServerSettingsCORSOriginsHint         = "CORS Origins"
  constant ServerSettingsProxyURLHint (line 1226) | ServerSettingsProxyURLHint            = "Proxy URL"
  constant ServerSettingsProxyUsernameHint (line 1227) | ServerSettingsProxyUsernameHint       = "Proxy Username"
  constant ServerSettingsProxyPasswordHint (line 1228) | ServerSettingsProxyPasswordHint       = "Proxy Password"
  constant ServerSettingsHTTPClientTimeoutHint (line 1229) | ServerSettingsHTTPClientTimeoutHint   = "HTTP Timeout"
  constant ServerSettingsExternalSSLCAPathHint (line 1230) | ServerSettingsExternalSSLCAPathHint   = "Custom CA Path"
  constant ServerSettingsExternalSSLInsecureHint (line 1231) | ServerSettingsExternalSSLInsecureHint = "Skip SSL Verification"
  constant ServerSettingsSSLDirHint (line 1232) | ServerSettingsSSLDirHint              = "SSL Directory"
  constant ServerSettingsDataDirHint (line 1233) | ServerSettingsDataDirHint             = "Data Directory"
  constant ServerSettingsGeneralHelp (line 1236) | ServerSettingsGeneralHelp = `PentAGI exposes its web UI via Docker with ...
  constant ServerSettingsLicenseKeyHelp (line 1242) | ServerSettingsLicenseKeyHelp = `PentAGI License Key in format of XXXX-XX...
  constant ServerSettingsHostHelp (line 1244) | ServerSettingsHostHelp = `Bind address for published port in docker-comp...
  constant ServerSettingsPortHelp (line 1250) | ServerSettingsPortHelp = `External port for PentAGI UI. Must be availabl...
  constant ServerSettingsPublicURLHelp (line 1252) | ServerSettingsPublicURLHelp = `Set the public base URL used in redirects...
  constant ServerSettingsCORSOriginsHelp (line 1259) | ServerSettingsCORSOriginsHelp = `Comma-separated allowed origins for bro...
  constant ServerSettingsProxyURLHelp (line 1261) | ServerSettingsProxyURLHelp = `HTTP or HTTPS proxy for outbound requests ...
  constant ServerSettingsHTTPClientTimeoutHelp (line 1263) | ServerSettingsHTTPClientTimeoutHelp = `Timeout in seconds for all extern...
  constant ServerSettingsExternalSSLCAPathHelp (line 1273) | ServerSettingsExternalSSLCAPathHelp = `Path to custom CA certificate fil...
  constant ServerSettingsExternalSSLInsecureHelp (line 1283) | ServerSettingsExternalSSLInsecureHelp = `Disable SSL/TLS certificate val...
  constant ServerSettingsSSLDirHelp (line 1289) | ServerSettingsSSLDirHelp = `Path to directory with server.crt and server...
  constant ServerSettingsDataDirHelp (line 1291) | ServerSettingsDataDirHelp = `Host directory for persistent data. PentAGI...
  constant ServerSettingsCookieSigningSaltHelp (line 1293) | ServerSettingsCookieSigningSaltHelp = `Secret salt used to sign cookies....
  constant ToolsAIAgentsSettingsFormTitle (line 1299) | ToolsAIAgentsSettingsFormTitle       = "AI Agents Settings"
  constant ToolsAIAgentsSettingsFormDescription (line 1300) | ToolsAIAgentsSettingsFormDescription = "Configure global behavior for AI...
  constant ToolsAIAgentsSettingsFormName (line 1301) | ToolsAIAgentsSettingsFormName        = "AI Agents Settings"
  constant ToolsAIAgentsSettingsFormOverview (line 1302) | ToolsAIAgentsSettingsFormOverview    = `This section configures global b...
  constant ToolsAIAgentsSettingHumanInTheLoop (line 1323) | ToolsAIAgentsSettingHumanInTheLoop          = "Enable User Interaction"
  constant ToolsAIAgentsSettingHumanInTheLoopDesc (line 1324) | ToolsAIAgentsSettingHumanInTheLoopDesc      = "Allow agents to ask for u...
  constant ToolsAIAgentsSettingUseAgents (line 1325) | ToolsAIAgentsSettingUseAgents               = "Use Multi-Agent Mode"
  constant ToolsAIAgentsSettingUseAgentsDesc (line 1326) | ToolsAIAgentsSettingUseAgentsDesc           = "Enable assistant to orche...
  constant ToolsAIAgentsSettingExecutionMonitor (line 1327) | ToolsAIAgentsSettingExecutionMonitor        = "Enable Execution Monitori...
  constant ToolsAIAgentsSettingExecutionMonitorDesc (line 1328) | ToolsAIAgentsSettingExecutionMonitorDesc    = "Automatically invoke ment...
  constant ToolsAIAgentsSettingSameToolLimit (line 1329) | ToolsAIAgentsSettingSameToolLimit           = "Same Tool Call Threshold"
  constant ToolsAIAgentsSettingSameToolLimitDesc (line 1330) | ToolsAIAgentsSettingSameToolLimitDesc       = "Consecutive identical too...
  constant ToolsAIAgentsSettingTotalToolLimit (line 1331) | ToolsAIAgentsSettingTotalToolLimit          = "Total Tool Call Threshold"
  constant ToolsAIAgentsSettingTotalToolLimitDesc (line 1332) | ToolsAIAgentsSettingTotalToolLimitDesc      = "Total tool calls before m...
  constant ToolsAIAgentsSettingMaxGeneralToolCalls (line 1333) | ToolsAIAgentsSettingMaxGeneralToolCalls     = "Max Tool Calls (General A...
  constant ToolsAIAgentsSettingMaxGeneralToolCallsDesc (line 1334) | ToolsAIAgentsSettingMaxGeneralToolCallsDesc = "Maximum tool calls for As...
  constant ToolsAIAgentsSettingMaxLimitedToolCalls (line 1335) | ToolsAIAgentsSettingMaxLimitedToolCalls     = "Max Tool Calls (Limited A...
  constant ToolsAIAgentsSettingMaxLimitedToolCallsDesc (line 1336) | ToolsAIAgentsSettingMaxLimitedToolCallsDesc = "Maximum tool calls for Se...
  constant ToolsAIAgentsSettingTaskPlanning (line 1337) | ToolsAIAgentsSettingTaskPlanning            = "Enable Task Planning (beta)"
  constant ToolsAIAgentsSettingTaskPlanningDesc (line 1338) | ToolsAIAgentsSettingTaskPlanningDesc        = "Generate structured execu...
  constant ToolsAIAgentsSettingsHelp (line 1341) | ToolsAIAgentsSettingsHelp = `AI Agents Settings define how agents collab...
  constant ToolsSearchEnginesFormTitle (line 1371) | ToolsSearchEnginesFormTitle       = "Search Engines Configuration"
  constant ToolsSearchEnginesFormDescription (line 1372) | ToolsSearchEnginesFormDescription = "Configure search engines for AI age...
  constant ToolsSearchEnginesFormName (line 1373) | ToolsSearchEnginesFormName        = "Search Engines"
  constant ToolsSearchEnginesFormOverview (line 1374) | ToolsSearchEnginesFormOverview    = `Available search engines:
  constant ToolsSearchEnginesDuckDuckGo (line 1389) | ToolsSearchEnginesDuckDuckGo               = "DuckDuckGo Search"
  constant ToolsSearchEnginesDuckDuckGoDesc (line 1390) | ToolsSearchEnginesDuckDuckGoDesc           = "Enable DuckDuckGo search (...
  constant ToolsSearchEnginesDuckDuckGoRegion (line 1391) | ToolsSearchEnginesDuckDuckGoRegion         = "DuckDuckGo Region"
  constant ToolsSearchEnginesDuckDuckGoRegionDesc (line 1392) | ToolsSearchEnginesDuckDuckGoRegionDesc     = "DuckDuckGo region code (e....
  constant ToolsSearchEnginesDuckDuckGoSafeSearch (line 1393) | ToolsSearchEnginesDuckDuckGoSafeSearch     = "DuckDuckGo Safe Search"
  constant ToolsSearchEnginesDuckDuckGoSafeSearchDesc (line 1394) | ToolsSearchEnginesDuckDuckGoSafeSearchDesc = "DuckDuckGo safe search (st...
  constant ToolsSearchEnginesDuckDuckGoTimeRange (line 1395) | ToolsSearchEnginesDuckDuckGoTimeRange      = "DuckDuckGo Time Range"
  constant ToolsSearchEnginesDuckDuckGoTimeRangeDesc (line 1396) | ToolsSearchEnginesDuckDuckGoTimeRangeDesc  = "DuckDuckGo time range (d: ...
  constant ToolsSearchEnginesSploitus (line 1397) | ToolsSearchEnginesSploitus                 = "Sploitus Search"
  constant ToolsSearchEnginesSploitusDesc (line 1398) | ToolsSearchEnginesSploitusDesc             = "Enable Sploitus search for...
  constant ToolsSearchEnginesPerplexityKey (line 1399) | ToolsSearchEnginesPerplexityKey            = "Perplexity API Key"
  constant ToolsSearchEnginesPerplexityKeyDesc (line 1400) | ToolsSearchEnginesPerplexityKeyDesc        = "API key for Perplexity AI ...
  constant ToolsSearchEnginesTavilyKey (line 1401) | ToolsSearchEnginesTavilyKey                = "Tavily API Key"
  constant ToolsSearchEnginesTavilyKeyDesc (line 1402) | ToolsSearchEnginesTavilyKeyDesc            = "API key for Tavily search ...
  constant ToolsSearchEnginesTraversaalKey (line 1403) | ToolsSearchEnginesTraversaalKey            = "Traversaal API Key"
  constant ToolsSearchEnginesTraversaalKeyDesc (line 1404) | ToolsSearchEnginesTraversaalKeyDesc        = "API key for Traversaal web...
  constant ToolsSearchEnginesGoogleKey (line 1405) | ToolsSearchEnginesGoogleKey                = "Google Search API Key"
  constant ToolsSearchEnginesGoogleKeyDesc (line 1406) | ToolsSearchEnginesGoogleKeyDesc            = "Google Custom Search API key"
  constant ToolsSearchEnginesGoogleCX (line 1407) | ToolsSearchEnginesGoogleCX                 = "Google Search Engine ID"
  constant ToolsSearchEnginesGoogleCXDesc (line 1408) | ToolsSearchEnginesGoogleCXDesc             = "Google Custom Search Engin...
  constant ToolsSearchEnginesGoogleLR (line 1409) | ToolsSearchEnginesGoogleLR                 = "Google Language Restriction"
  constant ToolsSearchEnginesGoogleLRDesc (line 1410) | ToolsSearchEnginesGoogleLRDesc             = "Google Search Engine langu...
  constant ToolsSearchEnginesSearxngURL (line 1411) | ToolsSearchEnginesSearxngURL               = "Searxng Search URL"
  constant ToolsSearchEnginesSearxngURLDesc (line 1412) | ToolsSearchEnginesSearxngURLDesc           = "Searxng search engine URL"
  constant ToolsSearchEnginesSearxngCategories (line 1413) | ToolsSearchEnginesSearxngCategories        = "Searxng Search Categories"
  constant ToolsSearchEnginesSearxngCategoriesDesc (line 1414) | ToolsSearchEnginesSearxngCategoriesDesc    = "Searxng search engine cate...
  constant ToolsSearchEnginesSearxngLanguage (line 1415) | ToolsSearchEnginesSearxngLanguage          = "Searxng Search Language"
  constant ToolsSearchEnginesSearxngLanguageDesc (line 1416) | ToolsSearchEnginesSearxngLanguageDesc      = "Searxng search engine lang...
  constant ToolsSearchEnginesSearxngSafeSearch (line 1417) | ToolsSearchEnginesSearxngSafeSearch        = "Searxng Safe Search"
  constant ToolsSearchEnginesSearxngSafeSearchDesc (line 1418) | ToolsSearchEnginesSearxngSafeSearchDesc    = "Searxng search engine safe...
  constant ToolsSearchEnginesSearxngTimeRange (line 1419) | ToolsSearchEnginesSearxngTimeRange         = "Searxng Time Range"
  constant ToolsSearchEnginesSearxngTimeRangeDesc (line 1420) | ToolsSearchEnginesSearxngTimeRangeDesc     = "Searxng search engine time...
  constant ToolsSearchEnginesSearxngTimeout (line 1421) | ToolsSearchEnginesSearxngTimeout           = "Searxng Timeout"
  constant ToolsSearchEnginesSearxngTimeoutDesc (line 1422) | ToolsSearchEnginesSearxngTimeoutDesc       = "Searxng request timeout in...
  constant ToolsScraperFormTitle (line 1427) | ToolsScraperFormTitle       = "Scraper Configuration"
  constant ToolsScraperFormDescription (line 1428) | ToolsScraperFormDescription = "Configure web scraping service"
  constant ToolsScraperFormName (line 1429) | ToolsScraperFormName        = "Scraper"
  constant ToolsScraperFormOverview (line 1430) | ToolsScraperFormOverview    = `Web scraper service for content extractio...
  constant ToolsScraperModeTitle (line 1445) | ToolsScraperModeTitle                 = "Scraper Mode"
  constant ToolsScraperModeDesc (line 1446) | ToolsScraperModeDesc                  = "Select how the scraper service ...
  constant ToolsScraperEmbedded (line 1447) | ToolsScraperEmbedded                  = "Embedded Container"
  constant ToolsScraperExternal (line 1448) | ToolsScraperExternal                  = "External Service"
  constant ToolsScraperDisabled (line 1449) | ToolsScraperDisabled                  = "Disabled"
  constant ToolsScraperPublicURL (line 1450) | ToolsScraperPublicURL                 = "Public Scraper URL"
  constant ToolsScraperPublicURLDesc (line 1451) | ToolsScraperPublicURLDesc             = "URL for scraping public/externa...
  constant ToolsScraperPublicURLEmbeddedDesc (line 1452) | ToolsScraperPublicURLEmbeddedDesc     = "URL for embedded scraper (optio...
  constant ToolsScraperPrivateURL (line 1453) | ToolsScraperPrivateURL                = "Private Scraper URL"
  constant ToolsScraperPrivateURLDesc (line 1454) | ToolsScraperPrivateURLDesc            = "URL for scraping private/intern...
  constant ToolsScraperPublicUsername (line 1455) | ToolsScraperPublicUsername            = "Public URL Username"
  constant ToolsScraperPublicUsernameDesc (line 1456) | ToolsScraperPublicUsernameDesc        = "Username for public scraper acc...
  constant ToolsScraperPublicPassword (line 1457) | ToolsScraperPublicPassword            = "Public URL Password"
  constant ToolsScraperPublicPasswordDesc (line 1458) | ToolsScraperPublicPasswordDesc        = "Password for public scraper acc...
  constant ToolsScraperPrivateUsername (line 1459) | ToolsScraperPrivateUsername           = "Private URL Username"
  constant ToolsScraperPrivateUsernameDesc (line 1460) | ToolsScraperPrivateUsernameDesc       = "Username for private scraper ac...
  constant ToolsScraperPrivatePassword (line 1461) | ToolsScraperPrivatePassword           = "Private URL Password"
  constant ToolsScraperPrivatePasswordDesc (line 1462) | ToolsScraperPrivatePasswordDesc       = "Password for private scraper ac...
  constant ToolsScraperLocalUsername (line 1463) | ToolsScraperLocalUsername             = "Local URL Username"
  constant ToolsScraperLocalUsernameDesc (line 1464) | ToolsScraperLocalUsernameDesc         = "Username for embedded scraper s...
  constant ToolsScraperLocalPassword (line 1465) | ToolsScraperLocalPassword             = "Local URL Password"
  constant ToolsScraperLocalPasswordDesc (line 1466) | ToolsScraperLocalPasswordDesc         = "Password for embedded scraper s...
  constant ToolsScraperMaxConcurrentSessions (line 1467) | ToolsScraperMaxConcurrentSessions     = "Max Concurrent Sessions"
  constant ToolsScraperMaxConcurrentSessionsDesc (line 1468) | ToolsScraperMaxConcurrentSessionsDesc = "Maximum number of concurrent sc...
  constant ToolsScraperEmbeddedHelp (line 1469) | ToolsScraperEmbeddedHelp              = "Embedded mode runs a local scra...
  constant ToolsScraperExternalHelp (line 1470) | ToolsScraperExternalHelp              = "External mode uses separate scr...
  constant ToolsScraperDisabledHelp (line 1471) | ToolsScraperDisabledHelp              = "Scraper is disabled. Web conten...
  constant ToolsDockerFormTitle (line 1476) | ToolsDockerFormTitle       = "Docker Environment Configuration"
  constant ToolsDockerFormDescription (line 1477) | ToolsDockerFormDescription = "Configure Docker environment for worker co...
  constant ToolsDockerFormName (line 1478) | ToolsDockerFormName        = "Docker Environment"
  constant ToolsDockerFormOverview (line 1479) | ToolsDockerFormOverview    = `• Worker Isolation - Containers provide se...
  constant ToolsDockerGeneralHelp (line 1488) | ToolsDockerGeneralHelp = `Each AI agent task runs in an isolated Docker ...
  constant ToolsDockerInside (line 1499) | ToolsDockerInside       = "Docker Access"
  constant ToolsDockerInsideDesc (line 1500) | ToolsDockerInsideDesc   = "Allow workers to manage Docker containers"
  constant ToolsDockerNetAdmin (line 1501) | ToolsDockerNetAdmin     = "Network Admin"
  constant ToolsDockerNetAdminDesc (line 1502) | ToolsDockerNetAdminDesc = "Grant NET_ADMIN capability for network scanni...
  constant ToolsDockerSocket (line 1505) | ToolsDockerSocket       = "Docker Socket"
  constant ToolsDockerSocketDesc (line 1506) | ToolsDockerSocketDesc   = "Path to Docker socket on host filesystem"
  constant ToolsDockerNetwork (line 1507) | ToolsDockerNetwork      = "Docker Network"
  constant ToolsDockerNetworkDesc (line 1508) | ToolsDockerNetworkDesc  = "Custom network name for worker containers"
  constant ToolsDockerPublicIP (line 1509) | ToolsDockerPublicIP     = "Public IP Address"
  constant ToolsDockerPublicIPDesc (line 1510) | ToolsDockerPublicIPDesc = "Public IP for reverse connections in OOB atta...
  constant ToolsDockerWorkDir (line 1513) | ToolsDockerWorkDir     = "Work Directory"
  constant ToolsDockerWorkDirDesc (line 1514) | ToolsDockerWorkDirDesc = "Host directory for worker filesystems (default...
  constant ToolsDockerDefaultImage (line 1517) | ToolsDockerDefaultImage               = "Default Image"
  constant ToolsDockerDefaultImageDesc (line 1518) | ToolsDockerDefaultImageDesc           = "Default Docker image for genera...
  constant ToolsDockerDefaultImageForPentest (line 1519) | ToolsDockerDefaultImageForPentest     = "Pentesting Image"
  constant ToolsDockerDefaultImageForPentestDesc (line 1520) | ToolsDockerDefaultImageForPentestDesc = "Default Docker image for securi...
  constant ToolsDockerHost (line 1523) | ToolsDockerHost          = "Docker Host"
  constant ToolsDockerHostDesc (line 1524) | ToolsDockerHostDesc      = "Docker daemon connection (unix:// or tcp://)"
  constant ToolsDockerTLSVerify (line 1525) | ToolsDockerTLSVerify     = "TLS Verification"
  constant ToolsDockerTLSVerifyDesc (line 1526) | ToolsDockerTLSVerifyDesc = "Enable TLS verification for Docker connection"
  constant ToolsDockerCertPath (line 1527) | ToolsDockerCertPath      = "TLS Certificates"
  constant ToolsDockerCertPathDesc (line 1528) | ToolsDockerCertPathDesc  = "Directory containing ca.pem, cert.pem, key.p...
  constant ToolsDockerInsideHelp (line 1531) | ToolsDockerInsideHelp = `Docker Access enables workers to spawn addition...
  constant ToolsDockerNetAdminHelp (line 1535) | ToolsDockerNetAdminHelp = `Network Admin capability allows workers to pe...
  constant ToolsDockerSocketHelp (line 1545) | ToolsDockerSocketHelp = `Docker Socket path defines how workers access t...
  constant ToolsDockerNetworkHelp (line 1552) | ToolsDockerNetworkHelp = `Custom Docker Network provides isolation for w...
  constant ToolsDockerPublicIPHelp (line 1560) | ToolsDockerPublicIPHelp = `Public IP Address enables out-of-band (OOB) a...
  constant ToolsDockerWorkDirHelp (line 1566) | ToolsDockerWorkDirHelp = `Work Directory specifies host filesystem locat...
  constant ToolsDockerDefaultImageHelp (line 1578) | ToolsDockerDefaultImageHelp = `Default Image provides fallback for worke...
  constant ToolsDockerDefaultImageForPentestHelp (line 1582) | ToolsDockerDefaultImageForPentestHelp = `Pentesting Image serves as defa...
  constant ToolsDockerHostHelp (line 1586) | ToolsDockerHostHelp = `Docker Host uses for start primary worker contain...
  constant ToolsDockerTLSVerifyHelp (line 1594) | ToolsDockerTLSVerifyHelp = `TLS Verification secures Docker daemon conne...
  constant ToolsDockerCertPathHelp (line 1598) | ToolsDockerCertPathHelp = `TLS Certificates directory must contain:
  constant EmbedderFormTitle (line 1610) | EmbedderFormTitle       = "Embedder Configuration"
  constant EmbedderFormDescription (line 1611) | EmbedderFormDescription = "Configure text vectorization for semantic sea...
  constant EmbedderFormName (line 1612) | EmbedderFormName        = "Embedder"
  constant EmbedderFormOverview (line 1613) | EmbedderFormOverview    = `Text embeddings convert documents into vector...
  constant EmbedderFormProvider (line 1618) | EmbedderFormProvider     = "Embedding Provider"
  constant EmbedderFormProviderDesc (line 1619) | EmbedderFormProviderDesc = "Select the provider for text vectorization. ...
  constant EmbedderFormURL (line 1621) | EmbedderFormURL     = "API Endpoint URL"
  constant EmbedderFormURLDesc (line 1622) | EmbedderFormURLDesc = "Custom API endpoint (leave empty to use default)"
  constant EmbedderFormAPIKey (line 1624) | EmbedderFormAPIKey     = "API Key"
  constant EmbedderFormAPIKeyDesc (line 1625) | EmbedderFormAPIKeyDesc = "Authentication key for the provider (not requi...
  constant EmbedderFormModel (line 1627) | EmbedderFormModel     = "Model Name"
  constant EmbedderFormModelDesc (line 1628) | EmbedderFormModelDesc = "Specific embedding model to use (leave empty fo...
  constant EmbedderFormBatchSize (line 1630) | EmbedderFormBatchSize     = "Batch Size"
  constant EmbedderFormBatchSizeDesc (line 1631) | EmbedderFormBatchSizeDesc = "Number of documents to process in a single ...
  constant EmbedderFormStripNewLines (line 1633) | EmbedderFormStripNewLines     = "Strip New Lines"
  constant EmbedderFormStripNewLinesDesc (line 1634) | EmbedderFormStripNewLinesDesc = "Remove line breaks from text before emb...
  constant EmbedderFormHelpTitle (line 1636) | EmbedderFormHelpTitle   = "Embedding Configuration"
  constant EmbedderFormHelpContent (line 1637) | EmbedderFormHelpContent = `Configure text vectorization for semantic sea...
  constant EmbedderFormHelpOpenAI (line 1643) | EmbedderFormHelpOpenAI      = "OpenAI: Most reliable option with excelle...
  constant EmbedderFormHelpOllama (line 1644) | EmbedderFormHelpOllama      = "Ollama: Local embeddings, no API key need...
  constant EmbedderFormHelpHuggingFace (line 1645) | EmbedderFormHelpHuggingFace = "HuggingFace: Open source models with API ...
  constant EmbedderFormHelpGoogleAI (line 1646) | EmbedderFormHelpGoogleAI    = "Google AI: Quality embeddings, requires A...
  constant EmbedderProviderDefault (line 1649) | EmbedderProviderDefault         = "Default (OpenAI)"
  constant EmbedderProviderDefaultDesc (line 1650) | EmbedderProviderDefaultDesc     = "Use OpenAI embeddings with API key fr...
  constant EmbedderProviderOpenAI (line 1651) | EmbedderProviderOpenAI          = "OpenAI"
  constant EmbedderProviderOpenAIDesc (line 1652) | EmbedderProviderOpenAIDesc      = "OpenAI text embeddings API (text-embe...
  constant EmbedderProviderOllama (line 1653) | EmbedderProviderOllama          = "Ollama"
  constant EmbedderProviderOllamaDesc (line 1654) | EmbedderProviderOllamaDesc      = "Local Ollama server for open-source e...
  constant EmbedderProviderMistral (line 1655) | EmbedderProviderMistral         = "Mistral"
  constant EmbedderProviderMistralDesc (line 1656) | EmbedderProviderMistralDesc     = "Mistral AI embedding models"
  constant EmbedderProviderJina (line 1657) | EmbedderProviderJina            = "Jina"
  constant EmbedderProviderJinaDesc (line 1658) | EmbedderProviderJinaDesc        = "Jina AI embedding API"
  constant EmbedderProviderHuggingFace (line 1659) | EmbedderProviderHuggingFace     = "HuggingFace"
  constant EmbedderProviderHuggingFaceDesc (line 1660) | EmbedderProviderHuggingFaceDesc = "HuggingFace inference API for embeddi...
  constant EmbedderProviderGoogleAI (line 1661) | EmbedderProviderGoogleAI        = "Google AI"
  constant EmbedderProviderGoogleAIDesc (line 1662) | EmbedderProviderGoogleAIDesc    = "Google AI embedding models (embedding...
  constant EmbedderProviderVoyageAI (line 1663) | EmbedderProviderVoyageAI        = "VoyageAI"
  constant EmbedderProviderVoyageAIDesc (line 1664) | EmbedderProviderVoyageAIDesc    = "VoyageAI embedding API"
  constant EmbedderProviderDisabled (line 1665) | EmbedderProviderDisabled        = "Disabled"
  constant EmbedderProviderDisabledDesc (line 1666) | EmbedderProviderDisabledDesc    = "Disable embeddings functionality comp...
  constant EmbedderURLPlaceholderOpenAI (line 1669) | EmbedderURLPlaceholderOpenAI      = "https://api.openai.com/v1"
  constant EmbedderURLPlaceholderOllama (line 1670) | EmbedderURLPlaceholderOllama      = "http://localhost:11434"
  constant EmbedderURLPlaceholderMistral (line 1671) | EmbedderURLPlaceholderMistral     = "https://api.mistral.ai/v1"
  constant EmbedderURLPlaceholderJina (line 1672) | EmbedderURLPlaceholderJina        = "https://api.jina.ai/v1"
  constant EmbedderURLPlaceholderHuggingFace (line 1673) | EmbedderURLPlaceholderHuggingFace = "https://api-inference.huggingface.co"
  constant EmbedderURLPlaceholderGoogleAI (line 1674) | EmbedderURLPlaceholderGoogleAI    = "Not supported - uses default endpoint"
  constant EmbedderURLPlaceholderVoyageAI (line 1675) | EmbedderURLPlaceholderVoyageAI    = "Not supported - uses default endpoint"
  constant EmbedderAPIKeyPlaceholderOllama (line 1677) | EmbedderAPIKeyPlaceholderOllama      = "Not required for local models"
  constant EmbedderAPIKeyPlaceholderMistral (line 1678) | EmbedderAPIKeyPlaceholderMistral     = "Mistral API key"
  constant EmbedderAPIKeyPlaceholderJina (line 1679) | EmbedderAPIKeyPlaceholderJina        = "Jina API key"
  constant EmbedderAPIKeyPlaceholderHuggingFace (line 1680) | EmbedderAPIKeyPlaceholderHuggingFace = "HuggingFace API key"
  constant EmbedderAPIKeyPlaceholderGoogleAI (line 1681) | EmbedderAPIKeyPlaceholderGoogleAI    = "Google AI API key"
  constant EmbedderAPIKeyPlaceholderVoyageAI (line 1682) | EmbedderAPIKeyPlaceholderVoyageAI    = "VoyageAI API key"
  constant EmbedderAPIKeyPlaceholderDefault (line 1683) | EmbedderAPIKeyPlaceholderDefault     = "API key for the provider"
  constant EmbedderModelPlaceholderOpenAI (line 1685) | EmbedderModelPlaceholderOpenAI      = "text-embedding-3-small"
  constant EmbedderModelPlaceholderOllama (line 1686) | EmbedderModelPlaceholderOllama      = "nomic-embed-text"
  constant EmbedderModelPlaceholderMistral (line 1687) | EmbedderModelPlaceholderMistral     = "mistral-embed"
  constant EmbedderModelPlaceholderJina (line 1688) | EmbedderModelPlaceholderJina        = "jina-embeddings-v2-base-en"
  constant EmbedderModelPlaceholderHuggingFace (line 1689) | EmbedderModelPlaceholderHuggingFace = "sentence-transformers/all-MiniLM-...
  constant EmbedderModelPlaceholderGoogleAI (line 1690) | EmbedderModelPlaceholderGoogleAI    = "gemini-embedding-001"
  constant EmbedderModelPlaceholderVoyageAI (line 1691) | EmbedderModelPlaceholderVoyageAI    = "voyage-2"
  constant EmbedderModelPlaceholderDefault (line 1692) | EmbedderModelPlaceholderDefault     = "Model name"
  constant EmbedderProviderIDDefault (line 1695) | EmbedderProviderIDDefault     = "default"
  constant EmbedderProviderIDOpenAI (line 1696) | EmbedderProviderIDOpenAI      = "openai"
  constant EmbedderProviderIDOllama (line 1697) | EmbedderProviderIDOllama      = "ollama"
  constant EmbedderProviderIDMistral (line 1698) | EmbedderProviderIDMistral     = "mistral"
  constant EmbedderProviderIDJina (line 1699) | EmbedderProviderIDJina        = "jina"
  constant EmbedderProviderIDHuggingFace (line 1700) | EmbedderProviderIDHuggingFace = "huggingface"
  constant EmbedderProviderIDGoogleAI (line 1701) | EmbedderProviderIDGoogleAI    = "googleai"
  constant EmbedderProviderIDVoyageAI (line 1702) | EmbedderProviderIDVoyageAI    = "voyageai"
  constant EmbedderProviderIDDisabled (line 1703) | EmbedderProviderIDDisabled    = "none"
  constant EmbedderHelpGeneral (line 1705) | EmbedderHelpGeneral = `Embeddings convert text into vectors for semantic...
  constant EmbedderHelpAttentionPrefix (line 1717) | EmbedderHelpAttentionPrefix = "Important:"
  constant EmbedderHelpAttention (line 1718) | EmbedderHelpAttention       = `Different embedding providers create inco...
  constant EmbedderHelpAttentionSuffix (line 1725) | EmbedderHelpAttentionSuffix = `Only change providers if absolutely neces...
  constant EmbedderHelpDefault (line 1728) | EmbedderHelpDefault = `Default mode uses OpenAI embeddings with the API ...
  constant EmbedderHelpOpenAI (line 1732) | EmbedderHelpOpenAI = `Direct OpenAI API access for embedding generation.
  constant EmbedderHelpOllama (line 1742) | EmbedderHelpOllama = `Local Ollama server for open-source embedding models.
  constant EmbedderHelpMistral (line 1754) | EmbedderHelpMistral = `Mistral AI embedding models via API.
  constant EmbedderHelpJina (line 1762) | EmbedderHelpJina = `Jina AI embedding API with specialized models.
  constant EmbedderHelpHuggingFace (line 1772) | EmbedderHelpHuggingFace = `HuggingFace Inference API for open-source mod...
  constant EmbedderHelpGoogleAI (line 1782) | EmbedderHelpGoogleAI = `Google AI embedding models (Gemini).
  constant EmbedderHelpVoyageAI (line 1793) | EmbedderHelpVoyageAI = `VoyageAI embedding API optimized for retrieval.
  constant EmbedderHelpDisabled (line 1803) | EmbedderHelpDisabled = `Disables all embedding functionality.
  constant MockScreenTitle (line 1815) | MockScreenTitle       = "Development Screen"
  constant MockScreenDescription (line 1816) | MockScreenDescription = "This screen is under development"
  constant ApplyChangesFormTitle (line 1821) | ApplyChangesFormTitle       = "Apply Configuration Changes"
  constant ApplyChangesFormName (line 1822) | ApplyChangesFormName        = "Apply Changes"
  constant ApplyChangesFormDescription (line 1823) | ApplyChangesFormDescription = "Review and apply your configuration changes"
  constant ApplyChangesFormOverview (line 1826) | ApplyChangesFormOverview = `This screen allows you to review all pending...
  constant ApplyChangesNotStarted (line 1834) | ApplyChangesNotStarted     = "Configuration changes are ready to be appl...
  constant ApplyChangesInProgress (line 1835) | ApplyChangesInProgress     = "Applying configuration changes...\n"
  constant ApplyChangesCompleted (line 1836) | ApplyChangesCompleted      = "Configuration changes have been successful...
  constant ApplyChangesFailed (line 1837) | ApplyChangesFailed         = "Failed to perform configuration changes"
  constant ApplyChangesResetCompleted (line 1838) | ApplyChangesResetCompleted = "Configuration changes have been successful...
  constant ApplyChangesTerminalIsNotInitialized (line 1840) | ApplyChangesTerminalIsNotInitialized = "Terminal is not initialized"
  constant ApplyChangesInstructions (line 1843) | ApplyChangesInstructions = `Press Enter to begin applying the configurat...
  constant ApplyChangesNoChanges (line 1845) | ApplyChangesNoChanges = "No configuration changes are pending"
  constant ApplyChangesInstallNotFound (line 1848) | ApplyChangesInstallNotFound = `PentAGI is not currently installed on thi...
  constant ApplyChangesInstallFoundLangfuse (line 1855) | ApplyChangesInstallFoundLangfuse      = `• Installation of Langfuse obse...
  constant ApplyChangesInstallFoundObservability (line 1856) | ApplyChangesInstallFoundObservability = `• Installation of comprehensive...
  constant ApplyChangesUpdateFound (line 1858) | ApplyChangesUpdateFound = `PentAGI is currently installed on this system.
  constant ApplyChangesWarningCritical (line 1866) | ApplyChangesWarningCritical = "⚠️  Critical changes detected - services ...
  constant ApplyChangesWarningSecrets (line 1867) | ApplyChangesWarningSecrets  = "🔒 Secret values detected - they will be s...
  constant ApplyChangesNoteBackup (line 1868) | ApplyChangesNoteBackup      = "💾 Current configuration will be backed up...
  constant ApplyChangesNoteTime (line 1869) | ApplyChangesNoteTime        = "⏱️  This process may take less than a min...
  constant ApplyChangesStageValidation (line 1872) | ApplyChangesStageValidation = "Validating environment and dependencies..."
  constant ApplyChangesStageBackup (line 1873) | ApplyChangesStageBackup     = "Creating configuration backup..."
  constant ApplyChangesStageEnvFile (line 1874) | ApplyChangesStageEnvFile    = "Updating environment file..."
  constant ApplyChangesStageCompose (line 1875) | ApplyChangesStageCompose    = "Generating Docker Compose files..."
  constant ApplyChangesStageDocker (line 1876) | ApplyChangesStageDocker     = "Managing Docker containers..."
  constant ApplyChangesStageServices (line 1877) | ApplyChangesStageServices   = "Starting services..."
  constant ApplyChangesStageComplete (line 1878) | ApplyChangesStageComplete   = "Configuration changes applied successfully"
  constant ApplyChangesChangesTitle (line 1881) | ApplyChangesChangesTitle  = "Pending Configuration Changes"
  constant ApplyChangesChangesCount (line 1882) | ApplyChangesChangesCount  = "Total changes: %d"
  constant ApplyChangesChangesMasked (line 1883) | ApplyChangesChangesMasked = "(hidden for security)"
  constant ApplyChangesChangesEmpty (line 1884) | ApplyChangesChangesEmpty  = "No changes to apply"
  constant ApplyChangesHelpTitle (line 1887) | ApplyChangesHelpTitle   = "Applying Configuration Changes"
  constant ApplyChangesHelpContent (line 1888) | ApplyChangesHelpContent = `Be sure to check the current configuration be...
  constant ApplyChangesIntegrityPromptTitle (line 1893) | ApplyChangesIntegrityPromptTitle   = "File integrity check"
  constant ApplyChangesIntegrityPromptMessage (line 1894) | ApplyChangesIntegrityPromptMessage = "Out-of-date files were detected.\n...
  constant ApplyChangesIntegrityOutdatedList (line 1895) | ApplyChangesIntegrityOutdatedList  = "Out-of-date files:\n%s\nConfirm up...
  constant ApplyChangesIntegrityChecking (line 1896) | ApplyChangesIntegrityChecking      = "Collecting file integrity informat...
  constant ApplyChangesIntegrityNoOutdated (line 1897) | ApplyChangesIntegrityNoOutdated    = "No out-of-date files found. Procee...
  constant MaintenanceTitle (line 1902) | MaintenanceTitle       = "System Maintenance"
  constant MaintenanceDescription (line 1903) | MaintenanceDescription = "Manage PentAGI services and perform maintenanc...
  constant MaintenanceName (line 1904) | MaintenanceName        = "Maintenance"
  constant MaintenanceOverview (line 1905) | MaintenanceOverview    = `Perform system maintenance operations for Pent...
  constant MaintenanceStartPentagi (line 1918) | MaintenanceStartPentagi            = "Start PentAGI"
  constant MaintenanceStartPentagiDesc (line 1919) | MaintenanceStartPentagiDesc        = "Start all configured PentAGI servi...
  constant MaintenanceStopPentagi (line 1920) | MaintenanceStopPentagi             = "Stop PentAGI"
  constant MaintenanceStopPentagiDesc (line 1921) | MaintenanceStopPentagiDesc         = "Stop all running PentAGI services"
  constant MaintenanceRestartPentagi (line 1922) | MaintenanceRestartPentagi          = "Restart PentAGI"
  constant MaintenanceRestartPentagiDesc (line 1923) | MaintenanceRestartPentagiDesc      = "Restart all PentAGI services"
  constant MaintenanceDownloadWorkerImage (line 1924) | MaintenanceDownloadWorkerImage     = "Download Worker Image"
  constant MaintenanceDownloadWorkerImageDesc (line 1925) | MaintenanceDownloadWorkerImageDesc = "Download pentesting container imag...
  constant MaintenanceUpdateWorkerImage (line 1926) | MaintenanceUpdateWorkerImage       = "Update Worker Image"
  constant MaintenanceUpdateWorkerImageDesc (line 1927) | MaintenanceUpdateWorkerImageDesc   = "Update pentesting container image ...
  constant MaintenanceUpdatePentagi (line 1928) | MaintenanceUpdatePentagi           = "Update PentAGI"
  constant MaintenanceUpdatePentagiDesc (line 1929) | MaintenanceUpdatePentagiDesc       = "Update PentAGI to the latest version"
  constant MaintenanceUpdateInstaller (line 1930) | MaintenanceUpdateInstaller         = "Update Installer"
  constant MaintenanceUpdateInstallerDesc (line 1931) | MaintenanceUpdateInstallerDesc     = "Update this installer to the lates...
  constant MaintenanceFactoryReset (line 1932) | MaintenanceFactoryReset            = "Factory Reset"
  constant MaintenanceFactoryResetDesc (line 1933) | MaintenanceFactoryResetDesc        = "Reset PentAGI to factory defaults"
  constant MaintenanceRemovePentagi (line 1934) | MaintenanceRemovePentagi           = "Remove PentAGI"
  constant MaintenanceRemovePentagiDesc (line 1935) | MaintenanceRemovePentagiDesc       = "Remove PentAGI containers but keep...
  constant MaintenancePurgePentagi (line 1936) | MaintenancePurgePentagi            = "Purge PentAGI"
  constant MaintenancePurgePentagiDesc (line 1937) | MaintenancePurgePentagiDesc        = "Completely remove PentAGI includin...
  constant MaintenanceResetPassword (line 1938) | MaintenanceResetPassword           = "Reset Admin Password"
  constant MaintenanceResetPasswordDesc (line 1939) | MaintenanceResetPasswordDesc       = "Reset the administrator password f...
  constant ResetPasswordFormTitle (line 1944) | ResetPasswordFormTitle       = "Reset Admin Password"
  constant ResetPasswordFormDescription (line 1945) | ResetPasswordFormDescription = "Reset the administrator password for Pen...
  constant ResetPasswordFormName (line 1946) | ResetPasswordFormName        = "Reset Password"
  constant ResetPasswordFormOverview (line 1947) | ResetPasswordFormOverview    = `Reset the password for the default admin...
  constant ResetPasswordNewPassword (line 1958) | ResetPasswordNewPassword         = "New Password"
  constant ResetPasswordNewPasswordDesc (line 1959) | ResetPasswordNewPasswordDesc     = "Enter the new administrator password"
  constant ResetPasswordConfirmPassword (line 1960) | ResetPasswordConfirmPassword     = "Confirm Password"
  constant ResetPasswordConfirmPasswordDesc (line 1961) | ResetPasswordConfirmPasswordDesc = "Re-enter the new password to confirm"
  constant ResetPasswordNotAvailable (line 1964) | ResetPasswordNotAvailable = "PentAGI must be running to reset password"
  constant ResetPasswordAvailable (line 1965) | ResetPasswordAvailable    = "Password reset is available"
  constant ResetPasswordInProgress (line 1966) | ResetPasswordInProgress   = "Resetting password..."
  constant ResetPasswordSuccess (line 1967) | ResetPasswordSuccess      = "Password has been successfully reset"
  constant ResetPasswordErrorPrefix (line 1968) | ResetPasswordErrorPrefix  = "Error: "
  constant ResetPasswordErrorEmptyPassword (line 1971) | ResetPasswordErrorEmptyPassword = "Password cannot be empty"
  constant ResetPasswordErrorShortPassword (line 1972) | ResetPasswordErrorShortPassword = "Password must be at least 5 character...
  constant ResetPasswordErrorMismatch (line 1973) | ResetPasswordErrorMismatch      = "Passwords do not match"
  constant ResetPasswordHelpContent (line 1976) | ResetPasswordHelpContent = `Reset the administrator password for accessi...
  constant ProcessorOperationFormTitle (line 1992) | ProcessorOperationFormTitle       = "%s"
  constant ProcessorOperationFormDescription (line 1993) | ProcessorOperationFormDescription = "Execute %s operation"
  constant ProcessorOperationFormName (line 1994) | ProcessorOperationFormName        = "%s"
  constant ProcessorOperationNotStarted (line 1997) | ProcessorOperationNotStarted = "Ready to execute %s operation"
  constant ProcessorOperationInProgress (line 1998) | ProcessorOperationInProgress = "Executing %s operation...\n"
  constant ProcessorOperationCompleted (line 1999) | ProcessorOperationCompleted  = "%s operation completed successfully\n"
  constant ProcessorOperationFailed (line 2000) | ProcessorOperationFailed     = "Failed to execute %s operation"
  constant ProcessorOperationConfirmation (line 2003) | ProcessorOperationConfirmation = "Are you sure you want to %s?"
  constant ProcessorOperationPressEnter (line 2004) | ProcessorOperationPressEnter   = "Press Enter to %s"
  constant ProcessorOperationPressYN (line 2005) | ProcessorOperationPressYN      = "Press Y to confirm, N to cancel"
  constant ProcessorOperationRequiresConfirmationShort (line 2007) | ProcessorOperationRequiresConfirmationShort = "This operation requires c...
  constant ProcessorOperationCancelled (line 2009) | ProcessorOperationCancelled = "Operation cancelled"
  constant ProcessorOperationUnknown (line 2010) | ProcessorOperationUnknown   = "Unknown operation: %s"
  constant ProcessorOperationStarting (line 2013) | ProcessorOperationStarting    = "Starting services..."
  constant ProcessorOperationStopping (line 2014) | ProcessorOperationStopping    = "Stopping services..."
  constant ProcessorOperationRestarting (line 2015) | ProcessorOperationRestarting  = "Restarting services..."
  constant ProcessorOperationDownloading (line 2016) | ProcessorOperationDownloading = "Downloading images..."
  constant ProcessorOperationUpdating (line 2017) | ProcessorOperationUpdating    = "Updating components..."
  constant ProcessorOperationResetting (line 2018) | ProcessorOperationResetting   = "Resetting to factory defaults..."
  constant ProcessorOperationRemoving (line 2019) | ProcessorOperationRemoving    = "Removing containers..."
  constant ProcessorOperationPurging (line 2020) | ProcessorOperationPurging     = "Purging all data..."
  constant ProcessorOperationInstalling (line 2021) | ProcessorOperationInstalling  = "Installing PentAGI services..."
  constant ProcessorOperationHelpTitle (line 2024) | ProcessorOperationHelpTitle           = "%s Operation"
  constant ProcessorOperationHelpContent (line 2025) | ProcessorOperationHelpContent         = "This operation will %s."
  constant ProcessorOperationHelpContentDownload (line 2026) | ProcessorOperationHelpContentDownload = "This operation will download %s...
  constant ProcessorOperationHelpContentUpdate (line 2027) | ProcessorOperationHelpContentUpdate   = "This operation will update %s c...
  constant OperationTitleInstallPentagi (line 2029) | OperationTitleInstallPentagi    = "Install PentAGI"
  constant OperationDescInstallPentagi (line 2030) | OperationDescInstallPentagi     = "Install and configure PentAGI services"
  constant OperationTitleDownload (line 2031) | OperationTitleDownload          = "Download %s"
  constant OperationDescDownloadComponents (line 2032) | OperationDescDownloadComponents = "Download %s components"
  constant OperationTitleUpdate (line 2033) | OperationTitleUpdate            = "Update %s"
  constant OperationDescUpdateToLatest (line 2034) | OperationDescUpdateToLatest     = "Update %s to latest version"
  constant OperationTitleExecute (line 2035) | OperationTitleExecute           = "Execute %s"
  constant OperationDescExecuteOn (line 2036) | OperationDescExecuteOn          = "Execute %s on %s"
  constant OperationProgressExecuting (line 2037) | OperationProgressExecuting      = "Executing %s..."
  constant ProcessorOperationTerminalNotInitialized (line 2040) | ProcessorOperationTerminalNotInitialized = "Terminal is not initialized"
  constant ProcessorHelpInstallPentagi (line 2045) | ProcessorHelpInstallPentagi = `This will:
  constant ProcessorHelpStartPentagi (line 2053) | ProcessorHelpStartPentagi = `This will:
  constant ProcessorHelpStopPentagi (line 2060) | ProcessorHelpStopPentagi = `This will:
  constant ProcessorHelpRestartPentagi (line 2067) | ProcessorHelpRestartPentagi = `This will:
  constant ProcessorHelpDownloadWorkerImage (line 2074) | ProcessorHelpDownloadWorkerImage = `This large image (6GB+) contains:
  constant ProcessorHelpUpdateWorkerImage (line 2081) | ProcessorHelpUpdateWorkerImage = `This will:
  constant ProcessorHelpUpdatePentagi (line 2088) | ProcessorHelpUpdatePentagi = `This will:
  constant ProcessorHelpUpdateInstaller (line 2095) | ProcessorHelpUpdateInstaller = `This will:
  constant ProcessorHelpFactoryReset (line 2102) | ProcessorHelpFactoryReset = `⚠️  WARNING: This operation will:
  constant ProcessorHelpRemovePentagi (line 2110) | ProcessorHelpRemovePentagi = `This will:
  constant ProcessorHelpPurgePentagi (line 2118) | ProcessorHelpPurgePentagi = `⚠️  WARNING: This will permanently delete:
  constant EnvDesc_OPEN_AI_KEY (line 2129) | EnvDesc_OPEN_AI_KEY                       = "OpenAI API Key"
  constant EnvDesc_OPEN_AI_SERVER_URL (line 2130) | EnvDesc_OPEN_AI_SERVER_URL                = "OpenAI Server URL"
  constant EnvDesc_ANTHROPIC_API_KEY (line 2131) | EnvDesc_ANTHROPIC_API_KEY                 = "Anthropic API Key"
  constant EnvDesc_ANTHROPIC_SERVER_URL (line 2132) | EnvDesc_ANTHROPIC_SERVER_URL              = "Anthropic Server URL"
  constant EnvDesc_GEMINI_API_KEY (line 2133) | EnvDesc_GEMINI_API_KEY                    = "Google Gemini API Key"
  constant EnvDesc_GEMINI_SERVER_URL (line 2134) | EnvDesc_GEMINI_SERVER_URL                 = "Gemini Server URL"
  constant EnvDesc_BEDROCK_DEFAULT_AUTH (line 2135) | EnvDesc_BEDROCK_DEFAULT_AUTH              = "AWS Bedrock Use Default Cre...
  constant EnvDesc_BEDROCK_BEARER_TOKEN (line 2136) | EnvDesc_BEDROCK_BEARER_TOKEN              = "AWS Bedrock Bearer Token"
  constant EnvDesc_BEDROCK_ACCESS_KEY_ID (line 2137) | EnvDesc_BEDROCK_ACCESS_KEY_ID             = "AWS Bedrock Access Key ID"
  constant EnvDesc_BEDROCK_SECRET_ACCESS_KEY (line 2138) | EnvDesc_BEDROCK_SECRET_ACCESS_KEY         = "AWS Bedrock Secret Access Key"
  constant EnvDesc_BEDROCK_SESSION_TOKEN (line 2139) | EnvDesc_BEDROCK_SESSION_TOKEN             = "AWS Bedrock Session Token"
  constant EnvDesc_BEDROCK_REGION (line 2140) | EnvDesc_BEDROCK_REGION                    = "AWS Bedrock Region"
  constant EnvDesc_BEDROCK_SERVER_URL (line 2141) | EnvDesc_BEDROCK_SERVER_URL                = "AWS Bedrock Custom Endpoint...
  constant EnvDesc_OLLAMA_SERVER_URL (line 2142) | EnvDesc_OLLAMA_SERVER_URL                 = "Ollama Server URL"
  constant EnvDesc_OLLAMA_SERVER_API_KEY (line 2143) | EnvDesc_OLLAMA_SERVER_API_KEY             = "Ollama Server API Key (Cloud)"
  constant EnvDesc_OLLAMA_SERVER_MODEL (line 2144) | EnvDesc_OLLAMA_SERVER_MODEL               = "Ollama Default Model"
  constant EnvDesc_OLLAMA_SERVER_CONFIG_PATH (line 2145) | EnvDesc_OLLAMA_SERVER_CONFIG_PATH         = "Ollama Container Config Path"
  constant EnvDesc_OLLAMA_SERVER_PULL_MODELS_TIMEOUT (line 2146) | EnvDesc_OLLAMA_SERVER_PULL_MODELS_TIMEOUT = "Ollama Model Pull Timeout"
  constant EnvDesc_OLLAMA_SERVER_PULL_MODELS_ENABLED (line 2147) | EnvDesc_OLLAMA_SERVER_PULL_MODELS_ENABLED = "Ollama Auto-pull Models"
  constant EnvDesc_OLLAMA_SERVER_LOAD_MODELS_ENABLED (line 2148) | EnvDesc_OLLAMA_SERVER_LOAD_MODELS_ENABLED = "Ollama Load Models List"
  constant EnvDesc_DEEPSEEK_API_KEY (line 2149) | EnvDesc_DEEPSEEK_API_KEY                  = "DeepSeek API Key"
  constant EnvDesc_DEEPSEEK_SERVER_URL (line 2150) | EnvDesc_DEEPSEEK_SERVER_URL               = "DeepSeek Server URL"
  constant EnvDesc_DEEPSEEK_PROVIDER (line 2151) | EnvDesc_DEEPSEEK_PROVIDER                 = "DeepSeek Provider Name Pref...
  constant EnvDesc_GLM_API_KEY (line 2152) | EnvDesc_GLM_API_KEY                       = "GLM API Key"
  constant EnvDesc_GLM_SERVER_URL (line 2153) | EnvDesc_GLM_SERVER_URL                    = "GLM Server URL"
  constant EnvDesc_GLM_PROVIDER (line 2154) | EnvDesc_GLM_PROVIDER                      = "GLM Provider Name Prefix (f...
  constant EnvDesc_KIMI_API_KEY (line 2155) | EnvDesc_KIMI_API_KEY                      = "Kimi API Key"
  constant EnvDesc_KIMI_SERVER_URL (line 2156) | EnvDesc_KIMI_SERVER_URL                   = "Kimi Server URL"
  constant EnvDesc_KIMI_PROVIDER (line 2157) | EnvDesc_KIMI_PROVIDER                     = "Kimi Provider Name Prefix (...
  constant EnvDesc_QWEN_API_KEY (line 2158) | EnvDesc_QWEN_API_KEY                      = "Qwen API Key"
  constant EnvDesc_QWEN_SERVER_URL (line 2159) | EnvDesc_QWEN_SERVER_URL                   = "Qwen Server URL"
  constant EnvDesc_QWEN_PROVIDER (line 2160) | EnvDesc_QWEN_PROVIDER                     = "Qwen Provider Name Prefix (...
  constant EnvDesc_LLM_SERVER_URL (line 2161) | EnvDesc_LLM_SERVER_URL                    = "Custom LLM Server URL"
  constant EnvDesc_LLM_SERVER_KEY (line 2162) | EnvDesc_LLM_SERVER_KEY                    = "Custom LLM API Key"
  constant EnvDesc_LLM_SERVER_MODEL (line 2163) | EnvDesc_LLM_SERVER_MODEL                  = "Custom LLM Model"
  constant EnvDesc_LLM_SERVER_CONFIG_PATH (line 2164) | EnvDesc_LLM_SERVER_CONFIG_PATH            = "Custom LLM Container Config...
  constant EnvDesc_LLM_SERVER_LEGACY_REASONING (line 2165) | EnvDesc_LLM_SERVER_LEGACY_REASONING       = "Custom LLM Legacy Reasoning"
  constant EnvDesc_LLM_SERVER_PRESERVE_REASONING (line 2166) | EnvDesc_LLM_SERVER_PRESERVE_REASONING     = "Custom LLM Preserve Reasoni...
  constant EnvDesc_LLM_SERVER_PROVIDER (line 2167) | EnvDesc_LLM_SERVER_PROVIDER               = "Custom LLM Provider Name"
  constant EnvDesc_LANGFUSE_LISTEN_IP (line 2169) | EnvDesc_LANGFUSE_LISTEN_IP   = "Langfuse Listen IP"
  constant EnvDesc_LANGFUSE_LISTEN_PORT (line 2170) | EnvDesc_LANGFUSE_LISTEN_PORT = "Langfuse Listen Port"
  constant EnvDesc_LANGFUSE_BASE_URL (line 2171) | EnvDesc_LANGFUSE_BASE_URL    = "Langfuse Base URL"
  constant EnvDesc_LANGFUSE_PROJECT_ID (line 2172) | EnvDesc_LANGFUSE_PROJECT_ID  = "Langfuse Project ID"
  constant EnvDesc_LANGFUSE_PUBLIC_KEY (line 2173) | EnvDesc_LANGFUSE_PUBLIC_KEY  = "Langfuse Public Key"
  constant EnvDesc_LANGFUSE_SECRET_KEY (line 2174) | EnvDesc_LANGFUSE_SECRET_KEY  = "Langfuse Secret Key"
  constant EnvDesc_LANGFUSE_INIT_PROJECT_ID (line 2177) | EnvDesc_LANGFUSE_INIT_PROJECT_ID         = "Langfuse Init Project ID"
  constant EnvDesc_LANGFUSE_INIT_PROJECT_PUBLIC_KEY (line 2178) | EnvDesc_LANGFUSE_INIT_PROJECT_PUBLIC_KEY = "Langfuse Init Project Public...
  constant EnvDesc_LANGFUSE_INIT_PROJECT_SECRET_KEY (line 2179) | EnvDesc_LANGFUSE_INIT_PROJECT_SECRET_KEY = "Langfuse Init Project Secret...
  constant EnvDesc_LANGFUSE_INIT_USER_EMAIL (line 2180) | EnvDesc_LANGFUSE_INIT_USER_EMAIL         = "Langfuse Init User Email"
  constant EnvDesc_LANGFUSE_INIT_USER_NAME (line 2181) | EnvDesc_LANGFUSE_INIT_USER_NAME          = "Langfuse Init User Name"
  constant EnvDesc_LANGFUSE_INIT_USER_PASSWORD (line 2182) | EnvDesc_LANGFUSE_INIT_USER_PASSWORD      = "Langfuse Init User Password"
  constant EnvDesc_LANGFUSE_OTEL_EXPORTER_OTLP_ENDPOINT (line 2184) | EnvDesc_LANGFUSE_OTEL_EXPORTER_OTLP_ENDPOINT = "Langfuse OTLP endpoint f...
  constant EnvDesc_GRAFANA_LISTEN_IP (line 2186) | EnvDesc_GRAFANA_LISTEN_IP     = "Grafana Listen IP"
  constant EnvDesc_GRAFANA_LISTEN_PORT (line 2187) | EnvDesc_GRAFANA_LISTEN_PORT   = "Grafana Listen Port"
  constant EnvDesc_OTEL_GRPC_LISTEN_IP (line 2188) | EnvDesc_OTEL_GRPC_LISTEN_IP   = "OTel gRPC Listen IP"
  constant EnvDesc_OTEL_GRPC_LISTEN_PORT (line 2189) | EnvDesc_OTEL_GRPC_LISTEN_PORT = "OTel gRPC Listen Port"
  constant EnvDesc_OTEL_HTTP_LISTEN_IP (line 2190) | EnvDesc_OTEL_HTTP_LISTEN_IP   = "OTel HTTP Listen IP"
  constant EnvDesc_OTEL_HTTP_LISTEN_PORT (line 2191) | EnvDesc_OTEL_HTTP_LISTEN_PORT = "OTel HTTP Listen Port"
  constant EnvDesc_OTEL_HOST (line 2192) | EnvDesc_OTEL_HOST             = "OpenTelemetry Host"
  constant EnvDesc_SUMMARIZER_PRESERVE_LAST (line 2194) | EnvDesc_SUMMARIZER_PRESERVE_LAST       = "Summarizer Preserve Last"
  constant EnvDesc_SUMMARIZER_USE_QA (line 2195) | EnvDesc_SUMMARIZER_USE_QA              = "Summarizer Use QA"
  constant EnvDesc_SUMMARIZER_SUM_MSG_HUMAN_IN_QA (line 2196) | EnvDesc_SUMMARIZER_SUM_MSG_HUMAN_IN_QA = "Summarizer Human in QA"
  constant EnvDesc_SUMMARIZER_LAST_SEC_BYTES (line 2197) | EnvDesc_SUMMARIZER_LAST_SEC_BYTES      = "Summarizer Last Section Bytes"
  constant EnvDesc_SUMMARIZER_MAX_BP_BYTES (line 2198) | EnvDesc_SUMMARIZER_MAX_BP_BYTES        = "Summarizer Max BP Bytes"
  constant EnvDesc_SUMMARIZER_MAX_QA_BYTES (line 2199) | EnvDesc_SUMMARIZER_MAX_QA_BYTES        = "Summarizer Max QA Bytes"
  constant EnvDesc_SUMMARIZER_MAX_QA_SECTIONS (line 2200) | EnvDesc_SUMMARIZER_MAX_QA_SECTIONS     = "Summarizer Max QA Sections"
  constant EnvDesc_SUMMARIZER_KEEP_QA_SECTIONS (line 2201) | EnvDesc_SUMMARIZER_KEEP_QA_SECTIONS    = "Summarizer Keep QA Sections"
  constant EnvDesc_ASSISTANT_SUMMARIZER_PRESERVE_LAST (line 2203) | EnvDesc_ASSISTANT_SUMMARIZER_PRESERVE_LAST    = "Assistant Summarizer Pr...
  constant EnvDesc_ASSISTANT_SUMMARIZER_LAST_SEC_BYTES (line 2204) | EnvDesc_ASSISTANT_SUMMARIZER_LAST_SEC_BYTES   = "Assistant Summarizer La...
  constant EnvDesc_ASSISTANT_SUMMARIZER_MAX_BP_BYTES (line 2205) | EnvDesc_ASSISTANT_SUMMARIZER_MAX_BP_BYTES     = "Assistant Summarizer Ma...
  constant EnvDesc_ASSISTANT_SUMMARIZER_MAX_QA_BYTES (line 2206) | EnvDesc_ASSISTANT_SUMMARIZER_MAX_QA_BYTES     = "Assistant Summarizer Ma...
  constant EnvDesc_ASSISTANT_SUMMARIZER_MAX_QA_SECTIONS (line 2207) | EnvDesc_ASSISTANT_SUMMARIZER_MAX_QA_SECTIONS  = "Assistant Summarizer Ma...
  constant EnvDesc_ASSISTANT_SUMMARIZER_KEEP_QA_SECTIONS (line 2208) | EnvDesc_ASSISTANT_SUMMARIZER_KEEP_QA_SECTIONS = "Assistant Summarizer Ke...
  constant EnvDesc_EMBEDDING_PROVIDER (line 2210) | EnvDesc_EMBEDDING_PROVIDER        = "Embedding Provider"
  constant EnvDesc_EMBEDDING_URL (line 2211) | EnvDesc_EMBEDDING_URL             = "Embedding URL"
  constant EnvDesc_EMBEDDING_KEY (line 2212) | EnvDesc_EMBEDDING_KEY             = "Embedding API Key"
  constant EnvDesc_EMBEDDING_MODEL (line 2213) | EnvDesc_EMBEDDING_MODEL           = "Embedding Model"
  constant EnvDesc_EMBEDDING_BATCH_SIZE (line 2214) | EnvDesc_EMBEDDING_BATCH_SIZE      = "Embedding Batch Size"
  constant EnvDesc_EMBEDDING_STRIP_NEW_LINES (line 2215) | EnvDesc_EMBEDDING_STRIP_NEW_LINES = "Embedding Strip New Lines"
  constant EnvDesc_ASK_USER (line 2217) | EnvDesc_ASK_USER = "Human-in-the-loop"
  constant EnvDesc_ASSISTANT_USE_AGENTS (line 2219) | EnvDesc_ASSISTANT_USE_AGENTS = "Enable multi-agent mode for assistant"
  constant EnvDesc_EXECUTION_MONITOR_ENABLED (line 2221) | EnvDesc_EXECUTION_MONITOR_ENABLED          = "Enable Execution Monitorin...
  constant EnvDesc_EXECUTION_MONITOR_SAME_TOOL_LIMIT 
Copy disabled (too large) Download .json
Condensed preview — 898 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (13,669K chars).
[
  {
    "path": ".dockerignore",
    "chars": 112,
    "preview": "frontend/coverage\nfrontend/dist\nfrontend/node_modules\nfrontend/ssl\n\n**/*.log\n**/*.env\n**/.DS_Store\n**/Thumbs.db\n"
  },
  {
    "path": ".env.example",
    "chars": 10212,
    "preview": "# PentAGI Environment Variables\n\n## For communication with PentAGI Cloud API\nINSTALLATION_ID=\nLICENSE_KEY=\n\n## Allow to "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1-bug-report.yml",
    "chars": 4598,
    "preview": "name: \"\\U0001F41B Bug report\"\ndescription: \"Report a bug in PentAGI\"\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nassignees:\n  - asd"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2-enhancement.yml",
    "chars": 4245,
    "preview": "name: \"\\U0001F680 Enhancement\"\ndescription: \"Suggest an enhancement for PentAGI\"\ntitle: \"[Enhancement]: \"\nlabels: [\"enha"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 3648,
    "preview": "<!--\nThank you for your contribution to PentAGI! Please fill out this template completely to help us review your changes"
  },
  {
    "path": ".github/SAVED_REPLIES.md",
    "chars": 6017,
    "preview": "# Saved Replies\n\nThese are standardized responses for the PentAGI Development Team to use when responding to Issues and "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 7419,
    "preview": "name: Docker build and push\n\non:\n  push:\n    branches:\n      - \"**\"\n    tags:\n      - \"v[0-9]+.[0-9]+.[0-9]+\"\n  workflow"
  },
  {
    "path": ".gitignore",
    "chars": 316,
    "preview": ".DS_Store\n.env\n.env.*\n.state\n!.env.example\n!backend/cmd/installer/files/links/.env\n\nbackend/tmp\nbackend/build\n\nfrontend/"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 8152,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"go\",\n            \"request\": \"launch\",\n "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 897,
    "preview": "{\n    \"go.lintFlags\": [\n        \"-checks=\\\"all,-ST1005\\\"\"\n    ],\n    \"go.testTimeout\": \"300s\",\n    \"go.testEnvVars\": {\n "
  },
  {
    "path": "CLAUDE.md",
    "chars": 7776,
    "preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
  },
  {
    "path": "Dockerfile",
    "chars": 4939,
    "preview": "# syntax=docker/dockerfile:1.4\n\n# STEP 1: Build the frontend\nFROM node:23-slim as fe-build\n\nENV NODE_ENV=production\nENV "
  },
  {
    "path": "EULA.md",
    "chars": 12042,
    "preview": "# PentAGI End User License Agreement\n\n## Introduction\n\nThis **End User License Agreement (EULA)** governs the terms and "
  },
  {
    "path": "LICENSE",
    "chars": 1080,
    "preview": "MIT License\n\nCopyright (c) 2025 PentAGI Development Team\n\nPermission is hereby granted, free of charge, to any person ob"
  },
  {
    "path": "NOTICE",
    "chars": 485,
    "preview": "PentAGI, Fully autonomous AI Agent capable of performing complex penetration testing tasks.\n\nCopyright 2025 PentAGI Deve"
  },
  {
    "path": "README.md",
    "chars": 161960,
    "preview": "# PentAGI\n\n<div align=\"center\" style=\"font-size: 1.5em; margin: 20px 0;\">\n    <strong>P</strong>enetration testing <stro"
  },
  {
    "path": "backend/cmd/ctester/main.go",
    "chars": 11531,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\t\"pentagi/pkg/config\"\n\t\"pentagi/pkg/pr"
  },
  {
    "path": "backend/cmd/ctester/models.go",
    "chars": 650,
    "preview": "package main\n\nimport \"time\"\n\n// TestResult represents the result of a single test for CLI compatibility\ntype TestResult "
  },
  {
    "path": "backend/cmd/ctester/report.go",
    "chars": 6780,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"text/tabwriter\"\n\t\"time\"\n)\n\n// PrintAgentResults prints the test results for a sing"
  },
  {
    "path": "backend/cmd/ctester/utils.go",
    "chars": 962,
    "preview": "package main\n\nimport (\n\t\"strings\"\n)\n\n// Helper functions\n\n// TruncateString truncates a string to a specified maximum le"
  },
  {
    "path": "backend/cmd/etester/flush.go",
    "chars": 1048,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"pentagi/pkg/terminal\"\n)\n\n// flush deletes all documents from the embedding store\n"
  },
  {
    "path": "backend/cmd/etester/info.go",
    "chars": 5861,
    "preview": "package main\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/pkg/terminal\"\n)\n\n// info displays statistics about t"
  },
  {
    "path": "backend/cmd/etester/main.go",
    "chars": 3795,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"pentagi/pkg/config\"\n\t\"pentagi/"
  },
  {
    "path": "backend/cmd/etester/reindex.go",
    "chars": 3519,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"pentagi/pkg/terminal\"\n\n\t\"github.com/jackc/pgx/v5\"\n\t\"github.com/pgvector/pgvector-"
  },
  {
    "path": "backend/cmd/etester/search.go",
    "chars": 7690,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/pkg/terminal\"\n\n\t\"github.com/vxcontrol/langchaingo"
  },
  {
    "path": "backend/cmd/etester/test.go",
    "chars": 3257,
    "preview": "package main\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/pkg/terminal\"\n)\n\nconst (\n\ttestText  = \"This is a tes"
  },
  {
    "path": "backend/cmd/etester/tester.go",
    "chars": 1801,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"pentagi/pkg/config\"\n\t\"pentagi/pkg/providers/embeddings\"\n\n\t\"github.com/jackc/"
  },
  {
    "path": "backend/cmd/ftester/main.go",
    "chars": 4183,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\t\"time\"\n"
  },
  {
    "path": "backend/cmd/ftester/mocks/logs.go",
    "chars": 7076,
    "preview": "package mocks\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"pentagi/pkg/database\"\n\t\"pentagi/pkg/terminal\"\n\t\"pentagi/pkg/tools"
  },
  {
    "path": "backend/cmd/ftester/mocks/tools.go",
    "chars": 38221,
    "preview": "package mocks\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/pkg/terminal\"\n\t\"pentagi/pkg/tools\"\n)\n\n// MockRespo"
  },
  {
    "path": "backend/cmd/ftester/worker/args.go",
    "chars": 9940,
    "preview": "package worker\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"pentagi/pkg/tools\"\n)\n\n// FunctionInf"
  },
  {
    "path": "backend/cmd/ftester/worker/executor.go",
    "chars": 12087,
    "preview": "package worker\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"pentagi/cmd/ftester/mocks\"\n\t\"pentagi/pkg/config\"\n\t\"pentag"
  },
  {
    "path": "backend/cmd/ftester/worker/interactive.go",
    "chars": 4708,
    "preview": "package worker\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/pkg/terminal\"\n)\n\n// Interac"
  },
  {
    "path": "backend/cmd/ftester/worker/tester.go",
    "chars": 21556,
    "preview": "package worker\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"pentagi/cmd/ftester/mocks\"\n\t\"pentagi/pkg/config\"\n\t\"pentag"
  },
  {
    "path": "backend/cmd/installer/checker/checker.go",
    "chars": 26148,
    "preview": "package checker\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n\n\t\"pentagi/cmd/installer/state"
  },
  {
    "path": "backend/cmd/installer/checker/helpers.go",
    "chars": 28541,
    "preview": "package checker\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\""
  },
  {
    "path": "backend/cmd/installer/checker/helpers_test.go",
    "chars": 22854,
    "preview": "package checker\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing"
  },
  {
    "path": "backend/cmd/installer/files/.gitignore",
    "chars": 21,
    "preview": "fs.go\nfs_test.go\nfs/\n"
  },
  {
    "path": "backend/cmd/installer/files/files.go",
    "chars": 10875,
    "preview": "//go:generate go run generate.go\n\npackage files\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"stri"
  },
  {
    "path": "backend/cmd/installer/files/files_test.go",
    "chars": 15870,
    "preview": "package files\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n)\n\n// newTestFiles creates a Files insta"
  },
  {
    "path": "backend/cmd/installer/files/generate.go",
    "chars": 21858,
    "preview": "//go:build ignore\n// +build ignore\n\npackage main\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t"
  },
  {
    "path": "backend/cmd/installer/hardening/hardening.go",
    "chars": 12322,
    "preview": "package hardening\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi"
  },
  {
    "path": "backend/cmd/installer/hardening/hardening_test.go",
    "chars": 48684,
    "preview": "package hardening\n\nimport (\n\t\"fmt\"\n\t\"maps\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"pentagi/cmd/instal"
  },
  {
    "path": "backend/cmd/installer/hardening/migrations.go",
    "chars": 2784,
    "preview": "package hardening\n\nimport (\n\t\"os\"\n\t\"slices\"\n\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cmd/installer/state\"\n\t\"pentagi/cmd"
  },
  {
    "path": "backend/cmd/installer/hardening/migrations_test.go",
    "chars": 27928,
    "preview": "package hardening\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/"
  },
  {
    "path": "backend/cmd/installer/hardening/network.go",
    "chars": 1947,
    "preview": "package hardening\n\nimport (\n\t\"os\"\n\n\t\"pentagi/cmd/installer/state\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n)\n\nfunc DoS"
  },
  {
    "path": "backend/cmd/installer/hardening/network_test.go",
    "chars": 31164,
    "preview": "package hardening\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"testing\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/c"
  },
  {
    "path": "backend/cmd/installer/loader/example_test.go",
    "chars": 1893,
    "preview": "package loader\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// Example demonstrates the full workflow of loading, modifyin"
  },
  {
    "path": "backend/cmd/installer/loader/file.go",
    "chars": 5191,
    "preview": "package loader\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n)\n\ntype EnvVar struct {\n\tName      str"
  },
  {
    "path": "backend/cmd/installer/loader/loader.go",
    "chars": 2625,
    "preview": "package loader\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"pentagi/pkg/config\"\n\n\t\"gith"
  },
  {
    "path": "backend/cmd/installer/loader/loader_test.go",
    "chars": 17358,
    "preview": "package loader\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n)\n\nfunc containsLine(content, line string)"
  },
  {
    "path": "backend/cmd/installer/main.go",
    "chars": 5529,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"syscall\"\n\n\t\"pentagi/cmd/in"
  },
  {
    "path": "backend/cmd/installer/main_test.go",
    "chars": 4303,
    "preview": "package main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"pentagi/pkg/version\"\n)\n\nfunc TestParseFlags(t *testing.T) {\n"
  },
  {
    "path": "backend/cmd/installer/navigator/navigator.go",
    "chars": 2172,
    "preview": "package navigator\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/state\"\n\t\"pentagi/cmd/in"
  },
  {
    "path": "backend/cmd/installer/navigator/navigator_test.go",
    "chars": 8708,
    "preview": "package navigator\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/loade"
  },
  {
    "path": "backend/cmd/installer/processor/compose.go",
    "chars": 7191,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"time\"\n)\n\nconst (\n\tcomposeFilePentagi  "
  },
  {
    "path": "backend/cmd/installer/processor/docker.go",
    "chars": 14753,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tcerrdefs \"github.com/contai"
  },
  {
    "path": "backend/cmd/installer/processor/fs.go",
    "chars": 14771,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"maps\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"pentagi/cmd/installer/files\"\n\n"
  },
  {
    "path": "backend/cmd/installer/processor/fs_test.go",
    "chars": 22778,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"pentagi/cmd/installer/files\"\n)\n\n// t"
  },
  {
    "path": "backend/cmd/installer/processor/locale.go",
    "chars": 5779,
    "preview": "package processor\n\n// Docker operations messages\nconst (\n\tMsgPullingImage                = \"Pulling image: %s\"\n\tMsgImage"
  },
  {
    "path": "backend/cmd/installer/processor/logic.go",
    "chars": 28447,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"maps\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n\n\t\"pentagi/cm"
  },
  {
    "path": "backend/cmd/installer/processor/logic_test.go",
    "chars": 41369,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cm"
  },
  {
    "path": "backend/cmd/installer/processor/mock_test.go",
    "chars": 61163,
    "preview": "package processor\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"t"
  },
  {
    "path": "backend/cmd/installer/processor/model.go",
    "chars": 7888,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cmd/ins"
  },
  {
    "path": "backend/cmd/installer/processor/pg.go",
    "chars": 2793,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"fmt\"\n\n\t_ \"github.com/lib/pq\"\n\t\"golang.org/x/crypto/bcrypt\"\n)\n\nc"
  },
  {
    "path": "backend/cmd/installer/processor/processor.go",
    "chars": 9689,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"sync\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/files\"\n\t\"pentag"
  },
  {
    "path": "backend/cmd/installer/processor/state.go",
    "chars": 4464,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"pentagi/cmd/installer/wizard/terminal\"\n\n\ttea \"github.com/ch"
  },
  {
    "path": "backend/cmd/installer/processor/update.go",
    "chars": 7610,
    "preview": "package processor\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"runtime\"\n\t\"time\"\n\n\t\""
  },
  {
    "path": "backend/cmd/installer/state/example_test.go",
    "chars": 6722,
    "preview": "package state\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// Example demonstrates the complete workflow of state manageme"
  },
  {
    "path": "backend/cmd/installer/state/state.go",
    "chars": 6083,
    "preview": "package state\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"time\"\n\n\t\"pentagi/cmd/installer/loader\"\n"
  },
  {
    "path": "backend/cmd/installer/state/state_test.go",
    "chars": 18252,
    "preview": "package state\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestNewState(t *testing.T) {\n\tt.Run(\"create"
  },
  {
    "path": "backend/cmd/installer/wizard/app.go",
    "chars": 7140,
    "preview": "package wizard\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cm"
  },
  {
    "path": "backend/cmd/installer/wizard/controller/controller.go",
    "chars": 94987,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/"
  },
  {
    "path": "backend/cmd/installer/wizard/locale/locale.go",
    "chars": 116969,
    "preview": "package locale\n\n// Common status and UI strings\nconst (\n\t// Common status and UI strings\n\tUIStatistics       = \"Statisti"
  },
  {
    "path": "backend/cmd/installer/wizard/logger/logger.go",
    "chars": 2028,
    "preview": "package logger\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/sirupsen/logrus\"\n)\n\nvar log *logrus.Logger\n\nfunc init() {\n\tlo"
  },
  {
    "path": "backend/cmd/installer/wizard/models/ai_agents_settings_form.go",
    "chars": 13470,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/co"
  },
  {
    "path": "backend/cmd/installer/wizard/models/apply_changes.go",
    "chars": 14295,
    "preview": "package models\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cmd/installer/pr"
  },
  {
    "path": "backend/cmd/installer/wizard/models/base_controls.go",
    "chars": 990,
    "preview": "package models\n\nimport (\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/styles\"\n\t\"pentagi/cmd/installer/"
  },
  {
    "path": "backend/cmd/installer/wizard/models/base_screen.go",
    "chars": 26500,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/ins"
  },
  {
    "path": "backend/cmd/installer/wizard/models/docker_form.go",
    "chars": 13914,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/control"
  },
  {
    "path": "backend/cmd/installer/wizard/models/embedder_form.go",
    "chars": 19734,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installe"
  },
  {
    "path": "backend/cmd/installer/wizard/models/eula.go",
    "chars": 6686,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd"
  },
  {
    "path": "backend/cmd/installer/wizard/models/graphiti_form.go",
    "chars": 13250,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/helpers/calc_context.go",
    "chars": 11830,
    "preview": "package helpers\n\nimport (\n\t\"pentagi/pkg/csum\"\n)\n\n// ContextEstimate represents the estimated context size range\ntype Con"
  },
  {
    "path": "backend/cmd/installer/wizard/models/helpers/calc_context_test.go",
    "chars": 17830,
    "preview": "package helpers\n\nimport (\n\t\"testing\"\n\n\t\"pentagi/pkg/csum\"\n)\n\n// TestConfigBoundaries verifies that boundaries are calcul"
  },
  {
    "path": "backend/cmd/installer/wizard/models/langfuse_form.go",
    "chars": 15711,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/list_screen.go",
    "chars": 10080,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/lo"
  },
  {
    "path": "backend/cmd/installer/wizard/models/llm_provider_form.go",
    "chars": 27106,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/ins"
  },
  {
    "path": "backend/cmd/installer/wizard/models/llm_providers.go",
    "chars": 2752,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/main_menu.go",
    "chars": 4271,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/maintenance.go",
    "chars": 4711,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/mock_form.go",
    "chars": 4023,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/styles\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/monitoring.go",
    "chars": 2451,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/observability_form.go",
    "chars": 13979,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/processor_operation_form.go",
    "chars": 23332,
    "preview": "package models\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/processor\"\n\t\"pentagi/cmd/installer/wizard"
  },
  {
    "path": "backend/cmd/installer/wizard/models/reset_password.go",
    "chars": 9011,
    "preview": "package models\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/processor"
  },
  {
    "path": "backend/cmd/installer/wizard/models/scraper_form.go",
    "chars": 15648,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installe"
  },
  {
    "path": "backend/cmd/installer/wizard/models/search_engines_form.go",
    "chars": 15852,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/server_settings_form.go",
    "chars": 17044,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/co"
  },
  {
    "path": "backend/cmd/installer/wizard/models/summarizer.go",
    "chars": 2432,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/summarizer_form.go",
    "chars": 17030,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/loader\"\n\t\"pentagi/cmd/installer/wizard/co"
  },
  {
    "path": "backend/cmd/installer/wizard/models/tools.go",
    "chars": 2332,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/controller\"\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t"
  },
  {
    "path": "backend/cmd/installer/wizard/models/types.go",
    "chars": 6116,
    "preview": "package models\n\nimport (\n\t\"strings\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n)\n\nconst (\n\tMinMenuWidth  = 38 // Minimum"
  },
  {
    "path": "backend/cmd/installer/wizard/models/welcome.go",
    "chars": 15761,
    "preview": "package models\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/checker\"\n\t\"pentagi/cmd/installer/wizard/controller\"\n"
  },
  {
    "path": "backend/cmd/installer/wizard/registry/registry.go",
    "chars": 6666,
    "preview": "package registry\n\nimport (\n\t\"pentagi/cmd/installer/files\"\n\t\"pentagi/cmd/installer/processor\"\n\t\"pentagi/cmd/installer/wiz"
  },
  {
    "path": "backend/cmd/installer/wizard/styles/styles.go",
    "chars": 7846,
    "preview": "package styles\n\nimport (\n\t\"slices\"\n\t\"strings\"\n\n\t\"pentagi/cmd/installer/wizard/locale\"\n\t\"pentagi/cmd/installer/wizard/log"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/key2uv.go",
    "chars": 7407,
    "preview": "package terminal\n\nimport (\n\t\"pentagi/cmd/installer/wizard/terminal/vt\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\tuv \"g"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/pty_unix.go",
    "chars": 3255,
    "preview": "//go:build !windows\n\npackage terminal\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\t\"syscall\"\n\n\t\"pentagi/cmd/ins"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/pty_windows.go",
    "chars": 318,
    "preview": "//go:build windows\n\npackage terminal\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n)\n\n// startPty is not supported on Windows\nfunc (t *ter"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/teacmd.go",
    "chars": 1543,
    "preview": "package terminal\n\nimport (\n\t\"sync\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n)\n\n// updateNotifier coordinates a single "
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/teacmd_test.go",
    "chars": 7756,
    "preview": "package terminal\n\nimport (\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n)\n\n// Tests for update notifier functionality\n\nfunc TestUpdateNoti"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/terminal.go",
    "chars": 12370,
    "preview": "package terminal\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"pentagi/cmd/installer"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/terminal_test.go",
    "chars": 24392,
    "preview": "package terminal\n\nimport (\n\t\"context\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"pentagi/cmd/install"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/callbacks.go",
    "chars": 2082,
    "preview": "package vt\n\nimport (\n\t\"image/color\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n//"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/cc.go",
    "chars": 1688,
    "preview": "package vt\n\nimport (\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// handleControl h"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/charset.go",
    "chars": 942,
    "preview": "package vt\n\n// CharSet represents a character set designator.\n// This can be used to select a character set for G0 or G1"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/csi.go",
    "chars": 1140,
    "preview": "package vt\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\nfunc (t *Terminal) handleCsi(cmd ans"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/csi_cursor.go",
    "chars": 3059,
    "preview": "package vt\n\nimport (\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// nextTab moves t"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/csi_mode.go",
    "chars": 2357,
    "preview": "package vt\n\nimport (\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\nfunc (t *Terminal) handleMode(params ansi.Params, set, isAnsi"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/csi_screen.go",
    "chars": 432,
    "preview": "package vt\n\nimport (\n\tuv \"github.com/charmbracelet/ultraviolet\"\n)\n\n// eraseCharacter erases n characters starting from t"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/csi_sgr.go",
    "chars": 306,
    "preview": "package vt\n\nimport (\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// handleSgr handl"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/cursor.go",
    "chars": 389,
    "preview": "package vt\n\nimport uv \"github.com/charmbracelet/ultraviolet\"\n\n// CursorStyle represents a cursor style.\ntype CursorStyle"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/dcs.go",
    "chars": 1138,
    "preview": "package vt\n\nimport \"github.com/charmbracelet/x/ansi\"\n\n// handleDcs handles a DCS escape sequence.\nfunc (t *Terminal) han"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/esc.go",
    "chars": 732,
    "preview": "package vt\n\nimport (\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// handleEsc handles an escape sequence.\nfunc (t *Terminal) h"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/focus.go",
    "chars": 603,
    "preview": "package vt\n\nimport (\n\t\"io\"\n\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// Focus sends the terminal a focus event if focus eve"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/handlers.go",
    "chars": 23738,
    "preview": "package vt\n\nimport (\n\t\"io\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// DcsHandl"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/key.go",
    "chars": 12039,
    "preview": "package vt\n\nimport (\n\t\"io\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// KeyMod r"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/mode.go",
    "chars": 1317,
    "preview": "package vt\n\nimport \"github.com/charmbracelet/x/ansi\"\n\n// resetModes resets all modes to their default values.\nfunc (t *T"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/mouse.go",
    "chars": 3066,
    "preview": "package vt\n\nimport (\n\t\"io\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n)\n\n// MouseBut"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/osc.go",
    "chars": 3086,
    "preview": "// Package vt provides a virtual terminal implementation.\n// SKIP: Fix typecheck errors - function signature mismatches "
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/screen.go",
    "chars": 21375,
    "preview": "package vt\n\nimport (\n\t\"strings\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n)\n\n// lineCache stores cached line content\nt"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/terminal.go",
    "chars": 9395,
    "preview": "package vt\n\nimport (\n\t\"image/color\"\n\t\"io\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/ultravi"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/terminal_test.go",
    "chars": 33981,
    "preview": "package vt\n\nimport (\n\t\"testing\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n)\n\n// testLogger wraps a testing.TB to imple"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/utf8.go",
    "chars": 2760,
    "preview": "package vt\n\nimport (\n\t\"unicode/utf8\"\n\n\tuv \"github.com/charmbracelet/ultraviolet\"\n\t\"github.com/charmbracelet/x/ansi\"\n\t\"gi"
  },
  {
    "path": "backend/cmd/installer/wizard/terminal/vt/utils.go",
    "chars": 124,
    "preview": "package vt\n\nfunc clamp(v, low, high int) int {\n\tif high < low {\n\t\tlow, high = high, low\n\t}\n\treturn min(high, max(low, v)"
  },
  {
    "path": "backend/cmd/installer/wizard/window/window.go",
    "chars": 2409,
    "preview": "package window\n\nconst MinContentHeight = 2\n\ntype Window interface {\n\tSetWindowSize(width, height int)\n\tSetHeaderHeight(h"
  },
  {
    "path": "backend/cmd/installer/wizard/window/window_test.go",
    "chars": 8939,
    "preview": "package window\n\nimport (\n\t\"testing\"\n)\n\nfunc TestNew(t *testing.T) {\n\tw := New()\n\n\twidth, height := w.GetWindowSize()\n\tif"
  },
  {
    "path": "backend/cmd/pentagi/main.go",
    "chars": 3467,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\t\"errors\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\t\"os/signal\"\n\t\"strconv\"\n\t\"syscall\"\n\t\"tim"
  },
  {
    "path": "backend/cmd/pentagi/tools.go",
    "chars": 93,
    "preview": "//go:build tools\n// +build tools\n\npackage tools\n\nimport (\n\t_ \"github.com/99designs/gqlgen\"\n)\n"
  },
  {
    "path": "backend/docs/analytics_api.md",
    "chars": 31600,
    "preview": "# Analytics API\n\nGraphQL API for system analytics and statistics monitoring. This document covers three main use cases f"
  },
  {
    "path": "backend/docs/chain_ast.md",
    "chars": 24506,
    "preview": "# ChainAST Documentation\n\n## Table of Contents\n\n- [ChainAST Documentation](#chainast-documentation)\n  - [Table of Conten"
  },
  {
    "path": "backend/docs/chain_summary.md",
    "chars": 52727,
    "preview": "# Enhanced Chain Summarization Algorithm\n\n## Table of Contents\n\n- [Enhanced Chain Summarization Algorithm](#enhanced-cha"
  },
  {
    "path": "backend/docs/charm.md",
    "chars": 49475,
    "preview": "# Charm.sh Ecosystem - Personal Cheat Sheet\n\n> Personal reference for building TUI applications with the Charm stack.\n\n#"
  },
  {
    "path": "backend/docs/config.md",
    "chars": 89137,
    "preview": "# PentAGI Configuration Guide\n\nThis document serves as a comprehensive guide to the configuration system in PentAGI, pri"
  },
  {
    "path": "backend/docs/controller.md",
    "chars": 40515,
    "preview": "# Controller Package Documentation\n\n## Table of Contents\n\n- [Controller Package Documentation](#controller-package-docum"
  },
  {
    "path": "backend/docs/database.md",
    "chars": 45409,
    "preview": "# Database Package Documentation\n\n## Overview\n\nThe `database` package is a core component of PentAGI that provides a rob"
  },
  {
    "path": "backend/docs/docker.md",
    "chars": 22458,
    "preview": "# Docker Client Package Documentation\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Architecture](#architecture)\n- ["
  },
  {
    "path": "backend/docs/flow_execution.md",
    "chars": 53123,
    "preview": "# Flow Execution in PentAGI\n\nThis document describes the internal architecture and execution workflow of Flow in PentAGI"
  },
  {
    "path": "backend/docs/gemini.md",
    "chars": 7141,
    "preview": "# Google AI (Gemini) Provider\n\nThe Google AI provider enables PentAGI to use Google's Gemini language models through the"
  },
  {
    "path": "backend/docs/installer/charm-architecture-patterns.md",
    "chars": 16806,
    "preview": "# Charm.sh Production Architecture Patterns\n\n> Essential patterns for building robust, scalable TUI applications with th"
  },
  {
    "path": "backend/docs/installer/charm-best-practices.md",
    "chars": 16469,
    "preview": "# Charm.sh Best Practices & Performance Guide\n\n> Proven patterns and anti-patterns for building high-performance TUI app"
  },
  {
    "path": "backend/docs/installer/charm-core-libraries.md",
    "chars": 10727,
    "preview": "# Charm.sh Core Libraries Reference\n\n> Comprehensive guide to the core libraries in the Charm ecosystem for building TUI"
  },
  {
    "path": "backend/docs/installer/charm-debugging-guide.md",
    "chars": 17646,
    "preview": "# Charm.sh Debugging & Troubleshooting Guide\n\n> Comprehensive guide to debugging TUI applications and avoiding common pi"
  },
  {
    "path": "backend/docs/installer/charm-form-patterns.md",
    "chars": 17436,
    "preview": "# Charm.sh Advanced Form Patterns\n\n> Comprehensive guide to building sophisticated forms using Charm ecosystem libraries"
  },
  {
    "path": "backend/docs/installer/charm-navigation-patterns.md",
    "chars": 14444,
    "preview": "# Charm.sh Navigation Patterns\n\n> Comprehensive guide to implementing robust navigation systems in TUI applications.\n\n##"
  },
  {
    "path": "backend/docs/installer/checker-test-scenarios.md",
    "chars": 4729,
    "preview": "# Checker Test Scenarios\n\nThis document outlines test scenarios for the installer's system checking functionality, focus"
  },
  {
    "path": "backend/docs/installer/checker.md",
    "chars": 7454,
    "preview": "# Checker Package Documentation\n\n## Overview\n\nThe `checker` package is responsible for gathering system facts and verify"
  },
  {
    "path": "backend/docs/installer/installer-architecture-design.md",
    "chars": 18094,
    "preview": "# PentAGI Installer Architecture & Design Patterns\n\n> Architecture patterns, design decisions, and implementation strate"
  },
  {
    "path": "backend/docs/installer/installer-base-screen.md",
    "chars": 11662,
    "preview": "# BaseScreen Architecture Guide\n\n> Practical guide for implementing new installer screens and migrating existing ones us"
  },
  {
    "path": "backend/docs/installer/installer-overview.md",
    "chars": 10549,
    "preview": "# PentAGI Installer Overview\n\n> Comprehensive guide to the PentAGI installer - a robust Terminal User Interface (TUI) fo"
  },
  {
    "path": "backend/docs/installer/installer-troubleshooting.md",
    "chars": 18074,
    "preview": "# PentAGI Installer Troubleshooting Guide\n\n> Comprehensive troubleshooting guide including recent fixes, performance opt"
  },
  {
    "path": "backend/docs/installer/processor-implementation.md",
    "chars": 7731,
    "preview": "# Processor Implementation Summary\n\n## Overview\nProcessor package implements the operational engine for PentAGI installe"
  },
  {
    "path": "backend/docs/installer/processor-logic-implementation.md",
    "chars": 10039,
    "preview": "# Processor Business Logic Implementation\n\n## Core Concepts\n\nThe processor package manages PentAGI stack lifecycle throu"
  },
  {
    "path": "backend/docs/installer/processor-wizard-integration.md",
    "chars": 12490,
    "preview": "# Processor-Wizard Integration Guide\n\n> Technical documentation for embedded terminal integration in PentAGI installer w"
  },
  {
    "path": "backend/docs/installer/processor.md",
    "chars": 19418,
    "preview": "# Processor Package Architecture\n\n## Overview\n\nThe `processor` package serves as the core orchestrator for PentAGI insta"
  },
  {
    "path": "backend/docs/installer/reference-config-pattern.md",
    "chars": 14448,
    "preview": "# Reference Configuration Pattern\n\n> Reference implementation of configuration using ScraperConfig as an example for all"
  },
  {
    "path": "backend/docs/installer/terminal-wizard-integration.md",
    "chars": 19191,
    "preview": "# Terminal Integration Guide for Wizard Screens\n\nThis guide covers integration of the `terminal` package into wizard con"
  },
  {
    "path": "backend/docs/installer.md",
    "chars": 45998,
    "preview": "# PentAGI Installer Documentation\n\n## Overview\n\nThe PentAGI installer provides a robust Terminal User Interface (TUI) fo"
  },
  {
    "path": "backend/docs/langfuse.md",
    "chars": 28838,
    "preview": "# Langfuse Integration for PentAGI\n\nThis document provides a comprehensive guide to the Langfuse integration in PentAGI,"
  },
  {
    "path": "backend/docs/llms_how_to.md",
    "chars": 56706,
    "preview": "# LLM Provider Integration Guide\n\nThis document describes critical requirements for client code when working with LLM pr"
  },
  {
    "path": "backend/docs/observability.md",
    "chars": 31269,
    "preview": "# PentAGI Observability Stack\n\n## Table of Contents\n- [PentAGI Observability Stack](#pentagi-observability-stack)\n  - [T"
  },
  {
    "path": "backend/docs/ollama.md",
    "chars": 5140,
    "preview": "# Ollama Provider\n\nThe Ollama provider enables PentAGI to use local language models through the [Ollama](https://ollama."
  },
  {
    "path": "backend/docs/prompt_engineering_openai.md",
    "chars": 9868,
    "preview": "# A Comprehensive Guide to Writing Effective Prompts for AI Agents\n\n## Introduction\n\nThis guide provides essential princ"
  },
  {
    "path": "backend/docs/prompt_engineering_pentagi.md",
    "chars": 33823,
    "preview": "# PentAGI Prompt Engineering Guide\n\nA comprehensive framework for designing high-performance prompts within the PentAGI "
  },
  {
    "path": "backend/fern/fern.config.json",
    "chars": 54,
    "preview": "{\n    \"organization\": \"PentAGI\",\n    \"version\": \"*\"\n}\n"
  },
  {
    "path": "backend/fern/generators.yml",
    "chars": 424,
    "preview": "default-group: local\ngroups:\n  local:\n    generators:\n      - name: fernapi/fern-go-sdk\n        version: 1.24.0\n        "
  },
  {
    "path": "backend/fern/langfuse/openapi.yml",
    "chars": 295908,
    "preview": "openapi: 3.0.1\ninfo:\n  title: langfuse\n  version: ''\n  description: >-\n    ## Authentication\n\n\n    Authenticate with the"
  },
  {
    "path": "backend/go.mod",
    "chars": 11826,
    "preview": "module pentagi\n\ngo 1.24.1\n\nrequire (\n\tgithub.com/99designs/gqlgen v0.17.57\n\tgithub.com/aws/aws-sdk-go-v2 v1.41.2\n\tgithub"
  },
  {
    "path": "backend/go.sum",
    "chars": 84958,
    "preview": "cloud.google.com/go v0.121.0 h1:pgfwva8nGw7vivjZiRfrmglGWiCJBP+0OmDpenG/Fwg=\ncloud.google.com/go v0.121.0/go.mod h1:rS7K"
  },
  {
    "path": "backend/gqlgen/gqlgen.yml",
    "chars": 3570,
    "preview": "# Where are all the schema files located? globs are supported eg  src/**/*.graphqls\nschema:\n  - pkg/graph/*.graphqls\n\n# "
  },
  {
    "path": "backend/migrations/migrations.go",
    "chars": 86,
    "preview": "package migrations\n\nimport \"embed\"\n\n//go:embed sql/*.sql\nvar EmbedMigrations embed.FS\n"
  },
  {
    "path": "backend/migrations/sql/20241026_115120_initial_state.sql",
    "chars": 13211,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nCREATE TABLE roles (\n  id     BIGINT    PRIMARY KEY GENERATED ALWAYS AS IDENTITY,\n"
  },
  {
    "path": "backend/migrations/sql/20241130_183411_new_type_logs.sql",
    "chars": 4339,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nINSERT INTO privileges (role_id, name) VALUES\n    (1, 'agentlogs.admin'),\n    (1, "
  },
  {
    "path": "backend/migrations/sql/20241215_132209_new_user_role.sql",
    "chars": 937,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nINSERT INTO privileges (role_id, name) VALUES\n    (2, 'roles.view'),\n    (2, 'prov"
  },
  {
    "path": "backend/migrations/sql/20241222_171335_msglog_result_format.sql",
    "chars": 543,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nCREATE TYPE MSGLOG_RESULT_FORMAT AS ENUM ('plain', 'markdown', 'terminal');\n\nALTER"
  },
  {
    "path": "backend/migrations/sql/20250102_152614_flow_trace_id.sql",
    "chars": 267,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE flows ADD COLUMN trace_id TEXT NULL;\n\nCREATE INDEX flows_trace_id_idx "
  },
  {
    "path": "backend/migrations/sql/20250103_1215631_new_msgchain_type_fixer.sql",
    "chars": 4632,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE msgchains ALTER COLUMN type DROP DEFAULT;\nALTER TABLE agentlogs ALTER "
  },
  {
    "path": "backend/migrations/sql/20250322_172248_new_searchengine_types.sql",
    "chars": 1163,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE searchlogs ALTER COLUMN engine DROP DEFAULT;\n\nCREATE TYPE SEARCHENGINE"
  },
  {
    "path": "backend/migrations/sql/20250331_200137_assistant_mode.sql",
    "chars": 9535,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nINSERT INTO privileges (role_id, name) VALUES\n  (1, 'assistants.admin'),\n  (1, 'as"
  },
  {
    "path": "backend/migrations/sql/20250412_181121_subtask_context copy.sql",
    "chars": 320,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE subtasks ADD COLUMN context TEXT NULL DEFAULT '';\n\nUPDATE subtasks SET"
  },
  {
    "path": "backend/migrations/sql/20250414_213004_thinking_msg_part.sql",
    "chars": 324,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE msglogs ADD COLUMN thinking TEXT NULL;\n\nALTER TABLE assistantlogs ADD "
  },
  {
    "path": "backend/migrations/sql/20250419_100249_new_logs_indices.sql",
    "chars": 1151,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\n\nDROP INDEX IF EXISTS assistantlogs_messag"
  },
  {
    "path": "backend/migrations/sql/20250420_120356_settings_permission.sql",
    "chars": 323,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nINSERT INTO privileges (role_id, name) VALUES\n  (1, 'settings.admin'),\n  (1, 'sett"
  },
  {
    "path": "backend/migrations/sql/20250701_094823_base_settings.sql",
    "chars": 7184,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nINSERT INTO privileges (role_id, name) VALUES\n  (1, 'settings.providers.admin'),\n "
  },
  {
    "path": "backend/migrations/sql/20250821_123456_add_searxng_search_type.sql",
    "chars": 1304,
    "preview": "-- +goose Up\n-- +goose StatementBegin\n-- Add searxng to the searchengine_type enum\nCREATE TYPE SEARCHENGINE_TYPE_NEW AS "
  },
  {
    "path": "backend/migrations/sql/20250901_165149_remove_input_idx.sql",
    "chars": 209,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nDROP INDEX IF EXISTS tasks_input_idx;\n-- +goose StatementEnd\n\n-- +goose Down\n-- +g"
  },
  {
    "path": "backend/migrations/sql/20251028_113516_remove_result_idx.sql",
    "chars": 308,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nDROP INDEX IF EXISTS tasks_result_idx;\nDROP INDEX IF EXISTS subtasks_result_idx;\n-"
  },
  {
    "path": "backend/migrations/sql/20251102_194813_remove_description_idx.sql",
    "chars": 236,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nDROP INDEX IF EXISTS subtasks_description_idx;\n-- +goose StatementEnd\n\n-- +goose D"
  },
  {
    "path": "backend/migrations/sql/20260128_153000_tool_call_id_template.sql",
    "chars": 3311,
    "preview": "-- +goose Up\n-- +goose StatementBegin\nALTER TABLE flows ADD COLUMN tool_call_id_template TEXT NULL;\nALTER TABLE assistan"
  },
  {
    "path": "backend/migrations/sql/20260129_120000_add_tracking_fields.sql",
    "chars": 11102,
    "preview": "-- +goose Up\n-- +goose StatementBegin\n-- Add usage tracking fields to msgchains\nALTER TABLE msgchains ADD COLUMN usage_c"
  }
]

// ... and 698 more files (download for full content)

About this extraction

This page contains the full source code of the vxcontrol/pentagi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 898 files (66.0 MB), approximately 3.2M tokens, and a symbol index with 15612 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!