gencode-ai 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +6 -1
- package/dist/base/config/index.d.ts.map +1 -0
- package/dist/base/config/index.js.map +1 -0
- package/dist/base/config/levels.d.ts +47 -0
- package/dist/base/config/levels.d.ts.map +1 -0
- package/dist/base/config/levels.js +175 -0
- package/dist/base/config/levels.js.map +1 -0
- package/dist/base/config/loader.d.ts.map +1 -0
- package/dist/base/config/loader.js.map +1 -0
- package/dist/base/config/manager.d.ts.map +1 -0
- package/dist/base/config/manager.js.map +1 -0
- package/dist/base/config/merger.d.ts.map +1 -0
- package/dist/base/config/merger.js.map +1 -0
- package/dist/base/config/providers-config.d.ts.map +1 -0
- package/dist/base/config/providers-config.js +76 -0
- package/dist/base/config/providers-config.js.map +1 -0
- package/dist/base/config/test-utils.d.ts.map +1 -0
- package/dist/base/config/test-utils.js.map +1 -0
- package/dist/base/config/types.d.ts +156 -0
- package/dist/base/config/types.d.ts.map +1 -0
- package/dist/base/config/types.js +34 -0
- package/dist/base/config/types.js.map +1 -0
- package/dist/base/discovery/base-loader.d.ts +63 -0
- package/dist/base/discovery/base-loader.d.ts.map +1 -0
- package/dist/base/discovery/base-loader.js +176 -0
- package/dist/base/discovery/base-loader.js.map +1 -0
- package/dist/base/discovery/file-scanner.d.ts +28 -0
- package/dist/base/discovery/file-scanner.d.ts.map +1 -0
- package/dist/base/discovery/file-scanner.js +175 -0
- package/dist/base/discovery/file-scanner.js.map +1 -0
- package/dist/base/discovery/index.d.ts +10 -0
- package/dist/base/discovery/index.d.ts.map +1 -0
- package/dist/base/discovery/index.js +12 -0
- package/dist/base/discovery/index.js.map +1 -0
- package/dist/base/discovery/path-resolver.d.ts +31 -0
- package/dist/base/discovery/path-resolver.d.ts.map +1 -0
- package/dist/base/discovery/path-resolver.js +92 -0
- package/dist/base/discovery/path-resolver.js.map +1 -0
- package/dist/base/discovery/types.d.ts +132 -0
- package/dist/base/discovery/types.d.ts.map +1 -0
- package/dist/base/discovery/types.js +14 -0
- package/dist/base/discovery/types.js.map +1 -0
- package/dist/base/utils/config-validator.d.ts +128 -0
- package/dist/base/utils/config-validator.d.ts.map +1 -0
- package/dist/base/utils/config-validator.js +143 -0
- package/dist/base/utils/config-validator.js.map +1 -0
- package/dist/base/utils/debug.d.ts +50 -0
- package/dist/base/utils/debug.d.ts.map +1 -0
- package/dist/base/utils/debug.js +80 -0
- package/dist/base/utils/debug.js.map +1 -0
- package/dist/base/utils/format-utils.d.ts +41 -0
- package/dist/base/utils/format-utils.d.ts.map +1 -0
- package/dist/base/utils/format-utils.js +57 -0
- package/dist/base/utils/format-utils.js.map +1 -0
- package/dist/base/utils/index.d.ts +12 -0
- package/dist/base/utils/index.d.ts.map +1 -0
- package/dist/base/utils/index.js +12 -0
- package/dist/base/utils/index.js.map +1 -0
- package/dist/base/utils/loading-reporter.d.ts +70 -0
- package/dist/base/utils/loading-reporter.d.ts.map +1 -0
- package/dist/base/utils/loading-reporter.js +164 -0
- package/dist/base/utils/loading-reporter.js.map +1 -0
- package/dist/base/utils/logger.d.ts +32 -0
- package/dist/base/utils/logger.d.ts.map +1 -0
- package/dist/base/utils/logger.js +77 -0
- package/dist/base/utils/logger.js.map +1 -0
- package/dist/base/utils/path-utils.d.ts +25 -0
- package/dist/base/utils/path-utils.d.ts.map +1 -0
- package/dist/base/utils/path-utils.js +71 -0
- package/dist/base/utils/path-utils.js.map +1 -0
- package/dist/base/utils/stream-utils.d.ts +28 -0
- package/dist/base/utils/stream-utils.d.ts.map +1 -0
- package/dist/base/utils/stream-utils.js +58 -0
- package/dist/base/utils/stream-utils.js.map +1 -0
- package/dist/base/utils/validation.d.ts +20 -0
- package/dist/base/utils/validation.d.ts.map +1 -0
- package/dist/base/utils/validation.js +22 -0
- package/dist/base/utils/validation.js.map +1 -0
- package/dist/cli/components/App.d.ts +16 -2
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +314 -15
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts +5 -3
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +74 -11
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/DiffPreview.d.ts +17 -0
- package/dist/cli/components/DiffPreview.d.ts.map +1 -0
- package/dist/cli/components/DiffPreview.js +72 -0
- package/dist/cli/components/DiffPreview.js.map +1 -0
- package/dist/cli/components/Input.d.ts +2 -1
- package/dist/cli/components/Input.d.ts.map +1 -1
- package/dist/cli/components/Input.js +2 -2
- package/dist/cli/components/Input.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +16 -2
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +65 -24
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/ModeIndicator.d.ts +1 -1
- package/dist/cli/components/ModeIndicator.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.d.ts +1 -1
- package/dist/cli/components/ModelSelector.d.ts.map +1 -1
- package/dist/cli/components/ModelSelector.js +2 -2
- package/dist/cli/components/ModelSelector.js.map +1 -1
- package/dist/cli/components/PermissionPrompt.d.ts +20 -12
- package/dist/cli/components/PermissionPrompt.d.ts.map +1 -1
- package/dist/cli/components/PermissionPrompt.js +51 -52
- package/dist/cli/components/PermissionPrompt.js.map +1 -1
- package/dist/cli/components/PlanApproval.d.ts +1 -1
- package/dist/cli/components/PlanApproval.d.ts.map +1 -1
- package/dist/cli/components/PlanApproval.js +18 -6
- package/dist/cli/components/PlanApproval.js.map +1 -1
- package/dist/cli/components/ProviderManager.d.ts +1 -1
- package/dist/cli/components/ProviderManager.d.ts.map +1 -1
- package/dist/cli/components/ProviderManager.js +4 -4
- package/dist/cli/components/ProviderManager.js.map +1 -1
- package/dist/cli/components/QuestionPrompt.d.ts +1 -1
- package/dist/cli/components/QuestionPrompt.d.ts.map +1 -1
- package/dist/cli/components/TodoList.d.ts +1 -1
- package/dist/cli/components/TodoList.d.ts.map +1 -1
- package/dist/cli/components/index.d.ts +2 -1
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +2 -1
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/components/markdown.d.ts.map +1 -1
- package/dist/cli/components/markdown.js +50 -6
- package/dist/cli/components/markdown.js.map +1 -1
- package/dist/cli/components/theme.d.ts +41 -0
- package/dist/cli/components/theme.d.ts.map +1 -1
- package/dist/cli/components/theme.js +52 -0
- package/dist/cli/components/theme.js.map +1 -1
- package/dist/cli/index.js +50 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/planning/index.d.ts.map +1 -0
- package/dist/cli/planning/index.js.map +1 -0
- package/dist/cli/planning/plan-file.d.ts.map +1 -0
- package/dist/cli/planning/plan-file.js.map +1 -0
- package/dist/cli/planning/state.d.ts.map +1 -0
- package/dist/cli/planning/state.js.map +1 -0
- package/dist/cli/planning/tools/enter-plan-mode.d.ts +25 -0
- package/dist/cli/planning/tools/enter-plan-mode.d.ts.map +1 -0
- package/dist/cli/planning/tools/enter-plan-mode.js.map +1 -0
- package/dist/cli/planning/tools/exit-plan-mode.d.ts +24 -0
- package/dist/cli/planning/tools/exit-plan-mode.d.ts.map +1 -0
- package/dist/cli/planning/tools/exit-plan-mode.js.map +1 -0
- package/dist/cli/planning/types.d.ts +102 -0
- package/dist/cli/planning/types.d.ts.map +1 -0
- package/dist/cli/planning/types.js +31 -0
- package/dist/cli/planning/types.js.map +1 -0
- package/dist/cli/prompts/index.d.ts +115 -0
- package/dist/cli/prompts/index.d.ts.map +1 -0
- package/dist/cli/prompts/index.js +315 -0
- package/dist/cli/prompts/index.js.map +1 -0
- package/dist/core/agent/agent.d.ts +215 -0
- package/dist/core/agent/agent.d.ts.map +1 -0
- package/dist/core/agent/agent.js +877 -0
- package/dist/core/agent/agent.js.map +1 -0
- package/dist/core/agent/index.d.ts.map +1 -0
- package/dist/core/agent/index.js.map +1 -0
- package/dist/core/agent/types.d.ts.map +1 -0
- package/dist/core/agent/types.js.map +1 -0
- package/dist/core/memory/import-resolver.d.ts.map +1 -0
- package/dist/core/memory/import-resolver.js.map +1 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/init-prompt.d.ts.map +1 -0
- package/dist/core/memory/init-prompt.js.map +1 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +716 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/rules-parser.d.ts.map +1 -0
- package/dist/core/memory/rules-parser.js.map +1 -0
- package/dist/core/memory/test-utils.d.ts.map +1 -0
- package/dist/core/memory/test-utils.js.map +1 -0
- package/dist/core/memory/types.d.ts.map +1 -0
- package/dist/core/memory/types.js.map +1 -0
- package/dist/core/permissions/audit.d.ts.map +1 -0
- package/dist/core/permissions/audit.js.map +1 -0
- package/dist/core/permissions/index.d.ts.map +1 -0
- package/dist/core/permissions/index.js.map +1 -0
- package/dist/core/permissions/manager.d.ts.map +1 -0
- package/dist/core/permissions/manager.js.map +1 -0
- package/dist/core/permissions/persistence.d.ts.map +1 -0
- package/dist/core/permissions/persistence.js.map +1 -0
- package/dist/core/permissions/prompt-matcher.d.ts.map +1 -0
- package/dist/core/permissions/prompt-matcher.js.map +1 -0
- package/dist/core/permissions/types.d.ts.map +1 -0
- package/dist/core/permissions/types.js.map +1 -0
- package/dist/core/pricing/calculator.d.ts.map +1 -0
- package/dist/core/pricing/calculator.js.map +1 -0
- package/dist/core/pricing/index.d.ts.map +1 -0
- package/dist/core/pricing/index.js.map +1 -0
- package/dist/core/pricing/models.d.ts.map +1 -0
- package/dist/core/pricing/models.js.map +1 -0
- package/dist/core/pricing/types.d.ts.map +1 -0
- package/dist/core/pricing/types.js.map +1 -0
- package/dist/core/providers/anthropic-vertex.d.ts +41 -0
- package/dist/core/providers/anthropic-vertex.d.ts.map +1 -0
- package/dist/core/providers/anthropic-vertex.js +462 -0
- package/dist/core/providers/anthropic-vertex.js.map +1 -0
- package/dist/core/providers/anthropic.d.ts.map +1 -0
- package/dist/core/providers/anthropic.js.map +1 -0
- package/dist/core/providers/google.d.ts.map +1 -0
- package/dist/core/providers/google.js +314 -0
- package/dist/core/providers/google.js.map +1 -0
- package/dist/core/providers/index.d.ts +46 -0
- package/dist/core/providers/index.d.ts.map +1 -0
- package/dist/core/providers/index.js +108 -0
- package/dist/core/providers/index.js.map +1 -0
- package/dist/core/providers/openai.d.ts.map +1 -0
- package/dist/core/providers/openai.js.map +1 -0
- package/dist/core/providers/registry.d.ts.map +1 -0
- package/dist/core/providers/registry.js +142 -0
- package/dist/core/providers/registry.js.map +1 -0
- package/dist/core/providers/search/brave.d.ts.map +1 -0
- package/dist/core/providers/search/brave.js.map +1 -0
- package/dist/core/providers/search/exa.d.ts.map +1 -0
- package/dist/core/providers/search/exa.js +161 -0
- package/dist/core/providers/search/exa.js.map +1 -0
- package/dist/core/providers/search/index.d.ts.map +1 -0
- package/dist/core/providers/search/index.js.map +1 -0
- package/dist/core/providers/search/serper.d.ts.map +1 -0
- package/dist/core/providers/search/serper.js.map +1 -0
- package/dist/core/providers/search/types.d.ts.map +1 -0
- package/dist/core/providers/search/types.js.map +1 -0
- package/dist/core/providers/store.d.ts.map +1 -0
- package/dist/core/providers/store.js.map +1 -0
- package/dist/core/providers/types.d.ts.map +1 -0
- package/dist/core/providers/types.js.map +1 -0
- package/dist/core/providers/vertex-ai.d.ts.map +1 -0
- package/dist/core/providers/vertex-ai.js +462 -0
- package/dist/core/providers/vertex-ai.js.map +1 -0
- package/dist/core/session/checkpointing/checkpoint-manager.d.ts.map +1 -0
- package/dist/core/session/checkpointing/checkpoint-manager.js.map +1 -0
- package/dist/core/session/checkpointing/index.d.ts.map +1 -0
- package/dist/core/session/checkpointing/index.js.map +1 -0
- package/dist/core/session/checkpointing/types.d.ts.map +1 -0
- package/dist/core/session/checkpointing/types.js.map +1 -0
- package/dist/core/session/compression/engine.d.ts.map +1 -0
- package/dist/core/session/compression/engine.js.map +1 -0
- package/dist/core/session/compression/index.d.ts.map +1 -0
- package/dist/core/session/compression/index.js.map +1 -0
- package/dist/core/session/compression/types.d.ts.map +1 -0
- package/dist/core/session/compression/types.js.map +1 -0
- package/dist/core/session/index.d.ts +10 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +10 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/input/history-manager.d.ts.map +1 -0
- package/dist/core/session/input/history-manager.js.map +1 -0
- package/dist/core/session/input/index.d.ts.map +1 -0
- package/dist/core/session/input/index.js.map +1 -0
- package/dist/core/session/manager.d.ts +169 -0
- package/dist/core/session/manager.d.ts.map +1 -0
- package/dist/core/session/manager.js +560 -0
- package/dist/core/session/manager.js.map +1 -0
- package/dist/core/session/tasks/index.d.ts +7 -0
- package/dist/core/session/tasks/index.d.ts.map +1 -0
- package/dist/core/session/tasks/index.js +7 -0
- package/dist/core/session/tasks/index.js.map +1 -0
- package/dist/core/session/tasks/output-streamer.d.ts +63 -0
- package/dist/core/session/tasks/output-streamer.d.ts.map +1 -0
- package/dist/core/session/tasks/output-streamer.js +211 -0
- package/dist/core/session/tasks/output-streamer.js.map +1 -0
- package/dist/core/session/tasks/task-manager.d.ts +90 -0
- package/dist/core/session/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/session/tasks/task-manager.js +512 -0
- package/dist/core/session/tasks/task-manager.js.map +1 -0
- package/dist/core/session/tasks/types.d.ts +113 -0
- package/dist/core/session/tasks/types.d.ts.map +1 -0
- package/dist/core/session/tasks/types.js +7 -0
- package/dist/core/session/tasks/types.js.map +1 -0
- package/dist/core/session/types.d.ts +63 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/tools/builtin/ask-user.d.ts.map +1 -0
- package/dist/core/tools/builtin/ask-user.js +148 -0
- package/dist/core/tools/builtin/ask-user.js.map +1 -0
- package/dist/core/tools/builtin/bash.d.ts.map +1 -0
- package/dist/core/tools/builtin/bash.js +107 -0
- package/dist/core/tools/builtin/bash.js.map +1 -0
- package/dist/core/tools/builtin/edit.d.ts.map +1 -0
- package/dist/core/tools/builtin/edit.js +79 -0
- package/dist/core/tools/builtin/edit.js.map +1 -0
- package/dist/core/tools/builtin/glob.d.ts.map +1 -0
- package/dist/core/tools/builtin/glob.js +37 -0
- package/dist/core/tools/builtin/glob.js.map +1 -0
- package/dist/core/tools/builtin/grep.d.ts.map +1 -0
- package/dist/core/tools/builtin/grep.js +60 -0
- package/dist/core/tools/builtin/grep.js.map +1 -0
- package/dist/core/tools/builtin/read.d.ts.map +1 -0
- package/dist/core/tools/builtin/read.js +30 -0
- package/dist/core/tools/builtin/read.js.map +1 -0
- package/dist/core/tools/builtin/taskoutput.d.ts +17 -0
- package/dist/core/tools/builtin/taskoutput.d.ts.map +1 -0
- package/dist/core/tools/builtin/taskoutput.js +277 -0
- package/dist/core/tools/builtin/taskoutput.js.map +1 -0
- package/dist/core/tools/builtin/todowrite.d.ts.map +1 -0
- package/dist/core/tools/builtin/todowrite.js +90 -0
- package/dist/core/tools/builtin/todowrite.js.map +1 -0
- package/dist/core/tools/builtin/webfetch.d.ts.map +1 -0
- package/dist/core/tools/builtin/webfetch.js +228 -0
- package/dist/core/tools/builtin/webfetch.js.map +1 -0
- package/dist/core/tools/builtin/websearch.d.ts.map +1 -0
- package/dist/core/tools/builtin/websearch.js +87 -0
- package/dist/core/tools/builtin/websearch.js.map +1 -0
- package/dist/core/tools/builtin/write.d.ts +9 -0
- package/dist/core/tools/builtin/write.d.ts.map +1 -0
- package/dist/core/tools/builtin/write.js +40 -0
- package/dist/core/tools/builtin/write.js.map +1 -0
- package/dist/core/tools/factories/mcp-tool-factory.d.ts +16 -0
- package/dist/core/tools/factories/mcp-tool-factory.d.ts.map +1 -0
- package/dist/core/tools/factories/mcp-tool-factory.js +92 -0
- package/dist/core/tools/factories/mcp-tool-factory.js.map +1 -0
- package/dist/core/tools/factories/skill-tool-factory.d.ts +28 -0
- package/dist/core/tools/factories/skill-tool-factory.d.ts.map +1 -0
- package/dist/core/tools/factories/skill-tool-factory.js +154 -0
- package/dist/core/tools/factories/skill-tool-factory.js.map +1 -0
- package/dist/core/tools/factories/task-tool-factory.d.ts +13 -0
- package/dist/core/tools/factories/task-tool-factory.d.ts.map +1 -0
- package/dist/core/tools/factories/task-tool-factory.js +387 -0
- package/dist/core/tools/factories/task-tool-factory.js.map +1 -0
- package/dist/core/tools/index.d.ts +87 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +133 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/registry.d.ts +36 -0
- package/dist/core/tools/registry.d.ts.map +1 -0
- package/dist/core/tools/registry.js +150 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/tools/types.d.ts +148 -0
- package/dist/core/tools/types.d.ts.map +1 -0
- package/dist/core/tools/types.js +193 -0
- package/dist/core/tools/types.js.map +1 -0
- package/dist/core/tools/utils/ssrf.d.ts.map +1 -0
- package/dist/core/tools/utils/ssrf.js.map +1 -0
- package/dist/ext/commands/discovery.d.ts +23 -0
- package/dist/ext/commands/discovery.d.ts.map +1 -0
- package/dist/ext/commands/discovery.js +36 -0
- package/dist/ext/commands/discovery.js.map +1 -0
- package/dist/ext/commands/expander.d.ts +25 -0
- package/dist/ext/commands/expander.d.ts.map +1 -0
- package/dist/ext/commands/expander.js +140 -0
- package/dist/ext/commands/expander.js.map +1 -0
- package/dist/ext/commands/index.d.ts +12 -0
- package/dist/ext/commands/index.d.ts.map +1 -0
- package/dist/ext/commands/index.js +12 -0
- package/dist/ext/commands/index.js.map +1 -0
- package/dist/ext/commands/manager.d.ts +50 -0
- package/dist/ext/commands/manager.d.ts.map +1 -0
- package/dist/ext/commands/manager.js +174 -0
- package/dist/ext/commands/manager.js.map +1 -0
- package/dist/ext/commands/parser.d.ts +31 -0
- package/dist/ext/commands/parser.d.ts.map +1 -0
- package/dist/ext/commands/parser.js +113 -0
- package/dist/ext/commands/parser.js.map +1 -0
- package/dist/ext/commands/types.d.ts +62 -0
- package/dist/ext/commands/types.d.ts.map +1 -0
- package/dist/ext/commands/types.js +8 -0
- package/dist/ext/commands/types.js.map +1 -0
- package/dist/ext/hooks/executor.d.ts +20 -0
- package/dist/ext/hooks/executor.d.ts.map +1 -0
- package/dist/ext/hooks/executor.js +251 -0
- package/dist/ext/hooks/executor.js.map +1 -0
- package/dist/ext/hooks/hooks-manager.d.ts +112 -0
- package/dist/ext/hooks/hooks-manager.d.ts.map +1 -0
- package/dist/ext/hooks/hooks-manager.js +200 -0
- package/dist/ext/hooks/hooks-manager.js.map +1 -0
- package/dist/ext/hooks/index.d.ts +17 -0
- package/dist/ext/hooks/index.d.ts.map +1 -0
- package/dist/ext/hooks/index.js +20 -0
- package/dist/ext/hooks/index.js.map +1 -0
- package/dist/ext/hooks/matcher.d.ts +38 -0
- package/dist/ext/hooks/matcher.d.ts.map +1 -0
- package/dist/ext/hooks/matcher.js +72 -0
- package/dist/ext/hooks/matcher.js.map +1 -0
- package/dist/ext/hooks/types.d.ts +152 -0
- package/dist/ext/hooks/types.d.ts.map +1 -0
- package/dist/ext/hooks/types.js +10 -0
- package/dist/ext/hooks/types.js.map +1 -0
- package/dist/ext/hooks/utils.d.ts +75 -0
- package/dist/ext/hooks/utils.d.ts.map +1 -0
- package/dist/ext/hooks/utils.js +198 -0
- package/dist/ext/hooks/utils.js.map +1 -0
- package/dist/ext/mcp/auth.d.ts +34 -0
- package/dist/ext/mcp/auth.d.ts.map +1 -0
- package/dist/ext/mcp/auth.js +98 -0
- package/dist/ext/mcp/auth.js.map +1 -0
- package/dist/ext/mcp/client.d.ts +18 -0
- package/dist/ext/mcp/client.d.ts.map +1 -0
- package/dist/ext/mcp/client.js +40 -0
- package/dist/ext/mcp/client.js.map +1 -0
- package/dist/ext/mcp/config.d.ts +33 -0
- package/dist/ext/mcp/config.d.ts.map +1 -0
- package/dist/ext/mcp/config.js +147 -0
- package/dist/ext/mcp/config.js.map +1 -0
- package/dist/ext/mcp/connection.d.ts +16 -0
- package/dist/ext/mcp/connection.d.ts.map +1 -0
- package/dist/ext/mcp/connection.js +96 -0
- package/dist/ext/mcp/connection.js.map +1 -0
- package/dist/ext/mcp/env-expand.d.ts +24 -0
- package/dist/ext/mcp/env-expand.d.ts.map +1 -0
- package/dist/ext/mcp/env-expand.js +53 -0
- package/dist/ext/mcp/env-expand.js.map +1 -0
- package/dist/ext/mcp/index.d.ts +15 -0
- package/dist/ext/mcp/index.d.ts.map +1 -0
- package/dist/ext/mcp/index.js +22 -0
- package/dist/ext/mcp/index.js.map +1 -0
- package/dist/ext/mcp/manager.d.ts +87 -0
- package/dist/ext/mcp/manager.d.ts.map +1 -0
- package/dist/ext/mcp/manager.js +246 -0
- package/dist/ext/mcp/manager.js.map +1 -0
- package/dist/ext/mcp/oauth-callback.d.ts +21 -0
- package/dist/ext/mcp/oauth-callback.d.ts.map +1 -0
- package/dist/ext/mcp/oauth-callback.js +123 -0
- package/dist/ext/mcp/oauth-callback.js.map +1 -0
- package/dist/ext/mcp/oauth-provider.d.ts +44 -0
- package/dist/ext/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/ext/mcp/oauth-provider.js +159 -0
- package/dist/ext/mcp/oauth-provider.js.map +1 -0
- package/dist/ext/mcp/types.d.ts +122 -0
- package/dist/ext/mcp/types.d.ts.map +1 -0
- package/dist/ext/mcp/types.js +6 -0
- package/dist/ext/mcp/types.js.map +1 -0
- package/dist/ext/skills/index.d.ts +7 -0
- package/dist/ext/skills/index.d.ts.map +1 -0
- package/dist/ext/skills/index.js +7 -0
- package/dist/ext/skills/index.js.map +1 -0
- package/dist/ext/skills/manager.d.ts +20 -0
- package/dist/ext/skills/manager.d.ts.map +1 -0
- package/dist/ext/skills/manager.js +27 -0
- package/dist/ext/skills/manager.js.map +1 -0
- package/dist/ext/skills/parser.d.ts +27 -0
- package/dist/ext/skills/parser.d.ts.map +1 -0
- package/dist/ext/skills/parser.js +87 -0
- package/dist/ext/skills/parser.js.map +1 -0
- package/dist/ext/skills/types.d.ts +34 -0
- package/dist/ext/skills/types.d.ts.map +1 -0
- package/dist/ext/skills/types.js +8 -0
- package/dist/ext/skills/types.js.map +1 -0
- package/dist/ext/subagents/configs.d.ts +35 -0
- package/dist/ext/subagents/configs.d.ts.map +1 -0
- package/dist/ext/subagents/configs.js +201 -0
- package/dist/ext/subagents/configs.js.map +1 -0
- package/dist/ext/subagents/index.d.ts +12 -0
- package/dist/ext/subagents/index.d.ts.map +1 -0
- package/dist/ext/subagents/index.js +12 -0
- package/dist/ext/subagents/index.js.map +1 -0
- package/dist/ext/subagents/manager.d.ts +66 -0
- package/dist/ext/subagents/manager.d.ts.map +1 -0
- package/dist/ext/subagents/manager.js +107 -0
- package/dist/ext/subagents/manager.js.map +1 -0
- package/dist/ext/subagents/parser.d.ts +17 -0
- package/dist/ext/subagents/parser.d.ts.map +1 -0
- package/dist/ext/subagents/parser.js +144 -0
- package/dist/ext/subagents/parser.js.map +1 -0
- package/dist/ext/subagents/result-cache.d.ts +78 -0
- package/dist/ext/subagents/result-cache.d.ts.map +1 -0
- package/dist/ext/subagents/result-cache.js +224 -0
- package/dist/ext/subagents/result-cache.js.map +1 -0
- package/dist/ext/subagents/subagent-session-manager.d.ts +68 -0
- package/dist/ext/subagents/subagent-session-manager.d.ts.map +1 -0
- package/dist/ext/subagents/subagent-session-manager.js +195 -0
- package/dist/ext/subagents/subagent-session-manager.js.map +1 -0
- package/dist/ext/subagents/subagent.d.ts +121 -0
- package/dist/ext/subagents/subagent.d.ts.map +1 -0
- package/dist/ext/subagents/subagent.js +425 -0
- package/dist/ext/subagents/subagent.js.map +1 -0
- package/dist/ext/subagents/types.d.ts +185 -0
- package/dist/ext/subagents/types.d.ts.map +1 -0
- package/dist/ext/subagents/types.js +19 -0
- package/dist/ext/subagents/types.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/docs/README.md +48 -6
- package/docs/command-environment-variables.md +150 -0
- package/docs/custom-agents.md +243 -0
- package/docs/custom-commands.md +329 -0
- package/docs/hooks.md +341 -0
- package/docs/mcp.md +496 -0
- package/docs/operating-modes.md +52 -11
- package/docs/permissions.md +31 -0
- package/docs/proposals/0003-task-subagents.md +144 -2
- package/docs/proposals/0004-plan-mode.md +58 -2
- package/docs/proposals/0008-checkpointing.md +154 -2
- package/docs/proposals/0009-hooks-system.md +141 -2
- package/docs/proposals/0010-mcp-integration.md +153 -2
- package/docs/proposals/0017-background-tasks.md +113 -2
- package/docs/proposals/0021-skills-system.md +124 -1
- package/docs/proposals/README.md +4 -4
- package/examples/custom-agents/README.md +126 -0
- package/examples/custom-agents/code-reviewer.json +10 -0
- package/examples/custom-agents/test-architect.md +63 -0
- package/examples/hooks-example.json +59 -0
- package/package.json +22 -3
- package/scripts/README.md +90 -0
- package/scripts/tests/test-commands-functional.ts +318 -0
- package/scripts/tests/test-commands-loading.ts +83 -0
- package/scripts/tests/test-component-loading.ts +281 -0
- package/scripts/tests/test-functional-all.ts +178 -0
- package/scripts/tests/test-hooks-functional.ts +342 -0
- package/scripts/tests/test-hooks-loading.ts +97 -0
- package/scripts/tests/test-mcp-loading.ts +118 -0
- package/scripts/tests/test-skills-functional.ts +256 -0
- package/scripts/tests/test-skills-loading.ts +75 -0
- package/scripts/tests/test-subagents-functional.ts +302 -0
- package/scripts/tests/test-subagents-loading.ts +80 -0
- package/src/base/config/levels.ts +237 -0
- package/src/base/config/providers-config.ts +87 -0
- package/src/base/config/types.ts +230 -0
- package/src/base/discovery/base-loader.ts +241 -0
- package/src/base/discovery/file-scanner.ts +221 -0
- package/src/base/discovery/index.ts +26 -0
- package/src/base/discovery/path-resolver.ts +130 -0
- package/src/base/discovery/types.ts +159 -0
- package/src/base/utils/config-validator.ts +191 -0
- package/src/base/utils/debug.ts +103 -0
- package/src/base/utils/format-utils.ts +71 -0
- package/src/base/utils/index.ts +12 -0
- package/src/base/utils/loading-reporter.ts +227 -0
- package/src/base/utils/logger.ts +99 -0
- package/src/base/utils/path-utils.ts +84 -0
- package/src/base/utils/stream-utils.ts +75 -0
- package/src/base/utils/validation.ts +22 -0
- package/src/cli/components/App.tsx +434 -22
- package/src/cli/components/CommandSuggestions.tsx +89 -13
- package/src/cli/components/DiffPreview.tsx +134 -0
- package/src/cli/components/Input.tsx +3 -1
- package/src/cli/components/Messages.tsx +148 -72
- package/src/cli/components/ModeIndicator.tsx +1 -1
- package/src/cli/components/ModelSelector.tsx +3 -3
- package/src/cli/components/PermissionPrompt.tsx +101 -70
- package/src/cli/components/PlanApproval.tsx +17 -7
- package/src/cli/components/ProviderManager.tsx +5 -5
- package/src/cli/components/QuestionPrompt.tsx +1 -1
- package/src/cli/components/TodoList.tsx +1 -1
- package/src/cli/components/index.ts +2 -1
- package/src/cli/components/markdown.ts +58 -6
- package/src/cli/components/theme.ts +63 -0
- package/src/cli/index.tsx +58 -17
- package/src/cli/planning/tools/enter-plan-mode.ts +111 -0
- package/src/cli/planning/tools/exit-plan-mode.ts +170 -0
- package/src/cli/planning/types.ts +154 -0
- package/src/cli/prompts/index.ts +400 -0
- package/src/cli/prompts/system/base.txt +191 -0
- package/src/cli/prompts/system/plan-mode.txt +96 -0
- package/src/core/agent/agent.ts +1050 -0
- package/src/core/memory/memory-manager.ts +845 -0
- package/src/core/permissions/validation.test.ts +619 -0
- package/src/core/providers/anthropic-vertex.ts +656 -0
- package/src/core/providers/google.ts +404 -0
- package/src/core/providers/index.ts +155 -0
- package/src/core/providers/registry.ts +203 -0
- package/src/core/providers/search/exa.ts +220 -0
- package/src/core/session/index.ts +10 -0
- package/src/core/session/manager.ts +692 -0
- package/src/core/session/tasks/index.ts +7 -0
- package/src/core/session/tasks/output-streamer.ts +245 -0
- package/src/core/session/tasks/task-manager.ts +619 -0
- package/src/core/session/tasks/types.ts +140 -0
- package/src/core/session/types.ts +80 -0
- package/src/core/tools/builtin/ask-user.ts +185 -0
- package/src/core/tools/builtin/bash.ts +125 -0
- package/src/core/tools/builtin/edit.ts +97 -0
- package/src/core/tools/builtin/glob.ts +43 -0
- package/src/core/tools/builtin/grep.ts +68 -0
- package/src/core/tools/builtin/read.ts +35 -0
- package/src/core/tools/builtin/taskoutput.ts +317 -0
- package/src/core/tools/builtin/todowrite.ts +104 -0
- package/src/core/tools/builtin/webfetch.ts +261 -0
- package/src/core/tools/builtin/websearch.ts +103 -0
- package/src/core/tools/builtin/write.ts +45 -0
- package/src/core/tools/factories/mcp-tool-factory.ts +109 -0
- package/src/core/tools/factories/skill-tool-factory.ts +181 -0
- package/src/core/tools/factories/task-tool-factory.ts +457 -0
- package/src/core/tools/index.ts +158 -0
- package/src/core/tools/registry.ts +179 -0
- package/src/core/tools/types.ts +306 -0
- package/src/ext/commands/discovery.ts +42 -0
- package/src/ext/commands/expander.ts +170 -0
- package/src/ext/commands/index.ts +12 -0
- package/src/ext/commands/manager.ts +210 -0
- package/src/ext/commands/parser.ts +136 -0
- package/src/ext/commands/types.ts +78 -0
- package/src/ext/hooks/executor.ts +284 -0
- package/src/ext/hooks/hooks-manager.ts +254 -0
- package/src/ext/hooks/index.ts +36 -0
- package/src/ext/hooks/matcher.ts +76 -0
- package/src/ext/hooks/types.ts +211 -0
- package/src/ext/hooks/utils.ts +230 -0
- package/src/ext/mcp/auth.ts +124 -0
- package/src/ext/mcp/client.ts +45 -0
- package/src/ext/mcp/config.ts +193 -0
- package/src/ext/mcp/connection.ts +111 -0
- package/src/ext/mcp/env-expand.ts +61 -0
- package/src/ext/mcp/index.ts +62 -0
- package/src/ext/mcp/manager.ts +287 -0
- package/src/ext/mcp/oauth-callback.ts +148 -0
- package/src/ext/mcp/oauth-provider.ts +211 -0
- package/src/ext/mcp/types.ts +146 -0
- package/src/ext/skills/index.ts +7 -0
- package/src/ext/skills/manager.test.ts +288 -0
- package/src/ext/skills/manager.ts +29 -0
- package/src/ext/skills/parser.test.ts +173 -0
- package/src/ext/skills/parser.ts +102 -0
- package/src/ext/skills/skill-tool.test.ts +172 -0
- package/src/ext/skills/types.ts +37 -0
- package/src/ext/subagents/configs.ts +214 -0
- package/src/ext/subagents/index.ts +12 -0
- package/src/ext/subagents/manager.ts +121 -0
- package/src/ext/subagents/parser.ts +160 -0
- package/src/ext/subagents/result-cache.ts +309 -0
- package/src/ext/subagents/subagent-session-manager.ts +250 -0
- package/src/ext/subagents/subagent.ts +536 -0
- package/src/ext/subagents/types.ts +241 -0
- package/src/index.ts +6 -6
- package/tests/config/hooks-config.test.ts +324 -0
- package/tests/hooks/executor.test.ts +132 -0
- package/tests/hooks/hooks-manager.test.ts +307 -0
- package/tests/hooks/matcher.test.ts +65 -0
- package/tests/hooks/utils.test.ts +224 -0
- package/tests/integration/hooks-config-loading.test.ts +363 -0
- package/tests/integration/hooks-integration.test.ts +249 -0
- package/RELEASE_NOTES_v0.4.0.md +0 -140
- package/dist/agent/agent.d.ts +0 -190
- package/dist/agent/agent.d.ts.map +0 -1
- package/dist/agent/agent.js +0 -668
- package/dist/agent/agent.js.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/types.js.map +0 -1
- package/dist/checkpointing/checkpoint-manager.d.ts.map +0 -1
- package/dist/checkpointing/checkpoint-manager.js.map +0 -1
- package/dist/checkpointing/index.d.ts.map +0 -1
- package/dist/checkpointing/index.js.map +0 -1
- package/dist/checkpointing/types.d.ts.map +0 -1
- package/dist/checkpointing/types.js.map +0 -1
- package/dist/cli/components/AllModelsSelector.d.ts +0 -11
- package/dist/cli/components/AllModelsSelector.d.ts.map +0 -1
- package/dist/cli/components/AllModelsSelector.js +0 -153
- package/dist/cli/components/AllModelsSelector.js.map +0 -1
- package/dist/cli/index-legacy.d.ts +0 -7
- package/dist/cli/index-legacy.d.ts.map +0 -1
- package/dist/cli/index-legacy.js +0 -431
- package/dist/cli/index-legacy.js.map +0 -1
- package/dist/cli/ink-cli.d.ts +0 -7
- package/dist/cli/ink-cli.d.ts.map +0 -1
- package/dist/cli/ink-cli.js +0 -105
- package/dist/cli/ink-cli.js.map +0 -1
- package/dist/cli/session-picker.d.ts +0 -16
- package/dist/cli/session-picker.d.ts.map +0 -1
- package/dist/cli/session-picker.js +0 -280
- package/dist/cli/session-picker.js.map +0 -1
- package/dist/cli/ui.d.ts +0 -61
- package/dist/cli/ui.d.ts.map +0 -1
- package/dist/cli/ui.js +0 -364
- package/dist/cli/ui.js.map +0 -1
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js.map +0 -1
- package/dist/config/levels.d.ts +0 -49
- package/dist/config/levels.d.ts.map +0 -1
- package/dist/config/levels.js +0 -222
- package/dist/config/levels.js.map +0 -1
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/config/manager.test.d.ts +0 -5
- package/dist/config/manager.test.d.ts.map +0 -1
- package/dist/config/manager.test.js +0 -192
- package/dist/config/manager.test.js.map +0 -1
- package/dist/config/merger.d.ts.map +0 -1
- package/dist/config/merger.js.map +0 -1
- package/dist/config/providers-config.d.ts.map +0 -1
- package/dist/config/providers-config.js +0 -76
- package/dist/config/providers-config.js.map +0 -1
- package/dist/config/test-utils.d.ts.map +0 -1
- package/dist/config/test-utils.js.map +0 -1
- package/dist/config/types.d.ts +0 -146
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -57
- package/dist/config/types.js.map +0 -1
- package/dist/input/history-manager.d.ts.map +0 -1
- package/dist/input/history-manager.js.map +0 -1
- package/dist/input/index.d.ts.map +0 -1
- package/dist/input/index.js.map +0 -1
- package/dist/memory/import-resolver.d.ts.map +0 -1
- package/dist/memory/import-resolver.js.map +0 -1
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/init-prompt.d.ts.map +0 -1
- package/dist/memory/init-prompt.js.map +0 -1
- package/dist/memory/init.d.ts +0 -20
- package/dist/memory/init.d.ts.map +0 -1
- package/dist/memory/init.js +0 -332
- package/dist/memory/init.js.map +0 -1
- package/dist/memory/manager.d.ts +0 -85
- package/dist/memory/manager.d.ts.map +0 -1
- package/dist/memory/manager.js +0 -234
- package/dist/memory/manager.js.map +0 -1
- package/dist/memory/memory-manager.d.ts.map +0 -1
- package/dist/memory/memory-manager.js +0 -716
- package/dist/memory/memory-manager.js.map +0 -1
- package/dist/memory/rules-parser.d.ts.map +0 -1
- package/dist/memory/rules-parser.js.map +0 -1
- package/dist/memory/test-utils.d.ts.map +0 -1
- package/dist/memory/test-utils.js.map +0 -1
- package/dist/memory/types.d.ts.map +0 -1
- package/dist/memory/types.js.map +0 -1
- package/dist/migration/migrate.d.ts +0 -24
- package/dist/migration/migrate.d.ts.map +0 -1
- package/dist/migration/migrate.js +0 -164
- package/dist/migration/migrate.js.map +0 -1
- package/dist/permissions/audit.d.ts.map +0 -1
- package/dist/permissions/audit.js.map +0 -1
- package/dist/permissions/index.d.ts.map +0 -1
- package/dist/permissions/index.js.map +0 -1
- package/dist/permissions/manager.d.ts.map +0 -1
- package/dist/permissions/manager.js.map +0 -1
- package/dist/permissions/manager.test.d.ts +0 -5
- package/dist/permissions/manager.test.d.ts.map +0 -1
- package/dist/permissions/manager.test.js +0 -213
- package/dist/permissions/manager.test.js.map +0 -1
- package/dist/permissions/persistence.d.ts.map +0 -1
- package/dist/permissions/persistence.js.map +0 -1
- package/dist/permissions/persistence.test.d.ts +0 -5
- package/dist/permissions/persistence.test.d.ts.map +0 -1
- package/dist/permissions/persistence.test.js +0 -171
- package/dist/permissions/persistence.test.js.map +0 -1
- package/dist/permissions/prompt-matcher.d.ts.map +0 -1
- package/dist/permissions/prompt-matcher.js.map +0 -1
- package/dist/permissions/prompt-matcher.test.d.ts +0 -5
- package/dist/permissions/prompt-matcher.test.d.ts.map +0 -1
- package/dist/permissions/prompt-matcher.test.js +0 -107
- package/dist/permissions/prompt-matcher.test.js.map +0 -1
- package/dist/permissions/types.d.ts.map +0 -1
- package/dist/permissions/types.js.map +0 -1
- package/dist/planning/index.d.ts.map +0 -1
- package/dist/planning/index.js.map +0 -1
- package/dist/planning/plan-file.d.ts.map +0 -1
- package/dist/planning/plan-file.js.map +0 -1
- package/dist/planning/state.d.ts.map +0 -1
- package/dist/planning/state.js.map +0 -1
- package/dist/planning/tools/enter-plan-mode.d.ts +0 -25
- package/dist/planning/tools/enter-plan-mode.d.ts.map +0 -1
- package/dist/planning/tools/enter-plan-mode.js.map +0 -1
- package/dist/planning/tools/exit-plan-mode.d.ts +0 -24
- package/dist/planning/tools/exit-plan-mode.d.ts.map +0 -1
- package/dist/planning/tools/exit-plan-mode.js.map +0 -1
- package/dist/planning/types.d.ts +0 -100
- package/dist/planning/types.d.ts.map +0 -1
- package/dist/planning/types.js +0 -28
- package/dist/planning/types.js.map +0 -1
- package/dist/pricing/calculator.d.ts.map +0 -1
- package/dist/pricing/calculator.js.map +0 -1
- package/dist/pricing/index.d.ts.map +0 -1
- package/dist/pricing/index.js.map +0 -1
- package/dist/pricing/models.d.ts.map +0 -1
- package/dist/pricing/models.js.map +0 -1
- package/dist/pricing/types.d.ts.map +0 -1
- package/dist/pricing/types.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -93
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -244
- package/dist/prompts/index.js.map +0 -1
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/gemini.d.ts +0 -22
- package/dist/providers/gemini.d.ts.map +0 -1
- package/dist/providers/gemini.js +0 -297
- package/dist/providers/gemini.js.map +0 -1
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js +0 -297
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/index.d.ts +0 -46
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -108
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js.map +0 -1
- package/dist/providers/registry.d.ts.map +0 -1
- package/dist/providers/registry.js +0 -142
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/search/brave.d.ts.map +0 -1
- package/dist/providers/search/brave.js.map +0 -1
- package/dist/providers/search/exa.d.ts.map +0 -1
- package/dist/providers/search/exa.js +0 -158
- package/dist/providers/search/exa.js.map +0 -1
- package/dist/providers/search/index.d.ts.map +0 -1
- package/dist/providers/search/index.js.map +0 -1
- package/dist/providers/search/serper.d.ts.map +0 -1
- package/dist/providers/search/serper.js.map +0 -1
- package/dist/providers/search/types.d.ts.map +0 -1
- package/dist/providers/search/types.js.map +0 -1
- package/dist/providers/store.d.ts.map +0 -1
- package/dist/providers/store.js.map +0 -1
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/vertex-ai.d.ts.map +0 -1
- package/dist/providers/vertex-ai.js +0 -447
- package/dist/providers/vertex-ai.js.map +0 -1
- package/dist/session/compression/engine.d.ts.map +0 -1
- package/dist/session/compression/engine.js.map +0 -1
- package/dist/session/compression/index.d.ts.map +0 -1
- package/dist/session/compression/index.js.map +0 -1
- package/dist/session/compression/types.d.ts.map +0 -1
- package/dist/session/compression/types.js.map +0 -1
- package/dist/session/index.d.ts +0 -6
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -6
- package/dist/session/index.js.map +0 -1
- package/dist/session/manager.d.ts +0 -166
- package/dist/session/manager.d.ts.map +0 -1
- package/dist/session/manager.js +0 -555
- package/dist/session/manager.js.map +0 -1
- package/dist/session/types.d.ts +0 -55
- package/dist/session/types.d.ts.map +0 -1
- package/dist/session/types.js.map +0 -1
- package/dist/tools/builtin/ask-user.d.ts.map +0 -1
- package/dist/tools/builtin/ask-user.js +0 -148
- package/dist/tools/builtin/ask-user.js.map +0 -1
- package/dist/tools/builtin/bash.d.ts.map +0 -1
- package/dist/tools/builtin/bash.js +0 -81
- package/dist/tools/builtin/bash.js.map +0 -1
- package/dist/tools/builtin/edit.d.ts.map +0 -1
- package/dist/tools/builtin/edit.js +0 -33
- package/dist/tools/builtin/edit.js.map +0 -1
- package/dist/tools/builtin/glob.d.ts.map +0 -1
- package/dist/tools/builtin/glob.js +0 -37
- package/dist/tools/builtin/glob.js.map +0 -1
- package/dist/tools/builtin/grep.d.ts.map +0 -1
- package/dist/tools/builtin/grep.js +0 -60
- package/dist/tools/builtin/grep.js.map +0 -1
- package/dist/tools/builtin/read.d.ts.map +0 -1
- package/dist/tools/builtin/read.js +0 -30
- package/dist/tools/builtin/read.js.map +0 -1
- package/dist/tools/builtin/todowrite.d.ts.map +0 -1
- package/dist/tools/builtin/todowrite.js +0 -88
- package/dist/tools/builtin/todowrite.js.map +0 -1
- package/dist/tools/builtin/webfetch.d.ts.map +0 -1
- package/dist/tools/builtin/webfetch.js +0 -228
- package/dist/tools/builtin/webfetch.js.map +0 -1
- package/dist/tools/builtin/websearch.d.ts.map +0 -1
- package/dist/tools/builtin/websearch.js +0 -87
- package/dist/tools/builtin/websearch.js.map +0 -1
- package/dist/tools/builtin/write.d.ts +0 -7
- package/dist/tools/builtin/write.d.ts.map +0 -1
- package/dist/tools/builtin/write.js +0 -25
- package/dist/tools/builtin/write.js.map +0 -1
- package/dist/tools/index.d.ts +0 -74
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -69
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -35
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -148
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/types.d.ts +0 -120
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -142
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/utils/ssrf.d.ts.map +0 -1
- package/dist/tools/utils/ssrf.js.map +0 -1
- package/docs/config-system-comparison.md +0 -707
- package/docs/cost-tracking-comparison.md +0 -904
- package/examples/test-ask-user.ts +0 -167
- package/examples/test-checkpointing.ts +0 -121
- package/examples/test-cost-tracking.ts +0 -77
- package/examples/test-interrupt-cleanup.ts +0 -94
- package/src/agent/agent.ts +0 -808
- package/src/config/levels.ts +0 -285
- package/src/config/providers-config.ts +0 -87
- package/src/config/types.ts +0 -237
- package/src/memory/memory-manager.ts +0 -845
- package/src/planning/tools/enter-plan-mode.ts +0 -111
- package/src/planning/tools/exit-plan-mode.ts +0 -170
- package/src/planning/types.ts +0 -150
- package/src/prompts/index.ts +0 -310
- package/src/prompts/system/base.txt +0 -166
- package/src/providers/google.ts +0 -382
- package/src/providers/index.ts +0 -155
- package/src/providers/registry.ts +0 -203
- package/src/providers/search/exa.ts +0 -217
- package/src/providers/vertex-ai.ts +0 -641
- package/src/session/index.ts +0 -6
- package/src/session/manager.ts +0 -686
- package/src/session/types.ts +0 -70
- package/src/tools/builtin/ask-user.ts +0 -185
- package/src/tools/builtin/bash.ts +0 -93
- package/src/tools/builtin/edit.ts +0 -38
- package/src/tools/builtin/glob.ts +0 -43
- package/src/tools/builtin/grep.ts +0 -68
- package/src/tools/builtin/read.ts +0 -35
- package/src/tools/builtin/todowrite.ts +0 -102
- package/src/tools/builtin/webfetch.ts +0 -261
- package/src/tools/builtin/websearch.ts +0 -103
- package/src/tools/builtin/write.ts +0 -28
- package/src/tools/index.ts +0 -85
- package/src/tools/registry.ts +0 -176
- package/src/tools/types.ts +0 -222
- /package/dist/{config → base/config}/index.d.ts +0 -0
- /package/dist/{config → base/config}/index.js +0 -0
- /package/dist/{config → base/config}/loader.d.ts +0 -0
- /package/dist/{config → base/config}/loader.js +0 -0
- /package/dist/{config → base/config}/manager.d.ts +0 -0
- /package/dist/{config → base/config}/manager.js +0 -0
- /package/dist/{config → base/config}/merger.d.ts +0 -0
- /package/dist/{config → base/config}/merger.js +0 -0
- /package/dist/{config → base/config}/providers-config.d.ts +0 -0
- /package/dist/{config → base/config}/test-utils.d.ts +0 -0
- /package/dist/{config → base/config}/test-utils.js +0 -0
- /package/dist/{planning → cli/planning}/index.d.ts +0 -0
- /package/dist/{planning → cli/planning}/index.js +0 -0
- /package/dist/{planning → cli/planning}/plan-file.d.ts +0 -0
- /package/dist/{planning → cli/planning}/plan-file.js +0 -0
- /package/dist/{planning → cli/planning}/state.d.ts +0 -0
- /package/dist/{planning → cli/planning}/state.js +0 -0
- /package/dist/{planning → cli/planning}/tools/enter-plan-mode.js +0 -0
- /package/dist/{planning → cli/planning}/tools/exit-plan-mode.js +0 -0
- /package/dist/{agent → core/agent}/index.d.ts +0 -0
- /package/dist/{agent → core/agent}/index.js +0 -0
- /package/dist/{agent → core/agent}/types.d.ts +0 -0
- /package/dist/{agent → core/agent}/types.js +0 -0
- /package/dist/{memory → core/memory}/import-resolver.d.ts +0 -0
- /package/dist/{memory → core/memory}/import-resolver.js +0 -0
- /package/dist/{memory → core/memory}/index.d.ts +0 -0
- /package/dist/{memory → core/memory}/index.js +0 -0
- /package/dist/{memory → core/memory}/init-prompt.d.ts +0 -0
- /package/dist/{memory → core/memory}/init-prompt.js +0 -0
- /package/dist/{memory → core/memory}/memory-manager.d.ts +0 -0
- /package/dist/{memory → core/memory}/rules-parser.d.ts +0 -0
- /package/dist/{memory → core/memory}/rules-parser.js +0 -0
- /package/dist/{memory → core/memory}/test-utils.d.ts +0 -0
- /package/dist/{memory → core/memory}/test-utils.js +0 -0
- /package/dist/{memory → core/memory}/types.d.ts +0 -0
- /package/dist/{memory → core/memory}/types.js +0 -0
- /package/dist/{permissions → core/permissions}/audit.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/audit.js +0 -0
- /package/dist/{permissions → core/permissions}/index.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/index.js +0 -0
- /package/dist/{permissions → core/permissions}/manager.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/manager.js +0 -0
- /package/dist/{permissions → core/permissions}/persistence.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/persistence.js +0 -0
- /package/dist/{permissions → core/permissions}/prompt-matcher.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/prompt-matcher.js +0 -0
- /package/dist/{permissions → core/permissions}/types.d.ts +0 -0
- /package/dist/{permissions → core/permissions}/types.js +0 -0
- /package/dist/{pricing → core/pricing}/calculator.d.ts +0 -0
- /package/dist/{pricing → core/pricing}/calculator.js +0 -0
- /package/dist/{pricing → core/pricing}/index.d.ts +0 -0
- /package/dist/{pricing → core/pricing}/index.js +0 -0
- /package/dist/{pricing → core/pricing}/models.d.ts +0 -0
- /package/dist/{pricing → core/pricing}/models.js +0 -0
- /package/dist/{pricing → core/pricing}/types.d.ts +0 -0
- /package/dist/{pricing → core/pricing}/types.js +0 -0
- /package/dist/{providers → core/providers}/anthropic.d.ts +0 -0
- /package/dist/{providers → core/providers}/anthropic.js +0 -0
- /package/dist/{providers → core/providers}/google.d.ts +0 -0
- /package/dist/{providers → core/providers}/openai.d.ts +0 -0
- /package/dist/{providers → core/providers}/openai.js +0 -0
- /package/dist/{providers → core/providers}/registry.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/brave.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/brave.js +0 -0
- /package/dist/{providers → core/providers}/search/exa.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/index.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/index.js +0 -0
- /package/dist/{providers → core/providers}/search/serper.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/serper.js +0 -0
- /package/dist/{providers → core/providers}/search/types.d.ts +0 -0
- /package/dist/{providers → core/providers}/search/types.js +0 -0
- /package/dist/{providers → core/providers}/store.d.ts +0 -0
- /package/dist/{providers → core/providers}/store.js +0 -0
- /package/dist/{providers → core/providers}/types.d.ts +0 -0
- /package/dist/{providers → core/providers}/types.js +0 -0
- /package/dist/{providers → core/providers}/vertex-ai.d.ts +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/checkpoint-manager.d.ts +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/checkpoint-manager.js +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/index.d.ts +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/index.js +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/types.d.ts +0 -0
- /package/dist/{checkpointing → core/session/checkpointing}/types.js +0 -0
- /package/dist/{session → core/session}/compression/engine.d.ts +0 -0
- /package/dist/{session → core/session}/compression/engine.js +0 -0
- /package/dist/{session → core/session}/compression/index.d.ts +0 -0
- /package/dist/{session → core/session}/compression/index.js +0 -0
- /package/dist/{session → core/session}/compression/types.d.ts +0 -0
- /package/dist/{session → core/session}/compression/types.js +0 -0
- /package/dist/{input → core/session/input}/history-manager.d.ts +0 -0
- /package/dist/{input → core/session/input}/history-manager.js +0 -0
- /package/dist/{input → core/session/input}/index.d.ts +0 -0
- /package/dist/{input → core/session/input}/index.js +0 -0
- /package/dist/{session → core/session}/types.js +0 -0
- /package/dist/{tools → core/tools}/builtin/ask-user.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/bash.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/edit.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/glob.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/grep.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/read.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/todowrite.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/webfetch.d.ts +0 -0
- /package/dist/{tools → core/tools}/builtin/websearch.d.ts +0 -0
- /package/dist/{tools → core/tools}/utils/ssrf.d.ts +0 -0
- /package/dist/{tools → core/tools}/utils/ssrf.js +0 -0
- /package/src/{config → base/config}/index.ts +0 -0
- /package/src/{config → base/config}/levels.test.ts +0 -0
- /package/src/{config → base/config}/loader.test.ts +0 -0
- /package/src/{config → base/config}/loader.ts +0 -0
- /package/src/{config → base/config}/manager.test.ts +0 -0
- /package/src/{config → base/config}/manager.ts +0 -0
- /package/src/{config → base/config}/merger.test.ts +0 -0
- /package/src/{config → base/config}/merger.ts +0 -0
- /package/src/{config → base/config}/test-utils.ts +0 -0
- /package/src/{planning → cli/planning}/index.ts +0 -0
- /package/src/{planning → cli/planning}/plan-file.ts +0 -0
- /package/src/{planning → cli/planning}/state.ts +0 -0
- /package/src/{prompts → cli/prompts}/index.test.ts +0 -0
- /package/src/{prompts → cli/prompts}/system/anthropic.txt +0 -0
- /package/src/{prompts → cli/prompts}/system/gemini.txt +0 -0
- /package/src/{prompts → cli/prompts}/system/generic.txt +0 -0
- /package/src/{prompts → cli/prompts}/system/openai.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/ask-user.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/bash.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/edit.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/glob.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/grep.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/read.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/todowrite.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/webfetch.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/websearch.txt +0 -0
- /package/src/{prompts → cli/prompts}/tools/write.txt +0 -0
- /package/src/{agent → core/agent}/index.ts +0 -0
- /package/src/{agent → core/agent}/types.ts +0 -0
- /package/src/{memory → core/memory}/import-resolver.test.ts +0 -0
- /package/src/{memory → core/memory}/import-resolver.ts +0 -0
- /package/src/{memory → core/memory}/index.ts +0 -0
- /package/src/{memory → core/memory}/init-prompt.ts +0 -0
- /package/src/{memory → core/memory}/memory-manager.test.ts +0 -0
- /package/src/{memory → core/memory}/rules-parser.test.ts +0 -0
- /package/src/{memory → core/memory}/rules-parser.ts +0 -0
- /package/src/{memory → core/memory}/test-utils.ts +0 -0
- /package/src/{memory → core/memory}/types.ts +0 -0
- /package/src/{permissions → core/permissions}/audit.ts +0 -0
- /package/src/{permissions → core/permissions}/index.ts +0 -0
- /package/src/{permissions → core/permissions}/manager.test.ts +0 -0
- /package/src/{permissions → core/permissions}/manager.ts +0 -0
- /package/src/{permissions → core/permissions}/persistence.test.ts +0 -0
- /package/src/{permissions → core/permissions}/persistence.ts +0 -0
- /package/src/{permissions → core/permissions}/prompt-matcher.test.ts +0 -0
- /package/src/{permissions → core/permissions}/prompt-matcher.ts +0 -0
- /package/src/{permissions → core/permissions}/types.ts +0 -0
- /package/src/{pricing → core/pricing}/calculator.ts +0 -0
- /package/src/{pricing → core/pricing}/index.ts +0 -0
- /package/src/{pricing → core/pricing}/models.ts +0 -0
- /package/src/{pricing → core/pricing}/types.ts +0 -0
- /package/src/{providers → core/providers}/anthropic.ts +0 -0
- /package/src/{providers → core/providers}/openai.ts +0 -0
- /package/src/{providers → core/providers}/search/brave.ts +0 -0
- /package/src/{providers → core/providers}/search/index.ts +0 -0
- /package/src/{providers → core/providers}/search/serper.ts +0 -0
- /package/src/{providers → core/providers}/search/types.ts +0 -0
- /package/src/{providers → core/providers}/store.ts +0 -0
- /package/src/{providers → core/providers}/types.ts +0 -0
- /package/src/{checkpointing → core/session/checkpointing}/checkpoint-manager.ts +0 -0
- /package/src/{checkpointing → core/session/checkpointing}/index.ts +0 -0
- /package/src/{checkpointing → core/session/checkpointing}/types.ts +0 -0
- /package/src/{session → core/session}/compression/engine.ts +0 -0
- /package/src/{session → core/session}/compression/index.ts +0 -0
- /package/src/{session → core/session}/compression/types.ts +0 -0
- /package/src/{input → core/session/input}/history-manager.ts +0 -0
- /package/src/{input → core/session/input}/index.ts +0 -0
- /package/src/{tools → core/tools}/utils/ssrf.ts +0 -0
|
@@ -0,0 +1,1050 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent - Core agent implementation with tool loop and session support
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { LLMProvider, Message, ToolResultContent, Provider, AuthMethod } from '../providers/types.js';
|
|
6
|
+
import { createProvider, inferProvider, inferAuthMethod } from '../providers/index.js';
|
|
7
|
+
import { ToolRegistry, createDefaultRegistry } from '../tools/index.js';
|
|
8
|
+
import {
|
|
9
|
+
PermissionManager,
|
|
10
|
+
type ApprovalAction,
|
|
11
|
+
type ApprovalSuggestion,
|
|
12
|
+
type PromptPermission,
|
|
13
|
+
type PermissionSettings,
|
|
14
|
+
} from '../permissions/index.js';
|
|
15
|
+
import { SessionManager } from '../session/index.js';
|
|
16
|
+
import { MemoryManager, type LoadedMemory } from '../memory/index.js';
|
|
17
|
+
import type { AgentConfig, AgentEvent } from './types.js';
|
|
18
|
+
import { buildSystemPromptWithPlanMode, debugPromptLoading } from '../../cli/prompts/index.js';
|
|
19
|
+
import type { Question, QuestionAnswer } from '../tools/types.js';
|
|
20
|
+
import {
|
|
21
|
+
getPlanModeManager,
|
|
22
|
+
type PlanModeManager,
|
|
23
|
+
type ModeType,
|
|
24
|
+
type AllowedPrompt,
|
|
25
|
+
} from '../../cli/planning/index.js';
|
|
26
|
+
import { initCheckpointManager } from '../session/checkpointing/index.js';
|
|
27
|
+
import { HooksManager } from '../../ext/hooks/index.js';
|
|
28
|
+
import type { HooksConfig } from '../../ext/hooks/index.js';
|
|
29
|
+
import { CommandManager } from '../../ext/commands/manager.js';
|
|
30
|
+
import type { ParsedCommand } from '../../ext/commands/types.js';
|
|
31
|
+
|
|
32
|
+
// Type for askUser callback
|
|
33
|
+
export type AskUserCallback = (questions: Question[]) => Promise<QuestionAnswer[]>;
|
|
34
|
+
|
|
35
|
+
export class Agent {
|
|
36
|
+
private provider: LLMProvider;
|
|
37
|
+
private registry: ToolRegistry | null = null; // Lazy-initialized for async skill discovery
|
|
38
|
+
private registryPromise: Promise<ToolRegistry> | null = null; // Mutex for registry initialization
|
|
39
|
+
private commandManager: CommandManager | null = null; // Lazy-initialized for async command discovery
|
|
40
|
+
private commandManagerPromise: Promise<CommandManager> | null = null; // Mutex for command manager initialization
|
|
41
|
+
private permissions: PermissionManager;
|
|
42
|
+
private sessionManager: SessionManager;
|
|
43
|
+
private memoryManager: MemoryManager;
|
|
44
|
+
private planModeManager: PlanModeManager;
|
|
45
|
+
private hooksManager: HooksManager;
|
|
46
|
+
private config: AgentConfig;
|
|
47
|
+
private sessionId: string | null = null;
|
|
48
|
+
private loadedMemory: LoadedMemory | null = null;
|
|
49
|
+
private askUserCallback: AskUserCallback | null = null;
|
|
50
|
+
private askPermissionCallback: ((request: import('../tools/types.js').PermissionRequest) => Promise<ApprovalAction | undefined>) | null = null;
|
|
51
|
+
|
|
52
|
+
constructor(config: AgentConfig) {
|
|
53
|
+
this.config = {
|
|
54
|
+
maxTurns: 10,
|
|
55
|
+
cwd: process.cwd(),
|
|
56
|
+
...config,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
this.provider = createProvider({
|
|
60
|
+
provider: config.provider,
|
|
61
|
+
authMethod: config.authMethod,
|
|
62
|
+
});
|
|
63
|
+
// Registry is now initialized lazily in ensureRegistry()
|
|
64
|
+
this.permissions = new PermissionManager({
|
|
65
|
+
config: config.permissions,
|
|
66
|
+
projectPath: config.cwd,
|
|
67
|
+
});
|
|
68
|
+
this.sessionManager = new SessionManager({
|
|
69
|
+
compression: config.compression,
|
|
70
|
+
});
|
|
71
|
+
this.memoryManager = new MemoryManager();
|
|
72
|
+
this.planModeManager = getPlanModeManager();
|
|
73
|
+
this.hooksManager = new HooksManager();
|
|
74
|
+
|
|
75
|
+
// Set compression engine with current model
|
|
76
|
+
this.sessionManager.setCompressionEngine(this.provider, this.config.model);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Ensure tool registry is initialized (lazy loading for async skill discovery)
|
|
81
|
+
* Thread-safe: Prevents concurrent initialization using a mutex
|
|
82
|
+
*/
|
|
83
|
+
private async ensureRegistry(): Promise<ToolRegistry> {
|
|
84
|
+
// If already initialized, return immediately
|
|
85
|
+
if (this.registry) {
|
|
86
|
+
return this.registry;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// If initialization is in progress, wait for it
|
|
90
|
+
if (this.registryPromise) {
|
|
91
|
+
return this.registryPromise;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Start new initialization
|
|
95
|
+
this.registryPromise = createDefaultRegistry(this.config.cwd ?? process.cwd());
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
this.registry = await this.registryPromise;
|
|
99
|
+
return this.registry;
|
|
100
|
+
} finally {
|
|
101
|
+
// Clear the promise after initialization completes
|
|
102
|
+
this.registryPromise = null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Ensure command manager is initialized (lazy loading for async command discovery)
|
|
108
|
+
* Thread-safe: Prevents concurrent initialization using a mutex
|
|
109
|
+
*/
|
|
110
|
+
private async ensureCommandManager(): Promise<CommandManager> {
|
|
111
|
+
// If already initialized, return immediately
|
|
112
|
+
if (this.commandManager) {
|
|
113
|
+
return this.commandManager;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// If initialization is in progress, wait for it
|
|
117
|
+
if (this.commandManagerPromise) {
|
|
118
|
+
return this.commandManagerPromise;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Start new initialization
|
|
122
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
123
|
+
this.commandManagerPromise = (async () => {
|
|
124
|
+
const manager = new CommandManager(cwd);
|
|
125
|
+
await manager.initialize();
|
|
126
|
+
return manager;
|
|
127
|
+
})();
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
this.commandManager = await this.commandManagerPromise;
|
|
131
|
+
return this.commandManager;
|
|
132
|
+
} finally {
|
|
133
|
+
// Clear the promise after initialization completes
|
|
134
|
+
this.commandManagerPromise = null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Initialize permission system (load persisted rules)
|
|
140
|
+
*/
|
|
141
|
+
async initializePermissions(settings?: PermissionSettings): Promise<void> {
|
|
142
|
+
await this.permissions.initialize(settings);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Initialize hooks system (load hooks configuration)
|
|
147
|
+
*/
|
|
148
|
+
initializeHooks(hooksConfig?: HooksConfig): void {
|
|
149
|
+
if (hooksConfig) {
|
|
150
|
+
this.hooksManager.setConfig(hooksConfig);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Set simple permission confirmation callback (backward compatible)
|
|
156
|
+
*/
|
|
157
|
+
setConfirmCallback(callback: (tool: string, input: unknown) => Promise<boolean>): void {
|
|
158
|
+
this.permissions.setSimpleConfirmCallback(callback);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Set enhanced permission confirmation callback with approval options
|
|
163
|
+
*/
|
|
164
|
+
setEnhancedConfirmCallback(
|
|
165
|
+
callback: (
|
|
166
|
+
tool: string,
|
|
167
|
+
input: unknown,
|
|
168
|
+
suggestions: ApprovalSuggestion[]
|
|
169
|
+
) => Promise<ApprovalAction>
|
|
170
|
+
): void {
|
|
171
|
+
this.permissions.setConfirmCallback(callback);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Add prompt-based permissions (Claude Code ExitPlanMode style)
|
|
176
|
+
*/
|
|
177
|
+
addAllowedPrompts(prompts: PromptPermission[]): void {
|
|
178
|
+
this.permissions.addAllowedPrompts(prompts);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Clear prompt-based permissions
|
|
183
|
+
*/
|
|
184
|
+
clearAllowedPrompts(): void {
|
|
185
|
+
this.permissions.clearAllowedPrompts();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Set callback to save permission rules to settings
|
|
190
|
+
* This enables saving rules to settings.local.json instead of permissions.json
|
|
191
|
+
*/
|
|
192
|
+
setSaveRuleCallback(callback: (tool: string, pattern?: string) => Promise<void>): void {
|
|
193
|
+
this.permissions.setSaveRuleCallback(callback);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get permission manager for direct access
|
|
198
|
+
*/
|
|
199
|
+
getPermissionManager(): PermissionManager {
|
|
200
|
+
return this.permissions;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Set callback for AskUserQuestion tool
|
|
205
|
+
* This allows the CLI to handle user questioning
|
|
206
|
+
*/
|
|
207
|
+
setAskUserCallback(callback: AskUserCallback): void {
|
|
208
|
+
this.askUserCallback = callback;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Set callback for tools to request permission with metadata (e.g., diff preview)
|
|
213
|
+
* This allows tools like Edit to show rich previews before execution
|
|
214
|
+
*/
|
|
215
|
+
setAskPermissionCallback(
|
|
216
|
+
callback: (request: import('../tools/types.js').PermissionRequest) => Promise<ApprovalAction | undefined>
|
|
217
|
+
): void {
|
|
218
|
+
this.askPermissionCallback = callback;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Get memory manager for direct access
|
|
223
|
+
*/
|
|
224
|
+
getMemoryManager(): MemoryManager {
|
|
225
|
+
return this.memoryManager;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Get loaded memory (null if not loaded yet)
|
|
230
|
+
*/
|
|
231
|
+
getLoadedMemory(): LoadedMemory | null {
|
|
232
|
+
return this.loadedMemory;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Load memory for the current working directory
|
|
237
|
+
*/
|
|
238
|
+
async loadMemory(): Promise<LoadedMemory> {
|
|
239
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
240
|
+
|
|
241
|
+
// Determine memory merge strategy (priority: env var > config > default)
|
|
242
|
+
const envStrategy = process.env.GEN_MEMORY_STRATEGY as
|
|
243
|
+
| 'fallback'
|
|
244
|
+
| 'both'
|
|
245
|
+
| 'gen-only'
|
|
246
|
+
| 'claude-only'
|
|
247
|
+
| undefined;
|
|
248
|
+
const strategy =
|
|
249
|
+
envStrategy ?? this.config.memoryMergeStrategy ?? 'fallback';
|
|
250
|
+
|
|
251
|
+
this.loadedMemory = await this.memoryManager.load({ cwd, strategy });
|
|
252
|
+
|
|
253
|
+
// Log verbose summary if verbose mode is enabled
|
|
254
|
+
if (this.config.verbose) {
|
|
255
|
+
console.log(this.memoryManager.getVerboseSummary(strategy));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return this.loadedMemory;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// ============================================================================
|
|
262
|
+
// Plan Mode
|
|
263
|
+
// ============================================================================
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Get plan mode manager for external access
|
|
267
|
+
*/
|
|
268
|
+
getPlanModeManager(): PlanModeManager {
|
|
269
|
+
return this.planModeManager;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Check if plan mode is active
|
|
274
|
+
*/
|
|
275
|
+
isPlanModeActive(): boolean {
|
|
276
|
+
return this.planModeManager.isActive();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Get current mode (build or plan)
|
|
281
|
+
*/
|
|
282
|
+
getCurrentMode(): ModeType {
|
|
283
|
+
return this.planModeManager.getCurrentMode();
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Enter plan mode programmatically
|
|
288
|
+
*/
|
|
289
|
+
async enterPlanMode(taskDescription?: string): Promise<string> {
|
|
290
|
+
const { createPlanFile } = await import('../../cli/planning/index.js');
|
|
291
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
292
|
+
const planFile = await createPlanFile(cwd, taskDescription);
|
|
293
|
+
this.planModeManager.enter(planFile.path, taskDescription);
|
|
294
|
+
return planFile.path;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Exit plan mode
|
|
299
|
+
*/
|
|
300
|
+
exitPlanMode(approved: boolean = false): void {
|
|
301
|
+
if (approved) {
|
|
302
|
+
// Add allowed prompts from plan mode to permissions
|
|
303
|
+
const allowedPrompts = this.planModeManager.getRequestedPermissions();
|
|
304
|
+
if (allowedPrompts.length > 0) {
|
|
305
|
+
this.permissions.addAllowedPrompts(allowedPrompts);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
this.planModeManager.exit(approved);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Toggle plan mode
|
|
313
|
+
*/
|
|
314
|
+
async togglePlanMode(): Promise<void> {
|
|
315
|
+
if (this.planModeManager.isActive()) {
|
|
316
|
+
this.planModeManager.exit(false);
|
|
317
|
+
} else {
|
|
318
|
+
await this.enterPlanMode();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Get plan mode requested permissions
|
|
324
|
+
*/
|
|
325
|
+
getPlanModePermissions(): AllowedPrompt[] {
|
|
326
|
+
return this.planModeManager.getRequestedPermissions();
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// ============================================================================
|
|
330
|
+
// Session Management
|
|
331
|
+
// ============================================================================
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Get current session ID
|
|
335
|
+
*/
|
|
336
|
+
getSessionId(): string | null {
|
|
337
|
+
return this.sessionId;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get session manager for external access
|
|
342
|
+
*/
|
|
343
|
+
getSessionManager(): SessionManager {
|
|
344
|
+
return this.sessionManager;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Set the model to use (auto-switches provider if needed)
|
|
349
|
+
* @param model Model ID to use
|
|
350
|
+
* @param provider Optional: explicit provider (otherwise inferred from model name)
|
|
351
|
+
* @param authMethod Optional: explicit auth method (otherwise inferred or use current)
|
|
352
|
+
*/
|
|
353
|
+
setModel(model: string, provider?: string, authMethod?: string): void {
|
|
354
|
+
this.config.model = model;
|
|
355
|
+
|
|
356
|
+
// Determine new provider and authMethod
|
|
357
|
+
const newProvider = (provider as Provider | undefined) ?? inferProvider(model);
|
|
358
|
+
const newAuthMethod = (authMethod as AuthMethod | undefined) ??
|
|
359
|
+
inferAuthMethod(model) ??
|
|
360
|
+
this.config.authMethod;
|
|
361
|
+
|
|
362
|
+
// Recreate provider if either provider or authMethod changed
|
|
363
|
+
const providerChanged = newProvider !== this.config.provider;
|
|
364
|
+
const authMethodChanged = newAuthMethod !== this.config.authMethod;
|
|
365
|
+
|
|
366
|
+
if (providerChanged || authMethodChanged) {
|
|
367
|
+
this.config.provider = newProvider;
|
|
368
|
+
this.config.authMethod = newAuthMethod;
|
|
369
|
+
this.provider = createProvider({
|
|
370
|
+
provider: newProvider,
|
|
371
|
+
authMethod: newAuthMethod,
|
|
372
|
+
});
|
|
373
|
+
// Update compression engine with new provider and model
|
|
374
|
+
this.sessionManager.setCompressionEngine(this.provider, model);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Get current model
|
|
380
|
+
*/
|
|
381
|
+
getModel(): string {
|
|
382
|
+
return this.config.model;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Get current provider
|
|
387
|
+
*/
|
|
388
|
+
getProvider(): Provider {
|
|
389
|
+
return this.config.provider;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Get model information for compression
|
|
394
|
+
*/
|
|
395
|
+
getModelInfo(): { contextWindow: number; outputLimit?: number } {
|
|
396
|
+
// Try to get from provider if available
|
|
397
|
+
if (this.provider.getModelInfo) {
|
|
398
|
+
const info = this.provider.getModelInfo(this.config.model);
|
|
399
|
+
if (info.contextWindow) {
|
|
400
|
+
return { contextWindow: info.contextWindow, outputLimit: info.outputLimit };
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Fallback: rough estimates based on model name
|
|
405
|
+
// These should eventually be moved to provider implementations
|
|
406
|
+
const model = this.config.model.toLowerCase();
|
|
407
|
+
|
|
408
|
+
if (model.includes('claude')) {
|
|
409
|
+
return { contextWindow: 200_000, outputLimit: 8192 };
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
if (model.includes('gpt-4') || model.includes('gpt-3.5')) {
|
|
413
|
+
return { contextWindow: 128_000, outputLimit: 4096 };
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (model.includes('gemini')) {
|
|
417
|
+
return { contextWindow: 1_000_000, outputLimit: 8192 };
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Default fallback
|
|
421
|
+
return { contextWindow: 128_000, outputLimit: 4096 };
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* List available models from the provider API
|
|
426
|
+
*/
|
|
427
|
+
async listModels(): Promise<{ id: string; name: string }[]> {
|
|
428
|
+
return this.provider.listModels();
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Start a new session
|
|
433
|
+
*/
|
|
434
|
+
async startSession(title?: string): Promise<string> {
|
|
435
|
+
const session = await this.sessionManager.create({
|
|
436
|
+
provider: this.config.provider,
|
|
437
|
+
model: this.config.model,
|
|
438
|
+
cwd: this.config.cwd,
|
|
439
|
+
title,
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
this.sessionId = session.metadata.id;
|
|
443
|
+
|
|
444
|
+
// Initialize checkpoint manager for this session
|
|
445
|
+
initCheckpointManager(this.sessionId);
|
|
446
|
+
|
|
447
|
+
// Trigger SessionStart hooks
|
|
448
|
+
await this.hooksManager.trigger('SessionStart', {
|
|
449
|
+
event: 'SessionStart',
|
|
450
|
+
cwd: this.config.cwd ?? process.cwd(),
|
|
451
|
+
sessionId: this.sessionId,
|
|
452
|
+
timestamp: new Date(),
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
return this.sessionId;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Resume an existing session
|
|
460
|
+
*/
|
|
461
|
+
async resumeSession(sessionId: string): Promise<boolean> {
|
|
462
|
+
const session = await this.sessionManager.load(sessionId);
|
|
463
|
+
if (!session) {
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
this.sessionId = session.metadata.id;
|
|
468
|
+
|
|
469
|
+
// CheckpointManager already restored by SessionManager.load()
|
|
470
|
+
// No need to call initCheckpointManager again
|
|
471
|
+
|
|
472
|
+
// Trigger SessionStart hooks (for resumed sessions)
|
|
473
|
+
await this.hooksManager.trigger('SessionStart', {
|
|
474
|
+
event: 'SessionStart',
|
|
475
|
+
cwd: this.config.cwd ?? process.cwd(),
|
|
476
|
+
sessionId: this.sessionId,
|
|
477
|
+
timestamp: new Date(),
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Resume the most recent session
|
|
485
|
+
*/
|
|
486
|
+
async resumeLatest(): Promise<boolean> {
|
|
487
|
+
const session = await this.sessionManager.resumeLatest();
|
|
488
|
+
if (!session) {
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
this.sessionId = session.metadata.id;
|
|
493
|
+
|
|
494
|
+
// CheckpointManager already restored by SessionManager.load()
|
|
495
|
+
// No need to call initCheckpointManager again
|
|
496
|
+
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Fork current session
|
|
502
|
+
*/
|
|
503
|
+
async forkSession(title?: string): Promise<string | null> {
|
|
504
|
+
if (!this.sessionId) {
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const forked = await this.sessionManager.fork(this.sessionId, title);
|
|
509
|
+
this.sessionId = forked.metadata.id;
|
|
510
|
+
|
|
511
|
+
return this.sessionId;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* List all sessions
|
|
516
|
+
*/
|
|
517
|
+
async listSessions() {
|
|
518
|
+
return this.sessionManager.list();
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Delete a session
|
|
523
|
+
*/
|
|
524
|
+
async deleteSession(sessionId: string): Promise<boolean> {
|
|
525
|
+
return this.sessionManager.delete(sessionId);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Save current session
|
|
530
|
+
*/
|
|
531
|
+
async saveSession(): Promise<void> {
|
|
532
|
+
const current = this.sessionManager.getCurrent();
|
|
533
|
+
if (current) {
|
|
534
|
+
await this.sessionManager.save(current);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Run a single query through the agent
|
|
540
|
+
*/
|
|
541
|
+
async *run(prompt: string, signal?: AbortSignal): AsyncGenerator<AgentEvent, void, unknown> {
|
|
542
|
+
// Check for abort before starting
|
|
543
|
+
if (signal?.aborted) {
|
|
544
|
+
yield { type: 'error', error: new Error('Operation cancelled') };
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Auto-create session if none exists
|
|
549
|
+
try {
|
|
550
|
+
if (!this.sessionId) {
|
|
551
|
+
await this.startSession();
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// Load memory if not already loaded
|
|
555
|
+
if (!this.loadedMemory) {
|
|
556
|
+
await this.loadMemory();
|
|
557
|
+
}
|
|
558
|
+
} catch (error) {
|
|
559
|
+
yield {
|
|
560
|
+
type: 'error',
|
|
561
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
562
|
+
};
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// ============================================================================
|
|
567
|
+
// COMMAND DETECTION AND EXPANSION
|
|
568
|
+
// ============================================================================
|
|
569
|
+
let actualPrompt = prompt;
|
|
570
|
+
let parsedCommand: ParsedCommand | null = null;
|
|
571
|
+
|
|
572
|
+
// Check if input starts with / (command syntax)
|
|
573
|
+
if (prompt.trim().startsWith('/')) {
|
|
574
|
+
try {
|
|
575
|
+
const commandManager = await this.ensureCommandManager();
|
|
576
|
+
|
|
577
|
+
// Parse command: /name args
|
|
578
|
+
const trimmed = prompt.trim().slice(1); // Remove leading /
|
|
579
|
+
const firstSpaceIndex = trimmed.indexOf(' ');
|
|
580
|
+
const commandName = firstSpaceIndex === -1 ? trimmed : trimmed.slice(0, firstSpaceIndex);
|
|
581
|
+
const args = firstSpaceIndex === -1 ? '' : trimmed.slice(firstSpaceIndex + 1);
|
|
582
|
+
|
|
583
|
+
// Try to parse the command
|
|
584
|
+
parsedCommand = await commandManager.parseCommand(commandName, args);
|
|
585
|
+
|
|
586
|
+
if (parsedCommand) {
|
|
587
|
+
// Replace prompt with wrapped expanded template (Claude Code style)
|
|
588
|
+
// XML tags help LLM understand this is a command template, not user prose
|
|
589
|
+
actualPrompt = `<command-expansion name="${commandName}">
|
|
590
|
+
${parsedCommand.expandedPrompt}
|
|
591
|
+
</command-expansion>
|
|
592
|
+
|
|
593
|
+
Follow the instructions in the command above.`;
|
|
594
|
+
|
|
595
|
+
// Apply pre-authorized tools (add to permission manager)
|
|
596
|
+
if (parsedCommand.preAuthorizedTools.length > 0) {
|
|
597
|
+
for (const toolPattern of parsedCommand.preAuthorizedTools) {
|
|
598
|
+
this.permissions.addAllowedPrompts([{
|
|
599
|
+
tool: 'Bash',
|
|
600
|
+
prompt: toolPattern,
|
|
601
|
+
}]);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
// Apply model override if specified
|
|
606
|
+
if (parsedCommand.modelOverride) {
|
|
607
|
+
this.config.model = parsedCommand.modelOverride;
|
|
608
|
+
// Recreate provider with new model if needed
|
|
609
|
+
// (In practice, model is just passed to API calls, no need to recreate)
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// Yield event to show command was recognized
|
|
613
|
+
// Include <command-running> tag to prevent LLM from re-invoking the same command
|
|
614
|
+
yield {
|
|
615
|
+
type: 'text',
|
|
616
|
+
text: `<command-running>${commandName}</command-running>\n[Command: /${commandName}${args ? ' ' + args : ''}]\n\n`,
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
// If command not found, continue with original prompt (LLM will handle it)
|
|
620
|
+
} catch (error) {
|
|
621
|
+
// Command parsing failed, continue with original prompt
|
|
622
|
+
console.warn('Command parsing failed:', error);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Add user message (with expanded prompt if command was parsed)
|
|
627
|
+
const userMessage: Message = { role: 'user', content: actualPrompt };
|
|
628
|
+
try {
|
|
629
|
+
await this.sessionManager.addMessage(userMessage, this.getModelInfo());
|
|
630
|
+
} catch (error) {
|
|
631
|
+
yield {
|
|
632
|
+
type: 'error',
|
|
633
|
+
error: new Error(`Failed to save user message: ${error instanceof Error ? error.message : String(error)}`)
|
|
634
|
+
};
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
let turns = 0;
|
|
639
|
+
const maxTurns = this.config.maxTurns ?? 10;
|
|
640
|
+
|
|
641
|
+
while (turns < maxTurns) {
|
|
642
|
+
turns++;
|
|
643
|
+
|
|
644
|
+
// Ensure tool registry is initialized (lazy loading)
|
|
645
|
+
const registry = await this.ensureRegistry();
|
|
646
|
+
|
|
647
|
+
// Get tool definitions (filtered by plan mode if active)
|
|
648
|
+
const toolDefs = registry.getFilteredDefinitions(this.config.tools);
|
|
649
|
+
|
|
650
|
+
// Call LLM
|
|
651
|
+
let response;
|
|
652
|
+
const processingStartTime = Date.now();
|
|
653
|
+
// Determine if streaming is enabled
|
|
654
|
+
const useStreaming = process.env.GEN_STREAM === '1' || this.config.streaming;
|
|
655
|
+
|
|
656
|
+
try {
|
|
657
|
+
// Debug prompt loading (enabled with GEN_DEBUG_PROMPTS=1 or =2)
|
|
658
|
+
debugPromptLoading(
|
|
659
|
+
this.config.model,
|
|
660
|
+
this.config.provider,
|
|
661
|
+
this.planModeManager.isActive(),
|
|
662
|
+
this.planModeManager.getPlanFilePath() ?? undefined
|
|
663
|
+
);
|
|
664
|
+
|
|
665
|
+
// Build system prompt based on model → provider → prompt flow
|
|
666
|
+
// Looks up provider from ~/.gencode/providers.json, falls back to config.provider
|
|
667
|
+
// Includes plan mode instructions if plan mode is active
|
|
668
|
+
const systemPrompt =
|
|
669
|
+
this.config.systemPrompt ??
|
|
670
|
+
buildSystemPromptWithPlanMode(
|
|
671
|
+
this.config.model,
|
|
672
|
+
this.config.cwd ?? process.cwd(),
|
|
673
|
+
true, // Assume git repo for now
|
|
674
|
+
this.loadedMemory?.context,
|
|
675
|
+
this.config.provider, // Fallback provider if model lookup fails
|
|
676
|
+
this.planModeManager.isActive(), // Plan mode active flag
|
|
677
|
+
this.planModeManager.getPlanFilePath() ?? undefined // Plan file path
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
if (useStreaming) {
|
|
681
|
+
// === STREAMING PATH ===
|
|
682
|
+
// Build response incrementally from stream chunks
|
|
683
|
+
const responseBuilder = {
|
|
684
|
+
content: [] as Array<{ type: 'text'; text: string } | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }>,
|
|
685
|
+
textBuffer: '',
|
|
686
|
+
toolCalls: new Map<string, { id: string; name: string; inputBuffer: string }>(),
|
|
687
|
+
stopReason: 'end_turn' as 'end_turn' | 'max_tokens' | 'tool_use' | 'stop_sequence',
|
|
688
|
+
usage: undefined as { inputTokens: number; outputTokens: number } | undefined,
|
|
689
|
+
cost: undefined as { inputCost: number; outputCost: number; totalCost: number; currency: string } | undefined,
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
// Process stream chunks
|
|
693
|
+
for await (const chunk of this.provider.stream({
|
|
694
|
+
model: this.config.model,
|
|
695
|
+
messages: this.sessionManager.getMessagesForLLM(),
|
|
696
|
+
tools: toolDefs,
|
|
697
|
+
systemPrompt,
|
|
698
|
+
maxTokens: 4096,
|
|
699
|
+
signal, // Pass abort signal for cancellation
|
|
700
|
+
})) {
|
|
701
|
+
// Check for abort
|
|
702
|
+
if (signal?.aborted) {
|
|
703
|
+
yield { type: 'error', error: new Error('Operation cancelled by user') };
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
switch (chunk.type) {
|
|
707
|
+
case 'text':
|
|
708
|
+
// Accumulate text and yield immediately for real-time display
|
|
709
|
+
responseBuilder.textBuffer += chunk.text;
|
|
710
|
+
yield { type: 'text', text: chunk.text };
|
|
711
|
+
break;
|
|
712
|
+
|
|
713
|
+
case 'reasoning':
|
|
714
|
+
// Forward reasoning content (o1/o3/Gemini 3+ thinking)
|
|
715
|
+
yield { type: 'reasoning_delta', text: chunk.text };
|
|
716
|
+
break;
|
|
717
|
+
|
|
718
|
+
case 'tool_start':
|
|
719
|
+
// Initialize tool call tracking
|
|
720
|
+
responseBuilder.toolCalls.set(chunk.id, {
|
|
721
|
+
id: chunk.id,
|
|
722
|
+
name: chunk.name,
|
|
723
|
+
inputBuffer: '',
|
|
724
|
+
});
|
|
725
|
+
break;
|
|
726
|
+
|
|
727
|
+
case 'tool_input':
|
|
728
|
+
// Accumulate incremental JSON input and forward delta
|
|
729
|
+
const tool = responseBuilder.toolCalls.get(chunk.id);
|
|
730
|
+
if (tool) {
|
|
731
|
+
tool.inputBuffer += chunk.input;
|
|
732
|
+
// Emit incremental tool input for progressive display
|
|
733
|
+
yield { type: 'tool_input_delta', id: chunk.id, delta: chunk.input };
|
|
734
|
+
}
|
|
735
|
+
break;
|
|
736
|
+
|
|
737
|
+
case 'done':
|
|
738
|
+
// Save final metadata
|
|
739
|
+
responseBuilder.stopReason = chunk.response.stopReason;
|
|
740
|
+
responseBuilder.usage = chunk.response.usage;
|
|
741
|
+
responseBuilder.cost = chunk.response.cost;
|
|
742
|
+
break;
|
|
743
|
+
|
|
744
|
+
case 'error':
|
|
745
|
+
yield { type: 'error', error: chunk.error };
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// Build complete response from accumulated data
|
|
751
|
+
if (responseBuilder.textBuffer) {
|
|
752
|
+
responseBuilder.content.push({
|
|
753
|
+
type: 'text',
|
|
754
|
+
text: responseBuilder.textBuffer,
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
for (const [_id, tool] of responseBuilder.toolCalls) {
|
|
759
|
+
try {
|
|
760
|
+
responseBuilder.content.push({
|
|
761
|
+
type: 'tool_use',
|
|
762
|
+
id: tool.id,
|
|
763
|
+
name: tool.name,
|
|
764
|
+
input: JSON.parse(tool.inputBuffer || '{}'),
|
|
765
|
+
});
|
|
766
|
+
} catch (error) {
|
|
767
|
+
// If JSON parsing fails, treat as malformed tool call
|
|
768
|
+
yield {
|
|
769
|
+
type: 'error',
|
|
770
|
+
error: new Error(`Failed to parse tool input for ${tool.name}: ${error instanceof Error ? error.message : String(error)}`),
|
|
771
|
+
};
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
response = {
|
|
777
|
+
content: responseBuilder.content,
|
|
778
|
+
stopReason: responseBuilder.stopReason,
|
|
779
|
+
usage: responseBuilder.usage,
|
|
780
|
+
cost: responseBuilder.cost,
|
|
781
|
+
};
|
|
782
|
+
|
|
783
|
+
} else {
|
|
784
|
+
// === TRADITIONAL PATH (COMPLETE) ===
|
|
785
|
+
response = await this.provider.complete({
|
|
786
|
+
model: this.config.model,
|
|
787
|
+
messages: this.sessionManager.getMessagesForLLM(),
|
|
788
|
+
tools: toolDefs,
|
|
789
|
+
systemPrompt,
|
|
790
|
+
maxTokens: 4096,
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
} catch (error) {
|
|
794
|
+
yield { type: 'error', error: error as Error };
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
// Validate response completeness
|
|
799
|
+
if (!response || !response.content) {
|
|
800
|
+
yield {
|
|
801
|
+
type: 'error',
|
|
802
|
+
error: new Error('Provider returned null or undefined response')
|
|
803
|
+
};
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
// Validate content is not empty (excluding max_tokens case)
|
|
808
|
+
if (response.content.length === 0 && response.stopReason !== 'max_tokens') {
|
|
809
|
+
yield {
|
|
810
|
+
type: 'error',
|
|
811
|
+
error: new Error(
|
|
812
|
+
`Provider returned empty content (stopReason: ${response.stopReason}, ` +
|
|
813
|
+
`usage: ${JSON.stringify(response.usage)})`
|
|
814
|
+
)
|
|
815
|
+
};
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Process response content
|
|
820
|
+
const toolCalls: Array<{ id: string; name: string; input: Record<string, unknown> }> = [];
|
|
821
|
+
let textContent = '';
|
|
822
|
+
|
|
823
|
+
for (const content of response.content) {
|
|
824
|
+
if (content.type === 'text') {
|
|
825
|
+
textContent += content.text;
|
|
826
|
+
// Only yield text if not in streaming mode (streaming already yielded chunks)
|
|
827
|
+
if (!useStreaming) {
|
|
828
|
+
yield { type: 'text', text: content.text };
|
|
829
|
+
}
|
|
830
|
+
} else if (content.type === 'tool_use') {
|
|
831
|
+
toolCalls.push({ id: content.id, name: content.name, input: content.input });
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
// Add assistant message and check if done
|
|
836
|
+
try {
|
|
837
|
+
await this.sessionManager.addMessage(
|
|
838
|
+
{ role: 'assistant', content: response.content },
|
|
839
|
+
this.getModelInfo()
|
|
840
|
+
);
|
|
841
|
+
} catch (error) {
|
|
842
|
+
yield {
|
|
843
|
+
type: 'error',
|
|
844
|
+
error: new Error(`Failed to save assistant message: ${error instanceof Error ? error.message : String(error)}`)
|
|
845
|
+
};
|
|
846
|
+
return;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
if (response.stopReason !== 'tool_use' || toolCalls.length === 0) {
|
|
850
|
+
yield { type: 'done', text: textContent, usage: response.usage, cost: response.cost };
|
|
851
|
+
|
|
852
|
+
// Save completion metadata for UI restoration
|
|
853
|
+
if (response.usage || response.cost) {
|
|
854
|
+
const current = this.sessionManager.getCurrent();
|
|
855
|
+
if (current) {
|
|
856
|
+
if (!current.metadata.completions) {
|
|
857
|
+
current.metadata.completions = [];
|
|
858
|
+
}
|
|
859
|
+
current.metadata.completions.push({
|
|
860
|
+
afterMessageIndex: current.messages.length - 1,
|
|
861
|
+
durationMs: Date.now() - processingStartTime,
|
|
862
|
+
usage: response.usage ? {
|
|
863
|
+
inputTokens: response.usage.inputTokens,
|
|
864
|
+
outputTokens: response.usage.outputTokens,
|
|
865
|
+
} : undefined,
|
|
866
|
+
cost: response.cost,
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// Trigger Stop hooks when conversation ends
|
|
872
|
+
await this.hooksManager.trigger('Stop', {
|
|
873
|
+
event: 'Stop',
|
|
874
|
+
cwd: this.config.cwd ?? process.cwd(),
|
|
875
|
+
sessionId: this.sessionId ?? undefined,
|
|
876
|
+
timestamp: new Date(),
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
// Execute tool calls
|
|
883
|
+
const toolResults: ToolResultContent[] = [];
|
|
884
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
885
|
+
|
|
886
|
+
// Build tool context with askUser callback and current agent info
|
|
887
|
+
const toolContext = {
|
|
888
|
+
cwd,
|
|
889
|
+
askUser: this.askUserCallback ?? undefined,
|
|
890
|
+
askPermission: this.askPermissionCallback ?? undefined,
|
|
891
|
+
currentProvider: this.config.provider,
|
|
892
|
+
currentModel: this.config.model,
|
|
893
|
+
currentAuthMethod: this.config.authMethod,
|
|
894
|
+
};
|
|
895
|
+
|
|
896
|
+
for (const call of toolCalls) {
|
|
897
|
+
yield { type: 'tool_start', id: call.id, name: call.name, input: call.input };
|
|
898
|
+
|
|
899
|
+
// Trigger PreToolUse hooks
|
|
900
|
+
const preHookResults = await this.hooksManager.trigger('PreToolUse', {
|
|
901
|
+
event: 'PreToolUse',
|
|
902
|
+
cwd,
|
|
903
|
+
toolName: call.name,
|
|
904
|
+
toolInput: call.input as Record<string, unknown>,
|
|
905
|
+
sessionId: this.sessionId ?? undefined,
|
|
906
|
+
timestamp: new Date(),
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
// Check if any PreToolUse hook blocked the action
|
|
910
|
+
const preHookBlocked = preHookResults.some(r => r.blocked);
|
|
911
|
+
if (preHookBlocked) {
|
|
912
|
+
const blockingHook = preHookResults.find(r => r.blocked);
|
|
913
|
+
const result = {
|
|
914
|
+
success: false,
|
|
915
|
+
output: '',
|
|
916
|
+
error: `Blocked by PreToolUse hook: ${blockingHook?.error || 'Hook returned exit code 2'}`,
|
|
917
|
+
};
|
|
918
|
+
yield { type: 'tool_result', id: call.id, name: call.name, result };
|
|
919
|
+
toolResults.push({
|
|
920
|
+
type: 'tool_result',
|
|
921
|
+
toolUseId: call.id,
|
|
922
|
+
content: result.error,
|
|
923
|
+
isError: true,
|
|
924
|
+
});
|
|
925
|
+
continue; // Skip to next tool
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
try {
|
|
929
|
+
// Ensure tool registry is initialized
|
|
930
|
+
const registry = await this.ensureRegistry();
|
|
931
|
+
|
|
932
|
+
// Protect permission check and tool execution
|
|
933
|
+
const allowed = await this.permissions.requestPermission(call.name, call.input);
|
|
934
|
+
const result = allowed
|
|
935
|
+
? await registry.execute(call.name, call.input, toolContext)
|
|
936
|
+
: { success: false, output: '', error: 'Permission denied by user' };
|
|
937
|
+
|
|
938
|
+
yield { type: 'tool_result', id: call.id, name: call.name, result };
|
|
939
|
+
toolResults.push({
|
|
940
|
+
type: 'tool_result',
|
|
941
|
+
toolUseId: call.id,
|
|
942
|
+
content: result.success ? result.output : (result.error ?? 'Unknown error'),
|
|
943
|
+
isError: !result.success,
|
|
944
|
+
});
|
|
945
|
+
|
|
946
|
+
// Trigger PostToolUse or PostToolUseFailure hooks
|
|
947
|
+
const hookEvent = result.success ? 'PostToolUse' : 'PostToolUseFailure';
|
|
948
|
+
await this.hooksManager.trigger(hookEvent, {
|
|
949
|
+
event: hookEvent,
|
|
950
|
+
cwd,
|
|
951
|
+
toolName: call.name,
|
|
952
|
+
toolInput: call.input as Record<string, unknown>,
|
|
953
|
+
toolResult: result,
|
|
954
|
+
sessionId: this.sessionId ?? undefined,
|
|
955
|
+
timestamp: new Date(),
|
|
956
|
+
});
|
|
957
|
+
} catch (error) {
|
|
958
|
+
// Catch permission check or tool execution errors
|
|
959
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
960
|
+
const errorResult = {
|
|
961
|
+
success: false,
|
|
962
|
+
output: '',
|
|
963
|
+
error: `Tool execution error: ${errorMsg}`
|
|
964
|
+
};
|
|
965
|
+
yield { type: 'tool_result', id: call.id, name: call.name, result: errorResult };
|
|
966
|
+
toolResults.push({
|
|
967
|
+
type: 'tool_result',
|
|
968
|
+
toolUseId: call.id,
|
|
969
|
+
content: errorMsg,
|
|
970
|
+
isError: true,
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
// Trigger PostToolUseFailure hooks
|
|
974
|
+
await this.hooksManager.trigger('PostToolUseFailure', {
|
|
975
|
+
event: 'PostToolUseFailure',
|
|
976
|
+
cwd,
|
|
977
|
+
toolName: call.name,
|
|
978
|
+
toolInput: call.input as Record<string, unknown>,
|
|
979
|
+
toolResult: errorResult,
|
|
980
|
+
sessionId: this.sessionId ?? undefined,
|
|
981
|
+
timestamp: new Date(),
|
|
982
|
+
});
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
// Add tool results as user message
|
|
987
|
+
try {
|
|
988
|
+
await this.sessionManager.addMessage(
|
|
989
|
+
{ role: 'user', content: toolResults },
|
|
990
|
+
this.getModelInfo()
|
|
991
|
+
);
|
|
992
|
+
} catch (error) {
|
|
993
|
+
yield {
|
|
994
|
+
type: 'error',
|
|
995
|
+
error: new Error(`Failed to save tool results: ${error instanceof Error ? error.message : String(error)}`)
|
|
996
|
+
};
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
yield { type: 'error', error: new Error(`Max turns (${maxTurns}) exceeded`) };
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* Clear conversation history
|
|
1006
|
+
*/
|
|
1007
|
+
clearHistory(): void {
|
|
1008
|
+
this.sessionManager.clearMessages();
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
/**
|
|
1012
|
+
* Clean up incomplete tool use messages (after interruption)
|
|
1013
|
+
* Removes the last assistant message if it contains tool_use without corresponding tool_result
|
|
1014
|
+
*/
|
|
1015
|
+
cleanupIncompleteMessages(): void {
|
|
1016
|
+
const messages = this.sessionManager.getMessages();
|
|
1017
|
+
if (messages.length === 0) return;
|
|
1018
|
+
|
|
1019
|
+
const lastMessage = messages[messages.length - 1];
|
|
1020
|
+
|
|
1021
|
+
// Check if last message is an assistant message with tool_use
|
|
1022
|
+
if (lastMessage.role === 'assistant' && Array.isArray(lastMessage.content)) {
|
|
1023
|
+
const hasToolUse = lastMessage.content.some((c) => c.type === 'tool_use');
|
|
1024
|
+
|
|
1025
|
+
if (hasToolUse) {
|
|
1026
|
+
// Remove the incomplete assistant message from session manager
|
|
1027
|
+
this.sessionManager.removeLastMessage();
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
/**
|
|
1033
|
+
* Get conversation history
|
|
1034
|
+
*/
|
|
1035
|
+
getHistory(): Message[] {
|
|
1036
|
+
return this.sessionManager.getMessages();
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
/**
|
|
1040
|
+
* Get compression statistics
|
|
1041
|
+
*/
|
|
1042
|
+
getCompressionStats(): {
|
|
1043
|
+
totalMessages: number;
|
|
1044
|
+
activeMessages: number;
|
|
1045
|
+
summaryCount: number;
|
|
1046
|
+
compressionRatio: number;
|
|
1047
|
+
} | null {
|
|
1048
|
+
return this.sessionManager.getCompressionStats();
|
|
1049
|
+
}
|
|
1050
|
+
}
|