@qduc/term2 0.7.1 → 0.7.3
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/dist/agent.d.ts +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +17 -1
- package/dist/agent.js.map +1 -1
- package/dist/agent.test.js +36 -0
- package/dist/agent.test.js.map +1 -1
- package/dist/app.d.ts +3 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +193 -86
- package/dist/app.js.map +1 -1
- package/dist/app.large-uncached-warning.test.js.map +1 -1
- package/dist/cli.integration.test.js +101 -5
- package/dist/cli.integration.test.js.map +1 -1
- package/dist/cli.js +61 -12
- package/dist/cli.js.map +1 -1
- package/dist/components/ApprovalPrompt.ask-user.test.d.ts +2 -0
- package/dist/components/ApprovalPrompt.ask-user.test.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.ask-user.test.js +108 -0
- package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +4 -4
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +76 -13
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.d.ts +11 -2
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +20 -6
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/BottomArea.test.js +37 -4
- package/dist/components/BottomArea.test.js.map +1 -1
- package/dist/components/Common/MenuContainer.d.ts +3 -4
- package/dist/components/Common/MenuContainer.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.js +14 -14
- package/dist/components/Common/MenuContainer.js.map +1 -1
- package/dist/components/Common/MenuContainer.test.d.ts +2 -0
- package/dist/components/Common/MenuContainer.test.d.ts.map +1 -0
- package/dist/components/Common/MenuContainer.test.js +66 -0
- package/dist/components/Common/MenuContainer.test.js.map +1 -0
- package/dist/components/Input/PopupManager.d.ts +14 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +6 -4
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/input-width.d.ts +2 -1
- package/dist/components/Input/input-width.d.ts.map +1 -1
- package/dist/components/Input/input-width.js +6 -2
- package/dist/components/Input/input-width.js.map +1 -1
- package/dist/components/Input/popup-props.d.ts +3 -1
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +12 -1
- package/dist/components/Input/popup-props.js.map +1 -1
- package/dist/components/Input/popup-props.test.js +9 -0
- package/dist/components/Input/popup-props.test.js.map +1 -1
- package/dist/components/InputBox.d.ts +8 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +97 -33
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.test.js +174 -7
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts +10 -0
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/LargeUncachedConfirmationPrompt.js +49 -0
- package/dist/components/LargeUncachedConfirmationPrompt.js.map +1 -0
- package/dist/components/LargeUncachedConfirmationPrompt.test.d.ts +2 -0
- package/dist/components/LargeUncachedConfirmationPrompt.test.d.ts.map +1 -0
- package/dist/components/LargeUncachedConfirmationPrompt.test.js +48 -0
- package/dist/components/LargeUncachedConfirmationPrompt.test.js.map +1 -0
- package/dist/components/MessageList.d.ts +10 -0
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +34 -3
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +54 -1
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.debug.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.debug.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.js +1 -4
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.d.ts +1 -0
- package/dist/components/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/PathSelectionMenu.js +11 -15
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.test.d.ts +2 -0
- package/dist/components/PathSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/PathSelectionMenu.test.js +17 -0
- package/dist/components/PathSelectionMenu.test.js.map +1 -0
- package/dist/components/ProviderSelectionMenu.d.ts +15 -0
- package/dist/components/ProviderSelectionMenu.d.ts.map +1 -0
- package/dist/components/ProviderSelectionMenu.js +172 -0
- package/dist/components/ProviderSelectionMenu.js.map +1 -0
- package/dist/components/ProviderSelectionMenu.test.d.ts +2 -0
- package/dist/components/ProviderSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/ProviderSelectionMenu.test.js +97 -0
- package/dist/components/ProviderSelectionMenu.test.js.map +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +1 -12
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.d.ts +2 -1
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.js +12 -13
- package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/StatusBar.d.ts +1 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +21 -15
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.js +23 -4
- package/dist/components/StatusBar.test.js.map +1 -1
- package/dist/components/UndoSelectionMenu.d.ts.map +1 -1
- package/dist/components/UndoSelectionMenu.js +1 -1
- package/dist/components/UndoSelectionMenu.js.map +1 -1
- package/dist/context/InputContext.d.ts +6 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.images.test.d.ts +2 -0
- package/dist/context/InputContext.images.test.d.ts.map +1 -0
- package/dist/context/InputContext.images.test.js +56 -0
- package/dist/context/InputContext.images.test.js.map +1 -0
- package/dist/context/InputContext.js +3 -2
- package/dist/context/InputContext.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +2 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +11 -2
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +2 -0
- package/dist/hooks/use-app-commands.test.js.map +1 -1
- package/dist/hooks/use-conversation.clear.test.js +31 -0
- package/dist/hooks/use-conversation.clear.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +12 -2
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +36 -5
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-conversation.resume.test.js +26 -3
- package/dist/hooks/use-conversation.resume.test.js.map +1 -1
- package/dist/hooks/use-escape-key.d.ts +12 -3
- package/dist/hooks/use-escape-key.d.ts.map +1 -1
- package/dist/hooks/use-escape-key.js +25 -11
- package/dist/hooks/use-escape-key.js.map +1 -1
- package/dist/hooks/use-escape-key.test.js +154 -14
- package/dist/hooks/use-escape-key.test.js.map +1 -1
- package/dist/hooks/use-mode-handlers.d.ts +13 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +22 -1
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-mode-handlers.test.d.ts +2 -0
- package/dist/hooks/use-mode-handlers.test.d.ts.map +1 -0
- package/dist/hooks/use-mode-handlers.test.js +119 -0
- package/dist/hooks/use-mode-handlers.test.js.map +1 -0
- package/dist/hooks/use-path-completion.d.ts +10 -3
- package/dist/hooks/use-path-completion.d.ts.map +1 -1
- package/dist/hooks/use-path-completion.js +53 -9
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +66 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/hooks/use-provider-selection.d.ts +60 -0
- package/dist/hooks/use-provider-selection.d.ts.map +1 -0
- package/dist/hooks/use-provider-selection.js +767 -0
- package/dist/hooks/use-provider-selection.js.map +1 -0
- package/dist/hooks/use-provider-selection.test.d.ts +2 -0
- package/dist/hooks/use-provider-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-provider-selection.test.js +793 -0
- package/dist/hooks/use-provider-selection.test.js.map +1 -0
- package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
- package/dist/hooks/use-runtime-settings.js +2 -2
- package/dist/hooks/use-runtime-settings.js.map +1 -1
- package/dist/hooks/use-selection.d.ts +3 -1
- package/dist/hooks/use-selection.d.ts.map +1 -1
- package/dist/hooks/use-selection.js +115 -24
- package/dist/hooks/use-selection.js.map +1 -1
- package/dist/hooks/use-selection.test.js +96 -2
- package/dist/hooks/use-selection.test.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +8 -1
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +4 -0
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +3 -0
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +140 -18
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +71 -1
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
- package/dist/hooks/use-terminal-width.d.ts +2 -1
- package/dist/hooks/use-terminal-width.d.ts.map +1 -1
- package/dist/hooks/use-terminal-width.js +2 -1
- package/dist/hooks/use-terminal-width.js.map +1 -1
- package/dist/hooks/use-trigger-detection.d.ts +4 -2
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +42 -8
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/hooks/use-trigger-detection.test.js +2 -1
- package/dist/hooks/use-trigger-detection.test.js.map +1 -1
- package/dist/inspect_zod.d.ts +2 -0
- package/dist/inspect_zod.d.ts.map +1 -0
- package/dist/inspect_zod.js +16 -0
- package/dist/inspect_zod.js.map +1 -0
- package/dist/lib/openai-agent-client.chat.test.js +8 -0
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +11 -6
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +241 -37
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +326 -23
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +62 -0
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- package/dist/lib/tool-execution-limiter.d.ts +16 -0
- package/dist/lib/tool-execution-limiter.d.ts.map +1 -0
- package/dist/lib/tool-execution-limiter.js +112 -0
- package/dist/lib/tool-execution-limiter.js.map +1 -0
- package/dist/lib/tool-execution-limiter.test.d.ts +2 -0
- package/dist/lib/tool-execution-limiter.test.d.ts.map +1 -0
- package/dist/lib/tool-execution-limiter.test.js +70 -0
- package/dist/lib/tool-execution-limiter.test.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +27 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +124 -95
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +92 -30
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/non-interactive.d.ts +2 -1
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +10 -2
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/gpt-5-modern.md +105 -91
- package/dist/prompts/gpt-5.5.md +106 -0
- package/dist/prompts/gpt-5.md +7 -4
- package/dist/prompts/orchestrator.md +27 -44
- package/dist/prompts/plan-mode-info.md +2 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +8 -0
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.js +13 -0
- package/dist/prompts/prompt-constructor.test.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +16 -0
- package/dist/prompts/prompt-constructor.ts +10 -0
- package/dist/prompts/prompt-profiles.js +1 -1
- package/dist/prompts/prompt-profiles.js.map +1 -1
- package/dist/prompts/prompt-profiles.ts +1 -1
- package/dist/prompts/prompt-selector.test.js +1 -1
- package/dist/prompts/prompt-selector.test.js.map +1 -1
- package/dist/prompts/prompt-selector.test.ts +1 -1
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +17 -1
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.js +21 -0
- package/dist/prompts/subagent-delegation.test.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +26 -0
- package/dist/prompts/subagent-delegation.ts +17 -1
- package/dist/prompts/subagents/base-anthropic.md +3 -0
- package/dist/prompts/subagents/base-codex.md +3 -0
- package/dist/prompts/subagents/base-gpt-5-modern.md +3 -0
- package/dist/prompts/subagents/base-simple.md +3 -0
- package/dist/prompts/subagents/explorer.md +8 -10
- package/dist/prompts/subagents/researcher.md +2 -1
- package/dist/prompts/subagents/worker.md +12 -3
- package/dist/prompts/subagents/worktree-hygiene.md +6 -0
- package/dist/providers/ai-sdk-anthropic.provider.d.ts +4 -1
- package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-anthropic.provider.js +65 -22
- package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
- package/dist/providers/ai-sdk-anthropic.provider.test.js +24 -1
- package/dist/providers/ai-sdk-anthropic.provider.test.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +0 -2
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +4 -8
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js +1 -119
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/anthropic-middleware.d.ts +25 -0
- package/dist/providers/anthropic-middleware.d.ts.map +1 -0
- package/dist/providers/anthropic-middleware.js +32 -0
- package/dist/providers/anthropic-middleware.js.map +1 -0
- package/dist/providers/anthropic-middleware.test.d.ts +2 -0
- package/dist/providers/anthropic-middleware.test.d.ts.map +1 -0
- package/dist/providers/anthropic-middleware.test.js +142 -0
- package/dist/providers/anthropic-middleware.test.js.map +1 -0
- package/dist/providers/codex-responses-model.d.ts +1 -0
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +97 -34
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-responses-model.test.js +158 -0
- package/dist/providers/codex-responses-model.test.js.map +1 -1
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +16 -9
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/codex.provider.test.js +2 -1
- package/dist/providers/codex.provider.test.js.map +1 -1
- package/dist/providers/custom-provider-adapter.test.js +6 -2
- package/dist/providers/custom-provider-adapter.test.js.map +1 -1
- package/dist/providers/fallback-responses-model.d.ts +3 -1
- package/dist/providers/fallback-responses-model.d.ts.map +1 -1
- package/dist/providers/fallback-responses-model.js +31 -4
- package/dist/providers/fallback-responses-model.js.map +1 -1
- package/dist/providers/fallback-responses-model.test.js +65 -8
- package/dist/providers/fallback-responses-model.test.js.map +1 -1
- package/dist/providers/fetch/composer.d.ts +1 -0
- package/dist/providers/fetch/composer.d.ts.map +1 -1
- package/dist/providers/fetch/composer.js +1 -0
- package/dist/providers/fetch/composer.js.map +1 -1
- package/dist/providers/fetch/composer.test.js +58 -17
- package/dist/providers/fetch/composer.test.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +3 -2
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +5 -2
- package/dist/providers/fetch/logging-middleware.js.map +1 -1
- package/dist/providers/openai-compatible-behavior-gate.test.js +1 -42
- package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
- package/dist/providers/openai-compatible-lazy.d.ts +4 -0
- package/dist/providers/openai-compatible-lazy.d.ts.map +1 -0
- package/dist/providers/openai-compatible-lazy.js +55 -0
- package/dist/providers/openai-compatible-lazy.js.map +1 -0
- package/dist/providers/openai-compatible-middleware.d.ts +5 -2
- package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
- package/dist/providers/openai-compatible-middleware.js +8 -11
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +5 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +59 -37
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-compatible.provider.test.js +97 -2
- package/dist/providers/openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/openai.provider.d.ts +8 -1
- package/dist/providers/openai.provider.d.ts.map +1 -1
- package/dist/providers/openai.provider.js +43 -10
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openai.provider.test.d.ts +2 -0
- package/dist/providers/openai.provider.test.d.ts.map +1 -0
- package/dist/providers/openai.provider.test.js +59 -0
- package/dist/providers/openai.provider.test.js.map +1 -0
- package/dist/providers/opencode-routing.d.ts +4 -0
- package/dist/providers/opencode-routing.d.ts.map +1 -0
- package/dist/providers/opencode-routing.js +14 -0
- package/dist/providers/opencode-routing.js.map +1 -0
- package/dist/providers/opencode-session.d.ts +19 -0
- package/dist/providers/opencode-session.d.ts.map +1 -0
- package/dist/providers/opencode-session.js +76 -0
- package/dist/providers/opencode-session.js.map +1 -0
- package/dist/providers/opencode.provider.d.ts +0 -8
- package/dist/providers/opencode.provider.d.ts.map +1 -1
- package/dist/providers/opencode.provider.js +0 -32
- package/dist/providers/opencode.provider.js.map +1 -1
- package/dist/providers/opencode.provider.test.d.ts +2 -0
- package/dist/providers/opencode.provider.test.d.ts.map +1 -0
- package/dist/providers/opencode.provider.test.js +186 -0
- package/dist/providers/opencode.provider.test.js.map +1 -0
- package/dist/providers/openrouter.provider.createRunner.test.js +5 -0
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
- package/dist/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/providers/openrouter.provider.js +8 -4
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/registry.d.ts +3 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/registry.test.js +1 -0
- package/dist/providers/registry.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/runner.js +4 -0
- package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
- package/dist/services/conversation-integration.test.js +8 -4
- package/dist/services/conversation-integration.test.js.map +1 -1
- package/dist/services/conversation-log-events.d.ts +3 -0
- package/dist/services/conversation-log-events.d.ts.map +1 -1
- package/dist/services/conversation-log-events.js.map +1 -1
- package/dist/services/conversation-log-writer.d.ts.map +1 -1
- package/dist/services/conversation-log-writer.js +1 -2
- package/dist/services/conversation-log-writer.js.map +1 -1
- package/dist/services/conversation-persistence.d.ts +1 -1
- package/dist/services/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation-persistence.js +53 -4
- package/dist/services/conversation-persistence.js.map +1 -1
- package/dist/services/conversation-persistence.test.js +203 -1
- package/dist/services/conversation-persistence.test.js.map +1 -1
- package/dist/services/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation-replay.js +114 -8
- package/dist/services/conversation-replay.js.map +1 -1
- package/dist/services/conversation-replay.test.js +368 -0
- package/dist/services/conversation-replay.test.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +9 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-service.d.ts +3 -1
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +3 -0
- package/dist/services/conversation-service.js.map +1 -1
- package/dist/services/conversation-session-reasoning.test.js +5 -1
- package/dist/services/conversation-session-reasoning.test.js.map +1 -1
- package/dist/services/conversation-session.auto-approval.test.js +25 -1
- package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
- package/dist/services/conversation-session.d.ts +8 -2
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +88 -44
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-store.merge-modes.test.d.ts.map +1 -1
- package/dist/services/conversation-store.merge-modes.test.js +160 -1
- package/dist/services/conversation-store.merge-modes.test.js.map +1 -1
- package/dist/services/file-service.d.ts +20 -4
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +111 -52
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/file-service.test.d.ts +2 -0
- package/dist/services/file-service.test.d.ts.map +1 -0
- package/dist/services/file-service.test.js +60 -0
- package/dist/services/file-service.test.js.map +1 -0
- package/dist/services/large-uncached-input-guard.d.ts.map +1 -1
- package/dist/services/large-uncached-input-guard.js +4 -3
- package/dist/services/large-uncached-input-guard.js.map +1 -1
- package/dist/services/large-uncached-input-guard.test.js +22 -0
- package/dist/services/large-uncached-input-guard.test.js.map +1 -1
- package/dist/services/logging-service.d.ts +0 -3
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +12 -8
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/mode-notices.d.ts +4 -5
- package/dist/services/mode-notices.d.ts.map +1 -1
- package/dist/services/mode-notices.js +4 -5
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/notification-service.d.ts +42 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +116 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/services/notification-service.test.d.ts +2 -0
- package/dist/services/notification-service.test.d.ts.map +1 -0
- package/dist/services/notification-service.test.js +151 -0
- package/dist/services/notification-service.test.js.map +1 -0
- package/dist/services/provider-traffic.d.ts +8 -9
- package/dist/services/provider-traffic.d.ts.map +1 -1
- package/dist/services/provider-traffic.js +25 -12
- package/dist/services/provider-traffic.js.map +1 -1
- package/dist/services/provider-traffic.test.js +102 -1
- package/dist/services/provider-traffic.test.js.map +1 -1
- package/dist/services/service-interfaces.d.ts +12 -16
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session-context-service.d.ts +8 -0
- package/dist/services/session-context-service.d.ts.map +1 -0
- package/dist/services/session-context-service.js +19 -0
- package/dist/services/session-context-service.js.map +1 -0
- package/dist/services/session-context-service.test.d.ts +2 -0
- package/dist/services/session-context-service.test.d.ts.map +1 -0
- package/dist/services/session-context-service.test.js +38 -0
- package/dist/services/session-context-service.test.js.map +1 -0
- package/dist/services/settings-env.d.ts.map +1 -1
- package/dist/services/settings-env.js +4 -1
- package/dist/services/settings-env.js.map +1 -1
- package/dist/services/settings-persistence.d.ts.map +1 -1
- package/dist/services/settings-persistence.js +0 -1
- package/dist/services/settings-persistence.js.map +1 -1
- package/dist/services/settings-persistence.test.js +2 -2
- package/dist/services/settings-persistence.test.js.map +1 -1
- package/dist/services/settings-schema.d.ts +25 -1
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +54 -23
- package/dist/services/settings-schema.js.map +1 -1
- package/dist/services/settings-schema.test.js +10 -0
- package/dist/services/settings-schema.test.js.map +1 -1
- package/dist/services/settings-service.d.ts +8 -0
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +60 -23
- package/dist/services/settings-service.js.map +1 -1
- package/dist/services/settings-sources.d.ts.map +1 -1
- package/dist/services/settings-sources.js +1 -0
- package/dist/services/settings-sources.js.map +1 -1
- package/dist/services/settings-sources.test.js +2 -0
- package/dist/services/settings-sources.test.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.d.ts +3 -2
- package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +3 -3
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.test.js +20 -0
- package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.d.ts +2 -1
- package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-resolver.js +2 -0
- package/dist/services/shell-auto-approval-resolver.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.test.js +10 -0
- package/dist/services/shell-auto-approval-resolver.test.js.map +1 -1
- package/dist/services/subagents/subagent-manager.d.ts +2 -1
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +182 -13
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-manager.test.js +548 -17
- package/dist/services/subagents/subagent-manager.test.js.map +1 -1
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +2 -2
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/ask-user-constants.d.ts +7 -0
- package/dist/tools/ask-user-constants.d.ts.map +1 -0
- package/dist/tools/ask-user-constants.js +7 -0
- package/dist/tools/ask-user-constants.js.map +1 -0
- package/dist/tools/ask-user.d.ts +11 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +56 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/ask-user.test.d.ts +2 -0
- package/dist/tools/ask-user.test.d.ts.map +1 -0
- package/dist/tools/ask-user.test.js +129 -0
- package/dist/tools/ask-user.test.js.map +1 -0
- package/dist/tools/code-context.js +1 -1
- package/dist/tools/code-context.js.map +1 -1
- package/dist/tools/code-context.test.js +278 -0
- package/dist/tools/code-context.test.js.map +1 -1
- package/dist/tools/format-helpers.d.ts +13 -0
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +34 -0
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/format-helpers.test.d.ts +2 -0
- package/dist/tools/format-helpers.test.d.ts.map +1 -0
- package/dist/tools/format-helpers.test.js +51 -0
- package/dist/tools/format-helpers.test.js.map +1 -0
- package/dist/tools/language-providers.d.ts.map +1 -1
- package/dist/tools/language-providers.js +379 -0
- package/dist/tools/language-providers.js.map +1 -1
- package/dist/tools/languages/cpp.d.ts +8 -0
- package/dist/tools/languages/cpp.d.ts.map +1 -0
- package/dist/tools/languages/cpp.js +306 -0
- package/dist/tools/languages/cpp.js.map +1 -0
- package/dist/tools/languages/csharp.d.ts +5 -0
- package/dist/tools/languages/csharp.d.ts.map +1 -0
- package/dist/tools/languages/csharp.js +225 -0
- package/dist/tools/languages/csharp.js.map +1 -0
- package/dist/tools/languages/go.d.ts +7 -0
- package/dist/tools/languages/go.d.ts.map +1 -0
- package/dist/tools/languages/go.js +223 -0
- package/dist/tools/languages/go.js.map +1 -0
- package/dist/tools/languages/index.d.ts +6 -0
- package/dist/tools/languages/index.d.ts.map +1 -0
- package/dist/tools/languages/index.js +32 -0
- package/dist/tools/languages/index.js.map +1 -0
- package/dist/tools/languages/java.d.ts +5 -0
- package/dist/tools/languages/java.d.ts.map +1 -0
- package/dist/tools/languages/java.js +183 -0
- package/dist/tools/languages/java.js.map +1 -0
- package/dist/tools/languages/json.d.ts +3 -0
- package/dist/tools/languages/json.d.ts.map +1 -0
- package/dist/tools/languages/json.js +40 -0
- package/dist/tools/languages/json.js.map +1 -0
- package/dist/tools/languages/php.d.ts +8 -0
- package/dist/tools/languages/php.d.ts.map +1 -0
- package/dist/tools/languages/php.js +139 -0
- package/dist/tools/languages/php.js.map +1 -0
- package/dist/tools/languages/python.d.ts +7 -0
- package/dist/tools/languages/python.d.ts.map +1 -0
- package/dist/tools/languages/python.js +189 -0
- package/dist/tools/languages/python.js.map +1 -0
- package/dist/tools/languages/ruby.d.ts +8 -0
- package/dist/tools/languages/ruby.d.ts.map +1 -0
- package/dist/tools/languages/ruby.js +94 -0
- package/dist/tools/languages/ruby.js.map +1 -0
- package/dist/tools/languages/rust.d.ts +7 -0
- package/dist/tools/languages/rust.d.ts.map +1 -0
- package/dist/tools/languages/rust.js +186 -0
- package/dist/tools/languages/rust.js.map +1 -0
- package/dist/tools/languages/types.d.ts +39 -0
- package/dist/tools/languages/types.d.ts.map +1 -0
- package/dist/tools/languages/types.js +2 -0
- package/dist/tools/languages/types.js.map +1 -0
- package/dist/tools/languages/typescript.d.ts +4 -0
- package/dist/tools/languages/typescript.d.ts.map +1 -0
- package/dist/tools/languages/typescript.js +94 -0
- package/dist/tools/languages/typescript.js.map +1 -0
- package/dist/tools/languages/utils.d.ts +14 -0
- package/dist/tools/languages/utils.d.ts.map +1 -0
- package/dist/tools/languages/utils.js +73 -0
- package/dist/tools/languages/utils.js.map +1 -0
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +2 -2
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +13 -1
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/tool-names.d.ts +1 -0
- package/dist/tools/tool-names.d.ts.map +1 -1
- package/dist/tools/tool-names.js +1 -0
- package/dist/tools/tool-names.js.map +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +1 -1
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +2 -35
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/command-safety/_scratch-classify.test.d.ts +2 -0
- package/dist/utils/command-safety/_scratch-classify.test.d.ts.map +1 -0
- package/dist/utils/command-safety/_scratch-classify.test.js +22 -0
- package/dist/utils/command-safety/_scratch-classify.test.js.map +1 -0
- package/dist/utils/command-safety/constants.d.ts.map +1 -1
- package/dist/utils/command-safety/constants.js +21 -0
- package/dist/utils/command-safety/constants.js.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.js +28 -2
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
- package/dist/utils/command-safety/path-analysis.js +6 -0
- package/dist/utils/command-safety/path-analysis.js.map +1 -1
- package/dist/utils/command-safety/scratch-classify.test.d.ts +2 -0
- package/dist/utils/command-safety/scratch-classify.test.d.ts.map +1 -0
- package/dist/utils/command-safety/scratch-classify.test.js +22 -0
- package/dist/utils/command-safety/scratch-classify.test.js.map +1 -0
- package/dist/utils/command-safety/scratch-tally.test.d.ts +2 -0
- package/dist/utils/command-safety/scratch-tally.test.d.ts.map +1 -0
- package/dist/utils/command-safety/scratch-tally.test.js +68 -0
- package/dist/utils/command-safety/scratch-tally.test.js.map +1 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.d.ts +2 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.d.ts.map +1 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.js +72 -0
- package/dist/utils/command-safety.evaluator-false-positives.test.js.map +1 -0
- package/dist/utils/header-sanitizer.d.ts +2 -0
- package/dist/utils/header-sanitizer.d.ts.map +1 -0
- package/dist/utils/header-sanitizer.js +38 -0
- package/dist/utils/header-sanitizer.js.map +1 -0
- package/dist/utils/header-sanitizer.test.d.ts +2 -0
- package/dist/utils/header-sanitizer.test.d.ts.map +1 -0
- package/dist/utils/header-sanitizer.test.js +56 -0
- package/dist/utils/header-sanitizer.test.js.map +1 -0
- package/dist/utils/home-directory-start-guard.d.ts +10 -0
- package/dist/utils/home-directory-start-guard.d.ts.map +1 -0
- package/dist/utils/home-directory-start-guard.js +20 -0
- package/dist/utils/home-directory-start-guard.js.map +1 -0
- package/dist/utils/home-directory-start-guard.test.d.ts +2 -0
- package/dist/utils/home-directory-start-guard.test.d.ts.map +1 -0
- package/dist/utils/home-directory-start-guard.test.js +40 -0
- package/dist/utils/home-directory-start-guard.test.js.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts +2 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.js +66 -0
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -0
- package/dist/utils/project-tree.d.ts +14 -0
- package/dist/utils/project-tree.d.ts.map +1 -0
- package/dist/utils/project-tree.js +111 -0
- package/dist/utils/project-tree.js.map +1 -0
- package/dist/utils/project-tree.test.d.ts +2 -0
- package/dist/utils/project-tree.test.d.ts.map +1 -0
- package/dist/utils/project-tree.test.js +149 -0
- package/dist/utils/project-tree.test.js.map +1 -0
- package/dist/utils/provider-traffic-extractor.d.ts +1 -0
- package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
- package/dist/utils/provider-traffic-extractor.js +1 -0
- package/dist/utils/provider-traffic-extractor.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.test.js +2 -0
- package/dist/utils/provider-traffic-extractor.test.js.map +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +11 -0
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/terminal-clear.d.ts +7 -0
- package/dist/utils/terminal-clear.d.ts.map +1 -0
- package/dist/utils/terminal-clear.js +5 -0
- package/dist/utils/terminal-clear.js.map +1 -0
- package/dist/utils/terminal-clear.test.d.ts +2 -0
- package/dist/utils/terminal-clear.test.d.ts.map +1 -0
- package/dist/utils/terminal-clear.test.js +13 -0
- package/dist/utils/terminal-clear.test.js.map +1 -0
- package/dist/utils/token-usage.d.ts +6 -2
- package/dist/utils/token-usage.d.ts.map +1 -1
- package/dist/utils/token-usage.js +11 -4
- package/dist/utils/token-usage.js.map +1 -1
- package/dist/utils/token-usage.test.js +15 -0
- package/dist/utils/token-usage.test.js.map +1 -1
- package/dist/utils/tty-osc.d.ts +27 -0
- package/dist/utils/tty-osc.d.ts.map +1 -0
- package/dist/utils/tty-osc.js +66 -0
- package/dist/utils/tty-osc.js.map +1 -0
- package/dist/utils/tty-osc.test.d.ts +2 -0
- package/dist/utils/tty-osc.test.d.ts.map +1 -0
- package/dist/utils/tty-osc.test.js +130 -0
- package/dist/utils/tty-osc.test.js.map +1 -0
- package/package.json +2 -2
- package/readme.md +2 -2
- package/dist/agent.lite-mode.test.d.ts +0 -2
- package/dist/agent.lite-mode.test.d.ts.map +0 -1
- package/dist/agent.lite-mode.test.js +0 -39
- package/dist/agent.lite-mode.test.js.map +0 -1
- package/dist/app.large-uncached-warning.test.js +0 -15
- package/dist/components/ApprovalPrompt.test.d.ts +0 -2
- package/dist/components/ApprovalPrompt.test.d.ts.map +0 -1
- package/dist/components/ApprovalPrompt.test.js +0 -23
- package/dist/components/ApprovalPrompt.test.js.map +0 -1
- package/dist/components/LiveResponse.test.d.ts +0 -2
- package/dist/components/LiveResponse.test.d.ts.map +0 -1
- package/dist/components/LiveResponse.test.js +0 -13
- package/dist/components/LiveResponse.test.js.map +0 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
- package/dist/components/TextInput.d.ts +0 -42
- package/dist/components/TextInput.d.ts.map +0 -1
- package/dist/components/TextInput.js +0 -398
- package/dist/components/TextInput.js.map +0 -1
- package/dist/components/TextInput.test.d.ts +0 -2
- package/dist/components/TextInput.test.d.ts.map +0 -1
- package/dist/components/TextInput.test.js +0 -75
- package/dist/components/TextInput.test.js.map +0 -1
- package/dist/debug_ask_mentor.d.ts +0 -2
- package/dist/debug_ask_mentor.d.ts.map +0 -1
- package/dist/debug_ask_mentor.js +0 -73
- package/dist/debug_ask_mentor.js.map +0 -1
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +0 -2
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +0 -1
- package/dist/hooks/use-conversation.max-turns-undo.test.js +0 -118
- package/dist/hooks/use-conversation.max-turns-undo.test.js.map +0 -1
- package/dist/lib/shell.d.ts +0 -7
- package/dist/lib/shell.d.ts.map +0 -1
- package/dist/lib/shell.js +0 -56
- package/dist/lib/shell.js.map +0 -1
- package/dist/modes/companion/command-index.d.ts +0 -26
- package/dist/modes/companion/command-index.d.ts.map +0 -1
- package/dist/modes/companion/command-index.js +0 -50
- package/dist/modes/companion/command-index.js.map +0 -1
- package/dist/modes/companion/command-index.test.d.ts +0 -2
- package/dist/modes/companion/command-index.test.d.ts.map +0 -1
- package/dist/modes/companion/command-index.test.js +0 -86
- package/dist/modes/companion/command-index.test.js.map +0 -1
- package/dist/modes/companion/companion-app.d.ts +0 -12
- package/dist/modes/companion/companion-app.d.ts.map +0 -1
- package/dist/modes/companion/companion-app.js +0 -297
- package/dist/modes/companion/companion-app.js.map +0 -1
- package/dist/modes/companion/companion-session.d.ts +0 -63
- package/dist/modes/companion/companion-session.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.js +0 -146
- package/dist/modes/companion/companion-session.js.map +0 -1
- package/dist/modes/companion/companion-session.test.d.ts +0 -2
- package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.test.js +0 -28
- package/dist/modes/companion/companion-session.test.js.map +0 -1
- package/dist/modes/companion/components/status-bar.d.ts +0 -13
- package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
- package/dist/modes/companion/components/status-bar.js +0 -26
- package/dist/modes/companion/components/status-bar.js.map +0 -1
- package/dist/modes/companion/context-buffer.d.ts +0 -65
- package/dist/modes/companion/context-buffer.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.js +0 -156
- package/dist/modes/companion/context-buffer.js.map +0 -1
- package/dist/modes/companion/context-buffer.test.d.ts +0 -2
- package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.test.js +0 -154
- package/dist/modes/companion/context-buffer.test.js.map +0 -1
- package/dist/modes/companion/event-detector.d.ts +0 -46
- package/dist/modes/companion/event-detector.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.js +0 -169
- package/dist/modes/companion/event-detector.js.map +0 -1
- package/dist/modes/companion/event-detector.test.d.ts +0 -2
- package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.test.js +0 -121
- package/dist/modes/companion/event-detector.test.js.map +0 -1
- package/dist/modes/companion/index.d.ts +0 -33
- package/dist/modes/companion/index.d.ts.map +0 -1
- package/dist/modes/companion/index.js +0 -21
- package/dist/modes/companion/index.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.d.ts +0 -3
- package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.js +0 -31
- package/dist/modes/companion/input-key-mapper.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.js +0 -26
- package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
- package/dist/modes/companion/input-parser.d.ts +0 -53
- package/dist/modes/companion/input-parser.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.js +0 -114
- package/dist/modes/companion/input-parser.js.map +0 -1
- package/dist/modes/companion/input-parser.test.d.ts +0 -2
- package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.test.js +0 -123
- package/dist/modes/companion/input-parser.test.js.map +0 -1
- package/dist/modes/companion/mode-manager.d.ts +0 -41
- package/dist/modes/companion/mode-manager.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.js +0 -56
- package/dist/modes/companion/mode-manager.js.map +0 -1
- package/dist/modes/companion/mode-manager.test.d.ts +0 -2
- package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.test.js +0 -65
- package/dist/modes/companion/mode-manager.test.js.map +0 -1
- package/dist/modes/companion/output-classifier.d.ts +0 -15
- package/dist/modes/companion/output-classifier.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.js +0 -77
- package/dist/modes/companion/output-classifier.js.map +0 -1
- package/dist/modes/companion/output-classifier.test.d.ts +0 -2
- package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.test.js +0 -133
- package/dist/modes/companion/output-classifier.test.js.map +0 -1
- package/dist/modes/companion/pty-wrapper.d.ts +0 -46
- package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
- package/dist/modes/companion/pty-wrapper.js +0 -143
- package/dist/modes/companion/pty-wrapper.js.map +0 -1
- package/dist/modes/companion/safety-classifier.d.ts +0 -31
- package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.js +0 -140
- package/dist/modes/companion/safety-classifier.js.map +0 -1
- package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
- package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.test.js +0 -151
- package/dist/modes/companion/safety-classifier.test.js.map +0 -1
- package/dist/modes/companion/summarizer.d.ts +0 -24
- package/dist/modes/companion/summarizer.d.ts.map +0 -1
- package/dist/modes/companion/summarizer.js +0 -132
- package/dist/modes/companion/summarizer.js.map +0 -1
- package/dist/modes/companion/terminal-history.d.ts +0 -27
- package/dist/modes/companion/terminal-history.d.ts.map +0 -1
- package/dist/modes/companion/terminal-history.js +0 -142
- package/dist/modes/companion/terminal-history.js.map +0 -1
- package/dist/prompts/simple-mentor.md +0 -215
- package/dist/providers/ai-sdk-openai.provider.d.ts +0 -14
- package/dist/providers/ai-sdk-openai.provider.d.ts.map +0 -1
- package/dist/providers/ai-sdk-openai.provider.js +0 -18
- package/dist/providers/ai-sdk-openai.provider.js.map +0 -1
- package/dist/providers/github-copilot/converters.d.ts +0 -45
- package/dist/providers/github-copilot/converters.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.js +0 -118
- package/dist/providers/github-copilot/converters.js.map +0 -1
- package/dist/providers/github-copilot/converters.test.d.ts +0 -2
- package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.test.js +0 -162
- package/dist/providers/github-copilot/converters.test.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
- package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
- package/dist/providers/github-copilot/index.d.ts +0 -4
- package/dist/providers/github-copilot/index.d.ts.map +0 -1
- package/dist/providers/github-copilot/index.js +0 -4
- package/dist/providers/github-copilot/index.js.map +0 -1
- package/dist/providers/github-copilot/model.d.ts +0 -24
- package/dist/providers/github-copilot/model.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.js +0 -15
- package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
- package/dist/providers/github-copilot/model.js +0 -498
- package/dist/providers/github-copilot/model.js.map +0 -1
- package/dist/providers/github-copilot/model.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.test.js +0 -63
- package/dist/providers/github-copilot/model.test.js.map +0 -1
- package/dist/providers/github-copilot/provider.d.ts +0 -15
- package/dist/providers/github-copilot/provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.js +0 -25
- package/dist/providers/github-copilot/provider.js.map +0 -1
- package/dist/providers/github-copilot/provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.test.js +0 -52
- package/dist/providers/github-copilot/provider.test.js.map +0 -1
- package/dist/providers/github-copilot/utils.d.ts +0 -20
- package/dist/providers/github-copilot/utils.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.js +0 -142
- package/dist/providers/github-copilot/utils.js.map +0 -1
- package/dist/providers/github-copilot/utils.test.d.ts +0 -2
- package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.test.js +0 -21
- package/dist/providers/github-copilot/utils.test.js.map +0 -1
- package/dist/providers/openai-compatible/api.d.ts +0 -17
- package/dist/providers/openai-compatible/api.d.ts.map +0 -1
- package/dist/providers/openai-compatible/api.js +0 -58
- package/dist/providers/openai-compatible/api.js.map +0 -1
- package/dist/providers/openai-compatible/model.d.ts +0 -17
- package/dist/providers/openai-compatible/model.d.ts.map +0 -1
- package/dist/providers/openai-compatible/model.js +0 -473
- package/dist/providers/openai-compatible/model.js.map +0 -1
- package/dist/providers/openai-compatible/provider.d.ts +0 -22
- package/dist/providers/openai-compatible/provider.d.ts.map +0 -1
- package/dist/providers/openai-compatible/provider.js +0 -43
- package/dist/providers/openai-compatible/provider.js.map +0 -1
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts +0 -2
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +0 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +0 -258
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +0 -1
- package/dist/providers/openai-compatible/utils.d.ts +0 -3
- package/dist/providers/openai-compatible/utils.d.ts.map +0 -1
- package/dist/providers/openai-compatible/utils.js +0 -11
- package/dist/providers/openai-compatible/utils.js.map +0 -1
- package/dist/providers/openrouter/api.d.ts +0 -39
- package/dist/providers/openrouter/api.d.ts.map +0 -1
- package/dist/providers/openrouter/api.js +0 -164
- package/dist/providers/openrouter/api.js.map +0 -1
- package/dist/providers/openrouter/converters.d.ts +0 -8
- package/dist/providers/openrouter/converters.d.ts.map +0 -1
- package/dist/providers/openrouter/converters.js +0 -391
- package/dist/providers/openrouter/converters.js.map +0 -1
- package/dist/providers/openrouter/converters.test.d.ts +0 -2
- package/dist/providers/openrouter/converters.test.d.ts.map +0 -1
- package/dist/providers/openrouter/converters.test.js +0 -179
- package/dist/providers/openrouter/converters.test.js.map +0 -1
- package/dist/providers/openrouter/index.d.ts +0 -4
- package/dist/providers/openrouter/index.d.ts.map +0 -1
- package/dist/providers/openrouter/index.js +0 -4
- package/dist/providers/openrouter/index.js.map +0 -1
- package/dist/providers/openrouter/model.d.ts +0 -14
- package/dist/providers/openrouter/model.d.ts.map +0 -1
- package/dist/providers/openrouter/model.js +0 -457
- package/dist/providers/openrouter/model.js.map +0 -1
- package/dist/providers/openrouter/provider.d.ts +0 -15
- package/dist/providers/openrouter/provider.d.ts.map +0 -1
- package/dist/providers/openrouter/provider.js +0 -21
- package/dist/providers/openrouter/provider.js.map +0 -1
- package/dist/providers/openrouter/reasoning-content.test.d.ts +0 -2
- package/dist/providers/openrouter/reasoning-content.test.d.ts.map +0 -1
- package/dist/providers/openrouter/reasoning-content.test.js +0 -122
- package/dist/providers/openrouter/reasoning-content.test.js.map +0 -1
- package/dist/providers/openrouter/utils.d.ts +0 -11
- package/dist/providers/openrouter/utils.d.ts.map +0 -1
- package/dist/providers/openrouter/utils.js +0 -29
- package/dist/providers/openrouter/utils.js.map +0 -1
- package/dist/providers/openrouter.api.retry.test.d.ts +0 -2
- package/dist/providers/openrouter.api.retry.test.d.ts.map +0 -1
- package/dist/providers/openrouter.api.retry.test.js +0 -148
- package/dist/providers/openrouter.api.retry.test.js.map +0 -1
- package/dist/providers/openrouter.test.d.ts +0 -2
- package/dist/providers/openrouter.test.d.ts.map +0 -1
- package/dist/providers/openrouter.test.js +0 -1449
- package/dist/providers/openrouter.test.js.map +0 -1
- package/dist/providers/protocol-client.d.ts +0 -17
- package/dist/providers/protocol-client.d.ts.map +0 -1
- package/dist/providers/protocol-client.js +0 -57
- package/dist/providers/protocol-client.js.map +0 -1
- package/dist/providers/protocol-client.test.d.ts +0 -2
- package/dist/providers/protocol-client.test.d.ts.map +0 -1
- package/dist/providers/protocol-client.test.js +0 -55
- package/dist/providers/protocol-client.test.js.map +0 -1
- package/dist/safety-checker.js +0 -57
- package/dist/services/check_mock.d.ts +0 -2
- package/dist/services/check_mock.d.ts.map +0 -1
- package/dist/services/check_mock.js +0 -22
- package/dist/services/check_mock.js.map +0 -1
- package/dist/services/conversation-service.test.d.ts +0 -2
- package/dist/services/conversation-service.test.d.ts.map +0 -1
- package/dist/services/conversation-service.test.js +0 -156
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/services/conversation-store.merge-modes.removed.d.ts +0 -2
- package/dist/services/conversation-store.merge-modes.removed.d.ts.map +0 -1
- package/dist/services/conversation-store.merge-modes.removed.js +0 -2
- package/dist/services/conversation-store.merge-modes.removed.js.map +0 -1
- package/dist/services/repro-error.test.d.ts +0 -2
- package/dist/services/repro-error.test.d.ts.map +0 -1
- package/dist/services/repro-error.test.js +0 -38
- package/dist/services/repro-error.test.js.map +0 -1
- package/dist/services/subagents/reasoning-inheritance.test.d.ts +0 -2
- package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +0 -1
- package/dist/services/subagents/reasoning-inheritance.test.js +0 -73
- package/dist/services/subagents/reasoning-inheritance.test.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -10
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -55
- package/dist/tools/bash.js.map +0 -1
- package/dist/utils/command-safety.d.ts +0 -21
- package/dist/utils/command-safety.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.d.ts +0 -2
- package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.js +0 -13
- package/dist/utils/command-safety.devnull.test.js.map +0 -1
- package/dist/utils/command-safety.js +0 -348
- package/dist/utils/command-safety.js.map +0 -1
- package/dist/utils/extract-command-messages.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
|
@@ -2,8 +2,20 @@ import test from 'ava';
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { ModelBehaviorError } from '@openai/agents';
|
|
5
|
-
import { SubagentManager } from './subagent-manager.js';
|
|
5
|
+
import { SubagentManager as RealSubagentManager } from './subagent-manager.js';
|
|
6
6
|
import { registerProvider } from '../../providers/registry.js';
|
|
7
|
+
const createSessionContextService = () => ({
|
|
8
|
+
runWithContext: (_context, fn) => fn(),
|
|
9
|
+
getContext: () => null,
|
|
10
|
+
});
|
|
11
|
+
const SubagentManager = class extends RealSubagentManager {
|
|
12
|
+
constructor(deps) {
|
|
13
|
+
super({
|
|
14
|
+
...deps,
|
|
15
|
+
sessionContextService: deps.sessionContextService ?? createSessionContextService(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
};
|
|
7
19
|
// ========== Mock Utilities ==========
|
|
8
20
|
function createMockLogger() {
|
|
9
21
|
return {
|
|
@@ -27,6 +39,9 @@ function createMockSettings(values = {}) {
|
|
|
27
39
|
},
|
|
28
40
|
};
|
|
29
41
|
}
|
|
42
|
+
function getAgentTool(agent, name) {
|
|
43
|
+
return agent.tools.find((tool) => tool.name === name);
|
|
44
|
+
}
|
|
30
45
|
// ========== Provider Mocks ==========
|
|
31
46
|
let mentorManagerRunnerCalls = [];
|
|
32
47
|
let mentorManagerResponseCounter = 0;
|
|
@@ -90,7 +105,11 @@ test.serial('run() returns failed result for unknown role', async (t) => {
|
|
|
90
105
|
'agent.model': 'mock-model',
|
|
91
106
|
'agent.provider': 'mock-mentor-manager',
|
|
92
107
|
});
|
|
93
|
-
const manager = new SubagentManager({
|
|
108
|
+
const manager = new SubagentManager({
|
|
109
|
+
logger: createMockLogger(),
|
|
110
|
+
settings,
|
|
111
|
+
sessionContextService: createSessionContextService(),
|
|
112
|
+
});
|
|
94
113
|
const result = await manager.run({ role: 'nonexistent-role-xyz', task: 'do something' });
|
|
95
114
|
t.is(result.status, 'failed');
|
|
96
115
|
t.truthy(result.error);
|
|
@@ -104,7 +123,11 @@ test.serial('run() with mentor role uses mentorModel setting', async (t) => {
|
|
|
104
123
|
'agent.mentorModel': 'mentor-model',
|
|
105
124
|
'agent.mentorProvider': 'mock-mentor-manager',
|
|
106
125
|
});
|
|
107
|
-
const manager = new SubagentManager({
|
|
126
|
+
const manager = new SubagentManager({
|
|
127
|
+
logger: createMockLogger(),
|
|
128
|
+
settings,
|
|
129
|
+
sessionContextService: createSessionContextService(),
|
|
130
|
+
});
|
|
108
131
|
const result = await manager.run({ role: 'mentor', task: 'advise me' });
|
|
109
132
|
t.is(result.status, 'completed');
|
|
110
133
|
t.is(result.role, 'mentor');
|
|
@@ -117,7 +140,11 @@ test.serial('run() with mentor role fails when mentorModel is not set', async (t
|
|
|
117
140
|
'agent.model': 'main-model',
|
|
118
141
|
'agent.provider': 'mock-mentor-manager',
|
|
119
142
|
});
|
|
120
|
-
const manager = new SubagentManager({
|
|
143
|
+
const manager = new SubagentManager({
|
|
144
|
+
logger: createMockLogger(),
|
|
145
|
+
settings,
|
|
146
|
+
sessionContextService: createSessionContextService(),
|
|
147
|
+
});
|
|
121
148
|
const result = await manager.run({ role: 'mentor', task: 'advise me' });
|
|
122
149
|
t.is(result.status, 'failed');
|
|
123
150
|
t.true(result.error.includes('Mentor model is not configured'));
|
|
@@ -129,7 +156,11 @@ test.serial('run() mentor maintains conversation history across calls', async (t
|
|
|
129
156
|
'agent.mentorModel': 'mentor-model',
|
|
130
157
|
'agent.mentorProvider': 'mock-mentor-manager',
|
|
131
158
|
});
|
|
132
|
-
const manager = new SubagentManager({
|
|
159
|
+
const manager = new SubagentManager({
|
|
160
|
+
logger: createMockLogger(),
|
|
161
|
+
settings,
|
|
162
|
+
sessionContextService: createSessionContextService(),
|
|
163
|
+
});
|
|
133
164
|
await manager.run({ role: 'mentor', task: 'first question' });
|
|
134
165
|
await manager.run({ role: 'mentor', task: 'second question' });
|
|
135
166
|
t.is(mentorManagerRunnerCalls.length, 2);
|
|
@@ -144,7 +175,11 @@ test.serial('resetMentorSession() clears conversation history', async (t) => {
|
|
|
144
175
|
'agent.mentorModel': 'mentor-model',
|
|
145
176
|
'agent.mentorProvider': 'mock-mentor-manager',
|
|
146
177
|
});
|
|
147
|
-
const manager = new SubagentManager({
|
|
178
|
+
const manager = new SubagentManager({
|
|
179
|
+
logger: createMockLogger(),
|
|
180
|
+
settings,
|
|
181
|
+
sessionContextService: createSessionContextService(),
|
|
182
|
+
});
|
|
148
183
|
await manager.run({ role: 'mentor', task: 'first question' });
|
|
149
184
|
t.true(mentorManagerRunnerCalls[0].input.length >= 1);
|
|
150
185
|
manager.resetMentorSession();
|
|
@@ -158,7 +193,11 @@ test.serial('run() with explorer role returns SubagentResult', async (t) => {
|
|
|
158
193
|
'agent.model': 'mock-model',
|
|
159
194
|
'agent.provider': 'mock-explorer-provider',
|
|
160
195
|
});
|
|
161
|
-
const manager = new SubagentManager({
|
|
196
|
+
const manager = new SubagentManager({
|
|
197
|
+
logger: createMockLogger(),
|
|
198
|
+
settings,
|
|
199
|
+
sessionContextService: createSessionContextService(),
|
|
200
|
+
});
|
|
162
201
|
const result = await manager.run({ role: 'explorer', task: 'find all TypeScript files' });
|
|
163
202
|
t.is(result.status, 'completed');
|
|
164
203
|
t.is(result.role, 'explorer');
|
|
@@ -171,7 +210,11 @@ test.serial('run() passes parent abort signal into the delegated provider run',
|
|
|
171
210
|
'agent.model': 'mock-model',
|
|
172
211
|
'agent.provider': 'mock-explorer-provider',
|
|
173
212
|
});
|
|
174
|
-
const manager = new SubagentManager({
|
|
213
|
+
const manager = new SubagentManager({
|
|
214
|
+
logger: createMockLogger(),
|
|
215
|
+
settings,
|
|
216
|
+
sessionContextService: createSessionContextService(),
|
|
217
|
+
});
|
|
175
218
|
const abortController = new AbortController();
|
|
176
219
|
await manager.run({
|
|
177
220
|
role: 'explorer',
|
|
@@ -200,7 +243,11 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
|
|
|
200
243
|
'agent.model': 'mock-model',
|
|
201
244
|
'agent.provider': 'mock-aborted-subagent-provider',
|
|
202
245
|
});
|
|
203
|
-
const manager = new SubagentManager({
|
|
246
|
+
const manager = new SubagentManager({
|
|
247
|
+
logger: createMockLogger(),
|
|
248
|
+
settings,
|
|
249
|
+
sessionContextService: createSessionContextService(),
|
|
250
|
+
});
|
|
204
251
|
const abortController = new AbortController();
|
|
205
252
|
const resultPromise = manager.run({
|
|
206
253
|
role: 'explorer',
|
|
@@ -212,12 +259,85 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
|
|
|
212
259
|
t.is(result.status, 'cancelled');
|
|
213
260
|
t.true(result.error?.includes('aborted') ?? false);
|
|
214
261
|
});
|
|
262
|
+
test.serial('explorer shell tool executes GREEN commands and blocks YELLOW and RED commands', async (t) => {
|
|
263
|
+
const settings = createMockSettings({
|
|
264
|
+
'agent.model': 'mock-model',
|
|
265
|
+
'agent.provider': 'mock-explorer-provider',
|
|
266
|
+
});
|
|
267
|
+
const manager = new SubagentManager({
|
|
268
|
+
logger: createMockLogger(),
|
|
269
|
+
settings,
|
|
270
|
+
sessionContextService: createSessionContextService(),
|
|
271
|
+
});
|
|
272
|
+
await manager.run({ role: 'explorer', task: 'inspect the workspace' });
|
|
273
|
+
t.is(explorerRunnerCalls.length, 1);
|
|
274
|
+
const agent = explorerRunnerCalls[0].agent;
|
|
275
|
+
const shell = getAgentTool(agent, 'shell');
|
|
276
|
+
t.truthy(shell);
|
|
277
|
+
t.is(await shell.needsApproval({}, { command: 'pwd' }), false);
|
|
278
|
+
const invokeShell = async (command) => shell.invoke({}, JSON.stringify({ command }), {});
|
|
279
|
+
const blockedPrefix = 'Error: command blocked - explorer can only run read-only (GREEN) shell commands. Command: ';
|
|
280
|
+
for (const command of ['pwd', 'ls', 'cat package.json', 'git status', 'git log --oneline']) {
|
|
281
|
+
const output = await invokeShell(command);
|
|
282
|
+
t.true(output.includes('exit 0'), `expected GREEN command to execute: ${command}`);
|
|
283
|
+
t.false(output.startsWith(blockedPrefix), `expected GREEN command to not be blocked: ${command}`);
|
|
284
|
+
}
|
|
285
|
+
for (const command of ['touch blocked.txt', 'npm test', 'unknown_tool_name', 'cat ../outside.txt']) {
|
|
286
|
+
const output = await invokeShell(command);
|
|
287
|
+
t.true(output.startsWith(blockedPrefix), `expected YELLOW command to be blocked: ${command}`);
|
|
288
|
+
t.true(output.includes(command), `blocked output should mention the command: ${command}`);
|
|
289
|
+
}
|
|
290
|
+
for (const command of ['rm -rf x', 'sudo ls']) {
|
|
291
|
+
const output = await invokeShell(command);
|
|
292
|
+
t.true(output.startsWith(blockedPrefix), `expected RED command to be blocked: ${command}`);
|
|
293
|
+
t.true(output.includes(command), `blocked output should mention the command: ${command}`);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
test.serial('explorer shell tool blocks write-like shell commands without creating files in a temp workspace', async (t) => {
|
|
297
|
+
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-explorer-shell-block-'));
|
|
298
|
+
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
299
|
+
fs.writeFileSync(path.join(tmpDir, 'source.txt'), 'source content');
|
|
300
|
+
const settings = createMockSettings({
|
|
301
|
+
'agent.model': 'mock-model',
|
|
302
|
+
'agent.provider': 'mock-explorer-provider',
|
|
303
|
+
});
|
|
304
|
+
const manager = new SubagentManager({
|
|
305
|
+
logger: createMockLogger(),
|
|
306
|
+
settings,
|
|
307
|
+
sessionContextService: createSessionContextService(),
|
|
308
|
+
executionContext: {
|
|
309
|
+
getCwd: () => tmpDir,
|
|
310
|
+
isRemote: () => false,
|
|
311
|
+
getSSHService: () => undefined,
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
await manager.run({ role: 'explorer', task: 'inspect a temp workspace' });
|
|
315
|
+
const agent = explorerRunnerCalls[explorerRunnerCalls.length - 1].agent;
|
|
316
|
+
const shell = getAgentTool(agent, 'shell');
|
|
317
|
+
t.truthy(shell);
|
|
318
|
+
const blockedPrefix = 'Error: command blocked - explorer can only run read-only (GREEN) shell commands. Command: ';
|
|
319
|
+
const cases = [
|
|
320
|
+
{ command: 'touch blocked-touch.txt', path: 'blocked-touch.txt' },
|
|
321
|
+
{ command: 'echo marker > blocked-redirect.txt', path: 'blocked-redirect.txt' },
|
|
322
|
+
{ command: 'cat source.txt > blocked-copy.txt', path: 'blocked-copy.txt' },
|
|
323
|
+
{ command: 'printf marker | tee blocked-tee.txt', path: 'blocked-tee.txt' },
|
|
324
|
+
];
|
|
325
|
+
for (const { command, path: relativePath } of cases) {
|
|
326
|
+
const output = await shell.invoke({}, JSON.stringify({ command }), {});
|
|
327
|
+
t.true(output.startsWith(blockedPrefix), `expected command to be blocked: ${command}`);
|
|
328
|
+
t.false(fs.existsSync(path.join(tmpDir, relativePath)), `expected no file to be created: ${relativePath}`);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
215
331
|
test.serial('run() with explorer role uses read-only tools only', async (t) => {
|
|
216
332
|
const settings = createMockSettings({
|
|
217
333
|
'agent.model': 'mock-model',
|
|
218
334
|
'agent.provider': 'mock-explorer-provider',
|
|
219
335
|
});
|
|
220
|
-
const manager = new SubagentManager({
|
|
336
|
+
const manager = new SubagentManager({
|
|
337
|
+
logger: createMockLogger(),
|
|
338
|
+
settings,
|
|
339
|
+
sessionContextService: createSessionContextService(),
|
|
340
|
+
});
|
|
221
341
|
await manager.run({ role: 'explorer', task: 'find files' });
|
|
222
342
|
t.is(explorerRunnerCalls.length, 1);
|
|
223
343
|
const agent = explorerRunnerCalls[0].agent;
|
|
@@ -233,7 +353,7 @@ test.serial('run() with explorer role uses read-only tools only', async (t) => {
|
|
|
233
353
|
// Explorer should NOT have web tools by default
|
|
234
354
|
t.false(toolNames.includes('web_search'));
|
|
235
355
|
t.false(toolNames.includes('web_fetch'));
|
|
236
|
-
t.
|
|
356
|
+
t.true(toolNames.includes('shell'));
|
|
237
357
|
});
|
|
238
358
|
// ========== Researcher role ==========
|
|
239
359
|
let researcherRunnerCalls = [];
|
|
@@ -268,7 +388,11 @@ test.serial('run() with researcher role includes web tools', async (t) => {
|
|
|
268
388
|
'agent.model': 'mock-model',
|
|
269
389
|
'agent.provider': 'mock-researcher-provider',
|
|
270
390
|
});
|
|
271
|
-
const manager = new SubagentManager({
|
|
391
|
+
const manager = new SubagentManager({
|
|
392
|
+
logger: createMockLogger(),
|
|
393
|
+
settings,
|
|
394
|
+
sessionContextService: createSessionContextService(),
|
|
395
|
+
});
|
|
272
396
|
await manager.run({ role: 'researcher', task: 'look up the latest TypeScript release' });
|
|
273
397
|
t.is(researcherRunnerCalls.length, 1);
|
|
274
398
|
const agent = researcherRunnerCalls[0].agent;
|
|
@@ -313,7 +437,11 @@ test.serial('run() with worker role includes write and shell tools for non-gpt m
|
|
|
313
437
|
'agent.model': 'mock-model',
|
|
314
438
|
'agent.provider': 'mock-worker-provider',
|
|
315
439
|
});
|
|
316
|
-
const manager = new SubagentManager({
|
|
440
|
+
const manager = new SubagentManager({
|
|
441
|
+
logger: createMockLogger(),
|
|
442
|
+
settings,
|
|
443
|
+
sessionContextService: createSessionContextService(),
|
|
444
|
+
});
|
|
317
445
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
318
446
|
t.is(workerRunnerCalls.length, 1);
|
|
319
447
|
const agent = workerRunnerCalls[0].agent;
|
|
@@ -332,7 +460,11 @@ test.serial('run() with worker role includes write and shell tools for gpt model
|
|
|
332
460
|
'agent.model': 'gpt-5',
|
|
333
461
|
'agent.provider': 'mock-worker-provider',
|
|
334
462
|
});
|
|
335
|
-
const manager = new SubagentManager({
|
|
463
|
+
const manager = new SubagentManager({
|
|
464
|
+
logger: createMockLogger(),
|
|
465
|
+
settings,
|
|
466
|
+
sessionContextService: createSessionContextService(),
|
|
467
|
+
});
|
|
336
468
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
337
469
|
t.is(workerRunnerCalls.length, 1);
|
|
338
470
|
const agent = workerRunnerCalls[0].agent;
|
|
@@ -703,6 +835,7 @@ test.serial('run() emits started, tool_started and completed events', async (t)
|
|
|
703
835
|
const manager = new SubagentManager({
|
|
704
836
|
logger: createMockLogger(),
|
|
705
837
|
settings,
|
|
838
|
+
sessionContextService: createSessionContextService(),
|
|
706
839
|
onEvent: (event) => events.push(event),
|
|
707
840
|
});
|
|
708
841
|
const result = await manager.run({ role: 'explorer', task: 'search the code' });
|
|
@@ -726,6 +859,7 @@ test.serial('run() emits a completed event even when the role is unknown', async
|
|
|
726
859
|
const manager = new SubagentManager({
|
|
727
860
|
logger: createMockLogger(),
|
|
728
861
|
settings,
|
|
862
|
+
sessionContextService: createSessionContextService(),
|
|
729
863
|
onEvent: (event) => events.push(event),
|
|
730
864
|
});
|
|
731
865
|
await manager.run({ role: 'definitely-not-a-role', task: 'x' });
|
|
@@ -743,7 +877,11 @@ test.serial('mentor base instructions come from the mentor role markdown', async
|
|
|
743
877
|
'agent.mentorProvider': 'mock-mentor-manager',
|
|
744
878
|
'app.mentorMode': false,
|
|
745
879
|
});
|
|
746
|
-
const manager = new SubagentManager({
|
|
880
|
+
const manager = new SubagentManager({
|
|
881
|
+
logger: createMockLogger(),
|
|
882
|
+
settings,
|
|
883
|
+
sessionContextService: createSessionContextService(),
|
|
884
|
+
});
|
|
747
885
|
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
748
886
|
t.is(mentorManagerRunnerCalls.length, 1);
|
|
749
887
|
const instructions = mentorManagerRunnerCalls[0].agent.instructions;
|
|
@@ -785,7 +923,11 @@ test.serial('finalText is the assistant message after the last tool item', async
|
|
|
785
923
|
'agent.model': 'mock-model',
|
|
786
924
|
'agent.provider': 'mock-post-tool-provider',
|
|
787
925
|
});
|
|
788
|
-
const manager = new SubagentManager({
|
|
926
|
+
const manager = new SubagentManager({
|
|
927
|
+
logger: createMockLogger(),
|
|
928
|
+
settings,
|
|
929
|
+
sessionContextService: createSessionContextService(),
|
|
930
|
+
});
|
|
789
931
|
const result = await manager.run({ role: 'explorer', task: 'where is it' });
|
|
790
932
|
t.is(result.finalText, 'Final answer: it is in foo.ts.');
|
|
791
933
|
t.false(result.finalText.includes('Let me look into this first.'));
|
|
@@ -821,6 +963,7 @@ test.serial('worker shell tool executes safe command without triggering approval
|
|
|
821
963
|
'agent.model': 'mock-model',
|
|
822
964
|
'agent.provider': 'mock-worker-shell-safe-provider',
|
|
823
965
|
}),
|
|
966
|
+
sessionContextService: createSessionContextService(),
|
|
824
967
|
executionContext: {
|
|
825
968
|
getCwd: () => tmpDir,
|
|
826
969
|
isRemote: () => false,
|
|
@@ -862,6 +1005,7 @@ test.serial('worker shell tool blocks dangerous/destructive commands and returns
|
|
|
862
1005
|
'agent.model': 'mock-model',
|
|
863
1006
|
'agent.provider': 'mock-worker-shell-dangerous-provider',
|
|
864
1007
|
}),
|
|
1008
|
+
sessionContextService: createSessionContextService(),
|
|
865
1009
|
executionContext: {
|
|
866
1010
|
getCwd: () => tmpDir,
|
|
867
1011
|
isRemote: () => false,
|
|
@@ -906,6 +1050,7 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
906
1050
|
'agent.autoApproveModel': 'mock-auto-approve-model',
|
|
907
1051
|
'agent.autoApproveProvider': 'mock-worker-shell-yellow-approved-provider',
|
|
908
1052
|
}),
|
|
1053
|
+
sessionContextService: createSessionContextService(),
|
|
909
1054
|
agentClient: {
|
|
910
1055
|
chat: async (message) => {
|
|
911
1056
|
chatCalls++;
|
|
@@ -956,6 +1101,7 @@ test.serial('worker shell tool blocks YELLOW command when auto-approval evaluato
|
|
|
956
1101
|
'agent.autoApproveModel': 'mock-auto-approve-model',
|
|
957
1102
|
'agent.autoApproveProvider': 'mock-worker-shell-yellow-rejected-provider',
|
|
958
1103
|
}),
|
|
1104
|
+
sessionContextService: createSessionContextService(),
|
|
959
1105
|
agentClient: {
|
|
960
1106
|
chat: async () => {
|
|
961
1107
|
chatCalls++;
|
|
@@ -995,7 +1141,11 @@ test.serial('run() extracts usage from error.state.usage when subagent run fails
|
|
|
995
1141
|
'agent.model': 'mock-model',
|
|
996
1142
|
'agent.provider': 'mock-failed-usage-provider',
|
|
997
1143
|
});
|
|
998
|
-
const manager = new SubagentManager({
|
|
1144
|
+
const manager = new SubagentManager({
|
|
1145
|
+
logger: createMockLogger(),
|
|
1146
|
+
settings,
|
|
1147
|
+
sessionContextService: createSessionContextService(),
|
|
1148
|
+
});
|
|
999
1149
|
const result = await manager.run({
|
|
1000
1150
|
role: 'explorer',
|
|
1001
1151
|
task: 'find files',
|
|
@@ -1043,6 +1193,7 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
|
|
|
1043
1193
|
'agent.provider': 'mock-retry-recoverable-provider',
|
|
1044
1194
|
'agent.retryAttempts': 2,
|
|
1045
1195
|
}),
|
|
1196
|
+
sessionContextService: createSessionContextService(),
|
|
1046
1197
|
onEvent: (event) => events.push(event),
|
|
1047
1198
|
});
|
|
1048
1199
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
@@ -1078,6 +1229,7 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
|
|
|
1078
1229
|
'agent.provider': 'mock-retry-exhaust-provider',
|
|
1079
1230
|
'agent.retryAttempts': 2,
|
|
1080
1231
|
}),
|
|
1232
|
+
sessionContextService: createSessionContextService(),
|
|
1081
1233
|
onEvent: (event) => events.push(event),
|
|
1082
1234
|
});
|
|
1083
1235
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
@@ -1110,6 +1262,7 @@ test.serial('run() does not retry on non-recoverable ModelBehaviorError', async
|
|
|
1110
1262
|
'agent.provider': 'mock-no-retry-non-recoverable-provider',
|
|
1111
1263
|
'agent.retryAttempts': 2,
|
|
1112
1264
|
}),
|
|
1265
|
+
sessionContextService: createSessionContextService(),
|
|
1113
1266
|
onEvent: (event) => events.push(event),
|
|
1114
1267
|
});
|
|
1115
1268
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
@@ -1139,6 +1292,7 @@ test.serial('run() aborted subagent returns cancelled status without model-error
|
|
|
1139
1292
|
'agent.provider': 'mock-abort-no-retry-provider',
|
|
1140
1293
|
'agent.retryAttempts': 2,
|
|
1141
1294
|
}),
|
|
1295
|
+
sessionContextService: createSessionContextService(),
|
|
1142
1296
|
onEvent: (event) => events.push(event),
|
|
1143
1297
|
});
|
|
1144
1298
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
@@ -1183,6 +1337,7 @@ test.serial('run() retries on transient upstream error via executeWithRetry', as
|
|
|
1183
1337
|
'agent.provider': 'mock-transient-retry-provider',
|
|
1184
1338
|
'agent.retryAttempts': 2,
|
|
1185
1339
|
}),
|
|
1340
|
+
sessionContextService: createSessionContextService(),
|
|
1186
1341
|
});
|
|
1187
1342
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1188
1343
|
t.is(result.status, 'completed');
|
|
@@ -1218,6 +1373,7 @@ test.serial('run() does not retry worker after a mutating write tool was invoked
|
|
|
1218
1373
|
'agent.provider': 'mock-write-then-crash-provider',
|
|
1219
1374
|
'agent.retryAttempts': 2,
|
|
1220
1375
|
}),
|
|
1376
|
+
sessionContextService: createSessionContextService(),
|
|
1221
1377
|
executionContext: {
|
|
1222
1378
|
getCwd: () => tmpDir,
|
|
1223
1379
|
isRemote: () => false,
|
|
@@ -1259,6 +1415,7 @@ test.serial('run() retries read-only subagent (explorer) even after read tools w
|
|
|
1259
1415
|
'agent.provider': 'mock-explorer-read-then-crash-provider',
|
|
1260
1416
|
'agent.retryAttempts': 2,
|
|
1261
1417
|
}),
|
|
1418
|
+
sessionContextService: createSessionContextService(),
|
|
1262
1419
|
});
|
|
1263
1420
|
const result = await manager.run({ role: 'explorer', task: 'search for something' });
|
|
1264
1421
|
t.is(result.status, 'completed');
|
|
@@ -1288,6 +1445,7 @@ test.serial('corrective retry task for hallucination names the specific bad tool
|
|
|
1288
1445
|
'agent.provider': 'mock-corrective-hallucination-provider',
|
|
1289
1446
|
'agent.retryAttempts': 2,
|
|
1290
1447
|
}),
|
|
1448
|
+
sessionContextService: createSessionContextService(),
|
|
1291
1449
|
});
|
|
1292
1450
|
await manager.run({ role: 'explorer', task: 'do something' });
|
|
1293
1451
|
t.is(runInputs.length, 2);
|
|
@@ -1319,6 +1477,7 @@ test.serial('corrective retry task for behavior error instructs model to produce
|
|
|
1319
1477
|
'agent.provider': 'mock-corrective-behavior-provider',
|
|
1320
1478
|
'agent.retryAttempts': 2,
|
|
1321
1479
|
}),
|
|
1480
|
+
sessionContextService: createSessionContextService(),
|
|
1322
1481
|
});
|
|
1323
1482
|
await manager.run({ role: 'explorer', task: 'do something' });
|
|
1324
1483
|
t.is(runInputs.length, 2);
|
|
@@ -1326,4 +1485,376 @@ test.serial('corrective retry task for behavior error instructs model to produce
|
|
|
1326
1485
|
t.true(retryInput.includes('final'), 'corrective prompt for behavior should instruct to produce a final answer');
|
|
1327
1486
|
t.true(retryInput.includes('Do not call'), 'should tell model not to call more tools');
|
|
1328
1487
|
});
|
|
1488
|
+
test.serial('subagent run injects warning into tool output when turns left <= 5', async (t) => {
|
|
1489
|
+
let executeOutput = null;
|
|
1490
|
+
registerProvider({
|
|
1491
|
+
id: 'mock-subagent-maxturns-provider',
|
|
1492
|
+
label: 'Mock Subagent MaxTurns Provider',
|
|
1493
|
+
createRunner: () => ({
|
|
1494
|
+
run: async (agent, _input, options) => {
|
|
1495
|
+
if (options.callModelInputFilter) {
|
|
1496
|
+
// Simulate 96 turns
|
|
1497
|
+
for (let i = 0; i < 96; i++) {
|
|
1498
|
+
await options.callModelInputFilter({
|
|
1499
|
+
modelData: { input: [] },
|
|
1500
|
+
agent,
|
|
1501
|
+
context: options.context,
|
|
1502
|
+
});
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
// Execute a tool to see if the warning is injected
|
|
1506
|
+
const readFileTool = agent.tools.find((tool) => tool.name === 'read_file');
|
|
1507
|
+
if (readFileTool) {
|
|
1508
|
+
const mockRunContext = {
|
|
1509
|
+
context: options.context,
|
|
1510
|
+
};
|
|
1511
|
+
executeOutput = await readFileTool.invoke(mockRunContext, JSON.stringify({ path: 'package.json' }), {});
|
|
1512
|
+
}
|
|
1513
|
+
return {
|
|
1514
|
+
status: 'completed',
|
|
1515
|
+
finalOutput: 'done',
|
|
1516
|
+
history: [],
|
|
1517
|
+
messages: [],
|
|
1518
|
+
};
|
|
1519
|
+
},
|
|
1520
|
+
}),
|
|
1521
|
+
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1522
|
+
});
|
|
1523
|
+
const manager = new SubagentManager({
|
|
1524
|
+
logger: createMockLogger(),
|
|
1525
|
+
settings: createMockSettings({
|
|
1526
|
+
'agent.model': 'mock-model',
|
|
1527
|
+
'agent.provider': 'mock-subagent-maxturns-provider',
|
|
1528
|
+
}),
|
|
1529
|
+
sessionContextService: createSessionContextService(),
|
|
1530
|
+
});
|
|
1531
|
+
await manager.run({ role: 'explorer', task: 'mock task' });
|
|
1532
|
+
t.truthy(executeOutput);
|
|
1533
|
+
t.true(executeOutput.includes('approaching the maximum turn limit'), 'should contain max turns warning');
|
|
1534
|
+
t.true(executeOutput.includes('4 turns left'), 'should indicate correct number of turns left');
|
|
1535
|
+
});
|
|
1536
|
+
test.serial('execution subagents select subagent-safe model-family prompts and append role instructions', async (t) => {
|
|
1537
|
+
let constructedAgentExplorer = null;
|
|
1538
|
+
let constructedAgentWorker = null;
|
|
1539
|
+
let constructedAgentResearcher = null;
|
|
1540
|
+
registerProvider({
|
|
1541
|
+
id: 'mock-prompt-test-provider-gpt-5-codex',
|
|
1542
|
+
label: 'Mock Prompt Test Provider GPT-5 Codex',
|
|
1543
|
+
createRunner: () => ({
|
|
1544
|
+
run: async (agent) => {
|
|
1545
|
+
constructedAgentExplorer = agent;
|
|
1546
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1547
|
+
},
|
|
1548
|
+
}),
|
|
1549
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1550
|
+
});
|
|
1551
|
+
registerProvider({
|
|
1552
|
+
id: 'mock-prompt-test-provider-claude-3-sonnet',
|
|
1553
|
+
label: 'Mock Prompt Test Provider Claude 3 Sonnet',
|
|
1554
|
+
createRunner: () => ({
|
|
1555
|
+
run: async (agent) => {
|
|
1556
|
+
constructedAgentWorker = agent;
|
|
1557
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1558
|
+
},
|
|
1559
|
+
}),
|
|
1560
|
+
fetchModels: async () => [{ id: 'claude-3-sonnet' }],
|
|
1561
|
+
});
|
|
1562
|
+
registerProvider({
|
|
1563
|
+
id: 'mock-prompt-test-provider-gpt-5-modern',
|
|
1564
|
+
label: 'Mock Prompt Test Provider GPT-5 Modern',
|
|
1565
|
+
createRunner: () => ({
|
|
1566
|
+
run: async (agent) => {
|
|
1567
|
+
constructedAgentResearcher = agent;
|
|
1568
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1569
|
+
},
|
|
1570
|
+
}),
|
|
1571
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1572
|
+
});
|
|
1573
|
+
// 1. Run explorer subagent with gpt-5-codex
|
|
1574
|
+
const managerExplorer = new SubagentManager({
|
|
1575
|
+
logger: createMockLogger(),
|
|
1576
|
+
settings: createMockSettings({
|
|
1577
|
+
'agent.model': 'gpt-5-codex',
|
|
1578
|
+
'agent.provider': 'mock-prompt-test-provider-gpt-5-codex',
|
|
1579
|
+
}),
|
|
1580
|
+
sessionContextService: createSessionContextService(),
|
|
1581
|
+
});
|
|
1582
|
+
await managerExplorer.run({ role: 'explorer', task: 'explorer task' });
|
|
1583
|
+
t.truthy(constructedAgentExplorer);
|
|
1584
|
+
t.true(constructedAgentExplorer.instructions.includes('nested Codex-family subagent'));
|
|
1585
|
+
t.true(constructedAgentExplorer.instructions.includes('You are an explorer subagent.'));
|
|
1586
|
+
t.true(constructedAgentExplorer.instructions.includes('## Worktree Hygiene'));
|
|
1587
|
+
t.true(constructedAgentExplorer.instructions.includes('## Available Tool Guidance'));
|
|
1588
|
+
const codexIdx = constructedAgentExplorer.instructions.indexOf('nested Codex-family subagent');
|
|
1589
|
+
const explorerIdx = constructedAgentExplorer.instructions.indexOf('You are an explorer subagent');
|
|
1590
|
+
t.true(codexIdx < explorerIdx, 'Model prompt must come before role prompt');
|
|
1591
|
+
// 2. Run worker subagent with claude-3-sonnet
|
|
1592
|
+
const managerWorker = new SubagentManager({
|
|
1593
|
+
logger: createMockLogger(),
|
|
1594
|
+
settings: createMockSettings({
|
|
1595
|
+
'agent.model': 'claude-3-sonnet',
|
|
1596
|
+
'agent.provider': 'mock-prompt-test-provider-claude-3-sonnet',
|
|
1597
|
+
}),
|
|
1598
|
+
sessionContextService: createSessionContextService(),
|
|
1599
|
+
});
|
|
1600
|
+
await managerWorker.run({ role: 'worker', task: 'worker task' });
|
|
1601
|
+
t.truthy(constructedAgentWorker);
|
|
1602
|
+
t.true(constructedAgentWorker.instructions.includes('nested Anthropic-family subagent'));
|
|
1603
|
+
t.true(constructedAgentWorker.instructions.includes('You are a worker subagent.'));
|
|
1604
|
+
const sonnetIdx = constructedAgentWorker.instructions.indexOf('nested Anthropic-family subagent');
|
|
1605
|
+
const workerIdx = constructedAgentWorker.instructions.indexOf('You are a worker subagent');
|
|
1606
|
+
t.true(sonnetIdx < workerIdx, 'Model prompt must come before role prompt');
|
|
1607
|
+
const managerResearcher = new SubagentManager({
|
|
1608
|
+
logger: createMockLogger(),
|
|
1609
|
+
settings: createMockSettings({
|
|
1610
|
+
'agent.model': 'gpt-5',
|
|
1611
|
+
'agent.provider': 'mock-prompt-test-provider-gpt-5-modern',
|
|
1612
|
+
}),
|
|
1613
|
+
sessionContextService: createSessionContextService(),
|
|
1614
|
+
});
|
|
1615
|
+
await managerResearcher.run({ role: 'researcher', task: 'research task' });
|
|
1616
|
+
t.truthy(constructedAgentResearcher);
|
|
1617
|
+
t.true(constructedAgentResearcher.instructions.includes('nested GPT-5-family subagent'));
|
|
1618
|
+
t.true(constructedAgentResearcher.instructions.includes('You are a researcher subagent.'));
|
|
1619
|
+
});
|
|
1620
|
+
test.serial('execution subagent prompts exclude top-level-only prompt content', async (t) => {
|
|
1621
|
+
let constructedAgent = null;
|
|
1622
|
+
registerProvider({
|
|
1623
|
+
id: 'mock-top-level-exclusion-provider',
|
|
1624
|
+
label: 'Mock Top Level Exclusion Provider',
|
|
1625
|
+
createRunner: () => ({
|
|
1626
|
+
run: async (agent) => {
|
|
1627
|
+
constructedAgent = agent;
|
|
1628
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1629
|
+
},
|
|
1630
|
+
}),
|
|
1631
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1632
|
+
});
|
|
1633
|
+
const manager = new SubagentManager({
|
|
1634
|
+
logger: createMockLogger(),
|
|
1635
|
+
settings: createMockSettings({
|
|
1636
|
+
'agent.model': 'gpt-5-codex',
|
|
1637
|
+
'agent.provider': 'mock-top-level-exclusion-provider',
|
|
1638
|
+
}),
|
|
1639
|
+
sessionContextService: createSessionContextService(),
|
|
1640
|
+
});
|
|
1641
|
+
await manager.run({ role: 'worker', task: 'worker task' });
|
|
1642
|
+
t.truthy(constructedAgent);
|
|
1643
|
+
t.false(constructedAgent.instructions.includes('commentary channel'));
|
|
1644
|
+
t.false(constructedAgent.instructions.includes('final channel'));
|
|
1645
|
+
t.false(constructedAgent.instructions.includes('Intermediary updates'));
|
|
1646
|
+
t.false(constructedAgent.instructions.includes('Plan Mode Workflow'));
|
|
1647
|
+
t.false(constructedAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.'));
|
|
1648
|
+
});
|
|
1649
|
+
test.serial('mentor subagent is NOT affected by prompt profiles', async (t) => {
|
|
1650
|
+
let mentorAgent = null;
|
|
1651
|
+
registerProvider({
|
|
1652
|
+
id: 'mock-prompt-test-provider-mentor',
|
|
1653
|
+
label: 'Mock Prompt Test Provider Mentor',
|
|
1654
|
+
createRunner: () => ({
|
|
1655
|
+
run: async (agent) => {
|
|
1656
|
+
mentorAgent = agent;
|
|
1657
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1658
|
+
},
|
|
1659
|
+
}),
|
|
1660
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1661
|
+
});
|
|
1662
|
+
const manager = new SubagentManager({
|
|
1663
|
+
logger: createMockLogger(),
|
|
1664
|
+
settings: createMockSettings({
|
|
1665
|
+
'agent.model': 'main-model',
|
|
1666
|
+
'agent.provider': 'mock-prompt-test-provider-mentor',
|
|
1667
|
+
'agent.mentorModel': 'gpt-5-codex',
|
|
1668
|
+
'agent.mentorProvider': 'mock-prompt-test-provider-mentor',
|
|
1669
|
+
'app.mentorMode': false,
|
|
1670
|
+
}),
|
|
1671
|
+
sessionContextService: createSessionContextService(),
|
|
1672
|
+
});
|
|
1673
|
+
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
1674
|
+
t.truthy(mentorAgent);
|
|
1675
|
+
t.false(mentorAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.'));
|
|
1676
|
+
t.false(mentorAgent.instructions.includes('nested Codex-family subagent'));
|
|
1677
|
+
t.false(mentorAgent.instructions.includes('## Available Tool Guidance'));
|
|
1678
|
+
t.false(mentorAgent.instructions.includes('## Worktree Hygiene'));
|
|
1679
|
+
t.true(mentorAgent.instructions.includes('You are a helpful mentor assistant.'));
|
|
1680
|
+
});
|
|
1681
|
+
test.serial('subagent tool definitions conditional registration for search tools', async (t) => {
|
|
1682
|
+
let workerAgentShellTrue = null;
|
|
1683
|
+
let workerAgentShellFalse = null;
|
|
1684
|
+
registerProvider({
|
|
1685
|
+
id: 'mock-tool-test-provider-shell-true',
|
|
1686
|
+
label: 'Mock Tool Test Provider Shell True',
|
|
1687
|
+
createRunner: () => ({
|
|
1688
|
+
run: async (agent) => {
|
|
1689
|
+
workerAgentShellTrue = agent;
|
|
1690
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1691
|
+
},
|
|
1692
|
+
}),
|
|
1693
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1694
|
+
});
|
|
1695
|
+
registerProvider({
|
|
1696
|
+
id: 'mock-tool-test-provider-shell-false',
|
|
1697
|
+
label: 'Mock Tool Test Provider Shell False',
|
|
1698
|
+
createRunner: () => ({
|
|
1699
|
+
run: async (agent) => {
|
|
1700
|
+
workerAgentShellFalse = agent;
|
|
1701
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1702
|
+
},
|
|
1703
|
+
}),
|
|
1704
|
+
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
1705
|
+
});
|
|
1706
|
+
// 1. Model: gpt-5 (searchViaShell is true by default), canRunShell: true (from worker.md)
|
|
1707
|
+
// Explorer/worker tools should NOT contain dedicated search tools: grep and find_files.
|
|
1708
|
+
const managerShellTrue = new SubagentManager({
|
|
1709
|
+
logger: createMockLogger(),
|
|
1710
|
+
settings: createMockSettings({
|
|
1711
|
+
'agent.model': 'gpt-5',
|
|
1712
|
+
'agent.provider': 'mock-tool-test-provider-shell-true',
|
|
1713
|
+
'app.searchViaShell': 'auto',
|
|
1714
|
+
}),
|
|
1715
|
+
sessionContextService: createSessionContextService(),
|
|
1716
|
+
});
|
|
1717
|
+
await managerShellTrue.run({ role: 'worker', task: 'some task' });
|
|
1718
|
+
t.truthy(workerAgentShellTrue);
|
|
1719
|
+
const toolNamesShellTrue = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1720
|
+
t.false(toolNamesShellTrue.includes('grep'), 'grep tool should be omitted when searchViaShell is active and canRunShell is true');
|
|
1721
|
+
t.false(toolNamesShellTrue.includes('find_files'), 'find_files tool should be omitted when searchViaShell is active and canRunShell is true');
|
|
1722
|
+
t.true(toolNamesShellTrue.includes('shell'), 'shell tool must be registered');
|
|
1723
|
+
t.true(workerAgentShellTrue.instructions.includes('Registered tools:'));
|
|
1724
|
+
t.true(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`'));
|
|
1725
|
+
t.true(workerAgentShellTrue.instructions.includes('`fd` for file search'));
|
|
1726
|
+
t.false(workerAgentShellTrue.instructions.includes('Use `grep` to search'));
|
|
1727
|
+
t.false(workerAgentShellTrue.instructions.includes('Use `find_files` to locate'));
|
|
1728
|
+
t.false(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools'));
|
|
1729
|
+
// 2. Model: gpt-4o (searchViaShell is false by default), canRunShell: true
|
|
1730
|
+
// Tools should include dedicated grep and find_files.
|
|
1731
|
+
const managerShellFalse = new SubagentManager({
|
|
1732
|
+
logger: createMockLogger(),
|
|
1733
|
+
settings: createMockSettings({
|
|
1734
|
+
'agent.model': 'gpt-4o',
|
|
1735
|
+
'agent.provider': 'mock-tool-test-provider-shell-false',
|
|
1736
|
+
'app.searchViaShell': 'auto',
|
|
1737
|
+
}),
|
|
1738
|
+
sessionContextService: createSessionContextService(),
|
|
1739
|
+
});
|
|
1740
|
+
await managerShellFalse.run({ role: 'worker', task: 'some task' });
|
|
1741
|
+
t.truthy(workerAgentShellFalse);
|
|
1742
|
+
const toolNamesShellFalse = workerAgentShellFalse.tools.map((tool) => tool.name);
|
|
1743
|
+
t.true(toolNamesShellFalse.includes('grep'), 'grep tool should be registered when searchViaShell is inactive');
|
|
1744
|
+
t.true(toolNamesShellFalse.includes('find_files'), 'find_files tool should be registered when searchViaShell is inactive');
|
|
1745
|
+
t.true(toolNamesShellFalse.includes('shell'), 'shell tool must be registered');
|
|
1746
|
+
t.true(workerAgentShellFalse.instructions.includes('For workspace search, use the dedicated search tools'));
|
|
1747
|
+
t.true(workerAgentShellFalse.instructions.includes('`grep`'));
|
|
1748
|
+
t.true(workerAgentShellFalse.instructions.includes('`find_files`'));
|
|
1749
|
+
t.false(workerAgentShellFalse.instructions.includes('use `shell` with commands like `rg`'));
|
|
1750
|
+
// 3. Model: gpt-5 with searchViaShell explicitly disabled still keeps dedicated search tools.
|
|
1751
|
+
const managerShellOff = new SubagentManager({
|
|
1752
|
+
logger: createMockLogger(),
|
|
1753
|
+
settings: createMockSettings({
|
|
1754
|
+
'agent.model': 'gpt-5',
|
|
1755
|
+
'agent.provider': 'mock-tool-test-provider-shell-true',
|
|
1756
|
+
'app.searchViaShell': 'off',
|
|
1757
|
+
}),
|
|
1758
|
+
sessionContextService: createSessionContextService(),
|
|
1759
|
+
});
|
|
1760
|
+
await managerShellOff.run({ role: 'worker', task: 'some task' });
|
|
1761
|
+
const toolNamesShellOff = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1762
|
+
t.true(toolNamesShellOff.includes('grep'), 'grep tool should remain registered when searchViaShell is off');
|
|
1763
|
+
t.true(toolNamesShellOff.includes('find_files'), 'find_files tool should remain registered when searchViaShell is off');
|
|
1764
|
+
t.true(toolNamesShellOff.includes('shell'), 'shell tool must still be registered');
|
|
1765
|
+
t.true(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools'));
|
|
1766
|
+
t.false(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`'));
|
|
1767
|
+
});
|
|
1768
|
+
test.serial('explorer uses shell search when available and researcher keeps dedicated search tools', async (t) => {
|
|
1769
|
+
let explorerAgent = null;
|
|
1770
|
+
let researcherAgent = null;
|
|
1771
|
+
registerProvider({
|
|
1772
|
+
id: 'mock-tool-test-provider-explorer-shell',
|
|
1773
|
+
label: 'Mock Tool Test Provider Explorer Shell',
|
|
1774
|
+
createRunner: () => ({
|
|
1775
|
+
run: async (agent) => {
|
|
1776
|
+
explorerAgent = agent;
|
|
1777
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1778
|
+
},
|
|
1779
|
+
}),
|
|
1780
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1781
|
+
});
|
|
1782
|
+
registerProvider({
|
|
1783
|
+
id: 'mock-tool-test-provider-researcher-dedicated',
|
|
1784
|
+
label: 'Mock Tool Test Provider Researcher Dedicated',
|
|
1785
|
+
createRunner: () => ({
|
|
1786
|
+
run: async (agent) => {
|
|
1787
|
+
researcherAgent = agent;
|
|
1788
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1789
|
+
},
|
|
1790
|
+
}),
|
|
1791
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1792
|
+
});
|
|
1793
|
+
await new SubagentManager({
|
|
1794
|
+
logger: createMockLogger(),
|
|
1795
|
+
settings: createMockSettings({
|
|
1796
|
+
'agent.model': 'gpt-5',
|
|
1797
|
+
'agent.provider': 'mock-tool-test-provider-explorer-shell',
|
|
1798
|
+
'app.searchViaShell': 'auto',
|
|
1799
|
+
}),
|
|
1800
|
+
sessionContextService: createSessionContextService(),
|
|
1801
|
+
}).run({ role: 'explorer', task: 'find files' });
|
|
1802
|
+
await new SubagentManager({
|
|
1803
|
+
logger: createMockLogger(),
|
|
1804
|
+
settings: createMockSettings({
|
|
1805
|
+
'agent.model': 'gpt-5',
|
|
1806
|
+
'agent.provider': 'mock-tool-test-provider-researcher-dedicated',
|
|
1807
|
+
'app.searchViaShell': 'auto',
|
|
1808
|
+
}),
|
|
1809
|
+
sessionContextService: createSessionContextService(),
|
|
1810
|
+
}).run({ role: 'researcher', task: 'research files' });
|
|
1811
|
+
t.truthy(explorerAgent);
|
|
1812
|
+
let toolNames = explorerAgent.tools.map((tool) => tool.name);
|
|
1813
|
+
t.true(toolNames.includes('shell'));
|
|
1814
|
+
t.false(toolNames.includes('grep'));
|
|
1815
|
+
t.false(toolNames.includes('find_files'));
|
|
1816
|
+
t.true(explorerAgent.instructions.includes('For workspace search, use `shell` with commands like `rg`'));
|
|
1817
|
+
t.false(explorerAgent.instructions.includes('For workspace search, use the dedicated search tools'));
|
|
1818
|
+
t.truthy(researcherAgent);
|
|
1819
|
+
toolNames = researcherAgent.tools.map((tool) => tool.name);
|
|
1820
|
+
t.false(toolNames.includes('shell'));
|
|
1821
|
+
t.true(toolNames.includes('grep'));
|
|
1822
|
+
t.true(toolNames.includes('find_files'));
|
|
1823
|
+
t.true(researcherAgent.instructions.includes('For workspace search, use the dedicated search tools'));
|
|
1824
|
+
t.false(researcherAgent.instructions.includes('use `shell` with commands like `rg`'));
|
|
1825
|
+
});
|
|
1826
|
+
test.serial('remote execution disables code-context tools and guidance', async (t) => {
|
|
1827
|
+
let remoteAgent = null;
|
|
1828
|
+
registerProvider({
|
|
1829
|
+
id: 'mock-tool-test-provider-remote',
|
|
1830
|
+
label: 'Mock Tool Test Provider Remote',
|
|
1831
|
+
createRunner: () => ({
|
|
1832
|
+
run: async (agent) => {
|
|
1833
|
+
remoteAgent = agent;
|
|
1834
|
+
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1835
|
+
},
|
|
1836
|
+
}),
|
|
1837
|
+
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
1838
|
+
});
|
|
1839
|
+
const manager = new SubagentManager({
|
|
1840
|
+
logger: createMockLogger(),
|
|
1841
|
+
settings: createMockSettings({
|
|
1842
|
+
'agent.model': 'gpt-4o',
|
|
1843
|
+
'agent.provider': 'mock-tool-test-provider-remote',
|
|
1844
|
+
}),
|
|
1845
|
+
executionContext: {
|
|
1846
|
+
getCwd: () => '/tmp/remote-workspace',
|
|
1847
|
+
isRemote: () => true,
|
|
1848
|
+
getSSHService: () => undefined,
|
|
1849
|
+
},
|
|
1850
|
+
sessionContextService: createSessionContextService(),
|
|
1851
|
+
});
|
|
1852
|
+
await manager.run({ role: 'explorer', task: 'inspect remote files' });
|
|
1853
|
+
t.truthy(remoteAgent);
|
|
1854
|
+
const toolNames = remoteAgent.tools.map((tool) => tool.name);
|
|
1855
|
+
t.false(toolNames.includes('read_code_outline'));
|
|
1856
|
+
t.false(toolNames.includes('code_context_search'));
|
|
1857
|
+
t.true(remoteAgent.instructions.includes('Code-context tools are not available in this run.'));
|
|
1858
|
+
t.false(remoteAgent.instructions.includes('For code structure and symbol context, use:'));
|
|
1859
|
+
});
|
|
1329
1860
|
//# sourceMappingURL=subagent-manager.test.js.map
|