@qduc/term2 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +3 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +46 -30
- package/dist/agent.js.map +1 -1
- package/dist/agent.test.js +195 -122
- package/dist/agent.test.js.map +1 -1
- package/dist/app-helpers.d.ts +12 -0
- package/dist/app-helpers.d.ts.map +1 -0
- package/dist/app-helpers.js +36 -0
- package/dist/app-helpers.js.map +1 -0
- package/dist/app-helpers.test.d.ts +2 -0
- package/dist/app-helpers.test.d.ts.map +1 -0
- package/dist/app-helpers.test.js +62 -0
- package/dist/app-helpers.test.js.map +1 -0
- package/dist/app.applyRuntimeSetting.test.d.ts +2 -0
- package/dist/app.applyRuntimeSetting.test.d.ts.map +1 -0
- package/dist/app.applyRuntimeSetting.test.js +57 -0
- package/dist/app.applyRuntimeSetting.test.js.map +1 -0
- package/dist/app.d.ts +8 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +104 -236
- package/dist/app.js.map +1 -1
- package/dist/app.navigate-question.test.d.ts +2 -0
- package/dist/app.navigate-question.test.d.ts.map +1 -0
- package/dist/app.navigate-question.test.js +194 -0
- package/dist/app.navigate-question.test.js.map +1 -0
- package/dist/app.parseInput.test.js +11 -11
- package/dist/app.parseInput.test.js.map +1 -1
- package/dist/app.startup-banner.test.js +5 -36
- package/dist/app.startup-banner.test.js.map +1 -1
- package/dist/app.test.d.ts +2 -0
- package/dist/app.test.d.ts.map +1 -0
- package/dist/app.test.js +377 -0
- package/dist/app.test.js.map +1 -0
- package/dist/cli.integration.test.js +80 -24
- package/dist/cli.integration.test.js.map +1 -1
- package/dist/cli.js +59 -20
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-approve-command.d.ts +1 -1
- package/dist/commands/auto-approve-command.d.ts.map +1 -1
- package/dist/commands/auto-approve-command.js +1 -1
- package/dist/commands/copy-command.d.ts +1 -1
- package/dist/commands/copy-command.d.ts.map +1 -1
- package/dist/commands/copy-command.js +1 -1
- package/dist/commands/copy-command.js.map +1 -1
- package/dist/commands/effort-command.d.ts +1 -1
- package/dist/commands/effort-command.d.ts.map +1 -1
- package/dist/commands/effort-command.js +1 -1
- package/dist/commands/guarded-settings-command.d.ts +1 -1
- package/dist/commands/guarded-settings-command.d.ts.map +1 -1
- package/dist/commands/handoff-command.d.ts +1 -1
- package/dist/commands/handoff-command.d.ts.map +1 -1
- package/dist/commands/handoff-command.js +1 -1
- package/dist/commands/handoff-command.js.map +1 -1
- package/dist/commands/mode-commands.d.ts +1 -1
- package/dist/commands/mode-commands.d.ts.map +1 -1
- package/dist/commands/model-command.d.ts +1 -1
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +2 -2
- package/dist/commands/model-command.js.map +1 -1
- package/dist/commands/skills-command.d.ts +9 -0
- package/dist/commands/skills-command.d.ts.map +1 -0
- package/dist/commands/skills-command.js +23 -0
- package/dist/commands/skills-command.js.map +1 -0
- package/dist/commands/skills-command.test.d.ts +2 -0
- package/dist/commands/skills-command.test.d.ts.map +1 -0
- package/dist/commands/skills-command.test.js +104 -0
- package/dist/commands/skills-command.test.js.map +1 -0
- 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 +202 -0
- package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -0
- package/dist/components/ApprovalPrompt.d.ts +6 -4
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +132 -13
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.d.ts +13 -2
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +37 -6
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/BottomArea.test.js +73 -3
- package/dist/components/BottomArea.test.js.map +1 -1
- package/dist/components/ChatMessage.test.d.ts +2 -0
- package/dist/components/ChatMessage.test.d.ts.map +1 -0
- package/dist/components/ChatMessage.test.js +20 -0
- package/dist/components/ChatMessage.test.js.map +1 -0
- package/dist/components/CommandMessage.d.ts +1 -0
- package/dist/components/CommandMessage.d.ts.map +1 -1
- package/dist/components/CommandMessage.js +528 -114
- package/dist/components/CommandMessage.js.map +1 -1
- package/dist/components/CommandMessage.test.js +526 -1
- package/dist/components/CommandMessage.test.js.map +1 -1
- package/dist/components/Common/MenuContainer.d.ts +3 -2
- package/dist/components/Common/MenuContainer.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.js +14 -2
- 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 +37 -0
- package/dist/components/Common/MenuContainer.test.js.map +1 -0
- package/dist/components/Common/ScrollableTabBar.d.ts.map +1 -1
- package/dist/components/Common/ScrollableTabBar.js.map +1 -1
- package/dist/components/Common/compute-visible-tabs.d.ts.map +1 -1
- package/dist/components/Common/compute-visible-tabs.js.map +1 -1
- package/dist/components/Common/compute-visible-tabs.test.d.ts.map +1 -1
- package/dist/components/Common/compute-visible-tabs.test.js +28 -28
- package/dist/components/Common/compute-visible-tabs.test.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.test.js +21 -16
- package/dist/components/ErrorBoundary.test.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +23 -1
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +14 -10
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/determine-active-menu.d.ts +3 -0
- package/dist/components/Input/determine-active-menu.d.ts.map +1 -1
- package/dist/components/Input/determine-active-menu.js +10 -2
- package/dist/components/Input/determine-active-menu.js.map +1 -1
- package/dist/components/Input/input-width.d.ts.map +1 -1
- package/dist/components/Input/input-width.js.map +1 -1
- package/dist/components/Input/input-width.test.d.ts +2 -0
- package/dist/components/Input/input-width.test.d.ts.map +1 -0
- package/dist/components/Input/input-width.test.js +23 -0
- package/dist/components/Input/input-width.test.js.map +1 -0
- package/dist/components/Input/insertions.d.ts +8 -0
- package/dist/components/Input/insertions.d.ts.map +1 -1
- package/dist/components/Input/insertions.js +12 -0
- package/dist/components/Input/insertions.js.map +1 -1
- package/dist/components/Input/insertions.test.d.ts +2 -0
- package/dist/components/Input/insertions.test.d.ts.map +1 -0
- package/dist/components/Input/insertions.test.js +25 -0
- package/dist/components/Input/insertions.test.js.map +1 -0
- package/dist/components/Input/popup-key-navigation.d.ts.map +1 -1
- package/dist/components/Input/popup-key-navigation.js.map +1 -1
- package/dist/components/Input/popup-key-navigation.test.d.ts.map +1 -1
- package/dist/components/Input/popup-key-navigation.test.js +21 -21
- package/dist/components/Input/popup-key-navigation.test.js.map +1 -1
- package/dist/components/Input/popup-props.d.ts +5 -1
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +19 -1
- package/dist/components/Input/popup-props.js.map +1 -1
- package/dist/components/Input/popup-props.test.d.ts.map +1 -1
- package/dist/components/Input/popup-props.test.js +19 -3
- package/dist/components/Input/popup-props.test.js.map +1 -1
- package/dist/components/Input/triggers.d.ts +1 -0
- package/dist/components/Input/triggers.d.ts.map +1 -1
- package/dist/components/Input/triggers.js +1 -0
- package/dist/components/Input/triggers.js.map +1 -1
- package/dist/components/InputBox.d.ts +12 -3
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +203 -55
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.menu-logic.test.js +51 -33
- package/dist/components/InputBox.menu-logic.test.js.map +1 -1
- package/dist/components/InputBox.test.js +455 -140
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts +2 -1
- package/dist/components/LargeUncachedConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.js +8 -3
- package/dist/components/LargeUncachedConfirmationPrompt.js.map +1 -1
- package/dist/components/LargeUncachedConfirmationPrompt.test.js +5 -4
- package/dist/components/LargeUncachedConfirmationPrompt.test.js.map +1 -1
- package/dist/components/MarkdownRenderer.test.d.ts +2 -0
- package/dist/components/MarkdownRenderer.test.d.ts.map +1 -0
- package/dist/components/MarkdownRenderer.test.js +292 -0
- package/dist/components/MarkdownRenderer.test.js.map +1 -0
- package/dist/components/MessageList.d.ts +2 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +47 -15
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +125 -0
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.js +15 -6
- 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 -9
- 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 +186 -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 +117 -0
- package/dist/components/ProviderSelectionMenu.test.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts +2 -1
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.js +12 -6
- 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 +3 -2
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.js +11 -0
- package/dist/components/StatusBar.test.js.map +1 -1
- package/dist/components/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/SubagentActivityMessage.js +11 -2
- package/dist/components/SubagentActivityMessage.js.map +1 -1
- package/dist/components/command-message-helpers.d.ts +83 -0
- package/dist/components/command-message-helpers.d.ts.map +1 -0
- package/dist/components/command-message-helpers.js +598 -0
- package/dist/components/command-message-helpers.js.map +1 -0
- package/dist/components/command-message-helpers.test.d.ts +2 -0
- package/dist/components/command-message-helpers.test.d.ts.map +1 -0
- package/dist/components/command-message-helpers.test.js +222 -0
- package/dist/components/command-message-helpers.test.js.map +1 -0
- package/dist/components/layout/Banner.d.ts +9 -0
- package/dist/components/layout/Banner.d.ts.map +1 -0
- package/dist/components/layout/Banner.js +91 -0
- package/dist/components/layout/Banner.js.map +1 -0
- package/dist/components/layout/BottomArea.d.ts +68 -0
- package/dist/components/layout/BottomArea.d.ts.map +1 -0
- package/dist/components/layout/BottomArea.js +81 -0
- package/dist/components/layout/BottomArea.js.map +1 -0
- package/dist/components/layout/BottomArea.test.d.ts +2 -0
- package/dist/components/layout/BottomArea.test.d.ts.map +1 -0
- package/dist/components/layout/BottomArea.test.js +232 -0
- package/dist/components/layout/BottomArea.test.js.map +1 -0
- package/dist/components/layout/DiffView.d.ts +7 -0
- package/dist/components/layout/DiffView.d.ts.map +1 -0
- package/dist/components/layout/DiffView.js +80 -0
- package/dist/components/layout/DiffView.js.map +1 -0
- package/dist/components/layout/DiffView.test.d.ts +2 -0
- package/dist/components/layout/DiffView.test.d.ts.map +1 -0
- package/dist/components/layout/DiffView.test.js +47 -0
- package/dist/components/layout/DiffView.test.js.map +1 -0
- package/dist/components/layout/StatusBar.d.ts +20 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -0
- package/dist/components/layout/StatusBar.js +129 -0
- package/dist/components/layout/StatusBar.js.map +1 -0
- package/dist/components/layout/StatusBar.test.d.ts +2 -0
- package/dist/components/layout/StatusBar.test.d.ts.map +1 -0
- package/dist/components/layout/StatusBar.test.js +121 -0
- package/dist/components/layout/StatusBar.test.js.map +1 -0
- package/dist/components/menu/ModelSelectionMenu.d.ts +18 -0
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/ModelSelectionMenu.js +45 -0
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -0
- package/dist/components/menu/ModelSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/ModelSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/ModelSelectionMenu.test.js +86 -0
- package/dist/components/menu/ModelSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/PathSelectionMenu.d.ts +15 -0
- package/dist/components/menu/PathSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/PathSelectionMenu.js +17 -0
- package/dist/components/menu/PathSelectionMenu.js.map +1 -0
- package/dist/components/menu/PathSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/PathSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/PathSelectionMenu.test.js +23 -0
- package/dist/components/menu/PathSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/ProviderSelectionMenu.d.ts +15 -0
- package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/ProviderSelectionMenu.js +186 -0
- package/dist/components/menu/ProviderSelectionMenu.js.map +1 -0
- package/dist/components/menu/ProviderSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/ProviderSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/ProviderSelectionMenu.test.js +71 -0
- package/dist/components/menu/ProviderSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.d.ts +14 -0
- package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.js +76 -0
- package/dist/components/menu/SettingsSelectionMenu.js.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.scroll.test.d.ts +2 -0
- package/dist/components/menu/SettingsSelectionMenu.scroll.test.d.ts.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.scroll.test.js +122 -0
- package/dist/components/menu/SettingsSelectionMenu.scroll.test.js.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/SettingsSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/SettingsSelectionMenu.test.js +50 -0
- package/dist/components/menu/SettingsSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/SettingsValueSelectionMenu.d.ts +13 -0
- package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/SettingsValueSelectionMenu.js +37 -0
- package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -0
- package/dist/components/menu/SettingsValueSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/SettingsValueSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/SettingsValueSelectionMenu.test.js +42 -0
- package/dist/components/menu/SettingsValueSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/SkillSelectionMenu.d.ts +11 -0
- package/dist/components/menu/SkillSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/SkillSelectionMenu.js +38 -0
- package/dist/components/menu/SkillSelectionMenu.js.map +1 -0
- package/dist/components/menu/SkillSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/SkillSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/SkillSelectionMenu.test.js +114 -0
- package/dist/components/menu/SkillSelectionMenu.test.js.map +1 -0
- package/dist/components/menu/SlashCommandMenu.d.ts +11 -0
- package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/menu/SlashCommandMenu.js +17 -0
- package/dist/components/menu/SlashCommandMenu.js.map +1 -0
- package/dist/components/menu/UndoSelectionMenu.d.ts +12 -0
- package/dist/components/menu/UndoSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/UndoSelectionMenu.js +19 -0
- package/dist/components/menu/UndoSelectionMenu.js.map +1 -0
- package/dist/components/menu/UndoSelectionMenu.test.d.ts +2 -0
- package/dist/components/menu/UndoSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/menu/UndoSelectionMenu.test.js +35 -0
- package/dist/components/menu/UndoSelectionMenu.test.js.map +1 -0
- package/dist/components/message/ChatMessage.d.ts +8 -0
- package/dist/components/message/ChatMessage.d.ts.map +1 -0
- package/dist/components/message/ChatMessage.js +11 -0
- package/dist/components/message/ChatMessage.js.map +1 -0
- package/dist/components/message/ChatMessage.test.d.ts +2 -0
- package/dist/components/message/ChatMessage.test.d.ts.map +1 -0
- package/dist/components/message/ChatMessage.test.js +29 -0
- package/dist/components/message/ChatMessage.test.js.map +1 -0
- package/dist/components/message/CommandMessage.d.ts +18 -0
- package/dist/components/message/CommandMessage.d.ts.map +1 -0
- package/dist/components/message/CommandMessage.js +708 -0
- package/dist/components/message/CommandMessage.js.map +1 -0
- package/dist/components/message/CommandMessage.test.d.ts +2 -0
- package/dist/components/message/CommandMessage.test.d.ts.map +1 -0
- package/dist/components/message/CommandMessage.test.js +1017 -0
- package/dist/components/message/CommandMessage.test.js.map +1 -0
- package/dist/components/message/MessageList.d.ts +32 -0
- package/dist/components/message/MessageList.d.ts.map +1 -0
- package/dist/components/message/MessageList.js +233 -0
- package/dist/components/message/MessageList.js.map +1 -0
- package/dist/components/message/MessageList.test.d.ts +2 -0
- package/dist/components/message/MessageList.test.d.ts.map +1 -0
- package/dist/components/message/MessageList.test.js +562 -0
- package/dist/components/message/MessageList.test.js.map +1 -0
- package/dist/components/message/SubagentActivityMessage.d.ts +13 -0
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -0
- package/dist/components/message/SubagentActivityMessage.js +72 -0
- package/dist/components/message/SubagentActivityMessage.js.map +1 -0
- package/dist/components/message/SubagentActivityMessage.test.d.ts +2 -0
- package/dist/components/message/SubagentActivityMessage.test.d.ts.map +1 -0
- package/dist/components/message/SubagentActivityMessage.test.js +191 -0
- package/dist/components/message/SubagentActivityMessage.test.js.map +1 -0
- package/dist/components/message/command-message-helpers.d.ts +84 -0
- package/dist/components/message/command-message-helpers.d.ts.map +1 -0
- package/dist/components/message/command-message-helpers.js +624 -0
- package/dist/components/message/command-message-helpers.js.map +1 -0
- package/dist/components/message/command-message-helpers.test.d.ts +2 -0
- package/dist/components/message/command-message-helpers.test.d.ts.map +1 -0
- package/dist/components/message/command-message-helpers.test.js +227 -0
- package/dist/components/message/command-message-helpers.test.js.map +1 -0
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.d.ts +2 -0
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.d.ts.map +1 -0
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.js +285 -0
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.js.map +1 -0
- package/dist/components/prompt/ApprovalPrompt.d.ts +14 -0
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -0
- package/dist/components/prompt/ApprovalPrompt.js +374 -0
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.d.ts +9 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.js +38 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.js.map +1 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.test.d.ts +2 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.test.d.ts.map +1 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.test.js +23 -0
- package/dist/components/prompt/HandoffConfirmationPrompt.test.js.map +1 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.d.ts +9 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js +44 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js.map +1 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.test.d.ts +2 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.test.d.ts.map +1 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.test.js +33 -0
- package/dist/components/prompt/InputSurgeConfirmationPrompt.test.js.map +1 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.d.ts +10 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js +49 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js.map +1 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.test.d.ts +2 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.test.d.ts.map +1 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.test.js +41 -0
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.test.js.map +1 -0
- package/dist/components/prompt/StandardModeConfirmationPrompt.d.ts +9 -0
- package/dist/components/prompt/StandardModeConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/prompt/StandardModeConfirmationPrompt.js +38 -0
- package/dist/components/prompt/StandardModeConfirmationPrompt.js.map +1 -0
- package/dist/context/InputContext.d.ts +7 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.images.test.js +12 -10
- package/dist/context/InputContext.images.test.js.map +1 -1
- package/dist/context/InputContext.js +17 -3
- package/dist/context/InputContext.js.map +1 -1
- package/dist/context/InputContext.stability.test.js +9 -11
- package/dist/context/InputContext.stability.test.js.map +1 -1
- package/dist/context/InputContext.test.js +125 -69
- package/dist/context/InputContext.test.js.map +1 -1
- package/dist/contracts/conversation.d.ts +2 -2
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/env-setup.test.js +3 -3
- package/dist/env-setup.test.js.map +1 -1
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.d.ts +2 -0
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.d.ts.map +1 -0
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.js +160 -0
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.d.ts +149 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -0
- package/dist/hooks/conversation-ui-reducer.js +259 -0
- package/dist/hooks/conversation-ui-reducer.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.multi-select.test.d.ts +2 -0
- package/dist/hooks/conversation-ui-reducer.multi-select.test.d.ts.map +1 -0
- package/dist/hooks/conversation-ui-reducer.multi-select.test.js +123 -0
- package/dist/hooks/conversation-ui-reducer.multi-select.test.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.test.d.ts +2 -0
- package/dist/hooks/conversation-ui-reducer.test.d.ts.map +1 -0
- package/dist/hooks/conversation-ui-reducer.test.js +280 -0
- package/dist/hooks/conversation-ui-reducer.test.js.map +1 -0
- package/dist/hooks/handoff-flow-reducer.d.ts +37 -0
- package/dist/hooks/handoff-flow-reducer.d.ts.map +1 -0
- package/dist/hooks/handoff-flow-reducer.js +58 -0
- package/dist/hooks/handoff-flow-reducer.js.map +1 -0
- package/dist/hooks/message-id.test.js +10 -10
- package/dist/hooks/message-id.test.js.map +1 -1
- package/dist/hooks/path-completion-filter.test.js +40 -40
- package/dist/hooks/path-completion-filter.test.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +8 -4
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +16 -3
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +164 -119
- package/dist/hooks/use-app-commands.test.js.map +1 -1
- package/dist/hooks/use-conversation-messages.d.ts +27 -0
- package/dist/hooks/use-conversation-messages.d.ts.map +1 -0
- package/dist/hooks/use-conversation-messages.js +67 -0
- package/dist/hooks/use-conversation-messages.js.map +1 -0
- package/dist/hooks/use-conversation-messages.test.d.ts +2 -0
- package/dist/hooks/use-conversation-messages.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation-messages.test.js +154 -0
- package/dist/hooks/use-conversation-messages.test.js.map +1 -0
- package/dist/hooks/use-conversation-settings.d.ts +17 -0
- package/dist/hooks/use-conversation-settings.d.ts.map +1 -0
- package/dist/hooks/use-conversation-settings.js +23 -0
- package/dist/hooks/use-conversation-settings.js.map +1 -0
- package/dist/hooks/use-conversation-settings.test.d.ts +2 -0
- package/dist/hooks/use-conversation-settings.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation-settings.test.js +82 -0
- package/dist/hooks/use-conversation-settings.test.js.map +1 -0
- package/dist/hooks/use-conversation.approval-pending-filter.test.d.ts +2 -0
- package/dist/hooks/use-conversation.approval-pending-filter.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation.approval-pending-filter.test.js +59 -0
- package/dist/hooks/use-conversation.approval-pending-filter.test.js.map +1 -0
- package/dist/hooks/use-conversation.ask-user-multi-select.test.d.ts +2 -0
- package/dist/hooks/use-conversation.ask-user-multi-select.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation.ask-user-multi-select.test.js +159 -0
- package/dist/hooks/use-conversation.ask-user-multi-select.test.js.map +1 -0
- package/dist/hooks/use-conversation.clear.test.js +85 -20
- package/dist/hooks/use-conversation.clear.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +24 -54
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +200 -219
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-conversation.resume.test.js +10 -8
- 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 +34 -12
- package/dist/hooks/use-escape-key.js.map +1 -1
- package/dist/hooks/use-escape-key.test.js +229 -61
- package/dist/hooks/use-escape-key.test.js.map +1 -1
- package/dist/hooks/use-handoff-flow.d.ts +30 -0
- package/dist/hooks/use-handoff-flow.d.ts.map +1 -0
- package/dist/hooks/use-handoff-flow.js +155 -0
- package/dist/hooks/use-handoff-flow.js.map +1 -0
- package/dist/hooks/use-handoff-flow.test.d.ts +2 -0
- package/dist/hooks/use-handoff-flow.test.d.ts.map +1 -0
- package/dist/hooks/use-handoff-flow.test.js +237 -0
- package/dist/hooks/use-handoff-flow.test.js.map +1 -0
- package/dist/hooks/use-input-history.test.js +7 -9
- package/dist/hooks/use-input-history.test.js.map +1 -1
- package/dist/hooks/use-mode-handlers.d.ts +19 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +44 -2
- 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 +128 -0
- package/dist/hooks/use-mode-handlers.test.js.map +1 -0
- package/dist/hooks/use-model-selection.d.ts +2 -2
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +12 -10
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.js +49 -75
- package/dist/hooks/use-model-selection.test.js.map +1 -1
- 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.js +62 -50
- package/dist/hooks/use-path-completion.test.js.map +1 -1
- package/dist/hooks/use-pending-turn-guards.d.ts +43 -0
- package/dist/hooks/use-pending-turn-guards.d.ts.map +1 -0
- package/dist/hooks/use-pending-turn-guards.js +120 -0
- package/dist/hooks/use-pending-turn-guards.js.map +1 -0
- package/dist/hooks/use-pending-turn-guards.test.d.ts +2 -0
- package/dist/hooks/use-pending-turn-guards.test.d.ts.map +1 -0
- package/dist/hooks/use-pending-turn-guards.test.js +314 -0
- package/dist/hooks/use-pending-turn-guards.test.js.map +1 -0
- package/dist/hooks/use-provider-selection.d.ts +55 -0
- package/dist/hooks/use-provider-selection.d.ts.map +1 -0
- package/dist/hooks/use-provider-selection.js +691 -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 +859 -0
- package/dist/hooks/use-provider-selection.test.js.map +1 -0
- package/dist/hooks/use-runtime-settings.d.ts +2 -2
- package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
- package/dist/hooks/use-runtime-settings.js +7 -3
- package/dist/hooks/use-runtime-settings.js.map +1 -1
- package/dist/hooks/use-runtime-settings.test.js +6 -7
- package/dist/hooks/use-runtime-settings.test.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 +118 -24
- package/dist/hooks/use-selection.test.js.map +1 -1
- package/dist/hooks/use-setting.d.ts +1 -1
- package/dist/hooks/use-setting.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +4 -1
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.scroll.test.js +19 -19
- package/dist/hooks/use-settings-completion.scroll.test.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +105 -105
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +4 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +148 -18
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +111 -30
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
- package/dist/hooks/use-shell-mode.d.ts +2 -2
- package/dist/hooks/use-shell-mode.d.ts.map +1 -1
- package/dist/hooks/use-shell-mode.js +17 -8
- package/dist/hooks/use-shell-mode.js.map +1 -1
- package/dist/hooks/use-skill-selection.d.ts +22 -0
- package/dist/hooks/use-skill-selection.d.ts.map +1 -0
- package/dist/hooks/use-skill-selection.js +67 -0
- package/dist/hooks/use-skill-selection.js.map +1 -0
- package/dist/hooks/use-skill-selection.test.d.ts +2 -0
- package/dist/hooks/use-skill-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-skill-selection.test.js +68 -0
- package/dist/hooks/use-skill-selection.test.js.map +1 -0
- package/dist/hooks/use-slash-commands.d.ts +2 -1
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-slash-commands.js +12 -6
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-slash-commands.test.js +81 -67
- package/dist/hooks/use-slash-commands.test.js.map +1 -1
- package/dist/hooks/use-terminal-focus-notifier.d.ts +14 -0
- package/dist/hooks/use-terminal-focus-notifier.d.ts.map +1 -0
- package/dist/hooks/use-terminal-focus-notifier.js +70 -0
- package/dist/hooks/use-terminal-focus-notifier.js.map +1 -0
- package/dist/hooks/use-terminal-focus-notifier.test.d.ts +2 -0
- package/dist/hooks/use-terminal-focus-notifier.test.d.ts.map +1 -0
- package/dist/hooks/use-terminal-focus-notifier.test.js +138 -0
- package/dist/hooks/use-terminal-focus-notifier.test.js.map +1 -0
- package/dist/hooks/use-terminal-width.js +1 -1
- package/dist/hooks/use-trigger-detection.d.ts +9 -2
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +76 -21
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/hooks/use-trigger-detection.test.js +58 -15
- package/dist/hooks/use-trigger-detection.test.js.map +1 -1
- package/dist/lib/agent-chat-service.d.ts +36 -0
- package/dist/lib/agent-chat-service.d.ts.map +1 -0
- package/dist/lib/agent-chat-service.js +181 -0
- package/dist/lib/agent-chat-service.js.map +1 -0
- package/dist/lib/agent-chat-service.test.d.ts +2 -0
- package/dist/lib/agent-chat-service.test.d.ts.map +1 -0
- package/dist/lib/agent-chat-service.test.js +155 -0
- package/dist/lib/agent-chat-service.test.js.map +1 -0
- package/dist/lib/agent-client.d.ts +76 -0
- package/dist/lib/agent-client.d.ts.map +1 -0
- package/dist/lib/agent-client.js +190 -0
- package/dist/lib/agent-client.js.map +1 -0
- package/dist/lib/agent-configuration.d.ts +72 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -0
- package/dist/lib/agent-configuration.js +202 -0
- package/dist/lib/agent-configuration.js.map +1 -0
- package/dist/lib/agent-configuration.test.d.ts +2 -0
- package/dist/lib/agent-configuration.test.d.ts.map +1 -0
- package/dist/lib/agent-configuration.test.js +332 -0
- package/dist/lib/agent-configuration.test.js.map +1 -0
- package/dist/lib/agent-factory.d.ts +34 -0
- package/dist/lib/agent-factory.d.ts.map +1 -0
- package/dist/lib/agent-factory.js +240 -0
- package/dist/lib/agent-factory.js.map +1 -0
- package/dist/lib/agent-factory.test.d.ts +2 -0
- package/dist/lib/agent-factory.test.d.ts.map +1 -0
- package/dist/lib/agent-factory.test.js +175 -0
- package/dist/lib/agent-factory.test.js.map +1 -0
- package/dist/lib/agent-run-orchestrator.d.ts +38 -0
- package/dist/lib/agent-run-orchestrator.d.ts.map +1 -0
- package/dist/lib/agent-run-orchestrator.js +262 -0
- package/dist/lib/agent-run-orchestrator.js.map +1 -0
- package/dist/lib/agent-run-orchestrator.test.d.ts +2 -0
- package/dist/lib/agent-run-orchestrator.test.d.ts.map +1 -0
- package/dist/lib/agent-run-orchestrator.test.js +237 -0
- package/dist/lib/agent-run-orchestrator.test.js.map +1 -0
- package/dist/lib/ask-user-answer-store.d.ts +9 -0
- package/dist/lib/ask-user-answer-store.d.ts.map +1 -0
- package/dist/lib/ask-user-answer-store.js +19 -0
- package/dist/lib/ask-user-answer-store.js.map +1 -0
- package/dist/lib/ask-user-answer-store.test.d.ts +2 -0
- package/dist/lib/ask-user-answer-store.test.d.ts.map +1 -0
- package/dist/lib/ask-user-answer-store.test.js +41 -0
- package/dist/lib/ask-user-answer-store.test.js.map +1 -0
- package/dist/lib/chained-input-filter.d.ts +23 -0
- package/dist/lib/chained-input-filter.d.ts.map +1 -0
- package/dist/lib/chained-input-filter.js +93 -0
- package/dist/lib/chained-input-filter.js.map +1 -0
- package/dist/lib/chained-input-filter.test.d.ts +2 -0
- package/dist/lib/chained-input-filter.test.d.ts.map +1 -0
- package/dist/lib/chained-input-filter.test.js +198 -0
- package/dist/lib/chained-input-filter.test.js.map +1 -0
- package/dist/lib/editor-impl.d.ts.map +1 -1
- package/dist/lib/editor-impl.js +22 -5
- package/dist/lib/editor-impl.js.map +1 -1
- package/dist/lib/editor-impl.test.js +33 -33
- package/dist/lib/editor-impl.test.js.map +1 -1
- package/dist/lib/openai-agent-client.chat.test.js +26 -18
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +34 -40
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.flex-tier.test.js +16 -16
- package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -1
- package/dist/lib/openai-agent-client.js +332 -421
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +694 -136
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +148 -154
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- package/dist/lib/openai-strict-tool-schema.test.js +9 -9
- package/dist/lib/openai-strict-tool-schema.test.js.map +1 -1
- package/dist/lib/retry-executor.d.ts.map +1 -1
- package/dist/lib/retry-executor.js +10 -65
- package/dist/lib/retry-executor.js.map +1 -1
- package/dist/lib/retry-executor.test.js +36 -38
- package/dist/lib/retry-executor.test.js.map +1 -1
- package/dist/lib/runner-manager.d.ts +22 -0
- package/dist/lib/runner-manager.d.ts.map +1 -0
- package/dist/lib/runner-manager.js +56 -0
- package/dist/lib/runner-manager.js.map +1 -0
- package/dist/lib/runner-manager.test.d.ts +2 -0
- package/dist/lib/runner-manager.test.d.ts.map +1 -0
- package/dist/lib/runner-manager.test.js +136 -0
- package/dist/lib/runner-manager.test.js.map +1 -0
- package/dist/lib/subagent-bridge.d.ts +45 -0
- package/dist/lib/subagent-bridge.d.ts.map +1 -0
- package/dist/lib/subagent-bridge.js +122 -0
- package/dist/lib/subagent-bridge.js.map +1 -0
- package/dist/lib/subagent-bridge.test.d.ts +2 -0
- package/dist/lib/subagent-bridge.test.d.ts.map +1 -0
- package/dist/lib/subagent-bridge.test.js +183 -0
- package/dist/lib/subagent-bridge.test.js.map +1 -0
- package/dist/lib/tool-interceptor-registry.d.ts +11 -0
- package/dist/lib/tool-interceptor-registry.d.ts.map +1 -0
- package/dist/lib/tool-interceptor-registry.js +35 -0
- package/dist/lib/tool-interceptor-registry.js.map +1 -0
- package/dist/lib/tool-interceptor-registry.test.d.ts +2 -0
- package/dist/lib/tool-interceptor-registry.test.d.ts.map +1 -0
- package/dist/lib/tool-interceptor-registry.test.js +108 -0
- package/dist/lib/tool-interceptor-registry.test.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +65 -2
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +199 -99
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +192 -91
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/lib/tool-selection-policy.test.js +43 -43
- package/dist/lib/tool-selection-policy.test.js.map +1 -1
- package/dist/non-interactive.d.ts +16 -8
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +23 -7
- package/dist/non-interactive.js.map +1 -1
- package/dist/non-interactive.test.js +67 -58
- package/dist/non-interactive.test.js.map +1 -1
- package/dist/prompts/gpt-5-modern.md +7 -8
- package/dist/prompts/gpt-5.4-mini.md +113 -0
- package/dist/prompts/gpt-5.5.md +59 -56
- package/dist/prompts/kimi.md +87 -0
- package/dist/prompts/mentor-addon.md +41 -40
- package/dist/prompts/orchestrator.md +23 -41
- package/dist/prompts/plan-mode-info.md +23 -12
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +15 -6
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.js +51 -44
- package/dist/prompts/prompt-constructor.test.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +54 -45
- package/dist/prompts/prompt-constructor.ts +17 -6
- package/dist/prompts/prompt-profiles.d.ts.map +1 -1
- package/dist/prompts/prompt-profiles.js +7 -6
- package/dist/prompts/prompt-profiles.js.map +1 -1
- package/dist/prompts/prompt-profiles.ts +7 -6
- package/dist/prompts/prompt-selector.test.js +1 -1
- package/dist/prompts/prompt-selector.test.ts +1 -1
- package/dist/prompts/reasoning-efficiency.test.js +7 -7
- package/dist/prompts/reasoning-efficiency.test.js.map +1 -1
- package/dist/prompts/reasoning-efficiency.test.ts +7 -7
- package/dist/prompts/search-via-shell.test.js +22 -22
- package/dist/prompts/search-via-shell.test.js.map +1 -1
- package/dist/prompts/search-via-shell.test.ts +22 -22
- package/dist/prompts/simple.md +53 -33
- package/dist/prompts/simple_prev.md +33 -0
- package/dist/prompts/simple_prev2.md +33 -0
- package/dist/prompts/simple_v2.md +84 -0
- package/dist/prompts/simple_v3.md +267 -0
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +21 -3
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.js +39 -11
- package/dist/prompts/subagent-delegation.test.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +45 -11
- package/dist/prompts/subagent-delegation.ts +21 -3
- 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/mentor-mode.md +20 -0
- package/dist/prompts/subagents/mentor.md +12 -2
- 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/prompts/worktree-hygiene.md +4 -3
- package/dist/providers/ai-sdk-agents-adapter.test.js +17 -17
- package/dist/providers/ai-sdk-agents-adapter.test.js.map +1 -1
- 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 +46 -23
- package/dist/providers/ai-sdk-anthropic.provider.test.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.js +13 -1
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.test.js +32 -26
- package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.test.js +11 -11
- package/dist/providers/ai-sdk-openrouter.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 +17 -5
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +614 -41
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-responses-model.test.js +753 -91
- 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 +34 -21
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/codex.provider.test.js +133 -124
- package/dist/providers/codex.provider.test.js.map +1 -1
- package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -1
- package/dist/providers/common/openai-compatible-messages.js +7 -0
- package/dist/providers/common/openai-compatible-messages.js.map +1 -1
- package/dist/providers/common/openai-compatible-messages.test.js +46 -42
- package/dist/providers/common/openai-compatible-messages.test.js.map +1 -1
- package/dist/providers/common/provider-errors.d.ts +9 -0
- package/dist/providers/common/provider-errors.d.ts.map +1 -1
- package/dist/providers/common/provider-errors.js +13 -0
- package/dist/providers/common/provider-errors.js.map +1 -1
- package/dist/providers/custom-provider-adapter.test.js +36 -24
- package/dist/providers/custom-provider-adapter.test.js.map +1 -1
- package/dist/providers/fallback-responses-model.d.ts +28 -2
- package/dist/providers/fallback-responses-model.d.ts.map +1 -1
- package/dist/providers/fallback-responses-model.js +194 -252
- package/dist/providers/fallback-responses-model.js.map +1 -1
- package/dist/providers/fallback-responses-model.test.js +524 -176
- package/dist/providers/fallback-responses-model.test.js.map +1 -1
- package/dist/providers/fetch/composer.d.ts +3 -2
- package/dist/providers/fetch/composer.d.ts.map +1 -1
- package/dist/providers/fetch/composer.js +11 -2
- package/dist/providers/fetch/composer.js.map +1 -1
- package/dist/providers/fetch/composer.test.js +214 -76
- package/dist/providers/fetch/composer.test.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +2 -2
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +18 -92
- package/dist/providers/fetch/logging-middleware.js.map +1 -1
- package/dist/providers/fetch/rate-limit-middleware.d.ts +15 -0
- package/dist/providers/fetch/rate-limit-middleware.d.ts.map +1 -0
- package/dist/providers/fetch/rate-limit-middleware.js +55 -0
- package/dist/providers/fetch/rate-limit-middleware.js.map +1 -0
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
- package/dist/providers/openai-compatible-lazy.js +3 -1
- package/dist/providers/openai-compatible-lazy.js.map +1 -1
- 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 +17 -11
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +6 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +76 -44
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-compatible.provider.test.js +234 -164
- 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 +65 -24
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openai.provider.test.js +87 -16
- package/dist/providers/openai.provider.test.js.map +1 -1
- 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 +38 -31
- 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/openrouter.provider.request-preprocessing.test.js +6 -6
- package/dist/providers/openrouter.provider.request-preprocessing.test.js.map +1 -1
- package/dist/providers/provider-service.d.ts +37 -0
- package/dist/providers/provider-service.d.ts.map +1 -0
- package/dist/providers/provider-service.js +192 -0
- package/dist/providers/provider-service.js.map +1 -0
- package/dist/providers/provider-service.test.d.ts +2 -0
- package/dist/providers/provider-service.test.d.ts.map +1 -0
- package/dist/providers/provider-service.test.js +233 -0
- package/dist/providers/provider-service.test.js.map +1 -0
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +25 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/registry.test.js +72 -46
- package/dist/providers/registry.test.js.map +1 -1
- package/dist/providers/retrying-model.d.ts +21 -0
- package/dist/providers/retrying-model.d.ts.map +1 -0
- package/dist/providers/retrying-model.js +95 -0
- package/dist/providers/retrying-model.js.map +1 -0
- package/dist/providers/retrying-model.test.d.ts +2 -0
- package/dist/providers/retrying-model.test.d.ts.map +1 -0
- package/dist/providers/retrying-model.test.js +103 -0
- package/dist/providers/retrying-model.test.js.map +1 -0
- package/dist/providers/web-search/exa.provider.test.js +22 -23
- package/dist/providers/web-search/exa.provider.test.js.map +1 -1
- package/dist/providers/web-search/registry.test.js +32 -33
- package/dist/providers/web-search/registry.test.js.map +1 -1
- package/dist/providers/web-search/tavily.provider.test.js +22 -23
- package/dist/providers/web-search/tavily.provider.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/dataset.d.ts +3 -3
- package/dist/scripts/eval-auto-approval/dataset.test.js +19 -19
- package/dist/scripts/eval-auto-approval/dataset.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/leaderboard.test.js +87 -83
- package/dist/scripts/eval-auto-approval/leaderboard.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/metrics.test.js +13 -13
- package/dist/scripts/eval-auto-approval/metrics.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/report.test.js +3 -3
- package/dist/scripts/eval-auto-approval/report.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/runner-utils.test.js +30 -38
- package/dist/scripts/eval-auto-approval/runner-utils.test.js.map +1 -1
- package/dist/scripts/eval-auto-approval/runner.js +9 -5
- package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
- package/dist/scripts/extract-provider-traffic.js +1 -1
- package/dist/scripts/extract-provider-traffic.js.map +1 -1
- package/dist/services/agent-stream.d.ts +2 -11
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/approval/approval-decision-policy.d.ts +20 -0
- package/dist/services/approval/approval-decision-policy.d.ts.map +1 -0
- package/dist/services/approval/approval-decision-policy.js +21 -0
- package/dist/services/approval/approval-decision-policy.js.map +1 -0
- package/dist/services/approval/approval-decision-policy.test.d.ts +2 -0
- package/dist/services/approval/approval-decision-policy.test.d.ts.map +1 -0
- package/dist/services/approval/approval-decision-policy.test.js +149 -0
- package/dist/services/approval/approval-decision-policy.test.js.map +1 -0
- package/dist/services/approval/approval-flow-coordinator.d.ts +61 -0
- package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -0
- package/dist/services/approval/approval-flow-coordinator.js +167 -0
- package/dist/services/approval/approval-flow-coordinator.js.map +1 -0
- package/dist/services/approval/approval-flow-coordinator.test.d.ts +2 -0
- package/dist/services/approval/approval-flow-coordinator.test.d.ts.map +1 -0
- package/dist/services/approval/approval-flow-coordinator.test.js +314 -0
- package/dist/services/approval/approval-flow-coordinator.test.js.map +1 -0
- package/dist/services/approval/approval-presentation-policy.d.ts +17 -0
- package/dist/services/approval/approval-presentation-policy.d.ts.map +1 -0
- package/dist/services/approval/approval-presentation-policy.js +44 -0
- package/dist/services/approval/approval-presentation-policy.js.map +1 -0
- package/dist/services/approval/approval-presentation-policy.test.d.ts +2 -0
- package/dist/services/approval/approval-presentation-policy.test.d.ts.map +1 -0
- package/dist/services/approval/approval-presentation-policy.test.js +74 -0
- package/dist/services/approval/approval-presentation-policy.test.js.map +1 -0
- package/dist/services/approval/approval-state.d.ts +52 -0
- package/dist/services/approval/approval-state.d.ts.map +1 -0
- package/dist/services/approval/approval-state.js +53 -0
- package/dist/services/approval/approval-state.js.map +1 -0
- package/dist/services/approval/approval-state.test.d.ts +2 -0
- package/dist/services/approval/approval-state.test.d.ts.map +1 -0
- package/dist/services/approval/approval-state.test.js +83 -0
- package/dist/services/approval/approval-state.test.js.map +1 -0
- package/dist/services/approval/shell-auto-approval-evaluator.d.ts +25 -0
- package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -0
- package/dist/services/approval/shell-auto-approval-evaluator.js +401 -0
- package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -0
- package/dist/services/approval/shell-auto-approval-evaluator.test.d.ts +2 -0
- package/dist/services/approval/shell-auto-approval-evaluator.test.d.ts.map +1 -0
- package/dist/services/approval/shell-auto-approval-evaluator.test.js +437 -0
- package/dist/services/approval/shell-auto-approval-evaluator.test.js.map +1 -0
- package/dist/services/approval/shell-auto-approval-resolver.d.ts +25 -0
- package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -0
- package/dist/services/approval/shell-auto-approval-resolver.js +61 -0
- package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -0
- package/dist/services/approval/shell-auto-approval-resolver.test.d.ts +2 -0
- package/dist/services/approval/shell-auto-approval-resolver.test.d.ts.map +1 -0
- package/dist/services/approval/shell-auto-approval-resolver.test.js +120 -0
- package/dist/services/approval/shell-auto-approval-resolver.test.js.map +1 -0
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts +39 -0
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -0
- package/dist/services/approval/tool-approval-batch-coordinator.js +114 -0
- package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -0
- package/dist/services/approval/tool-approval-policy-registry.d.ts +25 -0
- package/dist/services/approval/tool-approval-policy-registry.d.ts.map +1 -0
- package/dist/services/approval/tool-approval-policy-registry.js +26 -0
- package/dist/services/approval/tool-approval-policy-registry.js.map +1 -0
- package/dist/services/approval/tool-owner.d.ts +11 -0
- package/dist/services/approval/tool-owner.d.ts.map +1 -0
- package/dist/services/approval/tool-owner.js +58 -0
- package/dist/services/approval/tool-owner.js.map +1 -0
- package/dist/services/approval-continuation-runner.d.ts +59 -0
- package/dist/services/approval-continuation-runner.d.ts.map +1 -0
- package/dist/services/approval-continuation-runner.js +193 -0
- package/dist/services/approval-continuation-runner.js.map +1 -0
- package/dist/services/approval-flow-coordinator.d.ts +18 -3
- package/dist/services/approval-flow-coordinator.d.ts.map +1 -1
- package/dist/services/approval-flow-coordinator.js +25 -58
- package/dist/services/approval-flow-coordinator.js.map +1 -1
- package/dist/services/approval-flow-coordinator.test.js +64 -83
- package/dist/services/approval-flow-coordinator.test.js.map +1 -1
- package/dist/services/approval-state.d.ts +17 -2
- package/dist/services/approval-state.d.ts.map +1 -1
- package/dist/services/approval-state.js +5 -0
- package/dist/services/approval-state.js.map +1 -1
- package/dist/services/approval-state.test.js.map +1 -1
- package/dist/services/auto-approval-continuation-resolver.d.ts +31 -0
- package/dist/services/auto-approval-continuation-resolver.d.ts.map +1 -0
- package/dist/services/auto-approval-continuation-resolver.js +111 -0
- package/dist/services/auto-approval-continuation-resolver.js.map +1 -0
- package/dist/services/command-message-streaming.d.ts +1 -1
- package/dist/services/command-message-streaming.d.ts.map +1 -1
- package/dist/services/command-message-streaming.js +1 -1
- package/dist/services/command-message-streaming.js.map +1 -1
- package/dist/services/command-message-streaming.test.js +14 -14
- package/dist/services/command-message-streaming.test.js.map +1 -1
- package/dist/services/continuation-driver.d.ts +85 -0
- package/dist/services/continuation-driver.d.ts.map +1 -0
- package/dist/services/continuation-driver.js +426 -0
- package/dist/services/continuation-driver.js.map +1 -0
- package/dist/services/continuation-driver.test.d.ts +2 -0
- package/dist/services/continuation-driver.test.d.ts.map +1 -0
- package/dist/services/continuation-driver.test.js +503 -0
- package/dist/services/continuation-driver.test.js.map +1 -0
- package/dist/services/conversation/conversation-adapter-factory.d.ts +12 -0
- package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -0
- package/dist/services/conversation/conversation-adapter-factory.js +18 -0
- package/dist/services/conversation/conversation-adapter-factory.js.map +1 -0
- package/dist/services/conversation/conversation-adapter.d.ts +43 -0
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -0
- package/dist/services/conversation/conversation-adapter.js +151 -0
- package/dist/services/conversation/conversation-adapter.js.map +1 -0
- package/dist/services/conversation/conversation-adapter.test.d.ts +2 -0
- package/dist/services/conversation/conversation-adapter.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-adapter.test.js +65 -0
- package/dist/services/conversation/conversation-adapter.test.js.map +1 -0
- package/dist/services/conversation/conversation-clear-save.test.d.ts +2 -0
- package/dist/services/conversation/conversation-clear-save.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-clear-save.test.js +56 -0
- package/dist/services/conversation/conversation-clear-save.test.js.map +1 -0
- package/dist/services/conversation/conversation-events.d.ts +160 -0
- package/dist/services/conversation/conversation-events.d.ts.map +1 -0
- package/dist/services/conversation/conversation-events.js +2 -0
- package/dist/services/conversation/conversation-events.js.map +1 -0
- package/dist/services/conversation/conversation-history-repair.d.ts +25 -0
- package/dist/services/conversation/conversation-history-repair.d.ts.map +1 -0
- package/dist/services/conversation/conversation-history-repair.js +282 -0
- package/dist/services/conversation/conversation-history-repair.js.map +1 -0
- package/dist/services/conversation/conversation-history-repair.test.d.ts +2 -0
- package/dist/services/conversation/conversation-history-repair.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-history-repair.test.js +79 -0
- package/dist/services/conversation/conversation-history-repair.test.js.map +1 -0
- package/dist/services/conversation/conversation-integration.test.d.ts +2 -0
- package/dist/services/conversation/conversation-integration.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-integration.test.js +273 -0
- package/dist/services/conversation/conversation-integration.test.js.map +1 -0
- package/dist/services/conversation/conversation-persistence-types.d.ts +46 -0
- package/dist/services/conversation/conversation-persistence-types.d.ts.map +1 -0
- package/dist/services/conversation/conversation-persistence-types.js +2 -0
- package/dist/services/conversation/conversation-persistence-types.js.map +1 -0
- package/dist/services/conversation/conversation-persistence.d.ts +60 -0
- package/dist/services/conversation/conversation-persistence.d.ts.map +1 -0
- package/dist/services/conversation/conversation-persistence.js +455 -0
- package/dist/services/conversation/conversation-persistence.js.map +1 -0
- package/dist/services/conversation/conversation-persistence.test.d.ts +2 -0
- package/dist/services/conversation/conversation-persistence.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-persistence.test.js +1073 -0
- package/dist/services/conversation/conversation-persistence.test.js.map +1 -0
- package/dist/services/conversation/conversation-replay.d.ts +26 -0
- package/dist/services/conversation/conversation-replay.d.ts.map +1 -0
- package/dist/services/conversation/conversation-replay.js +998 -0
- package/dist/services/conversation/conversation-replay.js.map +1 -0
- package/dist/services/conversation/conversation-replay.test.d.ts +2 -0
- package/dist/services/conversation/conversation-replay.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-replay.test.js +1221 -0
- package/dist/services/conversation/conversation-replay.test.js.map +1 -0
- package/dist/services/conversation/conversation-result-builder.d.ts +58 -0
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -0
- package/dist/services/conversation/conversation-result-builder.js +178 -0
- package/dist/services/conversation/conversation-result-builder.js.map +1 -0
- package/dist/services/conversation/conversation-result-builder.test.d.ts +2 -0
- package/dist/services/conversation/conversation-result-builder.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-result-builder.test.js +504 -0
- package/dist/services/conversation/conversation-result-builder.test.js.map +1 -0
- package/dist/services/conversation/conversation-runtime-factory.d.ts +33 -0
- package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -0
- package/dist/services/conversation/conversation-runtime-factory.js +17 -0
- package/dist/services/conversation/conversation-runtime-factory.js.map +1 -0
- package/dist/services/conversation/conversation-service.d.ts +73 -0
- package/dist/services/conversation/conversation-service.d.ts.map +1 -0
- package/dist/services/conversation/conversation-service.js +106 -0
- package/dist/services/conversation/conversation-service.js.map +1 -0
- package/dist/services/conversation/conversation-service.test.d.ts +2 -0
- package/dist/services/conversation/conversation-service.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-service.test.js +1138 -0
- package/dist/services/conversation/conversation-service.test.js.map +1 -0
- package/dist/services/conversation/conversation-store-adapter.d.ts +45 -0
- package/dist/services/conversation/conversation-store-adapter.d.ts.map +1 -0
- package/dist/services/conversation/conversation-store-adapter.js +88 -0
- package/dist/services/conversation/conversation-store-adapter.js.map +1 -0
- package/dist/services/conversation/conversation-store-adapter.test.d.ts +2 -0
- package/dist/services/conversation/conversation-store-adapter.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-store-adapter.test.js +120 -0
- package/dist/services/conversation/conversation-store-adapter.test.js.map +1 -0
- package/dist/services/conversation/conversation-store.d.ts +77 -0
- package/dist/services/conversation/conversation-store.d.ts.map +1 -0
- package/dist/services/conversation/conversation-store.js +303 -0
- package/dist/services/conversation/conversation-store.js.map +1 -0
- package/dist/services/conversation/conversation-store.test.d.ts +2 -0
- package/dist/services/conversation/conversation-store.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-store.test.js +411 -0
- package/dist/services/conversation/conversation-store.test.js.map +1 -0
- package/dist/services/conversation/conversation-turn-items.d.ts +25 -0
- package/dist/services/conversation/conversation-turn-items.d.ts.map +1 -0
- package/dist/services/conversation/conversation-turn-items.js +404 -0
- package/dist/services/conversation/conversation-turn-items.js.map +1 -0
- package/dist/services/conversation/conversation-turn-items.test.d.ts +2 -0
- package/dist/services/conversation/conversation-turn-items.test.d.ts.map +1 -0
- package/dist/services/conversation/conversation-turn-items.test.js +68 -0
- package/dist/services/conversation/conversation-turn-items.test.js.map +1 -0
- package/dist/services/conversation-adapter.d.ts +50 -0
- package/dist/services/conversation-adapter.d.ts.map +1 -0
- package/dist/services/conversation-adapter.js +147 -0
- package/dist/services/conversation-adapter.js.map +1 -0
- package/dist/services/conversation-agent-client.d.ts +46 -0
- package/dist/services/conversation-agent-client.d.ts.map +1 -0
- package/dist/services/conversation-agent-client.js +2 -0
- package/dist/services/conversation-agent-client.js.map +1 -0
- package/dist/services/conversation-events.d.ts +13 -1
- package/dist/services/conversation-events.d.ts.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-logger.d.ts +23 -0
- package/dist/services/conversation-logger.d.ts.map +1 -0
- package/dist/services/conversation-logger.js +141 -0
- package/dist/services/conversation-logger.js.map +1 -0
- package/dist/services/conversation-logger.test.d.ts +2 -0
- package/dist/services/conversation-logger.test.d.ts.map +1 -0
- package/dist/services/conversation-logger.test.js +221 -0
- package/dist/services/conversation-logger.test.js.map +1 -0
- package/dist/services/conversation-persistence.test.js +27 -14
- 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 +104 -5
- package/dist/services/conversation-replay.js.map +1 -1
- package/dist/services/conversation-replay.test.js +312 -0
- package/dist/services/conversation-replay.test.js.map +1 -1
- package/dist/services/conversation-result-builder.d.ts +7 -0
- package/dist/services/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.js +24 -2
- package/dist/services/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +32 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-result-resolver.d.ts +25 -0
- package/dist/services/conversation-result-resolver.d.ts.map +1 -0
- package/dist/services/conversation-result-resolver.js +79 -0
- package/dist/services/conversation-result-resolver.js.map +1 -0
- package/dist/services/conversation-result-resolver.test.d.ts +2 -0
- package/dist/services/conversation-result-resolver.test.d.ts.map +1 -0
- package/dist/services/conversation-result-resolver.test.js +186 -0
- package/dist/services/conversation-result-resolver.test.js.map +1 -0
- package/dist/services/conversation-retry-policy.d.ts +11 -9
- package/dist/services/conversation-retry-policy.d.ts.map +1 -1
- package/dist/services/conversation-retry-policy.js +10 -52
- package/dist/services/conversation-retry-policy.js.map +1 -1
- package/dist/services/conversation-retry-policy.test.js +4 -3
- package/dist/services/conversation-retry-policy.test.js.map +1 -1
- package/dist/services/conversation-service.d.ts +11 -8
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +33 -28
- package/dist/services/conversation-service.js.map +1 -1
- package/dist/services/conversation-service.test.d.ts +2 -0
- package/dist/services/conversation-service.test.d.ts.map +1 -0
- package/dist/services/conversation-service.test.js +1102 -0
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/services/conversation-session-composition.d.ts +85 -0
- package/dist/services/conversation-session-composition.d.ts.map +1 -0
- package/dist/services/conversation-session-composition.js +246 -0
- package/dist/services/conversation-session-composition.js.map +1 -0
- package/dist/services/conversation-session-factory.d.ts +47 -0
- package/dist/services/conversation-session-factory.d.ts.map +1 -0
- package/dist/services/conversation-session-factory.js +41 -0
- package/dist/services/conversation-session-factory.js.map +1 -0
- package/dist/services/conversation-session-factory.test.d.ts +2 -0
- package/dist/services/conversation-session-factory.test.d.ts.map +1 -0
- package/dist/services/conversation-session-factory.test.js +197 -0
- package/dist/services/conversation-session-factory.test.js.map +1 -0
- package/dist/services/conversation-session-reasoning.test.js +9 -4
- package/dist/services/conversation-session-reasoning.test.js.map +1 -1
- package/dist/services/conversation-session.auto-approval.test.js +107 -52
- package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
- package/dist/services/conversation-session.characterization.test.d.ts +2 -0
- package/dist/services/conversation-session.characterization.test.d.ts.map +1 -0
- package/dist/services/conversation-session.characterization.test.js +1051 -0
- package/dist/services/conversation-session.characterization.test.js.map +1 -0
- package/dist/services/conversation-session.d.ts +16 -102
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.input-surge.test.d.ts +2 -0
- package/dist/services/conversation-session.input-surge.test.d.ts.map +1 -0
- package/dist/services/conversation-session.input-surge.test.js +240 -0
- package/dist/services/conversation-session.input-surge.test.js.map +1 -0
- package/dist/services/conversation-session.isolation.test.d.ts +2 -0
- package/dist/services/conversation-session.isolation.test.d.ts.map +1 -0
- package/dist/services/conversation-session.isolation.test.js +291 -0
- package/dist/services/conversation-session.isolation.test.js.map +1 -0
- package/dist/services/conversation-session.js +19 -1233
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-session.stream.test.d.ts +2 -0
- package/dist/services/conversation-session.stream.test.d.ts.map +1 -0
- package/dist/services/conversation-session.stream.test.js +2099 -0
- package/dist/services/conversation-session.stream.test.js.map +1 -0
- package/dist/services/conversation-session.tool-started.test.d.ts +2 -0
- package/dist/services/conversation-session.tool-started.test.d.ts.map +1 -0
- package/dist/services/conversation-session.tool-started.test.js +244 -0
- package/dist/services/conversation-session.tool-started.test.js.map +1 -0
- package/dist/services/conversation-store-adapter.d.ts +45 -0
- package/dist/services/conversation-store-adapter.d.ts.map +1 -0
- package/dist/services/conversation-store-adapter.js +88 -0
- package/dist/services/conversation-store-adapter.js.map +1 -0
- package/dist/services/conversation-store-adapter.test.d.ts +2 -0
- package/dist/services/conversation-store-adapter.test.d.ts.map +1 -0
- package/dist/services/conversation-store-adapter.test.js +120 -0
- package/dist/services/conversation-store-adapter.test.js.map +1 -0
- package/dist/services/conversation-terminal-adapter.d.ts +50 -0
- package/dist/services/conversation-terminal-adapter.d.ts.map +1 -0
- package/dist/services/conversation-terminal-adapter.js +147 -0
- package/dist/services/conversation-terminal-adapter.js.map +1 -0
- package/dist/services/conversation-turn-runner.d.ts +70 -0
- package/dist/services/conversation-turn-runner.d.ts.map +1 -0
- package/dist/services/conversation-turn-runner.js +396 -0
- package/dist/services/conversation-turn-runner.js.map +1 -0
- package/dist/services/execution-context.test.js +15 -15
- package/dist/services/execution-context.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/generation-guard.d.ts +16 -0
- package/dist/services/generation-guard.d.ts.map +1 -0
- package/dist/services/generation-guard.js +29 -0
- package/dist/services/generation-guard.js.map +1 -0
- package/dist/services/generation-guard.test.d.ts +2 -0
- package/dist/services/generation-guard.test.d.ts.map +1 -0
- package/dist/services/generation-guard.test.js +404 -0
- package/dist/services/generation-guard.test.js.map +1 -0
- package/dist/services/history-service.d.ts +2 -3
- package/dist/services/history-service.d.ts.map +1 -1
- package/dist/services/history-service.js +0 -52
- package/dist/services/history-service.js.map +1 -1
- package/dist/services/history-service.test.js +13 -13
- package/dist/services/history-service.test.js.map +1 -1
- package/dist/services/initial-turn-runner.d.ts +75 -0
- package/dist/services/initial-turn-runner.d.ts.map +1 -0
- package/dist/services/initial-turn-runner.js +437 -0
- package/dist/services/initial-turn-runner.js.map +1 -0
- package/dist/services/initial-turn-runner.test.d.ts +2 -0
- package/dist/services/initial-turn-runner.test.d.ts.map +1 -0
- package/dist/services/initial-turn-runner.test.js +358 -0
- package/dist/services/initial-turn-runner.test.js.map +1 -0
- package/dist/services/input-surge-guard.d.ts +3 -6
- package/dist/services/input-surge-guard.d.ts.map +1 -1
- package/dist/services/input-surge-guard.js +4 -79
- package/dist/services/input-surge-guard.js.map +1 -1
- package/dist/services/input-surge-guard.test.js +28 -39
- package/dist/services/input-surge-guard.test.js.map +1 -1
- package/dist/services/interruption-info.d.ts.map +1 -1
- package/dist/services/interruption-info.js +11 -9
- package/dist/services/interruption-info.js.map +1 -1
- package/dist/services/interruption-info.test.js +65 -58
- package/dist/services/interruption-info.test.js.map +1 -1
- package/dist/services/large-uncached-input-guard.test.js +28 -28
- package/dist/services/large-uncached-input-guard.test.js.map +1 -1
- package/dist/services/logging/assistant-turn-journal.d.ts +56 -0
- package/dist/services/logging/assistant-turn-journal.d.ts.map +1 -0
- package/dist/services/logging/assistant-turn-journal.js +139 -0
- package/dist/services/logging/assistant-turn-journal.js.map +1 -0
- package/dist/services/logging/assistant-turn-journal.test.d.ts +2 -0
- package/dist/services/logging/assistant-turn-journal.test.d.ts.map +1 -0
- package/dist/services/logging/assistant-turn-journal.test.js +118 -0
- package/dist/services/logging/assistant-turn-journal.test.js.map +1 -0
- package/dist/services/logging/conversation-log-events.d.ts +158 -0
- package/dist/services/logging/conversation-log-events.d.ts.map +1 -0
- package/dist/services/logging/conversation-log-events.js +12 -0
- package/dist/services/logging/conversation-log-events.js.map +1 -0
- package/dist/services/logging/conversation-log-writer.d.ts +40 -0
- package/dist/services/logging/conversation-log-writer.d.ts.map +1 -0
- package/dist/services/logging/conversation-log-writer.js +275 -0
- package/dist/services/logging/conversation-log-writer.js.map +1 -0
- package/dist/services/logging/conversation-logger.d.ts +29 -0
- package/dist/services/logging/conversation-logger.d.ts.map +1 -0
- package/dist/services/logging/conversation-logger.js +189 -0
- package/dist/services/logging/conversation-logger.js.map +1 -0
- package/dist/services/logging/conversation-logger.test.d.ts +2 -0
- package/dist/services/logging/conversation-logger.test.d.ts.map +1 -0
- package/dist/services/logging/conversation-logger.test.js +387 -0
- package/dist/services/logging/conversation-logger.test.js.map +1 -0
- package/dist/services/logging/logging-contract.d.ts +55 -0
- package/dist/services/logging/logging-contract.d.ts.map +1 -0
- package/dist/services/logging/logging-contract.js +141 -0
- package/dist/services/logging/logging-contract.js.map +1 -0
- package/dist/services/logging/logging-contract.test.d.ts +2 -0
- package/dist/services/logging/logging-contract.test.d.ts.map +1 -0
- package/dist/services/logging/logging-contract.test.js +100 -0
- package/dist/services/logging/logging-contract.test.js.map +1 -0
- package/dist/services/logging/logging-service.d.ts +87 -0
- package/dist/services/logging/logging-service.d.ts.map +1 -0
- package/dist/services/logging/logging-service.js +339 -0
- package/dist/services/logging/logging-service.js.map +1 -0
- package/dist/services/logging/logging-service.test.d.ts +2 -0
- package/dist/services/logging/logging-service.test.d.ts.map +1 -0
- package/dist/services/logging/logging-service.test.js +464 -0
- package/dist/services/logging/logging-service.test.js.map +1 -0
- package/dist/services/logging/provider-traffic.d.ts +112 -0
- package/dist/services/logging/provider-traffic.d.ts.map +1 -0
- package/dist/services/logging/provider-traffic.js +1020 -0
- package/dist/services/logging/provider-traffic.js.map +1 -0
- package/dist/services/logging/provider-traffic.test.d.ts +2 -0
- package/dist/services/logging/provider-traffic.test.d.ts.map +1 -0
- package/dist/services/logging/provider-traffic.test.js +577 -0
- package/dist/services/logging/provider-traffic.test.js.map +1 -0
- package/dist/services/logging-contract.d.ts +2 -2
- package/dist/services/logging-service.d.ts +0 -4
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +12 -54
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/logging-service.test.d.ts +2 -0
- package/dist/services/logging-service.test.d.ts.map +1 -0
- package/dist/services/logging-service.test.js +467 -0
- package/dist/services/logging-service.test.js.map +1 -0
- 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 +13 -9
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js +12 -1
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/model-service.test.js +75 -33
- package/dist/services/model-service.test.js.map +1 -1
- package/dist/services/notification-service.d.ts +32 -12
- package/dist/services/notification-service.d.ts.map +1 -1
- package/dist/services/notification-service.js +88 -40
- package/dist/services/notification-service.js.map +1 -1
- package/dist/services/notification-service.test.js +137 -64
- package/dist/services/notification-service.test.js.map +1 -1
- package/dist/services/plan-mode-interceptor.test.js +25 -25
- package/dist/services/plan-mode-interceptor.test.js.map +1 -1
- package/dist/services/provider-continuity.d.ts +17 -0
- package/dist/services/provider-continuity.d.ts.map +1 -0
- package/dist/services/provider-continuity.js +31 -0
- package/dist/services/provider-continuity.js.map +1 -0
- package/dist/services/provider-continuity.test.d.ts +2 -0
- package/dist/services/provider-continuity.test.d.ts.map +1 -0
- package/dist/services/provider-continuity.test.js +47 -0
- package/dist/services/provider-continuity.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 +24 -12
- package/dist/services/provider-traffic.js.map +1 -1
- package/dist/services/provider-traffic.test.js +51 -1
- package/dist/services/provider-traffic.test.js.map +1 -1
- package/dist/services/recovery-executor.d.ts +15 -0
- package/dist/services/recovery-executor.d.ts.map +1 -0
- package/dist/services/recovery-executor.js +93 -0
- package/dist/services/recovery-executor.js.map +1 -0
- package/dist/services/recovery-executor.test.d.ts +2 -0
- package/dist/services/recovery-executor.test.d.ts.map +1 -0
- package/dist/services/recovery-executor.test.js +192 -0
- package/dist/services/recovery-executor.test.js.map +1 -0
- package/dist/services/recovery-policy.d.ts +6 -0
- package/dist/services/recovery-policy.d.ts.map +1 -0
- package/dist/services/recovery-policy.js +56 -0
- package/dist/services/recovery-policy.js.map +1 -0
- package/dist/services/recovery-policy.test.d.ts +2 -0
- package/dist/services/recovery-policy.test.d.ts.map +1 -0
- package/dist/services/recovery-policy.test.js +103 -0
- package/dist/services/recovery-policy.test.js.map +1 -0
- package/dist/services/retry/conversation-retry-policy.d.ts +63 -0
- package/dist/services/retry/conversation-retry-policy.d.ts.map +1 -0
- package/dist/services/retry/conversation-retry-policy.js +76 -0
- package/dist/services/retry/conversation-retry-policy.js.map +1 -0
- package/dist/services/retry/conversation-retry-policy.test.d.ts +2 -0
- package/dist/services/retry/conversation-retry-policy.test.d.ts.map +1 -0
- package/dist/services/retry/conversation-retry-policy.test.js +181 -0
- package/dist/services/retry/conversation-retry-policy.test.js.map +1 -0
- package/dist/services/retry/recovery-executor.d.ts +15 -0
- package/dist/services/retry/recovery-executor.d.ts.map +1 -0
- package/dist/services/retry/recovery-executor.js +93 -0
- package/dist/services/retry/recovery-executor.js.map +1 -0
- package/dist/services/retry/recovery-executor.test.d.ts +2 -0
- package/dist/services/retry/recovery-executor.test.d.ts.map +1 -0
- package/dist/services/retry/recovery-executor.test.js +192 -0
- package/dist/services/retry/recovery-executor.test.js.map +1 -0
- package/dist/services/retry/recovery-policy.d.ts +6 -0
- package/dist/services/retry/recovery-policy.d.ts.map +1 -0
- package/dist/services/retry/recovery-policy.js +56 -0
- package/dist/services/retry/recovery-policy.js.map +1 -0
- package/dist/services/retry/recovery-policy.test.d.ts +2 -0
- package/dist/services/retry/recovery-policy.test.d.ts.map +1 -0
- package/dist/services/retry/recovery-policy.test.js +103 -0
- package/dist/services/retry/recovery-policy.test.js.map +1 -0
- package/dist/services/retry/retry-classifier.d.ts +9 -0
- package/dist/services/retry/retry-classifier.d.ts.map +1 -0
- package/dist/services/retry/retry-classifier.js +48 -0
- package/dist/services/retry/retry-classifier.js.map +1 -0
- package/dist/services/retry/retry-classifier.test.d.ts +2 -0
- package/dist/services/retry/retry-classifier.test.d.ts.map +1 -0
- package/dist/services/retry/retry-classifier.test.js +206 -0
- package/dist/services/retry/retry-classifier.test.js.map +1 -0
- package/dist/services/retry/retry-contracts.d.ts +99 -0
- package/dist/services/retry/retry-contracts.d.ts.map +1 -0
- package/dist/services/retry/retry-contracts.js +2 -0
- package/dist/services/retry/retry-contracts.js.map +1 -0
- package/dist/services/retry/retry-error-classification.d.ts +30 -0
- package/dist/services/retry/retry-error-classification.d.ts.map +1 -0
- package/dist/services/retry/retry-error-classification.js +311 -0
- package/dist/services/retry/retry-error-classification.js.map +1 -0
- package/dist/services/retry/retry-error-classification.test.d.ts +2 -0
- package/dist/services/retry/retry-error-classification.test.d.ts.map +1 -0
- package/dist/services/retry/retry-error-classification.test.js +339 -0
- package/dist/services/retry/retry-error-classification.test.js.map +1 -0
- package/dist/services/retry/retry-event-presenter.d.ts +18 -0
- package/dist/services/retry/retry-event-presenter.d.ts.map +1 -0
- package/dist/services/retry/retry-event-presenter.js +109 -0
- package/dist/services/retry/retry-event-presenter.js.map +1 -0
- package/dist/services/retry/retry-event-presenter.test.d.ts +2 -0
- package/dist/services/retry/retry-event-presenter.test.d.ts.map +1 -0
- package/dist/services/retry/retry-event-presenter.test.js +179 -0
- package/dist/services/retry/retry-event-presenter.test.js.map +1 -0
- package/dist/services/retry/upstream-retry-policy.d.ts +15 -0
- package/dist/services/retry/upstream-retry-policy.d.ts.map +1 -0
- package/dist/services/retry/upstream-retry-policy.js +136 -0
- package/dist/services/retry/upstream-retry-policy.js.map +1 -0
- package/dist/services/retry/upstream-retry-policy.test.d.ts +2 -0
- package/dist/services/retry/upstream-retry-policy.test.d.ts.map +1 -0
- package/dist/services/retry/upstream-retry-policy.test.js +125 -0
- package/dist/services/retry/upstream-retry-policy.test.js.map +1 -0
- package/dist/services/retry-classifier.d.ts +9 -0
- package/dist/services/retry-classifier.d.ts.map +1 -0
- package/dist/services/retry-classifier.js +41 -0
- package/dist/services/retry-classifier.js.map +1 -0
- package/dist/services/retry-classifier.test.d.ts +2 -0
- package/dist/services/retry-classifier.test.d.ts.map +1 -0
- package/dist/services/retry-classifier.test.js +206 -0
- package/dist/services/retry-classifier.test.js.map +1 -0
- package/dist/services/retry-contracts.d.ts +99 -0
- package/dist/services/retry-contracts.d.ts.map +1 -0
- package/dist/services/retry-contracts.js +2 -0
- package/dist/services/retry-contracts.js.map +1 -0
- package/dist/services/retry-error-classification.d.ts +30 -0
- package/dist/services/retry-error-classification.d.ts.map +1 -0
- package/dist/services/retry-error-classification.js +223 -0
- package/dist/services/retry-error-classification.js.map +1 -0
- package/dist/services/retry-error-classification.test.d.ts +2 -0
- package/dist/services/retry-error-classification.test.d.ts.map +1 -0
- package/dist/services/retry-error-classification.test.js +195 -0
- package/dist/services/retry-error-classification.test.js.map +1 -0
- package/dist/services/retry-event-presenter.d.ts +18 -0
- package/dist/services/retry-event-presenter.d.ts.map +1 -0
- package/dist/services/retry-event-presenter.js +124 -0
- package/dist/services/retry-event-presenter.js.map +1 -0
- package/dist/services/retry-event-presenter.test.d.ts +2 -0
- package/dist/services/retry-event-presenter.test.d.ts.map +1 -0
- package/dist/services/retry-event-presenter.test.js +194 -0
- package/dist/services/retry-event-presenter.test.js.map +1 -0
- package/dist/services/retry-handler.d.ts +51 -0
- package/dist/services/retry-handler.d.ts.map +1 -0
- package/dist/services/retry-handler.js +72 -0
- package/dist/services/retry-handler.js.map +1 -0
- package/dist/services/retry-handler.test.d.ts +2 -0
- package/dist/services/retry-handler.test.d.ts.map +1 -0
- package/dist/services/retry-handler.test.js +237 -0
- package/dist/services/retry-handler.test.js.map +1 -0
- package/dist/services/rtk-service.test.js +125 -125
- package/dist/services/rtk-service.test.js.map +1 -1
- package/dist/services/service-interfaces.d.ts +47 -16
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session/continuation-driver.d.ts +47 -0
- package/dist/services/session/continuation-driver.d.ts.map +1 -0
- package/dist/services/session/continuation-driver.js +346 -0
- package/dist/services/session/continuation-driver.js.map +1 -0
- package/dist/services/session/continuation-driver.test.d.ts +2 -0
- package/dist/services/session/continuation-driver.test.d.ts.map +1 -0
- package/dist/services/session/continuation-driver.test.js +804 -0
- package/dist/services/session/continuation-driver.test.js.map +1 -0
- package/dist/services/session/continuation-plan-applier.d.ts +23 -0
- package/dist/services/session/continuation-plan-applier.d.ts.map +1 -0
- package/dist/services/session/continuation-plan-applier.js +96 -0
- package/dist/services/session/continuation-plan-applier.js.map +1 -0
- package/dist/services/session/continuation-plan-applier.test.d.ts +2 -0
- package/dist/services/session/continuation-plan-applier.test.d.ts.map +1 -0
- package/dist/services/session/continuation-plan-applier.test.js +257 -0
- package/dist/services/session/continuation-plan-applier.test.js.map +1 -0
- package/dist/services/session/continuation-recovery-handler.d.ts +42 -0
- package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -0
- package/dist/services/session/continuation-recovery-handler.js +78 -0
- package/dist/services/session/continuation-recovery-handler.js.map +1 -0
- package/dist/services/session/continuation-recovery-handler.test.d.ts +2 -0
- package/dist/services/session/continuation-recovery-handler.test.d.ts.map +1 -0
- package/dist/services/session/continuation-recovery-handler.test.js +148 -0
- package/dist/services/session/continuation-recovery-handler.test.js.map +1 -0
- package/dist/services/session/continuation-state.d.ts +50 -0
- package/dist/services/session/continuation-state.d.ts.map +1 -0
- package/dist/services/session/continuation-state.js +74 -0
- package/dist/services/session/continuation-state.js.map +1 -0
- package/dist/services/session/continuation-state.test.d.ts +2 -0
- package/dist/services/session/continuation-state.test.d.ts.map +1 -0
- package/dist/services/session/continuation-state.test.js +140 -0
- package/dist/services/session/continuation-state.test.js.map +1 -0
- package/dist/services/session/continuation-stream-cycle.d.ts +43 -0
- package/dist/services/session/continuation-stream-cycle.d.ts.map +1 -0
- package/dist/services/session/continuation-stream-cycle.js +61 -0
- package/dist/services/session/continuation-stream-cycle.js.map +1 -0
- package/dist/services/session/continuation-stream-cycle.test.d.ts +2 -0
- package/dist/services/session/continuation-stream-cycle.test.d.ts.map +1 -0
- package/dist/services/session/continuation-stream-cycle.test.js +139 -0
- package/dist/services/session/continuation-stream-cycle.test.js.map +1 -0
- package/dist/services/session/conversation-session-reasoning.test.d.ts +2 -0
- package/dist/services/session/conversation-session-reasoning.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session-reasoning.test.js +67 -0
- package/dist/services/session/conversation-session-reasoning.test.js.map +1 -0
- package/dist/services/session/conversation-session.auto-approval.test.d.ts +2 -0
- package/dist/services/session/conversation-session.auto-approval.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.auto-approval.test.js +714 -0
- package/dist/services/session/conversation-session.auto-approval.test.js.map +1 -0
- package/dist/services/session/conversation-session.characterization.test.d.ts +2 -0
- package/dist/services/session/conversation-session.characterization.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.characterization.test.js +1266 -0
- package/dist/services/session/conversation-session.characterization.test.js.map +1 -0
- package/dist/services/session/conversation-session.d.ts +31 -0
- package/dist/services/session/conversation-session.d.ts.map +1 -0
- package/dist/services/session/conversation-session.input-surge.test.d.ts +2 -0
- package/dist/services/session/conversation-session.input-surge.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.input-surge.test.js +263 -0
- package/dist/services/session/conversation-session.input-surge.test.js.map +1 -0
- package/dist/services/session/conversation-session.isolation.test.d.ts +2 -0
- package/dist/services/session/conversation-session.isolation.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.isolation.test.js +290 -0
- package/dist/services/session/conversation-session.isolation.test.js.map +1 -0
- package/dist/services/session/conversation-session.js +33 -0
- package/dist/services/session/conversation-session.js.map +1 -0
- package/dist/services/session/conversation-session.stream.test.d.ts +2 -0
- package/dist/services/session/conversation-session.stream.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.stream.test.js +2150 -0
- package/dist/services/session/conversation-session.stream.test.js.map +1 -0
- package/dist/services/session/conversation-session.tool-started.test.d.ts +2 -0
- package/dist/services/session/conversation-session.tool-started.test.d.ts.map +1 -0
- package/dist/services/session/conversation-session.tool-started.test.js +244 -0
- package/dist/services/session/conversation-session.tool-started.test.js.map +1 -0
- package/dist/services/session/initial-input-preparer.d.ts +33 -0
- package/dist/services/session/initial-input-preparer.d.ts.map +1 -0
- package/dist/services/session/initial-input-preparer.js +49 -0
- package/dist/services/session/initial-input-preparer.js.map +1 -0
- package/dist/services/session/initial-input-preparer.test.d.ts +2 -0
- package/dist/services/session/initial-input-preparer.test.d.ts.map +1 -0
- package/dist/services/session/initial-input-preparer.test.js +113 -0
- package/dist/services/session/initial-input-preparer.test.js.map +1 -0
- package/dist/services/session/initial-stream-cycle.d.ts +44 -0
- package/dist/services/session/initial-stream-cycle.d.ts.map +1 -0
- package/dist/services/session/initial-stream-cycle.js +53 -0
- package/dist/services/session/initial-stream-cycle.js.map +1 -0
- package/dist/services/session/initial-stream-cycle.test.d.ts +2 -0
- package/dist/services/session/initial-stream-cycle.test.d.ts.map +1 -0
- package/dist/services/session/initial-stream-cycle.test.js +105 -0
- package/dist/services/session/initial-stream-cycle.test.js.map +1 -0
- package/dist/services/session/initial-turn-recovery-handler.d.ts +45 -0
- package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -0
- package/dist/services/session/initial-turn-recovery-handler.js +136 -0
- package/dist/services/session/initial-turn-recovery-handler.js.map +1 -0
- package/dist/services/session/initial-turn-recovery-handler.test.d.ts +2 -0
- package/dist/services/session/initial-turn-recovery-handler.test.d.ts.map +1 -0
- package/dist/services/session/initial-turn-recovery-handler.test.js +91 -0
- package/dist/services/session/initial-turn-recovery-handler.test.js.map +1 -0
- package/dist/services/session/initial-turn-runner.d.ts +35 -0
- package/dist/services/session/initial-turn-runner.d.ts.map +1 -0
- package/dist/services/session/initial-turn-runner.js +161 -0
- package/dist/services/session/initial-turn-runner.js.map +1 -0
- package/dist/services/session/initial-turn-runner.test.d.ts +2 -0
- package/dist/services/session/initial-turn-runner.test.d.ts.map +1 -0
- package/dist/services/session/initial-turn-runner.test.js +384 -0
- package/dist/services/session/initial-turn-runner.test.js.map +1 -0
- package/dist/services/session/session-adapter-bridge.d.ts +12 -0
- package/dist/services/session/session-adapter-bridge.d.ts.map +1 -0
- package/dist/services/session/session-adapter-bridge.js +11 -0
- package/dist/services/session/session-adapter-bridge.js.map +1 -0
- package/dist/services/session/session-composition.d.ts +163 -0
- package/dist/services/session/session-composition.d.ts.map +1 -0
- package/dist/services/session/session-composition.js +383 -0
- package/dist/services/session/session-composition.js.map +1 -0
- package/dist/services/session/session-composition.test.d.ts +2 -0
- package/dist/services/session/session-composition.test.d.ts.map +1 -0
- package/dist/services/session/session-composition.test.js +200 -0
- package/dist/services/session/session-composition.test.js.map +1 -0
- package/dist/services/session/session-context-service.d.ts +8 -0
- package/dist/services/session/session-context-service.d.ts.map +1 -0
- package/dist/services/session/session-context-service.js +19 -0
- package/dist/services/session/session-context-service.js.map +1 -0
- package/dist/services/session/session-context-service.test.d.ts +2 -0
- package/dist/services/session/session-context-service.test.d.ts.map +1 -0
- package/dist/services/session/session-context-service.test.js +38 -0
- package/dist/services/session/session-context-service.test.js.map +1 -0
- package/dist/services/session/session-factory.d.ts +6 -0
- package/dist/services/session/session-factory.d.ts.map +1 -0
- package/dist/services/session/session-factory.js +6 -0
- package/dist/services/session/session-factory.js.map +1 -0
- package/dist/services/session/session-factory.test.d.ts +2 -0
- package/dist/services/session/session-factory.test.d.ts.map +1 -0
- package/dist/services/session/session-factory.test.js +198 -0
- package/dist/services/session/session-factory.test.js.map +1 -0
- package/dist/services/session/session-input-planner.d.ts +95 -0
- package/dist/services/session/session-input-planner.d.ts.map +1 -0
- package/dist/services/session/session-input-planner.js +196 -0
- package/dist/services/session/session-input-planner.js.map +1 -0
- package/dist/services/session/session-lifecycle.d.ts +84 -0
- package/dist/services/session/session-lifecycle.d.ts.map +1 -0
- package/dist/services/session/session-lifecycle.js +147 -0
- package/dist/services/session/session-lifecycle.js.map +1 -0
- package/dist/services/session/session-lifecycle.test.d.ts +2 -0
- package/dist/services/session/session-lifecycle.test.d.ts.map +1 -0
- package/dist/services/session/session-lifecycle.test.js +194 -0
- package/dist/services/session/session-lifecycle.test.js.map +1 -0
- package/dist/services/session/session-manager.d.ts +58 -0
- package/dist/services/session/session-manager.d.ts.map +1 -0
- package/dist/services/session/session-manager.js +92 -0
- package/dist/services/session/session-manager.js.map +1 -0
- package/dist/services/session/session-manager.test.d.ts +2 -0
- package/dist/services/session/session-manager.test.d.ts.map +1 -0
- package/dist/services/session/session-manager.test.js +37 -0
- package/dist/services/session/session-manager.test.js.map +1 -0
- package/dist/services/session/session-runtime-controller.d.ts +26 -0
- package/dist/services/session/session-runtime-controller.d.ts.map +1 -0
- package/dist/services/session/session-runtime-controller.js +46 -0
- package/dist/services/session/session-runtime-controller.js.map +1 -0
- package/dist/services/session/session-stream-processor.d.ts +50 -0
- package/dist/services/session/session-stream-processor.d.ts.map +1 -0
- package/dist/services/session/session-stream-processor.js +189 -0
- package/dist/services/session/session-stream-processor.js.map +1 -0
- package/dist/services/session/session-stream-processor.test.d.ts +2 -0
- package/dist/services/session/session-stream-processor.test.d.ts.map +1 -0
- package/dist/services/session/session-stream-processor.test.js +608 -0
- package/dist/services/session/session-stream-processor.test.js.map +1 -0
- package/dist/services/session/session-tool-tracker.d.ts +131 -0
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -0
- package/dist/services/session/session-tool-tracker.js +253 -0
- package/dist/services/session/session-tool-tracker.js.map +1 -0
- package/dist/services/session/session-tool-tracker.test.d.ts +2 -0
- package/dist/services/session/session-tool-tracker.test.d.ts.map +1 -0
- package/dist/services/session/session-tool-tracker.test.js +54 -0
- package/dist/services/session/session-tool-tracker.test.js.map +1 -0
- package/dist/services/session/terminal-result-collector.d.ts +12 -0
- package/dist/services/session/terminal-result-collector.d.ts.map +1 -0
- package/dist/services/session/terminal-result-collector.js +139 -0
- package/dist/services/session/terminal-result-collector.js.map +1 -0
- package/dist/services/session/terminal-result-collector.test.d.ts +2 -0
- package/dist/services/session/terminal-result-collector.test.d.ts.map +1 -0
- package/dist/services/session/terminal-result-collector.test.js +240 -0
- package/dist/services/session/terminal-result-collector.test.js.map +1 -0
- package/dist/services/session/turn-attempt-factory.d.ts +43 -0
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -0
- package/dist/services/session/turn-attempt-factory.js +58 -0
- package/dist/services/session/turn-attempt-factory.js.map +1 -0
- package/dist/services/session/turn-attempt-factory.test.d.ts +2 -0
- package/dist/services/session/turn-attempt-factory.test.d.ts.map +1 -0
- package/dist/services/session/turn-attempt-factory.test.js +83 -0
- package/dist/services/session/turn-attempt-factory.test.js.map +1 -0
- package/dist/services/session/turn-attempt.d.ts +38 -0
- package/dist/services/session/turn-attempt.d.ts.map +1 -0
- package/dist/services/session/turn-attempt.js +99 -0
- package/dist/services/session/turn-attempt.js.map +1 -0
- package/dist/services/session/turn-attempt.test.d.ts +2 -0
- package/dist/services/session/turn-attempt.test.d.ts.map +1 -0
- package/dist/services/session/turn-attempt.test.js +167 -0
- package/dist/services/session/turn-attempt.test.js.map +1 -0
- package/dist/services/session/turn-coordinator.d.ts +30 -0
- package/dist/services/session/turn-coordinator.d.ts.map +1 -0
- package/dist/services/session/turn-coordinator.js +108 -0
- package/dist/services/session/turn-coordinator.js.map +1 -0
- package/dist/services/session/turn-coordinator.test.d.ts +2 -0
- package/dist/services/session/turn-coordinator.test.d.ts.map +1 -0
- package/dist/services/session/turn-coordinator.test.js +303 -0
- package/dist/services/session/turn-coordinator.test.js.map +1 -0
- package/dist/services/session/turn-executor.d.ts +28 -0
- package/dist/services/session/turn-executor.d.ts.map +1 -0
- package/dist/services/session/turn-executor.js +67 -0
- package/dist/services/session/turn-executor.js.map +1 -0
- package/dist/services/session/turn-item-accumulator.d.ts +21 -0
- package/dist/services/session/turn-item-accumulator.d.ts.map +1 -0
- package/dist/services/session/turn-item-accumulator.js +56 -0
- package/dist/services/session/turn-item-accumulator.js.map +1 -0
- package/dist/services/session/turn-item-accumulator.test.d.ts +2 -0
- package/dist/services/session/turn-item-accumulator.test.d.ts.map +1 -0
- package/dist/services/session/turn-item-accumulator.test.js +75 -0
- package/dist/services/session/turn-item-accumulator.test.js.map +1 -0
- package/dist/services/session/turn-outcome-adapters.d.ts +26 -0
- package/dist/services/session/turn-outcome-adapters.d.ts.map +1 -0
- package/dist/services/session/turn-outcome-adapters.js +45 -0
- package/dist/services/session/turn-outcome-adapters.js.map +1 -0
- package/dist/services/session/turn-outcome-adapters.test.d.ts +2 -0
- package/dist/services/session/turn-outcome-adapters.test.d.ts.map +1 -0
- package/dist/services/session/turn-outcome-adapters.test.js +101 -0
- package/dist/services/session/turn-outcome-adapters.test.js.map +1 -0
- package/dist/services/session/turn-status-machine.d.ts +25 -0
- package/dist/services/session/turn-status-machine.d.ts.map +1 -0
- package/dist/services/session/turn-status-machine.js +49 -0
- package/dist/services/session/turn-status-machine.js.map +1 -0
- package/dist/services/session/turn-status-machine.test.d.ts +2 -0
- package/dist/services/session/turn-status-machine.test.d.ts.map +1 -0
- package/dist/services/session/turn-status-machine.test.js +95 -0
- package/dist/services/session/turn-status-machine.test.js.map +1 -0
- package/dist/services/session/turn-transition.d.ts +57 -0
- package/dist/services/session/turn-transition.d.ts.map +1 -0
- package/dist/services/session/turn-transition.js +67 -0
- package/dist/services/session/turn-transition.js.map +1 -0
- package/dist/services/session/turn-transition.test.d.ts +2 -0
- package/dist/services/session/turn-transition.test.d.ts.map +1 -0
- package/dist/services/session/turn-transition.test.js +123 -0
- package/dist/services/session/turn-transition.test.js.map +1 -0
- 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/session-input-planner.d.ts +87 -0
- package/dist/services/session-input-planner.d.ts.map +1 -0
- package/dist/services/session-input-planner.js +183 -0
- package/dist/services/session-input-planner.js.map +1 -0
- package/dist/services/session-lifecycle.d.ts +84 -0
- package/dist/services/session-lifecycle.d.ts.map +1 -0
- package/dist/services/session-lifecycle.js +147 -0
- package/dist/services/session-lifecycle.js.map +1 -0
- package/dist/services/session-lifecycle.test.d.ts +2 -0
- package/dist/services/session-lifecycle.test.d.ts.map +1 -0
- package/dist/services/session-lifecycle.test.js +195 -0
- package/dist/services/session-lifecycle.test.js.map +1 -0
- package/dist/services/session-manager.d.ts +57 -0
- package/dist/services/session-manager.d.ts.map +1 -0
- package/dist/services/session-manager.js +87 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/session-manager.test.d.ts +2 -0
- package/dist/services/session-manager.test.d.ts.map +1 -0
- package/dist/services/session-manager.test.js +38 -0
- package/dist/services/session-manager.test.js.map +1 -0
- package/dist/services/session-retry-orchestrator.d.ts +135 -0
- package/dist/services/session-retry-orchestrator.d.ts.map +1 -0
- package/dist/services/session-retry-orchestrator.js +297 -0
- package/dist/services/session-retry-orchestrator.js.map +1 -0
- package/dist/services/session-runtime-controller.d.ts +26 -0
- package/dist/services/session-runtime-controller.d.ts.map +1 -0
- package/dist/services/session-runtime-controller.js +46 -0
- package/dist/services/session-runtime-controller.js.map +1 -0
- package/dist/services/session-state-controller.d.ts +83 -0
- package/dist/services/session-state-controller.d.ts.map +1 -0
- package/dist/services/session-state-controller.js +149 -0
- package/dist/services/session-state-controller.js.map +1 -0
- package/dist/services/session-state-controller.test.d.ts +2 -0
- package/dist/services/session-state-controller.test.d.ts.map +1 -0
- package/dist/services/session-state-controller.test.js +125 -0
- package/dist/services/session-state-controller.test.js.map +1 -0
- package/dist/services/session-state-facade.d.ts +57 -0
- package/dist/services/session-state-facade.d.ts.map +1 -0
- package/dist/services/session-state-facade.js +87 -0
- package/dist/services/session-state-facade.js.map +1 -0
- package/dist/services/session-stream-processor.d.ts +47 -0
- package/dist/services/session-stream-processor.d.ts.map +1 -0
- package/dist/services/session-stream-processor.js +179 -0
- package/dist/services/session-stream-processor.js.map +1 -0
- package/dist/services/session-stream-processor.test.d.ts +2 -0
- package/dist/services/session-stream-processor.test.d.ts.map +1 -0
- package/dist/services/session-stream-processor.test.js +395 -0
- package/dist/services/session-stream-processor.test.js.map +1 -0
- package/dist/services/session-tool-tracker.d.ts +112 -0
- package/dist/services/session-tool-tracker.d.ts.map +1 -0
- package/dist/services/session-tool-tracker.js +220 -0
- package/dist/services/session-tool-tracker.js.map +1 -0
- package/dist/services/settings/settings-env.d.ts +9 -0
- package/dist/services/settings/settings-env.d.ts.map +1 -0
- package/dist/services/settings/settings-env.js +81 -0
- package/dist/services/settings/settings-env.js.map +1 -0
- package/dist/services/settings/settings-env.test.d.ts +2 -0
- package/dist/services/settings/settings-env.test.d.ts.map +1 -0
- package/dist/services/settings/settings-env.test.js +36 -0
- package/dist/services/settings/settings-env.test.js.map +1 -0
- package/dist/services/settings/settings-merger.d.ts +26 -0
- package/dist/services/settings/settings-merger.d.ts.map +1 -0
- package/dist/services/settings/settings-merger.js +124 -0
- package/dist/services/settings/settings-merger.js.map +1 -0
- package/dist/services/settings/settings-merger.test.d.ts +2 -0
- package/dist/services/settings/settings-merger.test.d.ts.map +1 -0
- package/dist/services/settings/settings-merger.test.js +26 -0
- package/dist/services/settings/settings-merger.test.js.map +1 -0
- package/dist/services/settings/settings-persistence.d.ts +33 -0
- package/dist/services/settings/settings-persistence.d.ts.map +1 -0
- package/dist/services/settings/settings-persistence.js +156 -0
- package/dist/services/settings/settings-persistence.js.map +1 -0
- package/dist/services/settings/settings-persistence.test.d.ts +2 -0
- package/dist/services/settings/settings-persistence.test.d.ts.map +1 -0
- package/dist/services/settings/settings-persistence.test.js +103 -0
- package/dist/services/settings/settings-persistence.test.js.map +1 -0
- package/dist/services/settings/settings-schema.d.ts +555 -0
- package/dist/services/settings/settings-schema.d.ts.map +1 -0
- package/dist/services/settings/settings-schema.js +502 -0
- package/dist/services/settings/settings-schema.js.map +1 -0
- package/dist/services/settings/settings-schema.test.d.ts +2 -0
- package/dist/services/settings/settings-schema.test.d.ts.map +1 -0
- package/dist/services/settings/settings-schema.test.js +123 -0
- package/dist/services/settings/settings-schema.test.js.map +1 -0
- package/dist/services/settings/settings-service.d.ts +93 -0
- package/dist/services/settings/settings-service.d.ts.map +1 -0
- package/dist/services/settings/settings-service.js +449 -0
- package/dist/services/settings/settings-service.js.map +1 -0
- package/dist/services/settings/settings-service.mock.d.ts +20 -0
- package/dist/services/settings/settings-service.mock.d.ts.map +1 -0
- package/dist/services/settings/settings-service.mock.js +55 -0
- package/dist/services/settings/settings-service.mock.js.map +1 -0
- package/dist/services/settings/settings-service.test.d.ts +2 -0
- package/dist/services/settings/settings-service.test.d.ts.map +1 -0
- package/dist/services/settings/settings-service.test.js +924 -0
- package/dist/services/settings/settings-service.test.js.map +1 -0
- package/dist/services/settings/settings-sources.d.ts +5 -0
- package/dist/services/settings/settings-sources.d.ts.map +1 -0
- package/dist/services/settings/settings-sources.js +97 -0
- package/dist/services/settings/settings-sources.js.map +1 -0
- package/dist/services/settings/settings-sources.test.d.ts +2 -0
- package/dist/services/settings/settings-sources.test.d.ts.map +1 -0
- package/dist/services/settings/settings-sources.test.js +40 -0
- package/dist/services/settings/settings-sources.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-merger.d.ts.map +1 -1
- package/dist/services/settings-merger.js +2 -0
- package/dist/services/settings-merger.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 +34 -2
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +34 -4
- package/dist/services/settings-schema.js.map +1 -1
- package/dist/services/settings-schema.test.js +7 -1
- package/dist/services/settings-schema.test.js.map +1 -1
- package/dist/services/settings-service.d.ts +8 -1
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +59 -65
- package/dist/services/settings-service.js.map +1 -1
- package/dist/services/settings-service.test.d.ts +2 -0
- package/dist/services/settings-service.test.d.ts.map +1 -0
- package/dist/services/settings-service.test.js +929 -0
- package/dist/services/settings-service.test.js.map +1 -0
- 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/shell-auto-approval-evaluator.d.ts +9 -4
- package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +10 -8
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.test.js +49 -21
- package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.d.ts +4 -3
- 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/skills/skills-service.d.ts +44 -0
- package/dist/services/skills/skills-service.d.ts.map +1 -0
- package/dist/services/skills/skills-service.js +228 -0
- package/dist/services/skills/skills-service.js.map +1 -0
- package/dist/services/skills/skills-service.test.d.ts +2 -0
- package/dist/services/skills/skills-service.test.d.ts.map +1 -0
- package/dist/services/skills/skills-service.test.js +187 -0
- package/dist/services/skills/skills-service.test.js.map +1 -0
- package/dist/services/ssh-service.test.js +60 -70
- package/dist/services/ssh-service.test.js.map +1 -1
- package/dist/services/stream-event-parsing.d.ts.map +1 -1
- package/dist/services/stream-event-parsing.js +4 -1
- package/dist/services/stream-event-parsing.js.map +1 -1
- package/dist/services/stream-event-parsing.test.js +19 -12
- package/dist/services/stream-event-parsing.test.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts +9 -2
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +149 -3
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/stream-event-processor.test.js +661 -50
- package/dist/services/stream-event-processor.test.js.map +1 -1
- package/dist/services/stream-snapshot.d.ts +42 -0
- package/dist/services/stream-snapshot.d.ts.map +1 -0
- package/dist/services/stream-snapshot.js +45 -0
- package/dist/services/stream-snapshot.js.map +1 -0
- package/dist/services/subagents/execution-runner.d.ts +20 -0
- package/dist/services/subagents/execution-runner.d.ts.map +1 -0
- package/dist/services/subagents/execution-runner.js +169 -0
- package/dist/services/subagents/execution-runner.js.map +1 -0
- package/dist/services/subagents/mentor-runner.d.ts +17 -0
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -0
- package/dist/services/subagents/mentor-runner.js +97 -0
- package/dist/services/subagents/mentor-runner.js.map +1 -0
- package/dist/services/subagents/nested-runner.d.ts +42 -0
- package/dist/services/subagents/nested-runner.d.ts.map +1 -0
- package/dist/services/subagents/nested-runner.js +299 -0
- package/dist/services/subagents/nested-runner.js.map +1 -0
- package/dist/services/subagents/nested-runner.test.d.ts +2 -0
- package/dist/services/subagents/nested-runner.test.d.ts.map +1 -0
- package/dist/services/subagents/nested-runner.test.js +560 -0
- package/dist/services/subagents/nested-runner.test.js.map +1 -0
- package/dist/services/subagents/role-loader.d.ts +16 -0
- package/dist/services/subagents/role-loader.d.ts.map +1 -0
- package/dist/services/subagents/role-loader.js +174 -0
- package/dist/services/subagents/role-loader.js.map +1 -0
- package/dist/services/subagents/runtime.d.ts +26 -0
- package/dist/services/subagents/runtime.d.ts.map +1 -0
- package/dist/services/subagents/runtime.js +53 -0
- package/dist/services/subagents/runtime.js.map +1 -0
- package/dist/services/subagents/subagent-client-types.d.ts +20 -0
- package/dist/services/subagents/subagent-client-types.d.ts.map +1 -0
- package/dist/services/subagents/subagent-client-types.js +2 -0
- package/dist/services/subagents/subagent-client-types.js.map +1 -0
- package/dist/services/subagents/subagent-manager.d.ts +14 -6
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +25 -727
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-manager.test.js +1010 -390
- package/dist/services/subagents/subagent-manager.test.js.map +1 -1
- package/dist/services/subagents/subagent-session.js +1 -1
- package/dist/services/subagents/subagent-session.js.map +1 -1
- package/dist/services/subagents/subagent-session.test.js +41 -41
- package/dist/services/subagents/subagent-session.test.js.map +1 -1
- package/dist/services/subagents/tool-policy.d.ts +53 -0
- package/dist/services/subagents/tool-policy.d.ts.map +1 -0
- package/dist/services/subagents/tool-policy.js +426 -0
- package/dist/services/subagents/tool-policy.js.map +1 -0
- package/dist/services/subagents/types.d.ts +4 -2
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js +1 -1
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +26 -0
- package/dist/services/subagents/utils.d.ts.map +1 -0
- package/dist/services/subagents/utils.js +128 -0
- package/dist/services/subagents/utils.js.map +1 -0
- package/dist/services/test-helpers/mock-stream.d.ts +14 -0
- package/dist/services/test-helpers/mock-stream.d.ts.map +1 -0
- package/dist/services/test-helpers/mock-stream.js +28 -0
- package/dist/services/test-helpers/mock-stream.js.map +1 -0
- package/dist/services/tool-execution-ledger.d.ts +15 -0
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +62 -11
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/services/tool-execution-ledger.test.js +162 -57
- package/dist/services/tool-execution-ledger.test.js.map +1 -1
- package/dist/services/turn-attempt.d.ts +38 -0
- package/dist/services/turn-attempt.d.ts.map +1 -0
- package/dist/services/turn-attempt.js +99 -0
- package/dist/services/turn-attempt.js.map +1 -0
- package/dist/services/turn-attempt.test.d.ts +2 -0
- package/dist/services/turn-attempt.test.d.ts.map +1 -0
- package/dist/services/turn-attempt.test.js +167 -0
- package/dist/services/turn-attempt.test.js.map +1 -0
- package/dist/services/turn-coordinator.d.ts +30 -0
- package/dist/services/turn-coordinator.d.ts.map +1 -0
- package/dist/services/turn-coordinator.js +121 -0
- package/dist/services/turn-coordinator.js.map +1 -0
- package/dist/services/turn-coordinator.test.d.ts +2 -0
- package/dist/services/turn-coordinator.test.d.ts.map +1 -0
- package/dist/services/turn-coordinator.test.js +231 -0
- package/dist/services/turn-coordinator.test.js.map +1 -0
- package/dist/services/turn-execution-orchestrator.d.ts +79 -0
- package/dist/services/turn-execution-orchestrator.d.ts.map +1 -0
- package/dist/services/turn-execution-orchestrator.js +687 -0
- package/dist/services/turn-execution-orchestrator.js.map +1 -0
- package/dist/services/turn-execution-orchestrator.test.d.ts +2 -0
- package/dist/services/turn-execution-orchestrator.test.d.ts.map +1 -0
- package/dist/services/turn-execution-orchestrator.test.js +236 -0
- package/dist/services/turn-execution-orchestrator.test.js.map +1 -0
- package/dist/services/turn-item-accumulator.d.ts +21 -0
- package/dist/services/turn-item-accumulator.d.ts.map +1 -0
- package/dist/services/turn-item-accumulator.js +56 -0
- package/dist/services/turn-item-accumulator.js.map +1 -0
- package/dist/services/turn-item-accumulator.test.d.ts +2 -0
- package/dist/services/turn-item-accumulator.test.d.ts.map +1 -0
- package/dist/services/turn-item-accumulator.test.js +75 -0
- package/dist/services/turn-item-accumulator.test.js.map +1 -0
- package/dist/services/turn-status-machine.d.ts +25 -0
- package/dist/services/turn-status-machine.d.ts.map +1 -0
- package/dist/services/turn-status-machine.js +49 -0
- package/dist/services/turn-status-machine.js.map +1 -0
- package/dist/services/turn-status-machine.test.d.ts +2 -0
- package/dist/services/turn-status-machine.test.d.ts.map +1 -0
- package/dist/services/turn-status-machine.test.js +95 -0
- package/dist/services/turn-status-machine.test.js.map +1 -0
- package/dist/services/upstream-retry-policy.d.ts +15 -0
- package/dist/services/upstream-retry-policy.d.ts.map +1 -0
- package/dist/services/upstream-retry-policy.js +121 -0
- package/dist/services/upstream-retry-policy.js.map +1 -0
- package/dist/services/upstream-retry-policy.test.d.ts +2 -0
- package/dist/services/upstream-retry-policy.test.d.ts.map +1 -0
- package/dist/services/upstream-retry-policy.test.js +93 -0
- package/dist/services/upstream-retry-policy.test.js.map +1 -0
- package/dist/slash-commands.d.ts +3 -0
- package/dist/slash-commands.d.ts.map +1 -1
- package/dist/slash-commands.js.map +1 -1
- package/dist/slash-commands.test.js +7 -7
- package/dist/slash-commands.test.js.map +1 -1
- package/dist/test-helpers/conversation-session-with-adapter.d.ts +7 -0
- package/dist/test-helpers/conversation-session-with-adapter.d.ts.map +1 -0
- package/dist/test-helpers/conversation-session-with-adapter.js +11 -0
- package/dist/test-helpers/conversation-session-with-adapter.js.map +1 -0
- package/dist/test-helpers/ink-testing.d.ts +15 -0
- package/dist/test-helpers/ink-testing.d.ts.map +1 -0
- package/dist/test-helpers/ink-testing.js +44 -0
- package/dist/test-helpers/ink-testing.js.map +1 -0
- package/dist/test-helpers/ink-testing.test.d.ts +2 -0
- package/dist/test-helpers/ink-testing.test.d.ts.map +1 -0
- package/dist/test-helpers/ink-testing.test.js +35 -0
- package/dist/test-helpers/ink-testing.test.js.map +1 -0
- package/dist/tools/agent/activate-skill.d.ts +4 -0
- package/dist/tools/agent/activate-skill.d.ts.map +1 -0
- package/dist/tools/agent/activate-skill.js +86 -0
- package/dist/tools/agent/activate-skill.js.map +1 -0
- package/dist/tools/agent/ask-mentor.d.ts +11 -0
- package/dist/tools/agent/ask-mentor.d.ts.map +1 -0
- package/dist/tools/agent/ask-mentor.js +52 -0
- package/dist/tools/agent/ask-mentor.js.map +1 -0
- package/dist/tools/agent/ask-mentor.test.d.ts +2 -0
- package/dist/tools/agent/ask-mentor.test.d.ts.map +1 -0
- package/dist/tools/agent/ask-mentor.test.js +53 -0
- package/dist/tools/agent/ask-mentor.test.js.map +1 -0
- package/dist/tools/agent/ask-user-constants.d.ts +10 -0
- package/dist/tools/agent/ask-user-constants.d.ts.map +1 -0
- package/dist/tools/agent/ask-user-constants.js +14 -0
- package/dist/tools/agent/ask-user-constants.js.map +1 -0
- package/dist/tools/agent/ask-user.d.ts +17 -0
- package/dist/tools/agent/ask-user.d.ts.map +1 -0
- package/dist/tools/agent/ask-user.js +113 -0
- package/dist/tools/agent/ask-user.js.map +1 -0
- package/dist/tools/agent/ask-user.test.d.ts +2 -0
- package/dist/tools/agent/ask-user.test.d.ts.map +1 -0
- package/dist/tools/agent/ask-user.test.js +192 -0
- package/dist/tools/agent/ask-user.test.js.map +1 -0
- package/dist/tools/agent/run-subagent.d.ts +18 -0
- package/dist/tools/agent/run-subagent.d.ts.map +1 -0
- package/dist/tools/agent/run-subagent.js +200 -0
- package/dist/tools/agent/run-subagent.js.map +1 -0
- package/dist/tools/agent/run-subagent.test.d.ts +2 -0
- package/dist/tools/agent/run-subagent.test.d.ts.map +1 -0
- package/dist/tools/agent/run-subagent.test.js +189 -0
- package/dist/tools/agent/run-subagent.test.js.map +1 -0
- 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 +14 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +107 -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 +192 -0
- package/dist/tools/ask-user.test.js.map +1 -0
- package/dist/tools/command-message-formatters.test.js +9 -9
- package/dist/tools/command-message-formatters.test.js.map +1 -1
- package/dist/tools/edit-healing.js +1 -1
- package/dist/tools/edit-healing.js.map +1 -1
- package/dist/tools/file/apply-patch.d.ts +44 -0
- package/dist/tools/file/apply-patch.d.ts.map +1 -0
- package/dist/tools/file/apply-patch.js +576 -0
- package/dist/tools/file/apply-patch.js.map +1 -0
- package/dist/tools/file/apply-patch.test.d.ts +2 -0
- package/dist/tools/file/apply-patch.test.d.ts.map +1 -0
- package/dist/tools/file/apply-patch.test.js +307 -0
- package/dist/tools/file/apply-patch.test.js.map +1 -0
- package/dist/tools/file/create-file.d.ts +19 -0
- package/dist/tools/file/create-file.d.ts.map +1 -0
- package/dist/tools/file/create-file.js +189 -0
- package/dist/tools/file/create-file.js.map +1 -0
- package/dist/tools/file/create-file.test.d.ts +2 -0
- package/dist/tools/file/create-file.test.d.ts.map +1 -0
- package/dist/tools/file/create-file.test.js +386 -0
- package/dist/tools/file/create-file.test.js.map +1 -0
- package/dist/tools/file/edit-healing.d.ts +25 -0
- package/dist/tools/file/edit-healing.d.ts.map +1 -0
- package/dist/tools/file/edit-healing.js +274 -0
- package/dist/tools/file/edit-healing.js.map +1 -0
- package/dist/tools/file/edit-healing.test.d.ts +2 -0
- package/dist/tools/file/edit-healing.test.d.ts.map +1 -0
- package/dist/tools/file/edit-healing.test.js +117 -0
- package/dist/tools/file/edit-healing.test.js.map +1 -0
- package/dist/tools/file/file-locks.d.ts +3 -0
- package/dist/tools/file/file-locks.d.ts.map +1 -0
- package/dist/tools/file/file-locks.js +37 -0
- package/dist/tools/file/file-locks.js.map +1 -0
- package/dist/tools/file/find-files.d.ts +18 -0
- package/dist/tools/file/find-files.d.ts.map +1 -0
- package/dist/tools/file/find-files.js +176 -0
- package/dist/tools/file/find-files.js.map +1 -0
- package/dist/tools/file/find-files.test.d.ts +2 -0
- package/dist/tools/file/find-files.test.d.ts.map +1 -0
- package/dist/tools/file/find-files.test.js +193 -0
- package/dist/tools/file/find-files.test.js.map +1 -0
- package/dist/tools/file/read-file.d.ts +17 -0
- package/dist/tools/file/read-file.d.ts.map +1 -0
- package/dist/tools/file/read-file.js +130 -0
- package/dist/tools/file/read-file.js.map +1 -0
- package/dist/tools/file/read-file.test.d.ts +2 -0
- package/dist/tools/file/read-file.test.d.ts.map +1 -0
- package/dist/tools/file/read-file.test.js +166 -0
- package/dist/tools/file/read-file.test.js.map +1 -0
- package/dist/tools/file/search-replace-matcher.d.ts +50 -0
- package/dist/tools/file/search-replace-matcher.d.ts.map +1 -0
- package/dist/tools/file/search-replace-matcher.js +343 -0
- package/dist/tools/file/search-replace-matcher.js.map +1 -0
- package/dist/tools/file/search-replace.d.ts +35 -0
- package/dist/tools/file/search-replace.d.ts.map +1 -0
- package/dist/tools/file/search-replace.js +478 -0
- package/dist/tools/file/search-replace.js.map +1 -0
- package/dist/tools/file/search-replace.test.d.ts +2 -0
- package/dist/tools/file/search-replace.test.d.ts.map +1 -0
- package/dist/tools/file/search-replace.test.js +1282 -0
- package/dist/tools/file/search-replace.test.js.map +1 -0
- package/dist/tools/format-helpers.d.ts +76 -5
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +64 -7
- 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/grep.d.ts +5 -0
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +32 -9
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +108 -1
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/languages/go.d.ts.map +1 -1
- package/dist/tools/languages/go.js.map +1 -1
- package/dist/tools/languages/python.d.ts.map +1 -1
- package/dist/tools/languages/python.js.map +1 -1
- package/dist/tools/run-subagent.d.ts +6 -1
- package/dist/tools/run-subagent.d.ts.map +1 -1
- package/dist/tools/run-subagent.js +3 -2
- package/dist/tools/run-subagent.js.map +1 -1
- package/dist/tools/run-subagent.test.js +7 -6
- package/dist/tools/run-subagent.test.js.map +1 -1
- 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/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +3 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell-and-grep-formatters.test.d.ts +2 -0
- package/dist/tools/shell-and-grep-formatters.test.d.ts.map +1 -0
- package/dist/tools/shell-and-grep-formatters.test.js +25 -0
- package/dist/tools/shell-and-grep-formatters.test.js.map +1 -0
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +1 -0
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/system/code-context.d.ts +27 -0
- package/dist/tools/system/code-context.d.ts.map +1 -0
- package/dist/tools/system/code-context.js +524 -0
- package/dist/tools/system/code-context.js.map +1 -0
- package/dist/tools/system/code-context.test.d.ts +2 -0
- package/dist/tools/system/code-context.test.d.ts.map +1 -0
- package/dist/tools/system/code-context.test.js +646 -0
- package/dist/tools/system/code-context.test.js.map +1 -0
- package/dist/tools/system/grep.d.ts +23 -0
- package/dist/tools/system/grep.d.ts.map +1 -0
- package/dist/tools/system/grep.js +246 -0
- package/dist/tools/system/grep.js.map +1 -0
- package/dist/tools/system/grep.test.d.ts +2 -0
- package/dist/tools/system/grep.test.d.ts.map +1 -0
- package/dist/tools/system/grep.test.js +146 -0
- package/dist/tools/system/grep.test.js.map +1 -0
- package/dist/tools/system/shell.d.ts +24 -0
- package/dist/tools/system/shell.d.ts.map +1 -0
- package/dist/tools/system/shell.js +289 -0
- package/dist/tools/system/shell.js.map +1 -0
- package/dist/tools/system/shell.test.d.ts +2 -0
- package/dist/tools/system/shell.test.d.ts.map +1 -0
- package/dist/tools/system/shell.test.js +300 -0
- package/dist/tools/system/shell.test.js.map +1 -0
- 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/tool-names.test.js +7 -7
- package/dist/tools/tool-names.test.js.map +1 -1
- package/dist/tools/tool-parameter-schema.test.js +68 -71
- package/dist/tools/tool-parameter-schema.test.js.map +1 -1
- package/dist/tools/types.d.ts +2 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/utils.test.js +14 -14
- package/dist/tools/utils.test.js.map +1 -1
- package/dist/tools/web/web-fetch.d.ts +20 -0
- package/dist/tools/web/web-fetch.d.ts.map +1 -0
- package/dist/tools/web/web-fetch.js +114 -0
- package/dist/tools/web/web-fetch.js.map +1 -0
- package/dist/tools/web/web-fetch.test.d.ts +2 -0
- package/dist/tools/web/web-fetch.test.d.ts.map +1 -0
- package/dist/tools/web/web-fetch.test.js +158 -0
- package/dist/tools/web/web-fetch.test.js.map +1 -0
- package/dist/tools/web/web-search.d.ts +29 -0
- package/dist/tools/web/web-search.d.ts.map +1 -0
- package/dist/tools/web/web-search.js +104 -0
- package/dist/tools/web/web-search.js.map +1 -0
- package/dist/tools/web/web-search.test.d.ts +2 -0
- package/dist/tools/web/web-search.test.d.ts.map +1 -0
- package/dist/tools/web/web-search.test.js +174 -0
- package/dist/tools/web/web-search.test.js.map +1 -0
- package/dist/types/message.d.ts +55 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +6 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/terminal.d.ts +4 -0
- package/dist/types/terminal.d.ts.map +1 -0
- package/dist/types/terminal.js +2 -0
- package/dist/types/terminal.js.map +1 -0
- package/dist/types/user-turn.d.ts +7 -0
- package/dist/types/user-turn.d.ts.map +1 -1
- package/dist/types/user-turn.js +31 -4
- package/dist/types/user-turn.js.map +1 -1
- package/dist/types/user-turn.test.js +66 -12
- package/dist/types/user-turn.test.js.map +1 -1
- package/dist/utils/ai/flex-service-tier.d.ts +2 -0
- package/dist/utils/ai/flex-service-tier.d.ts.map +1 -0
- package/dist/utils/ai/flex-service-tier.js +20 -0
- package/dist/utils/ai/flex-service-tier.js.map +1 -0
- package/dist/utils/ai/flex-service-tier.test.d.ts +2 -0
- package/dist/utils/ai/flex-service-tier.test.d.ts.map +1 -0
- package/dist/utils/ai/flex-service-tier.test.js +25 -0
- package/dist/utils/ai/flex-service-tier.test.js.map +1 -0
- package/dist/utils/ai/model-provider-arg.d.ts +5 -0
- package/dist/utils/ai/model-provider-arg.d.ts.map +1 -0
- package/dist/utils/ai/model-provider-arg.js +15 -0
- package/dist/utils/ai/model-provider-arg.js.map +1 -0
- package/dist/utils/ai/model-provider-arg.test.d.ts +2 -0
- package/dist/utils/ai/model-provider-arg.test.d.ts.map +1 -0
- package/dist/utils/ai/model-provider-arg.test.js +21 -0
- package/dist/utils/ai/model-provider-arg.test.js.map +1 -0
- package/dist/utils/ai/model-settings.d.ts +12 -0
- package/dist/utils/ai/model-settings.d.ts.map +1 -0
- package/dist/utils/ai/model-settings.js +53 -0
- package/dist/utils/ai/model-settings.js.map +1 -0
- package/dist/utils/ai/provider-credentials.d.ts +10 -0
- package/dist/utils/ai/provider-credentials.d.ts.map +1 -0
- package/dist/utils/ai/provider-credentials.js +22 -0
- package/dist/utils/ai/provider-credentials.js.map +1 -0
- package/dist/utils/ai/provider-traffic-extractor.d.ts +20 -0
- package/dist/utils/ai/provider-traffic-extractor.d.ts.map +1 -0
- package/dist/utils/ai/provider-traffic-extractor.js +206 -0
- package/dist/utils/ai/provider-traffic-extractor.js.map +1 -0
- package/dist/utils/ai/provider-traffic-extractor.test.d.ts +2 -0
- package/dist/utils/ai/provider-traffic-extractor.test.d.ts.map +1 -0
- package/dist/utils/ai/provider-traffic-extractor.test.js +88 -0
- package/dist/utils/ai/provider-traffic-extractor.test.js.map +1 -0
- package/dist/utils/ai/token-usage.d.ts +45 -0
- package/dist/utils/ai/token-usage.d.ts.map +1 -0
- package/dist/utils/ai/token-usage.js +298 -0
- package/dist/utils/ai/token-usage.js.map +1 -0
- package/dist/utils/ai/token-usage.test.d.ts +2 -0
- package/dist/utils/ai/token-usage.test.d.ts.map +1 -0
- package/dist/utils/ai/token-usage.test.js +277 -0
- package/dist/utils/ai/token-usage.test.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -2
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/clipboard.test.js +51 -57
- package/dist/utils/clipboard.test.js.map +1 -1
- package/dist/utils/command-logger.test.d.ts +2 -0
- package/dist/utils/command-logger.test.d.ts.map +1 -0
- package/dist/utils/command-logger.test.js +32 -0
- package/dist/utils/command-logger.test.js.map +1 -0
- 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/command-safety.git.test.d.ts +2 -0
- package/dist/utils/command-safety.git.test.d.ts.map +1 -0
- package/dist/utils/command-safety.git.test.js +74 -0
- package/dist/utils/command-safety.git.test.js.map +1 -0
- package/dist/utils/command-safety.test.d.ts +2 -0
- package/dist/utils/command-safety.test.d.ts.map +1 -0
- package/dist/utils/command-safety.test.js +66 -0
- package/dist/utils/command-safety.test.js.map +1 -0
- package/dist/utils/conversation/apply-conversation-result.d.ts +55 -0
- package/dist/utils/conversation/apply-conversation-result.d.ts.map +1 -0
- package/dist/utils/conversation/apply-conversation-result.js +103 -0
- package/dist/utils/conversation/apply-conversation-result.js.map +1 -0
- package/dist/utils/conversation/apply-conversation-result.test.d.ts +2 -0
- package/dist/utils/conversation/apply-conversation-result.test.d.ts.map +1 -0
- package/dist/utils/conversation/apply-conversation-result.test.js +185 -0
- package/dist/utils/conversation/apply-conversation-result.test.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.d.ts +34 -0
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.js +538 -0
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.test.d.ts +2 -0
- package/dist/utils/conversation/conversation-event-handler.test.d.ts.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.test.js +1453 -0
- package/dist/utils/conversation/conversation-event-handler.test.js.map +1 -0
- package/dist/utils/conversation/conversation-utils.d.ts +44 -0
- package/dist/utils/conversation/conversation-utils.d.ts.map +1 -0
- package/dist/utils/conversation/conversation-utils.js +109 -0
- package/dist/utils/conversation/conversation-utils.js.map +1 -0
- package/dist/utils/conversation/conversation-utils.test.d.ts +2 -0
- package/dist/utils/conversation/conversation-utils.test.d.ts.map +1 -0
- package/dist/utils/conversation/conversation-utils.test.js +191 -0
- package/dist/utils/conversation/conversation-utils.test.js.map +1 -0
- package/dist/utils/conversation/markdown-commit-frontier.d.ts +11 -0
- package/dist/utils/conversation/markdown-commit-frontier.d.ts.map +1 -0
- package/dist/utils/conversation/markdown-commit-frontier.js +46 -0
- package/dist/utils/conversation/markdown-commit-frontier.js.map +1 -0
- package/dist/utils/conversation/markdown-commit-frontier.test.d.ts +2 -0
- package/dist/utils/conversation/markdown-commit-frontier.test.d.ts.map +1 -0
- package/dist/utils/conversation/markdown-commit-frontier.test.js +40 -0
- package/dist/utils/conversation/markdown-commit-frontier.test.js.map +1 -0
- package/dist/utils/conversation/message-buffer.d.ts +2 -0
- package/dist/utils/conversation/message-buffer.d.ts.map +1 -0
- package/dist/utils/conversation/message-buffer.js +15 -0
- package/dist/utils/conversation/message-buffer.js.map +1 -0
- package/dist/utils/conversation/message-buffer.test.d.ts +2 -0
- package/dist/utils/conversation/message-buffer.test.d.ts.map +1 -0
- package/dist/utils/conversation/message-buffer.test.js +17 -0
- package/dist/utils/conversation/message-buffer.test.js.map +1 -0
- package/dist/utils/conversation/message-utils.d.ts +36 -0
- package/dist/utils/conversation/message-utils.d.ts.map +1 -0
- package/dist/utils/conversation/message-utils.js +105 -0
- package/dist/utils/conversation/message-utils.js.map +1 -0
- package/dist/utils/conversation/message-utils.test.d.ts +2 -0
- package/dist/utils/conversation/message-utils.test.d.ts.map +1 -0
- package/dist/utils/conversation/message-utils.test.js +167 -0
- package/dist/utils/conversation/message-utils.test.js.map +1 -0
- package/dist/utils/conversation-event-handler.d.ts +8 -42
- package/dist/utils/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation-event-handler.js +196 -34
- package/dist/utils/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation-event-handler.test.js +396 -27
- package/dist/utils/conversation-event-handler.test.js.map +1 -1
- package/dist/utils/error-helpers.d.ts.map +1 -1
- package/dist/utils/error-helpers.js +12 -0
- package/dist/utils/error-helpers.js.map +1 -1
- package/dist/utils/error-helpers.test.js +99 -69
- package/dist/utils/error-helpers.test.js.map +1 -1
- package/dist/utils/extract-command-messages.d.ts +1 -1
- package/dist/utils/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/extract-command-messages.js +11 -9
- package/dist/utils/extract-command-messages.js.map +1 -1
- package/dist/utils/extract-command-messages.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.test.js +700 -0
- package/dist/utils/extract-command-messages.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 +8 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.js +92 -0
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.test.d.ts +2 -0
- package/dist/utils/inject-warning-into-tool-output.test.d.ts.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.test.js +149 -0
- package/dist/utils/inject-warning-into-tool-output.test.js.map +1 -0
- package/dist/utils/ink-render-options.test.d.ts +2 -0
- package/dist/utils/ink-render-options.test.d.ts.map +1 -0
- package/dist/utils/ink-render-options.test.js +7 -0
- package/dist/utils/ink-render-options.test.js.map +1 -0
- package/dist/utils/log-truncation.d.ts +42 -2
- package/dist/utils/log-truncation.d.ts.map +1 -1
- package/dist/utils/log-truncation.js +24 -6
- package/dist/utils/log-truncation.js.map +1 -1
- package/dist/utils/log-truncation.test.js +3 -2
- package/dist/utils/log-truncation.test.js.map +1 -1
- package/dist/utils/message-utils.d.ts +1 -1
- package/dist/utils/message-utils.d.ts.map +1 -1
- package/dist/utils/output/diff.d.ts +2 -0
- package/dist/utils/output/diff.d.ts.map +1 -0
- package/dist/utils/output/diff.js +42 -0
- package/dist/utils/output/diff.js.map +1 -0
- package/dist/utils/output/diff.test.d.ts +2 -0
- package/dist/utils/output/diff.test.d.ts.map +1 -0
- package/dist/utils/output/diff.test.js +85 -0
- package/dist/utils/output/diff.test.js.map +1 -0
- package/dist/utils/output/log-truncation.d.ts +49 -0
- package/dist/utils/output/log-truncation.d.ts.map +1 -0
- package/dist/utils/output/log-truncation.js +186 -0
- package/dist/utils/output/log-truncation.js.map +1 -0
- package/dist/utils/output/log-truncation.test.d.ts +2 -0
- package/dist/utils/output/log-truncation.test.d.ts.map +1 -0
- package/dist/utils/output/log-truncation.test.js +175 -0
- package/dist/utils/output/log-truncation.test.js.map +1 -0
- package/dist/utils/output/log-viewer-filters.d.ts +29 -0
- package/dist/utils/output/log-viewer-filters.d.ts.map +1 -0
- package/dist/utils/output/log-viewer-filters.js +49 -0
- package/dist/utils/output/log-viewer-filters.js.map +1 -0
- package/dist/utils/output/log-viewer-filters.test.d.ts +2 -0
- package/dist/utils/output/log-viewer-filters.test.d.ts.map +1 -0
- package/dist/utils/output/log-viewer-filters.test.js +48 -0
- package/dist/utils/output/log-viewer-filters.test.js.map +1 -0
- package/dist/utils/output/output-trim.d.ts +31 -0
- package/dist/utils/output/output-trim.d.ts.map +1 -0
- package/dist/utils/output/output-trim.js +79 -0
- package/dist/utils/output/output-trim.js.map +1 -0
- package/dist/utils/output/output-trim.test.d.ts +2 -0
- package/dist/utils/output/output-trim.test.d.ts.map +1 -0
- package/dist/utils/output/output-trim.test.js +183 -0
- package/dist/utils/output/output-trim.test.js.map +1 -0
- package/dist/utils/output/synchronized-output.d.ts +35 -0
- package/dist/utils/output/synchronized-output.d.ts.map +1 -0
- package/dist/utils/output/synchronized-output.js +66 -0
- package/dist/utils/output/synchronized-output.js.map +1 -0
- package/dist/utils/output/synchronized-output.test.d.ts +2 -0
- package/dist/utils/output/synchronized-output.test.d.ts.map +1 -0
- package/dist/utils/output/synchronized-output.test.js +70 -0
- package/dist/utils/output/synchronized-output.test.js.map +1 -0
- package/dist/utils/output/trim-tool-output.d.ts +2 -0
- package/dist/utils/output/trim-tool-output.d.ts.map +1 -0
- package/dist/utils/output/trim-tool-output.js +52 -0
- package/dist/utils/output/trim-tool-output.js.map +1 -0
- package/dist/utils/output/trim-tool-output.test.d.ts +2 -0
- package/dist/utils/output/trim-tool-output.test.d.ts.map +1 -0
- package/dist/utils/output/trim-tool-output.test.js +32 -0
- package/dist/utils/output/trim-tool-output.test.js.map +1 -0
- package/dist/utils/output/tty-osc.d.ts +27 -0
- package/dist/utils/output/tty-osc.d.ts.map +1 -0
- package/dist/utils/output/tty-osc.js +66 -0
- package/dist/utils/output/tty-osc.js.map +1 -0
- package/dist/utils/output/tty-osc.test.d.ts +2 -0
- package/dist/utils/output/tty-osc.test.d.ts.map +1 -0
- package/dist/utils/output/tty-osc.test.js +130 -0
- package/dist/utils/output/tty-osc.test.js.map +1 -0
- package/dist/utils/output/viewport.d.ts +6 -0
- package/dist/utils/output/viewport.d.ts.map +1 -0
- package/dist/utils/output/viewport.js +20 -0
- package/dist/utils/output/viewport.js.map +1 -0
- package/dist/utils/output/viewport.test.d.ts +2 -0
- package/dist/utils/output/viewport.test.d.ts.map +1 -0
- package/dist/utils/output/viewport.test.js +43 -0
- package/dist/utils/output/viewport.test.js.map +1 -0
- package/dist/utils/output-trim.test.d.ts +2 -0
- package/dist/utils/output-trim.test.d.ts.map +1 -0
- package/dist/utils/output-trim.test.js +183 -0
- package/dist/utils/output-trim.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/resume-list.d.ts +1 -1
- package/dist/utils/resume-list.d.ts.map +1 -1
- package/dist/utils/resume-list.js +1 -1
- package/dist/utils/resume-list.js.map +1 -1
- package/dist/utils/resume-list.test.js +31 -31
- package/dist/utils/resume-list.test.js.map +1 -1
- package/dist/utils/settings-command.d.ts +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +15 -4
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/settings-command.test.d.ts +2 -0
- package/dist/utils/settings-command.test.d.ts.map +1 -0
- package/dist/utils/settings-command.test.js +230 -0
- package/dist/utils/settings-command.test.js.map +1 -0
- package/dist/utils/shell/command-logger.d.ts +11 -0
- package/dist/utils/shell/command-logger.d.ts.map +1 -0
- package/dist/utils/shell/command-logger.js +34 -0
- package/dist/utils/shell/command-logger.js.map +1 -0
- package/dist/utils/shell/command-logger.test.d.ts +2 -0
- package/dist/utils/shell/command-logger.test.d.ts.map +1 -0
- package/dist/utils/shell/command-logger.test.js +32 -0
- package/dist/utils/shell/command-logger.test.js.map +1 -0
- package/dist/utils/shell/command-safety/constants.d.ts +21 -0
- package/dist/utils/shell/command-safety/constants.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/constants.js +265 -0
- package/dist/utils/shell/command-safety/constants.js.map +1 -0
- package/dist/utils/shell/command-safety/find-helpers.d.ts +15 -0
- package/dist/utils/shell/command-safety/find-helpers.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/find-helpers.js +131 -0
- package/dist/utils/shell/command-safety/find-helpers.js.map +1 -0
- package/dist/utils/shell/command-safety/handlers/find-handler.d.ts +6 -0
- package/dist/utils/shell/command-safety/handlers/find-handler.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/handlers/find-handler.js +106 -0
- package/dist/utils/shell/command-safety/handlers/find-handler.js.map +1 -0
- package/dist/utils/shell/command-safety/handlers/git-handler.d.ts +6 -0
- package/dist/utils/shell/command-safety/handlers/git-handler.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/handlers/git-handler.js +92 -0
- package/dist/utils/shell/command-safety/handlers/git-handler.js.map +1 -0
- package/dist/utils/shell/command-safety/handlers/index.d.ts +13 -0
- package/dist/utils/shell/command-safety/handlers/index.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/handlers/index.js +20 -0
- package/dist/utils/shell/command-safety/handlers/index.js.map +1 -0
- package/dist/utils/shell/command-safety/handlers/sed-handler.d.ts +6 -0
- package/dist/utils/shell/command-safety/handlers/sed-handler.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/handlers/sed-handler.js +95 -0
- package/dist/utils/shell/command-safety/handlers/sed-handler.js.map +1 -0
- package/dist/utils/shell/command-safety/handlers/types.d.ts +36 -0
- package/dist/utils/shell/command-safety/handlers/types.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/handlers/types.js +2 -0
- package/dist/utils/shell/command-safety/handlers/types.js.map +1 -0
- package/dist/utils/shell/command-safety/index.d.ts +23 -0
- package/dist/utils/shell/command-safety/index.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/index.js +227 -0
- package/dist/utils/shell/command-safety/index.js.map +1 -0
- package/dist/utils/shell/command-safety/path-analysis.d.ts +4 -0
- package/dist/utils/shell/command-safety/path-analysis.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/path-analysis.js +269 -0
- package/dist/utils/shell/command-safety/path-analysis.js.map +1 -0
- package/dist/utils/shell/command-safety/utils.d.ts +2 -0
- package/dist/utils/shell/command-safety/utils.d.ts.map +1 -0
- package/dist/utils/shell/command-safety/utils.js +20 -0
- package/dist/utils/shell/command-safety/utils.js.map +1 -0
- package/dist/utils/shell/command-safety.evaluator-false-positives.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.evaluator-false-positives.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.evaluator-false-positives.test.js +72 -0
- package/dist/utils/shell/command-safety.evaluator-false-positives.test.js.map +1 -0
- package/dist/utils/shell/command-safety.find.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.find.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.find.test.js +314 -0
- package/dist/utils/shell/command-safety.find.test.js.map +1 -0
- package/dist/utils/shell/command-safety.git.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.git.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.git.test.js +74 -0
- package/dist/utils/shell/command-safety.git.test.js.map +1 -0
- package/dist/utils/shell/command-safety.path.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.path.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.path.test.js +353 -0
- package/dist/utils/shell/command-safety.path.test.js.map +1 -0
- package/dist/utils/shell/command-safety.red-yellow-policy.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.red-yellow-policy.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.red-yellow-policy.test.js +36 -0
- package/dist/utils/shell/command-safety.red-yellow-policy.test.js.map +1 -0
- package/dist/utils/shell/command-safety.specialized-handlers.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.specialized-handlers.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.specialized-handlers.test.js +20 -0
- package/dist/utils/shell/command-safety.specialized-handlers.test.js.map +1 -0
- package/dist/utils/shell/command-safety.test.d.ts +2 -0
- package/dist/utils/shell/command-safety.test.d.ts.map +1 -0
- package/dist/utils/shell/command-safety.test.js +64 -0
- package/dist/utils/shell/command-safety.test.js.map +1 -0
- package/dist/utils/shell/execute-shell.d.ts +26 -0
- package/dist/utils/shell/execute-shell.d.ts.map +1 -0
- package/dist/utils/shell/execute-shell.js +68 -0
- package/dist/utils/shell/execute-shell.js.map +1 -0
- package/dist/utils/shell/execute-shell.test.d.ts +2 -0
- package/dist/utils/shell/execute-shell.test.d.ts.map +1 -0
- package/dist/utils/shell/execute-shell.test.js +89 -0
- package/dist/utils/shell/execute-shell.test.js.map +1 -0
- package/dist/utils/shell/shell-output.d.ts +17 -0
- package/dist/utils/shell/shell-output.d.ts.map +1 -0
- package/dist/utils/shell/shell-output.js +53 -0
- package/dist/utils/shell/shell-output.js.map +1 -0
- package/dist/utils/shell/shell-output.test.d.ts +2 -0
- package/dist/utils/shell/shell-output.test.d.ts.map +1 -0
- package/dist/utils/shell/shell-output.test.js +49 -0
- package/dist/utils/shell/shell-output.test.js.map +1 -0
- package/dist/utils/ssh-config-parser.test.js +37 -37
- package/dist/utils/ssh-config-parser.test.js.map +1 -1
- package/dist/utils/streaming/extract-command-messages.d.ts +5 -0
- package/dist/utils/streaming/extract-command-messages.d.ts.map +1 -0
- package/dist/utils/streaming/extract-command-messages.js +125 -0
- package/dist/utils/streaming/extract-command-messages.js.map +1 -0
- package/dist/utils/streaming/extract-command-messages.test.d.ts +2 -0
- package/dist/utils/streaming/extract-command-messages.test.d.ts.map +1 -0
- package/dist/utils/streaming/extract-command-messages.test.js +700 -0
- package/dist/utils/streaming/extract-command-messages.test.js.map +1 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts +33 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-session-factory.js +117 -0
- package/dist/utils/streaming/streaming-session-factory.js.map +1 -0
- package/dist/utils/streaming/streaming-session-factory.test.d.ts +2 -0
- package/dist/utils/streaming/streaming-session-factory.test.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-session-factory.test.js +148 -0
- package/dist/utils/streaming/streaming-session-factory.test.js.map +1 -0
- package/dist/utils/streaming/streaming-updater.d.ts +8 -0
- package/dist/utils/streaming/streaming-updater.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-updater.js +41 -0
- package/dist/utils/streaming/streaming-updater.js.map +1 -0
- package/dist/utils/streaming/streaming-updater.test.d.ts +2 -0
- package/dist/utils/streaming/streaming-updater.test.d.ts.map +1 -0
- package/dist/utils/streaming/streaming-updater.test.js +73 -0
- package/dist/utils/streaming/streaming-updater.test.js.map +1 -0
- package/dist/utils/streaming-session-factory.d.ts +8 -7
- package/dist/utils/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming-session-factory.js +15 -18
- package/dist/utils/streaming-session-factory.js.map +1 -1
- package/dist/utils/streaming-updater.test.d.ts +2 -0
- package/dist/utils/streaming-updater.test.d.ts.map +1 -0
- package/dist/utils/streaming-updater.test.js +73 -0
- package/dist/utils/streaming-updater.test.js.map +1 -0
- package/dist/utils/test-render.d.ts +14 -0
- package/dist/utils/test-render.d.ts.map +1 -0
- package/dist/utils/test-render.js +44 -0
- package/dist/utils/test-render.js.map +1 -0
- package/dist/utils/throttle.test.d.ts +2 -0
- package/dist/utils/throttle.test.d.ts.map +1 -0
- package/dist/utils/throttle.test.js +64 -0
- package/dist/utils/throttle.test.js.map +1 -0
- package/dist/utils/token-usage.d.ts +3 -1
- package/dist/utils/token-usage.d.ts.map +1 -1
- package/dist/utils/token-usage.js +7 -2
- 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/trim-tool-output.test.d.ts +2 -0
- package/dist/utils/trim-tool-output.test.d.ts.map +1 -0
- package/dist/utils/trim-tool-output.test.js +32 -0
- package/dist/utils/trim-tool-output.test.js.map +1 -0
- package/package.json +33 -32
|
@@ -1,9 +1,68 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { it, expect, beforeEach } from 'vitest';
|
|
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
|
+
import { AgentClient } from '../../lib/agent-client.js';
|
|
6
7
|
import { registerProvider } from '../../providers/registry.js';
|
|
8
|
+
import { MAX_SUBAGENT_MODEL_RETRIES } from '../retry/conversation-retry-policy.js';
|
|
9
|
+
const ROLE_MENTOR = 'mentor';
|
|
10
|
+
const ROLE_EXPLORER = 'explorer';
|
|
11
|
+
const ROLE_UNKNOWN = 'nonexistent-role-xyz';
|
|
12
|
+
const PROVIDER_MENTOR_MANAGER = 'mock-mentor-manager';
|
|
13
|
+
const PROVIDER_EXPLORER = 'mock-explorer-provider';
|
|
14
|
+
const MODEL_MAIN = 'main-model';
|
|
15
|
+
const MODEL_MENTOR = 'mentor-model';
|
|
16
|
+
const MODEL_MOCK = 'mock-model';
|
|
17
|
+
const TASK_ADVISE_ME = 'advise me';
|
|
18
|
+
const TASK_FIRST_QUESTION = 'first question';
|
|
19
|
+
const TASK_SECOND_QUESTION = 'second question';
|
|
20
|
+
const TASK_FRESH_QUESTION = 'fresh question';
|
|
21
|
+
const TASK_FIND_TS_FILES = 'find all TypeScript files';
|
|
22
|
+
const TASK_INSPECT_WORKSPACE = 'inspect the workspace';
|
|
23
|
+
const TASK_INSPECT_TEMP_WORKSPACE = 'inspect a temp workspace';
|
|
24
|
+
const TASK_FIND_FILES = 'find files';
|
|
25
|
+
const UNKNOWN_ROLE_ERROR_FRAGMENT = ROLE_UNKNOWN;
|
|
26
|
+
const MENTOR_MODEL_NOT_CONFIGURED_ERROR = 'Mentor model is not configured';
|
|
27
|
+
const EXPLORER_BLOCKED_PREFIX = 'Error: command blocked - explorer can only run read-only (GREEN) shell commands. Command: ';
|
|
28
|
+
const GREEN_SHELL_COMMANDS = ['pwd', 'ls', 'cat package.json', 'git status', 'git log --oneline'];
|
|
29
|
+
const YELLOW_SHELL_COMMANDS = ['touch blocked.txt', 'npm test', 'unknown_tool_name', 'cat ../outside.txt'];
|
|
30
|
+
const RED_SHELL_COMMANDS = ['rm -rf x', 'sudo ls'];
|
|
31
|
+
const TEMP_WORKSPACE_PREFIX = 'term2-test-explorer-shell-block-';
|
|
32
|
+
const TEMP_SOURCE_FILE = 'source.txt';
|
|
33
|
+
const TEMP_BLOCKED_CASES = [
|
|
34
|
+
{ command: 'touch blocked-touch.txt', path: 'blocked-touch.txt' },
|
|
35
|
+
{ command: 'echo marker > blocked-redirect.txt', path: 'blocked-redirect.txt' },
|
|
36
|
+
{ command: 'cat source.txt > blocked-copy.txt', path: 'blocked-copy.txt' },
|
|
37
|
+
{ command: 'printf marker | tee blocked-tee.txt', path: 'blocked-tee.txt' },
|
|
38
|
+
];
|
|
39
|
+
const createSessionContextService = () => ({
|
|
40
|
+
runWithContext: (_context, fn) => fn(),
|
|
41
|
+
getContext: () => null,
|
|
42
|
+
});
|
|
43
|
+
const SubagentManager = class extends RealSubagentManager {
|
|
44
|
+
constructor(deps) {
|
|
45
|
+
const sessionContextService = deps.sessionContextService ?? createSessionContextService();
|
|
46
|
+
super({
|
|
47
|
+
...deps,
|
|
48
|
+
sessionContextService,
|
|
49
|
+
createClient: deps.createClient ??
|
|
50
|
+
(({ agent, provider, maxTurns, retryAttempts }) => new AgentClient({
|
|
51
|
+
model: agent.model,
|
|
52
|
+
maxTurns,
|
|
53
|
+
retryAttempts,
|
|
54
|
+
deps: {
|
|
55
|
+
logger: deps.logger,
|
|
56
|
+
settings: deps.settings,
|
|
57
|
+
executionContext: deps.executionContext,
|
|
58
|
+
sessionContextService,
|
|
59
|
+
},
|
|
60
|
+
agentOverride: agent,
|
|
61
|
+
providerOverride: provider,
|
|
62
|
+
})),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
7
66
|
// ========== Mock Utilities ==========
|
|
8
67
|
function createMockLogger() {
|
|
9
68
|
return {
|
|
@@ -27,6 +86,81 @@ function createMockSettings(values = {}) {
|
|
|
27
86
|
},
|
|
28
87
|
};
|
|
29
88
|
}
|
|
89
|
+
function getAgentTool(agent, name) {
|
|
90
|
+
return agent.tools.find((tool) => tool.name === name);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Wraps a plain subagent run result into an AgentStream-compatible async iterable.
|
|
94
|
+
* ConversationSession expects stream:true results that can be iterated with for-await.
|
|
95
|
+
*/
|
|
96
|
+
function wrapResultAsAgentStream(result) {
|
|
97
|
+
const events = [];
|
|
98
|
+
if (typeof result.finalOutput === 'string' && result.finalOutput) {
|
|
99
|
+
events.push({ type: 'response.output_text.delta', delta: result.finalOutput });
|
|
100
|
+
}
|
|
101
|
+
// ConversationSession reads output/newItems/history from the stream in this
|
|
102
|
+
// priority. Provide at least one non-empty source so the session can process
|
|
103
|
+
// the result and reach the 'final' event.
|
|
104
|
+
const findSynthesizedOutput = () => {
|
|
105
|
+
if (Array.isArray(result.output) && result.output.length > 0)
|
|
106
|
+
return result.output;
|
|
107
|
+
if (Array.isArray(result.newItems) && result.newItems.length > 0)
|
|
108
|
+
return result.newItems;
|
|
109
|
+
if (Array.isArray(result.history) && result.history.length > 0)
|
|
110
|
+
return result.history;
|
|
111
|
+
if (typeof result.finalOutput === 'string' && result.finalOutput) {
|
|
112
|
+
return [{ role: 'assistant', type: 'message', content: result.finalOutput }];
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
};
|
|
116
|
+
const synthesizedOutput = findSynthesizedOutput();
|
|
117
|
+
return {
|
|
118
|
+
[Symbol.asyncIterator]() {
|
|
119
|
+
let index = 0;
|
|
120
|
+
return {
|
|
121
|
+
async next() {
|
|
122
|
+
if (index < events.length) {
|
|
123
|
+
return { value: events[index++], done: false };
|
|
124
|
+
}
|
|
125
|
+
return { value: undefined, done: true };
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
completed: Promise.resolve(result),
|
|
130
|
+
rawResponses: [result],
|
|
131
|
+
status: result.status ?? 'completed',
|
|
132
|
+
finalOutput: result.finalOutput,
|
|
133
|
+
state: result.state,
|
|
134
|
+
output: synthesizedOutput,
|
|
135
|
+
newItems: result.newItems ?? synthesizedOutput,
|
|
136
|
+
interruptions: result.interruptions ?? [],
|
|
137
|
+
history: result.history ?? synthesizedOutput,
|
|
138
|
+
messages: result.messages ?? synthesizedOutput,
|
|
139
|
+
responseId: result.responseId ?? null,
|
|
140
|
+
lastResponseId: result.responseId ?? null,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function wrapErrorAsAgentStream(error) {
|
|
144
|
+
const completed = Promise.reject(error);
|
|
145
|
+
completed.catch(() => { });
|
|
146
|
+
return {
|
|
147
|
+
[Symbol.asyncIterator]() {
|
|
148
|
+
return {
|
|
149
|
+
async next() {
|
|
150
|
+
throw error;
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
completed,
|
|
155
|
+
rawResponses: [],
|
|
156
|
+
status: 'failed',
|
|
157
|
+
interruptions: [],
|
|
158
|
+
history: [],
|
|
159
|
+
messages: [],
|
|
160
|
+
responseId: null,
|
|
161
|
+
lastResponseId: null,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
30
164
|
// ========== Provider Mocks ==========
|
|
31
165
|
let mentorManagerRunnerCalls = [];
|
|
32
166
|
let mentorManagerResponseCounter = 0;
|
|
@@ -34,22 +168,23 @@ let mentorManagerProviderRegistered = false;
|
|
|
34
168
|
function ensureMentorManagerProviderRegistered() {
|
|
35
169
|
if (!mentorManagerProviderRegistered) {
|
|
36
170
|
registerProvider({
|
|
37
|
-
id:
|
|
171
|
+
id: PROVIDER_MENTOR_MANAGER,
|
|
38
172
|
label: 'Mock Mentor Manager',
|
|
39
173
|
createRunner: () => ({
|
|
40
174
|
run: async (_agent, _input, _options) => {
|
|
41
175
|
mentorManagerRunnerCalls.push({ input: _input, options: _options, agent: _agent });
|
|
42
176
|
mentorManagerResponseCounter++;
|
|
43
|
-
|
|
177
|
+
const result = {
|
|
44
178
|
status: 'completed',
|
|
45
179
|
finalOutput: `mentor-response-${mentorManagerResponseCounter}`,
|
|
46
180
|
responseId: `resp-${mentorManagerResponseCounter}`,
|
|
47
181
|
history: [],
|
|
48
182
|
messages: [],
|
|
49
183
|
};
|
|
184
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
50
185
|
},
|
|
51
186
|
}),
|
|
52
|
-
fetchModels: async () => [{ id:
|
|
187
|
+
fetchModels: async () => [{ id: MODEL_MOCK }],
|
|
53
188
|
});
|
|
54
189
|
mentorManagerProviderRegistered = true;
|
|
55
190
|
}
|
|
@@ -59,25 +194,26 @@ let explorerRunnerCalls = [];
|
|
|
59
194
|
function ensureExplorerProviderRegistered() {
|
|
60
195
|
if (!explorerManagerProviderRegistered) {
|
|
61
196
|
registerProvider({
|
|
62
|
-
id:
|
|
197
|
+
id: PROVIDER_EXPLORER,
|
|
63
198
|
label: 'Mock Explorer Provider',
|
|
64
199
|
createRunner: () => ({
|
|
65
200
|
run: async (_agent, input, options) => {
|
|
66
201
|
explorerRunnerCalls.push({ input, agent: _agent, options });
|
|
67
|
-
|
|
202
|
+
const result = {
|
|
68
203
|
status: 'completed',
|
|
69
204
|
finalOutput: 'Found the relevant files.',
|
|
70
205
|
history: [],
|
|
71
206
|
messages: [],
|
|
72
207
|
};
|
|
208
|
+
return options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
73
209
|
},
|
|
74
210
|
}),
|
|
75
|
-
fetchModels: async () => [{ id:
|
|
211
|
+
fetchModels: async () => [{ id: MODEL_MOCK }],
|
|
76
212
|
});
|
|
77
213
|
explorerManagerProviderRegistered = true;
|
|
78
214
|
}
|
|
79
215
|
}
|
|
80
|
-
|
|
216
|
+
beforeEach(() => {
|
|
81
217
|
mentorManagerRunnerCalls = [];
|
|
82
218
|
mentorManagerResponseCounter = 0;
|
|
83
219
|
explorerRunnerCalls = [];
|
|
@@ -85,102 +221,133 @@ test.beforeEach(() => {
|
|
|
85
221
|
ensureExplorerProviderRegistered();
|
|
86
222
|
});
|
|
87
223
|
// ========== run() with unknown role ==========
|
|
88
|
-
|
|
224
|
+
it.sequential('run() returns failed result for unknown role', async () => {
|
|
89
225
|
const settings = createMockSettings({
|
|
90
|
-
'agent.model':
|
|
91
|
-
'agent.provider':
|
|
226
|
+
'agent.model': MODEL_MOCK,
|
|
227
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
92
228
|
});
|
|
93
|
-
const manager = new SubagentManager({
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
229
|
+
const manager = new SubagentManager({
|
|
230
|
+
logger: createMockLogger(),
|
|
231
|
+
settings,
|
|
232
|
+
sessionContextService: createSessionContextService(),
|
|
233
|
+
});
|
|
234
|
+
const result = await manager.run({ role: ROLE_UNKNOWN, task: 'do something' });
|
|
235
|
+
expect(result.status).toBe('failed');
|
|
236
|
+
expect(result.error).toBeTruthy();
|
|
237
|
+
expect(result.error.includes(UNKNOWN_ROLE_ERROR_FRAGMENT)).toBe(true);
|
|
98
238
|
});
|
|
99
239
|
// ========== Mentor role ==========
|
|
100
|
-
|
|
240
|
+
it.sequential('run() with mentor role uses mentorModel setting', async () => {
|
|
101
241
|
const settings = createMockSettings({
|
|
102
|
-
'agent.model':
|
|
103
|
-
'agent.provider':
|
|
104
|
-
'agent.mentorModel':
|
|
105
|
-
'agent.mentorProvider':
|
|
242
|
+
'agent.model': MODEL_MAIN,
|
|
243
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
244
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
245
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
106
246
|
});
|
|
107
|
-
const manager = new SubagentManager({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
247
|
+
const manager = new SubagentManager({
|
|
248
|
+
logger: createMockLogger(),
|
|
249
|
+
settings,
|
|
250
|
+
sessionContextService: createSessionContextService(),
|
|
251
|
+
});
|
|
252
|
+
const result = await manager.run({ role: ROLE_MENTOR, task: TASK_ADVISE_ME });
|
|
253
|
+
expect(result.status).toBe('completed');
|
|
254
|
+
expect(result.role).toBe(ROLE_MENTOR);
|
|
255
|
+
expect(result.finalText.includes('mentor-response')).toBe(true);
|
|
256
|
+
expect(mentorManagerRunnerCalls.length).toBe(1);
|
|
257
|
+
expect(mentorManagerRunnerCalls[0].agent.model).toBe(MODEL_MENTOR);
|
|
114
258
|
});
|
|
115
|
-
|
|
259
|
+
it.sequential('run() with mentor role fails when mentorModel is not set', async () => {
|
|
116
260
|
const settings = createMockSettings({
|
|
117
|
-
'agent.model':
|
|
118
|
-
'agent.provider':
|
|
261
|
+
'agent.model': MODEL_MAIN,
|
|
262
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
119
263
|
});
|
|
120
|
-
const manager = new SubagentManager({
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
264
|
+
const manager = new SubagentManager({
|
|
265
|
+
logger: createMockLogger(),
|
|
266
|
+
settings,
|
|
267
|
+
sessionContextService: createSessionContextService(),
|
|
268
|
+
});
|
|
269
|
+
const result = await manager.run({ role: ROLE_MENTOR, task: TASK_ADVISE_ME });
|
|
270
|
+
expect(result.status).toBe('failed');
|
|
271
|
+
expect(result.error.includes(MENTOR_MODEL_NOT_CONFIGURED_ERROR)).toBe(true);
|
|
124
272
|
});
|
|
125
|
-
|
|
273
|
+
it.sequential('run() mentor maintains conversation history across calls', async () => {
|
|
126
274
|
const settings = createMockSettings({
|
|
127
|
-
'agent.model':
|
|
128
|
-
'agent.provider':
|
|
129
|
-
'agent.mentorModel':
|
|
130
|
-
'agent.mentorProvider':
|
|
275
|
+
'agent.model': MODEL_MAIN,
|
|
276
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
277
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
278
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
131
279
|
});
|
|
132
|
-
const manager = new SubagentManager({
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
280
|
+
const manager = new SubagentManager({
|
|
281
|
+
logger: createMockLogger(),
|
|
282
|
+
settings,
|
|
283
|
+
sessionContextService: createSessionContextService(),
|
|
284
|
+
});
|
|
285
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_FIRST_QUESTION });
|
|
286
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_SECOND_QUESTION });
|
|
287
|
+
expect(mentorManagerRunnerCalls.length).toBe(2);
|
|
136
288
|
// Second call should have history (array with previous messages)
|
|
137
|
-
|
|
138
|
-
|
|
289
|
+
expect(Array.isArray(mentorManagerRunnerCalls[1].input)).toBe(true);
|
|
290
|
+
expect(mentorManagerRunnerCalls[1].input.length > 1).toBe(true);
|
|
139
291
|
});
|
|
140
|
-
|
|
292
|
+
it.sequential('resetMentorSession() clears conversation history', async () => {
|
|
141
293
|
const settings = createMockSettings({
|
|
142
|
-
'agent.model':
|
|
143
|
-
'agent.provider':
|
|
144
|
-
'agent.mentorModel':
|
|
145
|
-
'agent.mentorProvider':
|
|
294
|
+
'agent.model': MODEL_MAIN,
|
|
295
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
296
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
297
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
146
298
|
});
|
|
147
|
-
const manager = new SubagentManager({
|
|
148
|
-
|
|
149
|
-
|
|
299
|
+
const manager = new SubagentManager({
|
|
300
|
+
logger: createMockLogger(),
|
|
301
|
+
settings,
|
|
302
|
+
sessionContextService: createSessionContextService(),
|
|
303
|
+
});
|
|
304
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_FIRST_QUESTION });
|
|
305
|
+
expect(mentorManagerRunnerCalls[0].input.length >= 1).toBe(true);
|
|
150
306
|
manager.resetMentorSession();
|
|
151
|
-
await manager.run({ role:
|
|
307
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_FRESH_QUESTION });
|
|
152
308
|
// After reset, second call should have only 1 message (fresh start)
|
|
153
|
-
|
|
309
|
+
expect(mentorManagerRunnerCalls[1].input.length).toBe(1);
|
|
154
310
|
});
|
|
155
311
|
// ========== Explorer role ==========
|
|
156
|
-
|
|
312
|
+
it.sequential('run() with explorer role returns SubagentResult', async () => {
|
|
157
313
|
const settings = createMockSettings({
|
|
158
|
-
'agent.model':
|
|
159
|
-
'agent.provider':
|
|
314
|
+
'agent.model': MODEL_MOCK,
|
|
315
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
160
316
|
});
|
|
161
|
-
const manager = new SubagentManager({
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
317
|
+
const manager = new SubagentManager({
|
|
318
|
+
logger: createMockLogger(),
|
|
319
|
+
settings,
|
|
320
|
+
sessionContextService: createSessionContextService(),
|
|
321
|
+
});
|
|
322
|
+
const result = await manager.run({ role: ROLE_EXPLORER, task: TASK_FIND_TS_FILES });
|
|
323
|
+
expect(result.status).toBe('completed');
|
|
324
|
+
expect(result.role).toBe(ROLE_EXPLORER);
|
|
325
|
+
expect(result.agentId).toBeTruthy();
|
|
326
|
+
expect(result.filesChanged.length).toBe(0);
|
|
327
|
+
expect(result.finalText).toBeTruthy();
|
|
168
328
|
});
|
|
169
|
-
|
|
329
|
+
it.sequential('run() passes parent abort signal into the delegated provider run', async () => {
|
|
170
330
|
const settings = createMockSettings({
|
|
171
|
-
'agent.model':
|
|
172
|
-
'agent.provider':
|
|
331
|
+
'agent.model': MODEL_MOCK,
|
|
332
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
333
|
+
});
|
|
334
|
+
const manager = new SubagentManager({
|
|
335
|
+
logger: createMockLogger(),
|
|
336
|
+
settings,
|
|
337
|
+
sessionContextService: createSessionContextService(),
|
|
173
338
|
});
|
|
174
|
-
const manager = new SubagentManager({ logger: createMockLogger(), settings });
|
|
175
339
|
const abortController = new AbortController();
|
|
176
340
|
await manager.run({
|
|
177
|
-
role:
|
|
178
|
-
task:
|
|
341
|
+
role: ROLE_EXPLORER,
|
|
342
|
+
task: TASK_FIND_TS_FILES,
|
|
179
343
|
signal: abortController.signal,
|
|
180
344
|
});
|
|
181
|
-
|
|
345
|
+
expect(true).toBe(true);
|
|
182
346
|
});
|
|
183
|
-
|
|
347
|
+
it.sequential('run() cancels a delegated provider run when the parent signal aborts', async () => {
|
|
348
|
+
// ConversationSession threads the parent signal through agentClient.abort(),
|
|
349
|
+
// which aborts the internal AbortController whose signal reaches the runner
|
|
350
|
+
// via startStream(). The mock listens on options.signal (the internal AC).
|
|
184
351
|
registerProvider({
|
|
185
352
|
id: 'mock-aborted-subagent-provider',
|
|
186
353
|
label: 'Mock Aborted Subagent Provider',
|
|
@@ -197,43 +364,112 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
|
|
|
197
364
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
198
365
|
});
|
|
199
366
|
const settings = createMockSettings({
|
|
200
|
-
'agent.model':
|
|
367
|
+
'agent.model': MODEL_MOCK,
|
|
201
368
|
'agent.provider': 'mock-aborted-subagent-provider',
|
|
202
369
|
});
|
|
203
|
-
const manager = new SubagentManager({
|
|
370
|
+
const manager = new SubagentManager({
|
|
371
|
+
logger: createMockLogger(),
|
|
372
|
+
settings,
|
|
373
|
+
sessionContextService: createSessionContextService(),
|
|
374
|
+
});
|
|
204
375
|
const abortController = new AbortController();
|
|
205
376
|
const resultPromise = manager.run({
|
|
206
|
-
role:
|
|
207
|
-
task:
|
|
377
|
+
role: ROLE_EXPLORER,
|
|
378
|
+
task: TASK_FIND_TS_FILES,
|
|
208
379
|
signal: abortController.signal,
|
|
209
380
|
});
|
|
210
381
|
queueMicrotask(() => abortController.abort());
|
|
211
382
|
const result = await resultPromise;
|
|
212
|
-
|
|
213
|
-
|
|
383
|
+
expect(result.status).toBe('cancelled');
|
|
384
|
+
expect(result.error?.includes('aborted') ?? false).toBe(true);
|
|
214
385
|
});
|
|
215
|
-
|
|
386
|
+
it.sequential('explorer shell tool executes GREEN commands and blocks YELLOW and RED commands', async () => {
|
|
216
387
|
const settings = createMockSettings({
|
|
217
|
-
'agent.model':
|
|
218
|
-
'agent.provider':
|
|
388
|
+
'agent.model': MODEL_MOCK,
|
|
389
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
219
390
|
});
|
|
220
|
-
const manager = new SubagentManager({
|
|
221
|
-
|
|
222
|
-
|
|
391
|
+
const manager = new SubagentManager({
|
|
392
|
+
logger: createMockLogger(),
|
|
393
|
+
settings,
|
|
394
|
+
sessionContextService: createSessionContextService(),
|
|
395
|
+
});
|
|
396
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_INSPECT_WORKSPACE });
|
|
397
|
+
expect(explorerRunnerCalls.length).toBe(1);
|
|
398
|
+
const agent = explorerRunnerCalls[0].agent;
|
|
399
|
+
const shell = getAgentTool(agent, 'shell');
|
|
400
|
+
expect(shell).toBeTruthy();
|
|
401
|
+
expect(await shell.needsApproval({}, { command: 'pwd' })).toBe(false);
|
|
402
|
+
const invokeShell = async (command) => shell.invoke({}, JSON.stringify({ command }), {});
|
|
403
|
+
for (const command of GREEN_SHELL_COMMANDS) {
|
|
404
|
+
const output = await invokeShell(command);
|
|
405
|
+
expect(output.includes('exit 0')).toBe(true);
|
|
406
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(false);
|
|
407
|
+
}
|
|
408
|
+
for (const command of YELLOW_SHELL_COMMANDS) {
|
|
409
|
+
const output = await invokeShell(command);
|
|
410
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
411
|
+
expect(output.includes(command)).toBe(true);
|
|
412
|
+
}
|
|
413
|
+
for (const command of RED_SHELL_COMMANDS) {
|
|
414
|
+
const output = await invokeShell(command);
|
|
415
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
416
|
+
expect(output.includes(command)).toBe(true);
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
it.sequential('explorer shell tool blocks write-like shell commands without creating files in a temp workspace', async () => {
|
|
420
|
+
const tmpDir = fs.mkdtempSync(path.join('/tmp', TEMP_WORKSPACE_PREFIX));
|
|
421
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
422
|
+
fs.writeFileSync(path.join(tmpDir, TEMP_SOURCE_FILE), 'source content');
|
|
423
|
+
const settings = createMockSettings({
|
|
424
|
+
'agent.model': MODEL_MOCK,
|
|
425
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
426
|
+
});
|
|
427
|
+
const manager = new SubagentManager({
|
|
428
|
+
logger: createMockLogger(),
|
|
429
|
+
settings,
|
|
430
|
+
sessionContextService: createSessionContextService(),
|
|
431
|
+
executionContext: {
|
|
432
|
+
getCwd: () => tmpDir,
|
|
433
|
+
isRemote: () => false,
|
|
434
|
+
getSSHService: () => undefined,
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_INSPECT_TEMP_WORKSPACE });
|
|
438
|
+
const agent = explorerRunnerCalls[explorerRunnerCalls.length - 1].agent;
|
|
439
|
+
const shell = getAgentTool(agent, 'shell');
|
|
440
|
+
expect(shell).toBeTruthy();
|
|
441
|
+
for (const { command, path: relativePath } of TEMP_BLOCKED_CASES) {
|
|
442
|
+
const output = await shell.invoke({}, JSON.stringify({ command }), {});
|
|
443
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
444
|
+
expect(fs.existsSync(path.join(tmpDir, relativePath))).toBe(false);
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
it.sequential('run() with explorer role uses read-only tools only', async () => {
|
|
448
|
+
const settings = createMockSettings({
|
|
449
|
+
'agent.model': MODEL_MOCK,
|
|
450
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
451
|
+
});
|
|
452
|
+
const manager = new SubagentManager({
|
|
453
|
+
logger: createMockLogger(),
|
|
454
|
+
settings,
|
|
455
|
+
sessionContextService: createSessionContextService(),
|
|
456
|
+
});
|
|
457
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_FIND_FILES });
|
|
458
|
+
expect(explorerRunnerCalls.length).toBe(1);
|
|
223
459
|
const agent = explorerRunnerCalls[0].agent;
|
|
224
460
|
const toolNames = agent.tools.map((t) => t.name);
|
|
225
461
|
// Explorer should have read tools
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
462
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
463
|
+
expect(toolNames.includes('grep')).toBe(true);
|
|
464
|
+
expect(toolNames.includes('find_files')).toBe(true);
|
|
229
465
|
// Explorer should NOT have write tools
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
466
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
467
|
+
expect(toolNames.includes('search_replace')).toBe(false);
|
|
468
|
+
expect(toolNames.includes('create_file')).toBe(false);
|
|
233
469
|
// Explorer should NOT have web tools by default
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
470
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
471
|
+
expect(toolNames.includes('web_fetch')).toBe(false);
|
|
472
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
237
473
|
});
|
|
238
474
|
// ========== Researcher role ==========
|
|
239
475
|
let researcherRunnerCalls = [];
|
|
@@ -246,12 +482,13 @@ function ensureResearcherProviderRegistered() {
|
|
|
246
482
|
createRunner: () => ({
|
|
247
483
|
run: async (_agent, _input, _options) => {
|
|
248
484
|
researcherRunnerCalls.push({ agent: _agent });
|
|
249
|
-
|
|
485
|
+
const result = {
|
|
250
486
|
status: 'completed',
|
|
251
487
|
finalOutput: 'Research findings.',
|
|
252
488
|
history: [],
|
|
253
489
|
messages: [],
|
|
254
490
|
};
|
|
491
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
255
492
|
},
|
|
256
493
|
}),
|
|
257
494
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -259,26 +496,30 @@ function ensureResearcherProviderRegistered() {
|
|
|
259
496
|
researcherProviderRegistered = true;
|
|
260
497
|
}
|
|
261
498
|
}
|
|
262
|
-
|
|
499
|
+
beforeEach(() => {
|
|
263
500
|
researcherRunnerCalls = [];
|
|
264
501
|
ensureResearcherProviderRegistered();
|
|
265
502
|
});
|
|
266
|
-
|
|
503
|
+
it.sequential('run() with researcher role includes web tools', async () => {
|
|
267
504
|
const settings = createMockSettings({
|
|
268
505
|
'agent.model': 'mock-model',
|
|
269
506
|
'agent.provider': 'mock-researcher-provider',
|
|
270
507
|
});
|
|
271
|
-
const manager = new SubagentManager({
|
|
508
|
+
const manager = new SubagentManager({
|
|
509
|
+
logger: createMockLogger(),
|
|
510
|
+
settings,
|
|
511
|
+
sessionContextService: createSessionContextService(),
|
|
512
|
+
});
|
|
272
513
|
await manager.run({ role: 'researcher', task: 'look up the latest TypeScript release' });
|
|
273
|
-
|
|
514
|
+
expect(researcherRunnerCalls.length).toBe(1);
|
|
274
515
|
const agent = researcherRunnerCalls[0].agent;
|
|
275
516
|
const toolNames = agent.tools.map((t) => t.name);
|
|
276
517
|
// Researcher should have read and web tools
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
518
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
519
|
+
expect(toolNames.includes('web_search')).toBe(true);
|
|
520
|
+
expect(toolNames.includes('web_fetch')).toBe(true);
|
|
280
521
|
// But not write tools
|
|
281
|
-
|
|
522
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
282
523
|
});
|
|
283
524
|
// ========== Worker role ==========
|
|
284
525
|
let workerRunnerCalls = [];
|
|
@@ -291,12 +532,13 @@ function ensureWorkerProviderRegistered() {
|
|
|
291
532
|
createRunner: () => ({
|
|
292
533
|
run: async (_agent, _input, _options) => {
|
|
293
534
|
workerRunnerCalls.push({ agent: _agent });
|
|
294
|
-
|
|
535
|
+
const result = {
|
|
295
536
|
status: 'completed',
|
|
296
537
|
finalOutput: 'Changes applied.',
|
|
297
538
|
history: [],
|
|
298
539
|
messages: [],
|
|
299
540
|
};
|
|
541
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
300
542
|
},
|
|
301
543
|
}),
|
|
302
544
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -304,60 +546,118 @@ function ensureWorkerProviderRegistered() {
|
|
|
304
546
|
workerProviderRegistered = true;
|
|
305
547
|
}
|
|
306
548
|
}
|
|
307
|
-
|
|
549
|
+
beforeEach(() => {
|
|
308
550
|
workerRunnerCalls = [];
|
|
309
551
|
ensureWorkerProviderRegistered();
|
|
310
552
|
});
|
|
311
|
-
|
|
553
|
+
it.sequential('run() with worker role includes write and shell tools for non-gpt model', async () => {
|
|
312
554
|
const settings = createMockSettings({
|
|
313
555
|
'agent.model': 'mock-model',
|
|
314
556
|
'agent.provider': 'mock-worker-provider',
|
|
315
557
|
});
|
|
316
|
-
const manager = new SubagentManager({
|
|
558
|
+
const manager = new SubagentManager({
|
|
559
|
+
logger: createMockLogger(),
|
|
560
|
+
settings,
|
|
561
|
+
sessionContextService: createSessionContextService(),
|
|
562
|
+
});
|
|
317
563
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
318
|
-
|
|
564
|
+
expect(workerRunnerCalls.length).toBe(1);
|
|
319
565
|
const agent = workerRunnerCalls[0].agent;
|
|
320
566
|
const toolNames = agent.tools.map((t) => t.name);
|
|
321
567
|
// Worker should have read, non-gpt write tools, and shell
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
568
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
569
|
+
expect(toolNames.includes('search_replace')).toBe(true);
|
|
570
|
+
expect(toolNames.includes('create_file')).toBe(true);
|
|
571
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
326
572
|
// Should NOT have apply_patch or web tools
|
|
327
|
-
|
|
328
|
-
|
|
573
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
574
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
329
575
|
});
|
|
330
|
-
|
|
576
|
+
it.sequential('run() with worker role includes write and shell tools for gpt model', async () => {
|
|
331
577
|
const settings = createMockSettings({
|
|
332
578
|
'agent.model': 'gpt-5',
|
|
333
579
|
'agent.provider': 'mock-worker-provider',
|
|
334
580
|
});
|
|
335
|
-
const manager = new SubagentManager({
|
|
581
|
+
const manager = new SubagentManager({
|
|
582
|
+
logger: createMockLogger(),
|
|
583
|
+
settings,
|
|
584
|
+
sessionContextService: createSessionContextService(),
|
|
585
|
+
});
|
|
336
586
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
337
|
-
|
|
587
|
+
expect(workerRunnerCalls.length).toBe(1);
|
|
338
588
|
const agent = workerRunnerCalls[0].agent;
|
|
339
589
|
const toolNames = agent.tools.map((t) => t.name);
|
|
340
590
|
// Worker should have read, gpt write tools (apply_patch), and shell
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
591
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
592
|
+
expect(toolNames.includes('apply_patch')).toBe(true);
|
|
593
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
344
594
|
// Should NOT have search_replace, create_file, or web tools
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
595
|
+
expect(toolNames.includes('search_replace')).toBe(false);
|
|
596
|
+
expect(toolNames.includes('create_file')).toBe(false);
|
|
597
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
348
598
|
});
|
|
349
|
-
|
|
599
|
+
it.sequential('run() result contains agentId and correct role', async () => {
|
|
350
600
|
const settings = createMockSettings({
|
|
351
601
|
'agent.model': 'mock-model',
|
|
352
602
|
'agent.provider': 'mock-worker-provider',
|
|
353
603
|
});
|
|
354
604
|
const manager = new SubagentManager({ logger: createMockLogger(), settings });
|
|
355
605
|
const result = await manager.run({ role: 'worker', task: 'do some work' });
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
606
|
+
expect(result.role).toBe('worker');
|
|
607
|
+
expect(result.agentId).toBeTruthy();
|
|
608
|
+
expect(result.agentId.length > 0).toBe(true);
|
|
609
|
+
expect(result.filesChanged.length).toBe(0);
|
|
610
|
+
expect(result.status).toBe('completed');
|
|
611
|
+
});
|
|
612
|
+
it.sequential('getRoleAgentTool caches one internal agent tool per role', () => {
|
|
613
|
+
const manager = new SubagentManager({
|
|
614
|
+
logger: createMockLogger(),
|
|
615
|
+
settings: createMockSettings({
|
|
616
|
+
'agent.model': 'mock-model',
|
|
617
|
+
'agent.provider': 'mock-boundary-worker',
|
|
618
|
+
}),
|
|
619
|
+
});
|
|
620
|
+
const first = manager.getRoleAgentTool('worker');
|
|
621
|
+
const second = manager.getRoleAgentTool('worker');
|
|
622
|
+
const explorer = manager.getRoleAgentTool('explorer');
|
|
623
|
+
expect(first).toBe(second);
|
|
624
|
+
expect(first).not.toBe(explorer);
|
|
625
|
+
expect(first.name).toBe('run_subagent_worker');
|
|
626
|
+
});
|
|
627
|
+
it.sequential('clearCache rebuilds cached role agent tools', () => {
|
|
628
|
+
const manager = new SubagentManager({
|
|
629
|
+
logger: createMockLogger(),
|
|
630
|
+
settings: createMockSettings({
|
|
631
|
+
'agent.model': 'mock-model',
|
|
632
|
+
'agent.provider': 'mock-boundary-worker',
|
|
633
|
+
}),
|
|
634
|
+
});
|
|
635
|
+
const first = manager.getRoleAgentTool('worker');
|
|
636
|
+
manager.clearCache();
|
|
637
|
+
const rebuilt = manager.getRoleAgentTool('worker');
|
|
638
|
+
expect(first).not.toBe(rebuilt);
|
|
639
|
+
});
|
|
640
|
+
it.sequential('cached worker agent preserves native approval checks for nested tools', async () => {
|
|
641
|
+
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-nested-worker-approval-'));
|
|
642
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
643
|
+
const manager = new SubagentManager({
|
|
644
|
+
logger: createMockLogger(),
|
|
645
|
+
settings: createMockSettings({
|
|
646
|
+
'agent.model': 'mock-model',
|
|
647
|
+
'agent.provider': 'mock-boundary-worker',
|
|
648
|
+
}),
|
|
649
|
+
executionContext: {
|
|
650
|
+
getCwd: () => tmpDir,
|
|
651
|
+
isRemote: () => false,
|
|
652
|
+
getSSHService: () => undefined,
|
|
653
|
+
},
|
|
654
|
+
});
|
|
655
|
+
const worker = manager.getRoleAgent('worker');
|
|
656
|
+
const shell = getAgentTool(worker, 'shell');
|
|
657
|
+
const createFile = getAgentTool(worker, 'create_file');
|
|
658
|
+
expect(await shell.needsApproval({}, { command: 'touch nested-approval.txt' })).toBe(true);
|
|
659
|
+
expect(await createFile.needsApproval({}, { path: 'inside.txt', content: 'ok' })).toBe(false);
|
|
660
|
+
expect(await createFile.needsApproval({}, { path: '../outside.txt', content: 'blocked' })).toBe(false);
|
|
361
661
|
});
|
|
362
662
|
// ========== Write boundary enforcement ==========
|
|
363
663
|
let boundaryWorkerCalls = [];
|
|
@@ -370,12 +670,13 @@ function ensureBoundaryWorkerProviderRegistered() {
|
|
|
370
670
|
createRunner: () => ({
|
|
371
671
|
run: async (_agent, _input, _options) => {
|
|
372
672
|
boundaryWorkerCalls.push({ agent: _agent });
|
|
373
|
-
|
|
673
|
+
const result = {
|
|
374
674
|
status: 'completed',
|
|
375
675
|
finalOutput: 'Done.',
|
|
376
676
|
history: [],
|
|
377
677
|
messages: [],
|
|
378
678
|
};
|
|
679
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
379
680
|
},
|
|
380
681
|
}),
|
|
381
682
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -383,13 +684,13 @@ function ensureBoundaryWorkerProviderRegistered() {
|
|
|
383
684
|
boundaryWorkerRegistered = true;
|
|
384
685
|
}
|
|
385
686
|
}
|
|
386
|
-
|
|
687
|
+
beforeEach(() => {
|
|
387
688
|
boundaryWorkerCalls = [];
|
|
388
689
|
ensureBoundaryWorkerProviderRegistered();
|
|
389
690
|
});
|
|
390
|
-
|
|
691
|
+
it.sequential('worker write tool rejects paths outside workspace', async () => {
|
|
391
692
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-boundary-'));
|
|
392
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
693
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
393
694
|
const mockExecutionContext = {
|
|
394
695
|
getCwd: () => tmpDir,
|
|
395
696
|
isRemote: () => false,
|
|
@@ -409,35 +710,33 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
409
710
|
role: 'worker',
|
|
410
711
|
task: 'update a file',
|
|
411
712
|
});
|
|
412
|
-
|
|
713
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
413
714
|
const agentGpt = boundaryWorkerCalls[0].agent;
|
|
414
715
|
const applyPatch = agentGpt.tools.find((t) => t.name === 'apply_patch');
|
|
415
|
-
|
|
416
|
-
|
|
716
|
+
expect(applyPatch).toBeTruthy();
|
|
717
|
+
expect(agentGpt.tools.find((t) => t.name === 'search_replace')).toBeFalsy();
|
|
417
718
|
// Call with a path inside the boundary — should NOT be rejected for boundary violation
|
|
418
719
|
const insideResult = await applyPatch.invoke({}, JSON.stringify({
|
|
419
720
|
type: 'create_file',
|
|
420
721
|
path: 'newfile.ts',
|
|
421
722
|
diff: '+hello\n',
|
|
422
723
|
}), {});
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
t.true(!insideError || !insideError.includes('outside the allowed write boundary'));
|
|
724
|
+
const insideError = insideResult.startsWith('Error:') ? insideResult : undefined;
|
|
725
|
+
expect(!insideError || !insideError.includes('outside the allowed write boundary')).toBe(true);
|
|
426
726
|
// Call with a path outside the boundary — should be rejected
|
|
427
727
|
const outsideResult = await applyPatch.invoke({}, JSON.stringify({
|
|
428
728
|
type: 'create_file',
|
|
429
729
|
path: '../outside/file.ts',
|
|
430
730
|
diff: '+hello\n',
|
|
431
731
|
}), {});
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
t.false(outsideParsed?.output?.[0]?.success ?? true);
|
|
732
|
+
expect(outsideResult.includes('outside the allowed write boundary')).toBe(true);
|
|
733
|
+
expect(outsideResult.startsWith('Error:')).toBe(true);
|
|
435
734
|
const outsideNeedsApproval = await applyPatch.needsApproval({}, {
|
|
436
735
|
type: 'create_file',
|
|
437
736
|
path: '../outside/file.ts',
|
|
438
737
|
diff: '+hello\n',
|
|
439
738
|
});
|
|
440
|
-
|
|
739
|
+
expect(outsideNeedsApproval).toBe(false);
|
|
441
740
|
// 2. Test search_replace tool under non-gpt model
|
|
442
741
|
const settingsNonGpt = createMockSettings({
|
|
443
742
|
'agent.model': 'mock-model',
|
|
@@ -453,11 +752,11 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
453
752
|
role: 'worker',
|
|
454
753
|
task: 'update a file',
|
|
455
754
|
});
|
|
456
|
-
|
|
755
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
457
756
|
const agentNonGpt = boundaryWorkerCalls[0].agent;
|
|
458
757
|
const searchReplace = agentNonGpt.tools.find((t) => t.name === 'search_replace');
|
|
459
|
-
|
|
460
|
-
|
|
758
|
+
expect(searchReplace).toBeTruthy();
|
|
759
|
+
expect(agentNonGpt.tools.find((t) => t.name === 'apply_patch')).toBeFalsy();
|
|
461
760
|
const batchOutsideResult = await searchReplace.invoke({}, JSON.stringify({
|
|
462
761
|
path: '../outside.ts',
|
|
463
762
|
replacements: [
|
|
@@ -467,13 +766,12 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
467
766
|
},
|
|
468
767
|
],
|
|
469
768
|
}), {});
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
t.false(batchOutsideParsed?.output?.[0]?.success ?? true);
|
|
769
|
+
expect(batchOutsideResult.includes('outside the allowed write boundary')).toBe(true);
|
|
770
|
+
expect(batchOutsideResult.startsWith('Error:')).toBe(true);
|
|
473
771
|
});
|
|
474
|
-
|
|
772
|
+
it.sequential('worker writes are auto-approved within the workspace', async () => {
|
|
475
773
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-approval-'));
|
|
476
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
774
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
477
775
|
const mockExecutionContext = {
|
|
478
776
|
getCwd: () => tmpDir,
|
|
479
777
|
isRemote: () => false,
|
|
@@ -493,23 +791,23 @@ test.serial('worker writes are auto-approved within the workspace', async (t) =>
|
|
|
493
791
|
role: 'worker',
|
|
494
792
|
task: 'update files',
|
|
495
793
|
});
|
|
496
|
-
|
|
794
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
497
795
|
const agent = boundaryWorkerCalls[0].agent;
|
|
498
796
|
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
499
|
-
|
|
797
|
+
expect(createFile).toBeTruthy();
|
|
500
798
|
// In-boundary writes require no interactive approval (there is no foreground
|
|
501
799
|
// approval channel for a subagent running inside a blocked parent tool call).
|
|
502
800
|
// Standard mode is off but the write still does not need approval.
|
|
503
801
|
const inBoundaryNeedsApproval = await createFile.needsApproval({}, { path: 'a.ts', content: 'x' });
|
|
504
|
-
|
|
802
|
+
expect(inBoundaryNeedsApproval).toBe(false);
|
|
505
803
|
// Out-of-boundary writes are also not surfaced for approval; they are
|
|
506
804
|
// rejected deterministically by execute() instead.
|
|
507
805
|
const outBoundaryNeedsApproval = await createFile.needsApproval({}, { path: '../escape.ts', content: 'x' });
|
|
508
|
-
|
|
806
|
+
expect(outBoundaryNeedsApproval).toBe(false);
|
|
509
807
|
});
|
|
510
|
-
|
|
808
|
+
it.sequential('worker cannot write outside the workspace', async () => {
|
|
511
809
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-default-boundary-'));
|
|
512
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
810
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
513
811
|
const mockExecutionContext = {
|
|
514
812
|
getCwd: () => tmpDir,
|
|
515
813
|
isRemote: () => false,
|
|
@@ -528,15 +826,14 @@ test.serial('worker cannot write outside the workspace', async (t) => {
|
|
|
528
826
|
await manager.run({ role: 'worker', task: 'update a file' });
|
|
529
827
|
const agent = boundaryWorkerCalls[boundaryWorkerCalls.length - 1].agent;
|
|
530
828
|
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
531
|
-
|
|
829
|
+
expect(createFile).toBeTruthy();
|
|
532
830
|
const outsideResult = await createFile.invoke({}, JSON.stringify({ path: '../outside.ts', content: 'x' }), {});
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
t.false(outsideParsed?.output?.[0]?.success ?? true);
|
|
831
|
+
expect(outsideResult.includes('outside the allowed write boundary')).toBe(true);
|
|
832
|
+
expect(outsideResult.startsWith('Error:')).toBe(true);
|
|
536
833
|
});
|
|
537
|
-
|
|
834
|
+
it.sequential('worker filesChanged tracks only successful writes for batch operations', async () => {
|
|
538
835
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-files-changed-'));
|
|
539
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
836
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
540
837
|
registerProvider({
|
|
541
838
|
id: 'mock-worker-files-changed-provider',
|
|
542
839
|
label: 'Mock Worker Files Changed Provider',
|
|
@@ -562,12 +859,13 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
562
859
|
replacements: [{ search_content: 'x', replace_content: 'y' }],
|
|
563
860
|
}), {});
|
|
564
861
|
}
|
|
565
|
-
|
|
862
|
+
const result = {
|
|
566
863
|
status: 'completed',
|
|
567
864
|
finalOutput: 'Done.',
|
|
568
865
|
history: [],
|
|
569
866
|
messages: [],
|
|
570
867
|
};
|
|
868
|
+
return wrapResultAsAgentStream(result);
|
|
571
869
|
},
|
|
572
870
|
}),
|
|
573
871
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -586,7 +884,7 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
586
884
|
},
|
|
587
885
|
});
|
|
588
886
|
const resultGpt = await managerGpt.run({ role: 'worker', task: 'do mixed writes' });
|
|
589
|
-
|
|
887
|
+
expect(new Set(resultGpt.filesChanged)).toEqual(new Set(['a.txt']));
|
|
590
888
|
// 2. Test with non-GPT-5 model (using search_replace)
|
|
591
889
|
const managerNonGpt = new SubagentManager({
|
|
592
890
|
logger: createMockLogger(),
|
|
@@ -601,11 +899,11 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
601
899
|
},
|
|
602
900
|
});
|
|
603
901
|
const resultNonGpt = await managerNonGpt.run({ role: 'worker', task: 'do mixed writes' });
|
|
604
|
-
|
|
902
|
+
expect(new Set(resultNonGpt.filesChanged)).toEqual(new Set(['b.txt']));
|
|
605
903
|
});
|
|
606
|
-
|
|
904
|
+
it.sequential('worker write lock rejects concurrent create_file for same path without waiting', async () => {
|
|
607
905
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-lock-'));
|
|
608
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
906
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
609
907
|
registerProvider({
|
|
610
908
|
id: 'mock-worker-lock-provider',
|
|
611
909
|
label: 'Mock Worker Lock Provider',
|
|
@@ -622,12 +920,13 @@ test.serial('worker write lock rejects concurrent create_file for same path with
|
|
|
622
920
|
content: 'two',
|
|
623
921
|
}), {}),
|
|
624
922
|
]);
|
|
625
|
-
|
|
923
|
+
const result = {
|
|
626
924
|
status: 'completed',
|
|
627
925
|
finalOutput: JSON.stringify({ first, second }),
|
|
628
926
|
history: [],
|
|
629
927
|
messages: [],
|
|
630
928
|
};
|
|
929
|
+
return wrapResultAsAgentStream(result);
|
|
631
930
|
},
|
|
632
931
|
}),
|
|
633
932
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -646,15 +945,15 @@ test.serial('worker write lock rejects concurrent create_file for same path with
|
|
|
646
945
|
});
|
|
647
946
|
const result = await manager.run({ role: 'worker', task: 'concurrent writes' });
|
|
648
947
|
const parsed = JSON.parse(result.finalText);
|
|
649
|
-
const first =
|
|
650
|
-
const second =
|
|
651
|
-
const allErrors = [first
|
|
652
|
-
.filter(
|
|
948
|
+
const first = parsed.first;
|
|
949
|
+
const second = parsed.second;
|
|
950
|
+
const allErrors = [first, second]
|
|
951
|
+
.filter((text) => typeof text === 'string' && text.startsWith('Error:'))
|
|
653
952
|
.join(' ');
|
|
654
|
-
|
|
953
|
+
expect(allErrors.includes('already being modified')).toBe(true);
|
|
655
954
|
});
|
|
656
955
|
// ========== Session isolation ==========
|
|
657
|
-
|
|
956
|
+
it.sequential('run() creates isolated sessions for each subagent call', async () => {
|
|
658
957
|
const settings = createMockSettings({
|
|
659
958
|
'agent.model': 'mock-model',
|
|
660
959
|
'agent.provider': 'mock-explorer-provider',
|
|
@@ -664,9 +963,9 @@ test.serial('run() creates isolated sessions for each subagent call', async (t)
|
|
|
664
963
|
manager.run({ role: 'explorer', task: 'task 1' }),
|
|
665
964
|
manager.run({ role: 'explorer', task: 'task 2' }),
|
|
666
965
|
]);
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
966
|
+
expect(result1.status).toBe('completed');
|
|
967
|
+
expect(result2.status).toBe('completed');
|
|
968
|
+
expect(result1.agentId).not.toBe(result2.agentId);
|
|
670
969
|
});
|
|
671
970
|
// ========== Real-time events ==========
|
|
672
971
|
let eventToolProviderRegistered = false;
|
|
@@ -685,7 +984,8 @@ function ensureEventToolProviderRegistered() {
|
|
|
685
984
|
// Tool execution may fail (missing file); we only care that the
|
|
686
985
|
// tool-started event fired before execution.
|
|
687
986
|
}
|
|
688
|
-
|
|
987
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
988
|
+
return wrapResultAsAgentStream(result);
|
|
689
989
|
},
|
|
690
990
|
}),
|
|
691
991
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -693,7 +993,7 @@ function ensureEventToolProviderRegistered() {
|
|
|
693
993
|
eventToolProviderRegistered = true;
|
|
694
994
|
}
|
|
695
995
|
}
|
|
696
|
-
|
|
996
|
+
it.sequential('run() emits started and completed events', async () => {
|
|
697
997
|
ensureEventToolProviderRegistered();
|
|
698
998
|
const settings = createMockSettings({
|
|
699
999
|
'agent.model': 'mock-model',
|
|
@@ -703,39 +1003,36 @@ test.serial('run() emits started, tool_started and completed events', async (t)
|
|
|
703
1003
|
const manager = new SubagentManager({
|
|
704
1004
|
logger: createMockLogger(),
|
|
705
1005
|
settings,
|
|
1006
|
+
sessionContextService: createSessionContextService(),
|
|
706
1007
|
onEvent: (event) => events.push(event),
|
|
707
1008
|
});
|
|
708
1009
|
const result = await manager.run({ role: 'explorer', task: 'search the code' });
|
|
709
1010
|
const started = events.find((e) => e.type === 'subagent_started');
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
const toolStarted = events.find((e) => e.type === 'subagent_tool_started');
|
|
715
|
-
t.truthy(toolStarted);
|
|
716
|
-
t.is(toolStarted.toolName, 'read_file');
|
|
717
|
-
t.is(toolStarted.agentId, result.agentId);
|
|
718
|
-
t.is(toolStarted.commandMessages?.[0]?.command, 'read_file "/nonexistent-subagent-event-test"');
|
|
1011
|
+
expect(started).toBeTruthy();
|
|
1012
|
+
expect(started.role).toBe('explorer');
|
|
1013
|
+
expect(started.task).toBe('search the code');
|
|
1014
|
+
expect(started.agentId).toBe(result.agentId);
|
|
719
1015
|
const completed = events.find((e) => e.type === 'subagent_completed');
|
|
720
|
-
|
|
721
|
-
|
|
1016
|
+
expect(completed).toBeTruthy();
|
|
1017
|
+
expect(completed.result.agentId).toBe(result.agentId);
|
|
722
1018
|
});
|
|
723
|
-
|
|
1019
|
+
it.sequential('run() emits a completed event even when the role is unknown', async () => {
|
|
724
1020
|
const settings = createMockSettings({ 'agent.model': 'mock-model' });
|
|
725
1021
|
const events = [];
|
|
726
1022
|
const manager = new SubagentManager({
|
|
727
1023
|
logger: createMockLogger(),
|
|
728
1024
|
settings,
|
|
1025
|
+
sessionContextService: createSessionContextService(),
|
|
729
1026
|
onEvent: (event) => events.push(event),
|
|
730
1027
|
});
|
|
731
1028
|
await manager.run({ role: 'definitely-not-a-role', task: 'x' });
|
|
732
|
-
|
|
1029
|
+
expect(events.find((e) => e.type === 'subagent_started')).toBeTruthy();
|
|
733
1030
|
const completed = events.find((e) => e.type === 'subagent_completed');
|
|
734
|
-
|
|
735
|
-
|
|
1031
|
+
expect(completed).toBeTruthy();
|
|
1032
|
+
expect(completed.result.status).toBe('failed');
|
|
736
1033
|
});
|
|
737
1034
|
// ========== Mentor role definition sourced from markdown ==========
|
|
738
|
-
|
|
1035
|
+
it.sequential('mentor base instructions come from the mentor role markdown', async () => {
|
|
739
1036
|
const settings = createMockSettings({
|
|
740
1037
|
'agent.model': 'main-model',
|
|
741
1038
|
'agent.provider': 'mock-mentor-manager',
|
|
@@ -743,16 +1040,20 @@ test.serial('mentor base instructions come from the mentor role markdown', async
|
|
|
743
1040
|
'agent.mentorProvider': 'mock-mentor-manager',
|
|
744
1041
|
'app.mentorMode': false,
|
|
745
1042
|
});
|
|
746
|
-
const manager = new SubagentManager({
|
|
1043
|
+
const manager = new SubagentManager({
|
|
1044
|
+
logger: createMockLogger(),
|
|
1045
|
+
settings,
|
|
1046
|
+
sessionContextService: createSessionContextService(),
|
|
1047
|
+
});
|
|
747
1048
|
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
748
|
-
|
|
1049
|
+
expect(mentorManagerRunnerCalls.length).toBe(1);
|
|
749
1050
|
const instructions = mentorManagerRunnerCalls[0].agent.instructions;
|
|
750
1051
|
// Dynamically load the mentor role markdown to verify integration without brittle hardcoding
|
|
751
1052
|
const mentorPath = path.join(import.meta.dirname, '../../../source/prompts/subagents/mentor.md');
|
|
752
1053
|
const mentorContent = fs.readFileSync(mentorPath, 'utf-8');
|
|
753
1054
|
const parts = mentorContent.split('---');
|
|
754
1055
|
const expectedBody = parts[parts.length - 1].trim();
|
|
755
|
-
|
|
1056
|
+
expect(instructions.includes(expectedBody)).toBe(true);
|
|
756
1057
|
});
|
|
757
1058
|
// ========== finalText excludes pre-tool narration ==========
|
|
758
1059
|
let postToolProviderRegistered = false;
|
|
@@ -762,55 +1063,64 @@ function ensurePostToolProviderRegistered() {
|
|
|
762
1063
|
id: 'mock-post-tool-provider',
|
|
763
1064
|
label: 'Mock Post Tool Provider',
|
|
764
1065
|
createRunner: () => ({
|
|
765
|
-
run: async () =>
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
1066
|
+
run: async (_agent, _input, _options) => {
|
|
1067
|
+
const result = {
|
|
1068
|
+
status: 'completed',
|
|
1069
|
+
// finalOutput intentionally absent to exercise the history fallback.
|
|
1070
|
+
finalOutput: 'Final answer: it is in foo.ts.',
|
|
1071
|
+
history: [
|
|
1072
|
+
{ rawItem: { role: 'assistant', content: 'Let me look into this first.' } },
|
|
1073
|
+
{ rawItem: { type: 'function_call', name: 'grep' } },
|
|
1074
|
+
{ rawItem: { type: 'function_call_result', name: 'grep' } },
|
|
1075
|
+
{ rawItem: { role: 'assistant', content: 'Final answer: it is in foo.ts.' } },
|
|
1076
|
+
],
|
|
1077
|
+
messages: [],
|
|
1078
|
+
};
|
|
1079
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
1080
|
+
},
|
|
776
1081
|
}),
|
|
777
1082
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
778
1083
|
});
|
|
779
1084
|
postToolProviderRegistered = true;
|
|
780
1085
|
}
|
|
781
1086
|
}
|
|
782
|
-
|
|
1087
|
+
it.sequential('finalText is the assistant message after the last tool item', async () => {
|
|
783
1088
|
ensurePostToolProviderRegistered();
|
|
784
1089
|
const settings = createMockSettings({
|
|
785
1090
|
'agent.model': 'mock-model',
|
|
786
1091
|
'agent.provider': 'mock-post-tool-provider',
|
|
787
1092
|
});
|
|
788
|
-
const manager = new SubagentManager({
|
|
1093
|
+
const manager = new SubagentManager({
|
|
1094
|
+
logger: createMockLogger(),
|
|
1095
|
+
settings,
|
|
1096
|
+
sessionContextService: createSessionContextService(),
|
|
1097
|
+
});
|
|
789
1098
|
const result = await manager.run({ role: 'explorer', task: 'where is it' });
|
|
790
|
-
|
|
791
|
-
|
|
1099
|
+
expect(result.finalText).toBe('Final answer: it is in foo.ts.');
|
|
1100
|
+
expect(result.finalText.includes('Let me look into this first.')).toBe(false);
|
|
792
1101
|
});
|
|
793
1102
|
// ========== Worker shell tool — safety gating ==========
|
|
794
|
-
|
|
1103
|
+
it.sequential('worker shell tool executes safe command without triggering approval UI', async () => {
|
|
795
1104
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-safe-'));
|
|
796
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1105
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
797
1106
|
let shellResult = null;
|
|
798
1107
|
registerProvider({
|
|
799
1108
|
id: 'mock-worker-shell-safe-provider',
|
|
800
1109
|
label: 'Mock Worker Shell Safe Provider',
|
|
801
1110
|
createRunner: () => ({
|
|
802
|
-
run: async (agent) => {
|
|
1111
|
+
run: async (agent, _input, _options) => {
|
|
803
1112
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
804
1113
|
// needsApproval must be false for safe commands — no approval UI in workers
|
|
805
1114
|
const needsApproval = await shellTool.needsApproval({}, { command: 'ls .' });
|
|
806
|
-
|
|
1115
|
+
expect(needsApproval, 'worker shell tool must never require approval').toBe(false);
|
|
807
1116
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'echo hello' }), {});
|
|
808
|
-
|
|
1117
|
+
const result = {
|
|
809
1118
|
status: 'completed',
|
|
810
1119
|
finalOutput: 'done',
|
|
811
1120
|
history: [],
|
|
812
1121
|
messages: [],
|
|
813
1122
|
};
|
|
1123
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
814
1124
|
},
|
|
815
1125
|
}),
|
|
816
1126
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -821,6 +1131,7 @@ test.serial('worker shell tool executes safe command without triggering approval
|
|
|
821
1131
|
'agent.model': 'mock-model',
|
|
822
1132
|
'agent.provider': 'mock-worker-shell-safe-provider',
|
|
823
1133
|
}),
|
|
1134
|
+
sessionContextService: createSessionContextService(),
|
|
824
1135
|
executionContext: {
|
|
825
1136
|
getCwd: () => tmpDir,
|
|
826
1137
|
isRemote: () => false,
|
|
@@ -829,29 +1140,30 @@ test.serial('worker shell tool executes safe command without triggering approval
|
|
|
829
1140
|
});
|
|
830
1141
|
await manager.run({ role: 'worker', task: 'list files' });
|
|
831
1142
|
// The shell tool should have executed and returned output (not an error block)
|
|
832
|
-
|
|
833
|
-
|
|
1143
|
+
expect(shellResult).toBeTruthy();
|
|
1144
|
+
expect(shellResult.includes('blocked for safety')).toBe(false);
|
|
834
1145
|
});
|
|
835
|
-
|
|
1146
|
+
it.sequential('worker shell tool blocks dangerous/destructive commands and returns error string', async () => {
|
|
836
1147
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-dangerous-'));
|
|
837
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1148
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
838
1149
|
let shellResult = null;
|
|
839
1150
|
registerProvider({
|
|
840
1151
|
id: 'mock-worker-shell-dangerous-provider',
|
|
841
1152
|
label: 'Mock Worker Shell Dangerous Provider',
|
|
842
1153
|
createRunner: () => ({
|
|
843
|
-
run: async (agent) => {
|
|
1154
|
+
run: async (agent, _input, _options) => {
|
|
844
1155
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
845
1156
|
// needsApproval must always be false — dangerous commands are blocked by execute(), not approval
|
|
846
1157
|
const needsApproval = await shellTool.needsApproval({}, { command: 'rm -rf /tmp/something' });
|
|
847
|
-
|
|
1158
|
+
expect(needsApproval, 'worker shell must never trigger approval UI even for dangerous commands').toBe(false);
|
|
848
1159
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'rm -rf /tmp/something' }), {});
|
|
849
|
-
|
|
1160
|
+
const result = {
|
|
850
1161
|
status: 'completed',
|
|
851
1162
|
finalOutput: 'done',
|
|
852
1163
|
history: [],
|
|
853
1164
|
messages: [],
|
|
854
1165
|
};
|
|
1166
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
855
1167
|
},
|
|
856
1168
|
}),
|
|
857
1169
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -862,6 +1174,7 @@ test.serial('worker shell tool blocks dangerous/destructive commands and returns
|
|
|
862
1174
|
'agent.model': 'mock-model',
|
|
863
1175
|
'agent.provider': 'mock-worker-shell-dangerous-provider',
|
|
864
1176
|
}),
|
|
1177
|
+
sessionContextService: createSessionContextService(),
|
|
865
1178
|
executionContext: {
|
|
866
1179
|
getCwd: () => tmpDir,
|
|
867
1180
|
isRemote: () => false,
|
|
@@ -870,13 +1183,13 @@ test.serial('worker shell tool blocks dangerous/destructive commands and returns
|
|
|
870
1183
|
});
|
|
871
1184
|
await manager.run({ role: 'worker', task: 'delete stuff' });
|
|
872
1185
|
// The shell tool should have returned a blocked-for-safety error string, not executed
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
1186
|
+
expect(shellResult).toBeTruthy();
|
|
1187
|
+
expect(shellResult.includes('blocked for safety')).toBe(true);
|
|
1188
|
+
expect(shellResult.includes('exit 0')).toBe(false);
|
|
876
1189
|
});
|
|
877
|
-
|
|
1190
|
+
it.sequential('worker shell tool allows YELLOW command when auto-approval evaluator approves', async () => {
|
|
878
1191
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-yellow-ok-'));
|
|
879
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1192
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
880
1193
|
let shellResult = null;
|
|
881
1194
|
let chatCalls = 0;
|
|
882
1195
|
let evaluatorPrompt = '';
|
|
@@ -884,15 +1197,16 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
884
1197
|
id: 'mock-worker-shell-yellow-approved-provider',
|
|
885
1198
|
label: 'Mock Worker Shell Yellow Approved Provider',
|
|
886
1199
|
createRunner: () => ({
|
|
887
|
-
run: async (agent) => {
|
|
1200
|
+
run: async (agent, _input, _options) => {
|
|
888
1201
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
889
1202
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'npm run test:verbose -- --help' }), {});
|
|
890
|
-
|
|
1203
|
+
const result = {
|
|
891
1204
|
status: 'completed',
|
|
892
1205
|
finalOutput: 'done',
|
|
893
1206
|
history: [],
|
|
894
1207
|
messages: [],
|
|
895
1208
|
};
|
|
1209
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
896
1210
|
},
|
|
897
1211
|
}),
|
|
898
1212
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -906,6 +1220,7 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
906
1220
|
'agent.autoApproveModel': 'mock-auto-approve-model',
|
|
907
1221
|
'agent.autoApproveProvider': 'mock-worker-shell-yellow-approved-provider',
|
|
908
1222
|
}),
|
|
1223
|
+
sessionContextService: createSessionContextService(),
|
|
909
1224
|
agentClient: {
|
|
910
1225
|
chat: async (message) => {
|
|
911
1226
|
chatCalls++;
|
|
@@ -920,29 +1235,30 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
920
1235
|
},
|
|
921
1236
|
});
|
|
922
1237
|
await manager.run({ role: 'worker', task: 'run help for tests in this repository' });
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
1238
|
+
expect(chatCalls).toBe(1);
|
|
1239
|
+
expect(evaluatorPrompt.includes('run help for tests in this repository')).toBe(true);
|
|
1240
|
+
expect(shellResult).toBeTruthy();
|
|
1241
|
+
expect(shellResult.includes('blocked for safety')).toBe(false);
|
|
927
1242
|
});
|
|
928
|
-
|
|
1243
|
+
it.sequential('worker shell tool blocks YELLOW command when auto-approval evaluator rejects', async () => {
|
|
929
1244
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-yellow-no-'));
|
|
930
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1245
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
931
1246
|
let shellResult = null;
|
|
932
1247
|
let chatCalls = 0;
|
|
933
1248
|
registerProvider({
|
|
934
1249
|
id: 'mock-worker-shell-yellow-rejected-provider',
|
|
935
1250
|
label: 'Mock Worker Shell Yellow Rejected Provider',
|
|
936
1251
|
createRunner: () => ({
|
|
937
|
-
run: async (agent) => {
|
|
1252
|
+
run: async (agent, _input, _options) => {
|
|
938
1253
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
939
1254
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'npm run test:verbose -- --help' }), {});
|
|
940
|
-
|
|
1255
|
+
const result = {
|
|
941
1256
|
status: 'completed',
|
|
942
1257
|
finalOutput: 'done',
|
|
943
1258
|
history: [],
|
|
944
1259
|
messages: [],
|
|
945
1260
|
};
|
|
1261
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
946
1262
|
},
|
|
947
1263
|
}),
|
|
948
1264
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -956,6 +1272,7 @@ test.serial('worker shell tool blocks YELLOW command when auto-approval evaluato
|
|
|
956
1272
|
'agent.autoApproveModel': 'mock-auto-approve-model',
|
|
957
1273
|
'agent.autoApproveProvider': 'mock-worker-shell-yellow-rejected-provider',
|
|
958
1274
|
}),
|
|
1275
|
+
sessionContextService: createSessionContextService(),
|
|
959
1276
|
agentClient: {
|
|
960
1277
|
chat: async () => {
|
|
961
1278
|
chatCalls++;
|
|
@@ -969,11 +1286,11 @@ test.serial('worker shell tool blocks YELLOW command when auto-approval evaluato
|
|
|
969
1286
|
},
|
|
970
1287
|
});
|
|
971
1288
|
await manager.run({ role: 'worker', task: 'run help for tests' });
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
1289
|
+
expect(chatCalls).toBe(1);
|
|
1290
|
+
expect(shellResult).toBeTruthy();
|
|
1291
|
+
expect(shellResult.includes('blocked for safety')).toBe(true);
|
|
975
1292
|
});
|
|
976
|
-
|
|
1293
|
+
it.sequential('run() extracts usage from error.state.usage when subagent run fails', async () => {
|
|
977
1294
|
registerProvider({
|
|
978
1295
|
id: 'mock-failed-usage-provider',
|
|
979
1296
|
label: 'Mock Failed Usage Provider',
|
|
@@ -995,20 +1312,24 @@ test.serial('run() extracts usage from error.state.usage when subagent run fails
|
|
|
995
1312
|
'agent.model': 'mock-model',
|
|
996
1313
|
'agent.provider': 'mock-failed-usage-provider',
|
|
997
1314
|
});
|
|
998
|
-
const manager = new SubagentManager({
|
|
1315
|
+
const manager = new SubagentManager({
|
|
1316
|
+
logger: createMockLogger(),
|
|
1317
|
+
settings,
|
|
1318
|
+
sessionContextService: createSessionContextService(),
|
|
1319
|
+
});
|
|
999
1320
|
const result = await manager.run({
|
|
1000
1321
|
role: 'explorer',
|
|
1001
1322
|
task: 'find files',
|
|
1002
1323
|
});
|
|
1003
|
-
|
|
1004
|
-
|
|
1324
|
+
expect(result.status).toBe('failed');
|
|
1325
|
+
expect(result.usage).toEqual({
|
|
1005
1326
|
prompt_tokens: 15,
|
|
1006
1327
|
completion_tokens: 25,
|
|
1007
1328
|
total_tokens: 40,
|
|
1008
1329
|
});
|
|
1009
1330
|
});
|
|
1010
1331
|
// ========== Model error retry ==========
|
|
1011
|
-
|
|
1332
|
+
it.sequential('run() retries on recoverable model error (hallucinated tool) and succeeds on second attempt', async () => {
|
|
1012
1333
|
let runCount = 0;
|
|
1013
1334
|
const events = [];
|
|
1014
1335
|
const logWarnCalls = [];
|
|
@@ -1019,14 +1340,15 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
|
|
|
1019
1340
|
run: async () => {
|
|
1020
1341
|
runCount++;
|
|
1021
1342
|
if (runCount === 1) {
|
|
1022
|
-
|
|
1343
|
+
return wrapErrorAsAgentStream(new ModelBehaviorError('Tool bash not found in agent Explorer.'));
|
|
1023
1344
|
}
|
|
1024
|
-
|
|
1345
|
+
const result = {
|
|
1025
1346
|
status: 'completed',
|
|
1026
1347
|
finalOutput: 'Success on retry',
|
|
1027
1348
|
history: [],
|
|
1028
1349
|
messages: [],
|
|
1029
1350
|
};
|
|
1351
|
+
return wrapResultAsAgentStream(result);
|
|
1030
1352
|
},
|
|
1031
1353
|
}),
|
|
1032
1354
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1043,21 +1365,22 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
|
|
|
1043
1365
|
'agent.provider': 'mock-retry-recoverable-provider',
|
|
1044
1366
|
'agent.retryAttempts': 2,
|
|
1045
1367
|
}),
|
|
1368
|
+
sessionContextService: createSessionContextService(),
|
|
1046
1369
|
onEvent: (event) => events.push(event),
|
|
1047
1370
|
});
|
|
1048
1371
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1049
|
-
|
|
1050
|
-
|
|
1372
|
+
expect(result.status).toBe('completed');
|
|
1373
|
+
expect(runCount).toBe(2);
|
|
1051
1374
|
const retryEvent = events.find((e) => e.type === 'retry');
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
const retryLog = logWarnCalls.find((c) => c.meta?.eventType === 'retry.
|
|
1058
|
-
|
|
1375
|
+
expect(retryEvent).toBeTruthy();
|
|
1376
|
+
expect(retryEvent.toolName).toBe('bash');
|
|
1377
|
+
expect(retryEvent.retryType).toBe('hallucination');
|
|
1378
|
+
expect(retryEvent.attempt).toBe(1);
|
|
1379
|
+
expect(retryEvent.maxRetries).toBe(MAX_SUBAGENT_MODEL_RETRIES);
|
|
1380
|
+
const retryLog = logWarnCalls.find((c) => c.meta?.eventType === 'retry.model_error');
|
|
1381
|
+
expect(retryLog).toBeTruthy();
|
|
1059
1382
|
});
|
|
1060
|
-
|
|
1383
|
+
it.sequential('run() exhausts retries on repeated recoverable model errors and returns failed result', async () => {
|
|
1061
1384
|
let runCount = 0;
|
|
1062
1385
|
const events = [];
|
|
1063
1386
|
registerProvider({
|
|
@@ -1066,7 +1389,7 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
|
|
|
1066
1389
|
createRunner: () => ({
|
|
1067
1390
|
run: async () => {
|
|
1068
1391
|
runCount++;
|
|
1069
|
-
|
|
1392
|
+
return wrapErrorAsAgentStream(new ModelBehaviorError('Tool bash not found in agent Explorer.'));
|
|
1070
1393
|
},
|
|
1071
1394
|
}),
|
|
1072
1395
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1078,18 +1401,19 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
|
|
|
1078
1401
|
'agent.provider': 'mock-retry-exhaust-provider',
|
|
1079
1402
|
'agent.retryAttempts': 2,
|
|
1080
1403
|
}),
|
|
1404
|
+
sessionContextService: createSessionContextService(),
|
|
1081
1405
|
onEvent: (event) => events.push(event),
|
|
1082
1406
|
});
|
|
1083
1407
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
// Should have tried: initial + MAX_SUBAGENT_MODEL_RETRIES
|
|
1088
|
-
|
|
1408
|
+
expect(result.status).toBe('failed');
|
|
1409
|
+
expect(result.error).toBeTruthy();
|
|
1410
|
+
expect(result.error.includes('bash')).toBe(true);
|
|
1411
|
+
// Should have tried: initial + MAX_SUBAGENT_MODEL_RETRIES retries.
|
|
1412
|
+
expect(runCount).toBe(1 + MAX_SUBAGENT_MODEL_RETRIES);
|
|
1089
1413
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1090
|
-
|
|
1414
|
+
expect(retryEvents.length, 'should emit one retry event per retry attempt').toBe(MAX_SUBAGENT_MODEL_RETRIES);
|
|
1091
1415
|
});
|
|
1092
|
-
|
|
1416
|
+
it.sequential('run() does not retry on non-recoverable ModelBehaviorError', async () => {
|
|
1093
1417
|
let runCount = 0;
|
|
1094
1418
|
const events = [];
|
|
1095
1419
|
registerProvider({
|
|
@@ -1110,15 +1434,16 @@ test.serial('run() does not retry on non-recoverable ModelBehaviorError', async
|
|
|
1110
1434
|
'agent.provider': 'mock-no-retry-non-recoverable-provider',
|
|
1111
1435
|
'agent.retryAttempts': 2,
|
|
1112
1436
|
}),
|
|
1437
|
+
sessionContextService: createSessionContextService(),
|
|
1113
1438
|
onEvent: (event) => events.push(event),
|
|
1114
1439
|
});
|
|
1115
1440
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1116
|
-
|
|
1117
|
-
|
|
1441
|
+
expect(result.status).toBe('failed');
|
|
1442
|
+
expect(runCount, 'no retry should be attempted').toBe(1);
|
|
1118
1443
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1119
|
-
|
|
1444
|
+
expect(retryEvents.length).toBe(0);
|
|
1120
1445
|
});
|
|
1121
|
-
|
|
1446
|
+
it.sequential('run() aborted subagent returns cancelled status without model-error retry', async () => {
|
|
1122
1447
|
const events = [];
|
|
1123
1448
|
registerProvider({
|
|
1124
1449
|
id: 'mock-abort-no-retry-provider',
|
|
@@ -1139,175 +1464,452 @@ test.serial('run() aborted subagent returns cancelled status without model-error
|
|
|
1139
1464
|
'agent.provider': 'mock-abort-no-retry-provider',
|
|
1140
1465
|
'agent.retryAttempts': 2,
|
|
1141
1466
|
}),
|
|
1467
|
+
sessionContextService: createSessionContextService(),
|
|
1142
1468
|
onEvent: (event) => events.push(event),
|
|
1143
1469
|
});
|
|
1144
1470
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1145
|
-
|
|
1471
|
+
expect(result.status).toBe('cancelled');
|
|
1146
1472
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1147
|
-
|
|
1473
|
+
expect(retryEvents.length, 'abort errors should not trigger model-error retries').toBe(0);
|
|
1148
1474
|
});
|
|
1149
|
-
|
|
1475
|
+
it.sequential('run() does not restart read-only subagent from the beginning after a recoverable model error', async () => {
|
|
1150
1476
|
let runCount = 0;
|
|
1151
|
-
const
|
|
1477
|
+
const events = [];
|
|
1152
1478
|
registerProvider({
|
|
1153
|
-
id: 'mock-
|
|
1154
|
-
label: 'Mock
|
|
1479
|
+
id: 'mock-explorer-read-then-crash-provider',
|
|
1480
|
+
label: 'Mock Explorer Read Then Crash Provider',
|
|
1155
1481
|
createRunner: () => ({
|
|
1156
|
-
run: async () => {
|
|
1482
|
+
run: async (agent) => {
|
|
1157
1483
|
runCount++;
|
|
1158
1484
|
if (runCount === 1) {
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1485
|
+
// Call a read tool then throw a recoverable error
|
|
1486
|
+
const grep = agent.tools.find((tool) => tool.name === 'grep');
|
|
1487
|
+
if (grep) {
|
|
1488
|
+
await grep.invoke({}, JSON.stringify({ pattern: 'foo', path: '.' }), {}).catch(() => { });
|
|
1489
|
+
}
|
|
1490
|
+
throw new ModelBehaviorError('Tool bash not found in agent Explorer.');
|
|
1163
1491
|
}
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
finalOutput: 'Success after upstream retry',
|
|
1167
|
-
history: [],
|
|
1168
|
-
messages: [],
|
|
1169
|
-
};
|
|
1492
|
+
const result = { status: 'completed', finalOutput: 'found it', history: [], messages: [] };
|
|
1493
|
+
return wrapResultAsAgentStream(result);
|
|
1170
1494
|
},
|
|
1171
1495
|
}),
|
|
1172
1496
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1173
1497
|
});
|
|
1174
1498
|
const manager = new SubagentManager({
|
|
1175
|
-
logger:
|
|
1176
|
-
...createMockLogger(),
|
|
1177
|
-
warn: (msg, meta) => {
|
|
1178
|
-
logWarnCalls.push({ msg, meta });
|
|
1179
|
-
},
|
|
1180
|
-
},
|
|
1499
|
+
logger: createMockLogger(),
|
|
1181
1500
|
settings: createMockSettings({
|
|
1182
1501
|
'agent.model': 'mock-model',
|
|
1183
|
-
'agent.provider': 'mock-
|
|
1502
|
+
'agent.provider': 'mock-explorer-read-then-crash-provider',
|
|
1184
1503
|
'agent.retryAttempts': 2,
|
|
1185
1504
|
}),
|
|
1505
|
+
sessionContextService: createSessionContextService(),
|
|
1506
|
+
onEvent: (event) => events.push(event),
|
|
1186
1507
|
});
|
|
1187
|
-
const result = await manager.run({ role: 'explorer', task: '
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1508
|
+
const result = await manager.run({ role: 'explorer', task: 'search for something' });
|
|
1509
|
+
expect(result.status).toBe('failed');
|
|
1510
|
+
expect(result.error?.includes('bash')).toBe(true);
|
|
1511
|
+
expect(runCount, 'subagent must not restart from the beginning when no resumable stream exists').toBe(1);
|
|
1512
|
+
expect(events.filter((event) => event.type === 'retry').length).toBe(0);
|
|
1192
1513
|
});
|
|
1193
|
-
|
|
1194
|
-
let
|
|
1195
|
-
const events = [];
|
|
1514
|
+
it.sequential('subagent run injects warning into tool output when turns left <= 5', async () => {
|
|
1515
|
+
let executeOutput = null;
|
|
1196
1516
|
registerProvider({
|
|
1197
|
-
id: 'mock-
|
|
1198
|
-
label: 'Mock
|
|
1517
|
+
id: 'mock-subagent-maxturns-provider',
|
|
1518
|
+
label: 'Mock Subagent MaxTurns Provider',
|
|
1199
1519
|
createRunner: () => ({
|
|
1200
|
-
run: async (agent) => {
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1520
|
+
run: async (agent, _input, options) => {
|
|
1521
|
+
if (options.callModelInputFilter) {
|
|
1522
|
+
// Simulate 96 turns
|
|
1523
|
+
for (let i = 0; i < 96; i++) {
|
|
1524
|
+
await options.callModelInputFilter({
|
|
1525
|
+
modelData: { input: [] },
|
|
1526
|
+
agent,
|
|
1527
|
+
context: options.context,
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1206
1530
|
}
|
|
1207
|
-
|
|
1531
|
+
// Execute a tool to see if the warning is injected
|
|
1532
|
+
const readFileTool = agent.tools.find((tool) => tool.name === 'read_file');
|
|
1533
|
+
if (readFileTool) {
|
|
1534
|
+
const mockRunContext = {
|
|
1535
|
+
context: options.context,
|
|
1536
|
+
};
|
|
1537
|
+
executeOutput = await readFileTool.invoke(mockRunContext, JSON.stringify({ path: 'package.json' }), {});
|
|
1538
|
+
}
|
|
1539
|
+
const result = {
|
|
1540
|
+
status: 'completed',
|
|
1541
|
+
finalOutput: 'done',
|
|
1542
|
+
history: [],
|
|
1543
|
+
messages: [],
|
|
1544
|
+
};
|
|
1545
|
+
return options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
1208
1546
|
},
|
|
1209
1547
|
}),
|
|
1210
1548
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1211
1549
|
});
|
|
1212
|
-
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-write-then-crash-'));
|
|
1213
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1214
1550
|
const manager = new SubagentManager({
|
|
1215
1551
|
logger: createMockLogger(),
|
|
1216
1552
|
settings: createMockSettings({
|
|
1217
1553
|
'agent.model': 'mock-model',
|
|
1218
|
-
'agent.provider': 'mock-
|
|
1219
|
-
'agent.retryAttempts': 2,
|
|
1554
|
+
'agent.provider': 'mock-subagent-maxturns-provider',
|
|
1220
1555
|
}),
|
|
1221
|
-
|
|
1222
|
-
getCwd: () => tmpDir,
|
|
1223
|
-
isRemote: () => false,
|
|
1224
|
-
getSSHService: () => undefined,
|
|
1225
|
-
},
|
|
1226
|
-
onEvent: (event) => events.push(event),
|
|
1556
|
+
sessionContextService: createSessionContextService(),
|
|
1227
1557
|
});
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
t.is(retryEvents.length, 0, 'no retry event should be emitted');
|
|
1558
|
+
await manager.run({ role: 'explorer', task: 'mock task' });
|
|
1559
|
+
expect(executeOutput).toBeTruthy();
|
|
1560
|
+
expect(executeOutput.includes('approaching the maximum turn limit')).toBe(true);
|
|
1561
|
+
expect(executeOutput.includes('4 turns left')).toBe(true);
|
|
1233
1562
|
});
|
|
1234
|
-
|
|
1235
|
-
let
|
|
1563
|
+
it.sequential('execution subagents select subagent-safe model-family prompts and append role instructions', async () => {
|
|
1564
|
+
let constructedAgentExplorer = null;
|
|
1565
|
+
let constructedAgentWorker = null;
|
|
1566
|
+
let constructedAgentResearcher = null;
|
|
1236
1567
|
registerProvider({
|
|
1237
|
-
id: 'mock-
|
|
1238
|
-
label: 'Mock
|
|
1568
|
+
id: 'mock-prompt-test-provider-gpt-5-codex',
|
|
1569
|
+
label: 'Mock Prompt Test Provider GPT-5 Codex',
|
|
1239
1570
|
createRunner: () => ({
|
|
1240
1571
|
run: async (agent) => {
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
const grep = agent.tools.find((tool) => tool.name === 'grep');
|
|
1245
|
-
if (grep) {
|
|
1246
|
-
await grep.invoke({}, JSON.stringify({ pattern: 'foo', path: '.' }), {}).catch(() => { });
|
|
1247
|
-
}
|
|
1248
|
-
throw new ModelBehaviorError('Tool bash not found in agent Explorer.');
|
|
1249
|
-
}
|
|
1250
|
-
return { status: 'completed', finalOutput: 'found it', history: [], messages: [] };
|
|
1572
|
+
constructedAgentExplorer = agent;
|
|
1573
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1574
|
+
return wrapResultAsAgentStream(result);
|
|
1251
1575
|
},
|
|
1252
1576
|
}),
|
|
1253
|
-
fetchModels: async () => [{ id: '
|
|
1577
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1254
1578
|
});
|
|
1255
|
-
|
|
1579
|
+
registerProvider({
|
|
1580
|
+
id: 'mock-prompt-test-provider-claude-3-sonnet',
|
|
1581
|
+
label: 'Mock Prompt Test Provider Claude 3 Sonnet',
|
|
1582
|
+
createRunner: () => ({
|
|
1583
|
+
run: async (agent) => {
|
|
1584
|
+
constructedAgentWorker = agent;
|
|
1585
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1586
|
+
return wrapResultAsAgentStream(result);
|
|
1587
|
+
},
|
|
1588
|
+
}),
|
|
1589
|
+
fetchModels: async () => [{ id: 'claude-3-sonnet' }],
|
|
1590
|
+
});
|
|
1591
|
+
registerProvider({
|
|
1592
|
+
id: 'mock-prompt-test-provider-gpt-5-modern',
|
|
1593
|
+
label: 'Mock Prompt Test Provider GPT-5 Modern',
|
|
1594
|
+
createRunner: () => ({
|
|
1595
|
+
run: async (agent) => {
|
|
1596
|
+
constructedAgentResearcher = agent;
|
|
1597
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1598
|
+
return wrapResultAsAgentStream(result);
|
|
1599
|
+
},
|
|
1600
|
+
}),
|
|
1601
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1602
|
+
});
|
|
1603
|
+
// 1. Run explorer subagent with gpt-5-codex
|
|
1604
|
+
const managerExplorer = new SubagentManager({
|
|
1256
1605
|
logger: createMockLogger(),
|
|
1257
1606
|
settings: createMockSettings({
|
|
1258
|
-
'agent.model': '
|
|
1259
|
-
'agent.provider': 'mock-
|
|
1260
|
-
|
|
1607
|
+
'agent.model': 'gpt-5-codex',
|
|
1608
|
+
'agent.provider': 'mock-prompt-test-provider-gpt-5-codex',
|
|
1609
|
+
}),
|
|
1610
|
+
sessionContextService: createSessionContextService(),
|
|
1611
|
+
});
|
|
1612
|
+
await managerExplorer.run({ role: 'explorer', task: 'explorer task' });
|
|
1613
|
+
expect(constructedAgentExplorer).toBeTruthy();
|
|
1614
|
+
expect(constructedAgentExplorer.instructions.includes('nested Codex-family subagent')).toBe(true);
|
|
1615
|
+
expect(constructedAgentExplorer.instructions.includes('You are an explorer subagent.')).toBe(true);
|
|
1616
|
+
expect(constructedAgentExplorer.instructions.includes('## Worktree Hygiene')).toBe(true);
|
|
1617
|
+
expect(constructedAgentExplorer.instructions.includes('## Available Tool Guidance')).toBe(true);
|
|
1618
|
+
const codexIdx = constructedAgentExplorer.instructions.indexOf('nested Codex-family subagent');
|
|
1619
|
+
const explorerIdx = constructedAgentExplorer.instructions.indexOf('You are an explorer subagent');
|
|
1620
|
+
expect(codexIdx < explorerIdx).toBe(true);
|
|
1621
|
+
// 2. Run worker subagent with claude-3-sonnet
|
|
1622
|
+
const managerWorker = new SubagentManager({
|
|
1623
|
+
logger: createMockLogger(),
|
|
1624
|
+
settings: createMockSettings({
|
|
1625
|
+
'agent.model': 'claude-3-sonnet',
|
|
1626
|
+
'agent.provider': 'mock-prompt-test-provider-claude-3-sonnet',
|
|
1627
|
+
}),
|
|
1628
|
+
sessionContextService: createSessionContextService(),
|
|
1629
|
+
});
|
|
1630
|
+
await managerWorker.run({ role: 'worker', task: 'worker task' });
|
|
1631
|
+
expect(constructedAgentWorker).toBeTruthy();
|
|
1632
|
+
expect(constructedAgentWorker.instructions.includes('nested Anthropic-family subagent')).toBe(true);
|
|
1633
|
+
expect(constructedAgentWorker.instructions.includes('You are a worker subagent.')).toBe(true);
|
|
1634
|
+
const sonnetIdx = constructedAgentWorker.instructions.indexOf('nested Anthropic-family subagent');
|
|
1635
|
+
const workerIdx = constructedAgentWorker.instructions.indexOf('You are a worker subagent');
|
|
1636
|
+
expect(sonnetIdx < workerIdx).toBe(true);
|
|
1637
|
+
const managerResearcher = new SubagentManager({
|
|
1638
|
+
logger: createMockLogger(),
|
|
1639
|
+
settings: createMockSettings({
|
|
1640
|
+
'agent.model': 'gpt-5',
|
|
1641
|
+
'agent.provider': 'mock-prompt-test-provider-gpt-5-modern',
|
|
1261
1642
|
}),
|
|
1643
|
+
sessionContextService: createSessionContextService(),
|
|
1262
1644
|
});
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1645
|
+
await managerResearcher.run({ role: 'researcher', task: 'research task' });
|
|
1646
|
+
expect(constructedAgentResearcher).toBeTruthy();
|
|
1647
|
+
expect(constructedAgentResearcher.instructions.includes('nested GPT-5-family subagent')).toBe(true);
|
|
1648
|
+
expect(constructedAgentResearcher.instructions.includes('You are a researcher subagent.')).toBe(true);
|
|
1266
1649
|
});
|
|
1267
|
-
|
|
1268
|
-
|
|
1650
|
+
it.sequential('execution subagent prompts exclude top-level-only prompt content', async () => {
|
|
1651
|
+
let constructedAgent = null;
|
|
1269
1652
|
registerProvider({
|
|
1270
|
-
id: 'mock-
|
|
1271
|
-
label: 'Mock
|
|
1653
|
+
id: 'mock-top-level-exclusion-provider',
|
|
1654
|
+
label: 'Mock Top Level Exclusion Provider',
|
|
1272
1655
|
createRunner: () => ({
|
|
1273
|
-
run: async (
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
throw new ModelBehaviorError('Tool bash not found in agent Explorer.');
|
|
1278
|
-
}
|
|
1279
|
-
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1656
|
+
run: async (agent) => {
|
|
1657
|
+
constructedAgent = agent;
|
|
1658
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1659
|
+
return wrapResultAsAgentStream(result);
|
|
1280
1660
|
},
|
|
1281
1661
|
}),
|
|
1282
|
-
fetchModels: async () => [{ id: '
|
|
1662
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1283
1663
|
});
|
|
1284
1664
|
const manager = new SubagentManager({
|
|
1285
1665
|
logger: createMockLogger(),
|
|
1286
1666
|
settings: createMockSettings({
|
|
1287
|
-
'agent.model': '
|
|
1288
|
-
'agent.provider': 'mock-
|
|
1289
|
-
|
|
1667
|
+
'agent.model': 'gpt-5-codex',
|
|
1668
|
+
'agent.provider': 'mock-top-level-exclusion-provider',
|
|
1669
|
+
}),
|
|
1670
|
+
sessionContextService: createSessionContextService(),
|
|
1671
|
+
});
|
|
1672
|
+
await manager.run({ role: 'worker', task: 'worker task' });
|
|
1673
|
+
expect(constructedAgent).toBeTruthy();
|
|
1674
|
+
expect(constructedAgent.instructions.includes('commentary channel')).toBe(false);
|
|
1675
|
+
expect(constructedAgent.instructions.includes('final channel')).toBe(false);
|
|
1676
|
+
expect(constructedAgent.instructions.includes('Intermediary updates')).toBe(false);
|
|
1677
|
+
expect(constructedAgent.instructions.includes('Plan Mode Workflow')).toBe(false);
|
|
1678
|
+
expect(constructedAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.')).toBe(false);
|
|
1679
|
+
});
|
|
1680
|
+
it.sequential('mentor subagent is NOT affected by prompt profiles', async () => {
|
|
1681
|
+
let mentorAgent = null;
|
|
1682
|
+
registerProvider({
|
|
1683
|
+
id: 'mock-prompt-test-provider-mentor',
|
|
1684
|
+
label: 'Mock Prompt Test Provider Mentor',
|
|
1685
|
+
createRunner: () => ({
|
|
1686
|
+
run: async (agent) => {
|
|
1687
|
+
mentorAgent = agent;
|
|
1688
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1689
|
+
return wrapResultAsAgentStream(result);
|
|
1690
|
+
},
|
|
1691
|
+
}),
|
|
1692
|
+
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
1693
|
+
});
|
|
1694
|
+
const manager = new SubagentManager({
|
|
1695
|
+
logger: createMockLogger(),
|
|
1696
|
+
settings: createMockSettings({
|
|
1697
|
+
'agent.model': 'main-model',
|
|
1698
|
+
'agent.provider': 'mock-prompt-test-provider-mentor',
|
|
1699
|
+
'agent.mentorModel': 'gpt-5-codex',
|
|
1700
|
+
'agent.mentorProvider': 'mock-prompt-test-provider-mentor',
|
|
1701
|
+
'app.mentorMode': false,
|
|
1702
|
+
}),
|
|
1703
|
+
sessionContextService: createSessionContextService(),
|
|
1704
|
+
});
|
|
1705
|
+
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
1706
|
+
expect(mentorAgent).toBeTruthy();
|
|
1707
|
+
expect(mentorAgent.instructions.includes('You are Codex, a coding agent based on GPT-5.')).toBe(false);
|
|
1708
|
+
expect(mentorAgent.instructions.includes('nested Codex-family subagent')).toBe(false);
|
|
1709
|
+
expect(mentorAgent.instructions.includes('## Available Tool Guidance')).toBe(false);
|
|
1710
|
+
expect(mentorAgent.instructions.includes('## Worktree Hygiene')).toBe(false);
|
|
1711
|
+
expect(mentorAgent.instructions.includes('You are a senior architect')).toBe(true);
|
|
1712
|
+
});
|
|
1713
|
+
it.sequential('subagent tool definitions conditional registration for search tools', async () => {
|
|
1714
|
+
let workerAgentShellTrue = null;
|
|
1715
|
+
let workerAgentShellFalse = null;
|
|
1716
|
+
registerProvider({
|
|
1717
|
+
id: 'mock-tool-test-provider-shell-true',
|
|
1718
|
+
label: 'Mock Tool Test Provider Shell True',
|
|
1719
|
+
createRunner: () => ({
|
|
1720
|
+
run: async (agent) => {
|
|
1721
|
+
workerAgentShellTrue = agent;
|
|
1722
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1723
|
+
return wrapResultAsAgentStream(result);
|
|
1724
|
+
},
|
|
1725
|
+
}),
|
|
1726
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1727
|
+
});
|
|
1728
|
+
registerProvider({
|
|
1729
|
+
id: 'mock-tool-test-provider-shell-false',
|
|
1730
|
+
label: 'Mock Tool Test Provider Shell False',
|
|
1731
|
+
createRunner: () => ({
|
|
1732
|
+
run: async (agent) => {
|
|
1733
|
+
workerAgentShellFalse = agent;
|
|
1734
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1735
|
+
return wrapResultAsAgentStream(result);
|
|
1736
|
+
},
|
|
1290
1737
|
}),
|
|
1738
|
+
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
1291
1739
|
});
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
const
|
|
1295
|
-
|
|
1296
|
-
|
|
1740
|
+
// 1. Model: gpt-5 (searchViaShell is true by default), canRunShell: true (from worker.md)
|
|
1741
|
+
// Explorer/worker tools should NOT contain dedicated search tools: grep and find_files.
|
|
1742
|
+
const managerShellTrue = new SubagentManager({
|
|
1743
|
+
logger: createMockLogger(),
|
|
1744
|
+
settings: createMockSettings({
|
|
1745
|
+
'agent.model': 'gpt-5',
|
|
1746
|
+
'agent.provider': 'mock-tool-test-provider-shell-true',
|
|
1747
|
+
'app.searchViaShell': 'auto',
|
|
1748
|
+
}),
|
|
1749
|
+
sessionContextService: createSessionContextService(),
|
|
1750
|
+
});
|
|
1751
|
+
await managerShellTrue.run({ role: 'worker', task: 'some task' });
|
|
1752
|
+
expect(workerAgentShellTrue).toBeTruthy();
|
|
1753
|
+
const toolNamesShellTrue = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1754
|
+
expect(toolNamesShellTrue.includes('grep')).toBe(false);
|
|
1755
|
+
expect(toolNamesShellTrue.includes('find_files')).toBe(false);
|
|
1756
|
+
expect(toolNamesShellTrue.includes('shell')).toBe(true);
|
|
1757
|
+
expect(workerAgentShellTrue.instructions.includes('Registered tools:')).toBe(true);
|
|
1758
|
+
expect(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`')).toBe(true);
|
|
1759
|
+
expect(workerAgentShellTrue.instructions.includes('`fd` for file search')).toBe(true);
|
|
1760
|
+
expect(workerAgentShellTrue.instructions.includes('Use `grep` to search')).toBe(false);
|
|
1761
|
+
expect(workerAgentShellTrue.instructions.includes('Use `find_files` to locate')).toBe(false);
|
|
1762
|
+
expect(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools')).toBe(false);
|
|
1763
|
+
// 2. Model: gpt-4o (searchViaShell is false by default), canRunShell: true
|
|
1764
|
+
// Tools should include dedicated grep and find_files.
|
|
1765
|
+
const managerShellFalse = new SubagentManager({
|
|
1766
|
+
logger: createMockLogger(),
|
|
1767
|
+
settings: createMockSettings({
|
|
1768
|
+
'agent.model': 'gpt-4o',
|
|
1769
|
+
'agent.provider': 'mock-tool-test-provider-shell-false',
|
|
1770
|
+
'app.searchViaShell': 'auto',
|
|
1771
|
+
}),
|
|
1772
|
+
sessionContextService: createSessionContextService(),
|
|
1773
|
+
});
|
|
1774
|
+
await managerShellFalse.run({ role: 'worker', task: 'some task' });
|
|
1775
|
+
expect(workerAgentShellFalse).toBeTruthy();
|
|
1776
|
+
const toolNamesShellFalse = workerAgentShellFalse.tools.map((tool) => tool.name);
|
|
1777
|
+
expect(toolNamesShellFalse.includes('grep')).toBe(true);
|
|
1778
|
+
expect(toolNamesShellFalse.includes('find_files')).toBe(true);
|
|
1779
|
+
expect(toolNamesShellFalse.includes('shell')).toBe(true);
|
|
1780
|
+
expect(workerAgentShellFalse.instructions.includes('For workspace search, use the dedicated search tools')).toBe(true);
|
|
1781
|
+
expect(workerAgentShellFalse.instructions.includes('`grep`')).toBe(true);
|
|
1782
|
+
expect(workerAgentShellFalse.instructions.includes('`find_files`')).toBe(true);
|
|
1783
|
+
expect(workerAgentShellFalse.instructions.includes('use `shell` with commands like `rg`')).toBe(false);
|
|
1784
|
+
// 3. Model: gpt-5 with searchViaShell explicitly disabled still keeps dedicated search tools.
|
|
1785
|
+
const managerShellOff = new SubagentManager({
|
|
1786
|
+
logger: createMockLogger(),
|
|
1787
|
+
settings: createMockSettings({
|
|
1788
|
+
'agent.model': 'gpt-5',
|
|
1789
|
+
'agent.provider': 'mock-tool-test-provider-shell-true',
|
|
1790
|
+
'app.searchViaShell': 'off',
|
|
1791
|
+
}),
|
|
1792
|
+
sessionContextService: createSessionContextService(),
|
|
1793
|
+
});
|
|
1794
|
+
await managerShellOff.run({ role: 'worker', task: 'some task' });
|
|
1795
|
+
const toolNamesShellOff = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1796
|
+
expect(toolNamesShellOff.includes('grep')).toBe(true);
|
|
1797
|
+
expect(toolNamesShellOff.includes('find_files')).toBe(true);
|
|
1798
|
+
expect(toolNamesShellOff.includes('shell')).toBe(true);
|
|
1799
|
+
expect(workerAgentShellTrue.instructions.includes('For workspace search, use the dedicated search tools')).toBe(true);
|
|
1800
|
+
expect(workerAgentShellTrue.instructions.includes('use `shell` with commands like `rg`')).toBe(false);
|
|
1297
1801
|
});
|
|
1298
|
-
|
|
1299
|
-
|
|
1802
|
+
it.sequential('explorer uses shell search when available and researcher keeps dedicated search tools', async () => {
|
|
1803
|
+
let explorerAgent = null;
|
|
1804
|
+
let researcherAgent = null;
|
|
1300
1805
|
registerProvider({
|
|
1301
|
-
id: 'mock-
|
|
1302
|
-
label: 'Mock
|
|
1806
|
+
id: 'mock-tool-test-provider-explorer-shell',
|
|
1807
|
+
label: 'Mock Tool Test Provider Explorer Shell',
|
|
1303
1808
|
createRunner: () => ({
|
|
1304
|
-
run: async (
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1809
|
+
run: async (agent) => {
|
|
1810
|
+
explorerAgent = agent;
|
|
1811
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1812
|
+
return wrapResultAsAgentStream(result);
|
|
1813
|
+
},
|
|
1814
|
+
}),
|
|
1815
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1816
|
+
});
|
|
1817
|
+
registerProvider({
|
|
1818
|
+
id: 'mock-tool-test-provider-researcher-dedicated',
|
|
1819
|
+
label: 'Mock Tool Test Provider Researcher Dedicated',
|
|
1820
|
+
createRunner: () => ({
|
|
1821
|
+
run: async (agent) => {
|
|
1822
|
+
researcherAgent = agent;
|
|
1823
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1824
|
+
return wrapResultAsAgentStream(result);
|
|
1825
|
+
},
|
|
1826
|
+
}),
|
|
1827
|
+
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
1828
|
+
});
|
|
1829
|
+
await new SubagentManager({
|
|
1830
|
+
logger: createMockLogger(),
|
|
1831
|
+
settings: createMockSettings({
|
|
1832
|
+
'agent.model': 'gpt-5',
|
|
1833
|
+
'agent.provider': 'mock-tool-test-provider-explorer-shell',
|
|
1834
|
+
'app.searchViaShell': 'auto',
|
|
1835
|
+
}),
|
|
1836
|
+
sessionContextService: createSessionContextService(),
|
|
1837
|
+
}).run({ role: 'explorer', task: 'find files' });
|
|
1838
|
+
await new SubagentManager({
|
|
1839
|
+
logger: createMockLogger(),
|
|
1840
|
+
settings: createMockSettings({
|
|
1841
|
+
'agent.model': 'gpt-5',
|
|
1842
|
+
'agent.provider': 'mock-tool-test-provider-researcher-dedicated',
|
|
1843
|
+
'app.searchViaShell': 'auto',
|
|
1844
|
+
}),
|
|
1845
|
+
sessionContextService: createSessionContextService(),
|
|
1846
|
+
}).run({ role: 'researcher', task: 'research files' });
|
|
1847
|
+
expect(explorerAgent).toBeTruthy();
|
|
1848
|
+
let toolNames = explorerAgent.tools.map((tool) => tool.name);
|
|
1849
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
1850
|
+
expect(toolNames.includes('grep')).toBe(false);
|
|
1851
|
+
expect(toolNames.includes('find_files')).toBe(false);
|
|
1852
|
+
expect(explorerAgent.instructions.includes('For workspace search, use `shell` with commands like `rg`')).toBe(true);
|
|
1853
|
+
expect(explorerAgent.instructions.includes('For workspace search, use the dedicated search tools')).toBe(false);
|
|
1854
|
+
expect(researcherAgent).toBeTruthy();
|
|
1855
|
+
toolNames = researcherAgent.tools.map((tool) => tool.name);
|
|
1856
|
+
expect(toolNames.includes('shell')).toBe(false);
|
|
1857
|
+
expect(toolNames.includes('grep')).toBe(true);
|
|
1858
|
+
expect(toolNames.includes('find_files')).toBe(true);
|
|
1859
|
+
expect(researcherAgent.instructions.includes('For workspace search, use the dedicated search tools')).toBe(true);
|
|
1860
|
+
expect(researcherAgent.instructions.includes('use `shell` with commands like `rg`')).toBe(false);
|
|
1861
|
+
});
|
|
1862
|
+
it.sequential('remote execution disables code-context tools and guidance', async () => {
|
|
1863
|
+
let remoteAgent = null;
|
|
1864
|
+
registerProvider({
|
|
1865
|
+
id: 'mock-tool-test-provider-remote',
|
|
1866
|
+
label: 'Mock Tool Test Provider Remote',
|
|
1867
|
+
createRunner: () => ({
|
|
1868
|
+
run: async (agent) => {
|
|
1869
|
+
remoteAgent = agent;
|
|
1870
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1871
|
+
return wrapResultAsAgentStream(result);
|
|
1872
|
+
},
|
|
1873
|
+
}),
|
|
1874
|
+
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
1875
|
+
});
|
|
1876
|
+
const manager = new SubagentManager({
|
|
1877
|
+
logger: createMockLogger(),
|
|
1878
|
+
settings: createMockSettings({
|
|
1879
|
+
'agent.model': 'gpt-4o',
|
|
1880
|
+
'agent.provider': 'mock-tool-test-provider-remote',
|
|
1881
|
+
}),
|
|
1882
|
+
executionContext: {
|
|
1883
|
+
getCwd: () => '/tmp/remote-workspace',
|
|
1884
|
+
isRemote: () => true,
|
|
1885
|
+
getSSHService: () => undefined,
|
|
1886
|
+
},
|
|
1887
|
+
sessionContextService: createSessionContextService(),
|
|
1888
|
+
});
|
|
1889
|
+
await manager.run({ role: 'explorer', task: 'inspect remote files' });
|
|
1890
|
+
expect(remoteAgent).toBeTruthy();
|
|
1891
|
+
const toolNames = remoteAgent.tools.map((tool) => tool.name);
|
|
1892
|
+
expect(toolNames.includes('read_code_outline')).toBe(false);
|
|
1893
|
+
expect(toolNames.includes('code_context_search')).toBe(false);
|
|
1894
|
+
expect(remoteAgent.instructions.includes('Code-context tools are not available in this run.')).toBe(true);
|
|
1895
|
+
expect(remoteAgent.instructions.includes('For code structure and symbol context, use:')).toBe(false);
|
|
1896
|
+
});
|
|
1897
|
+
it.sequential('run() aborted subagent retains toolsUsed and filesChanged', async () => {
|
|
1898
|
+
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-abort-'));
|
|
1899
|
+
// TODO: // TODO: t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true })) needs manual try/finally conversion;
|
|
1900
|
+
registerProvider({
|
|
1901
|
+
id: 'mock-abort-retain-provider',
|
|
1902
|
+
label: 'Mock Abort Retain Provider',
|
|
1903
|
+
createRunner: () => ({
|
|
1904
|
+
run: async (agent) => {
|
|
1905
|
+
// Simulate using a tool
|
|
1906
|
+
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
1907
|
+
if (createFile) {
|
|
1908
|
+
await createFile.invoke({}, JSON.stringify({ path: 'test.ts', content: 'x' }), {});
|
|
1309
1909
|
}
|
|
1310
|
-
|
|
1910
|
+
const err = new Error('The operation was aborted');
|
|
1911
|
+
err.name = 'AbortError';
|
|
1912
|
+
throw err;
|
|
1311
1913
|
},
|
|
1312
1914
|
}),
|
|
1313
1915
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1316,14 +1918,32 @@ test.serial('corrective retry task for behavior error instructs model to produce
|
|
|
1316
1918
|
logger: createMockLogger(),
|
|
1317
1919
|
settings: createMockSettings({
|
|
1318
1920
|
'agent.model': 'mock-model',
|
|
1319
|
-
'agent.provider': 'mock-
|
|
1320
|
-
|
|
1921
|
+
'agent.provider': 'mock-abort-retain-provider',
|
|
1922
|
+
}),
|
|
1923
|
+
sessionContextService: createSessionContextService(),
|
|
1924
|
+
executionContext: {
|
|
1925
|
+
getCwd: () => tmpDir,
|
|
1926
|
+
isRemote: () => false,
|
|
1927
|
+
getSSHService: () => undefined,
|
|
1928
|
+
},
|
|
1929
|
+
});
|
|
1930
|
+
const result = await manager.run({ role: 'worker', task: 'find all files' });
|
|
1931
|
+
expect(result.status).toBe('cancelled');
|
|
1932
|
+
expect(result.toolsUsed.length).toBe(1);
|
|
1933
|
+
expect(result.toolsUsed[0].toolName).toBe('create_file');
|
|
1934
|
+
expect(result.filesChanged).toEqual(['test.ts']);
|
|
1935
|
+
});
|
|
1936
|
+
it.sequential('run() returns failed result when createClient factory is not provided', async () => {
|
|
1937
|
+
const manager = new RealSubagentManager({
|
|
1938
|
+
logger: createMockLogger(),
|
|
1939
|
+
settings: createMockSettings({
|
|
1940
|
+
'agent.model': 'mock-model',
|
|
1941
|
+
'agent.provider': 'openai',
|
|
1321
1942
|
}),
|
|
1943
|
+
sessionContextService: createSessionContextService(),
|
|
1322
1944
|
});
|
|
1323
|
-
await manager.run({ role: 'explorer', task: '
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
t.true(retryInput.includes('final'), 'corrective prompt for behavior should instruct to produce a final answer');
|
|
1327
|
-
t.true(retryInput.includes('Do not call'), 'should tell model not to call more tools');
|
|
1945
|
+
const result = await manager.run({ role: 'explorer', task: 'some task' });
|
|
1946
|
+
expect(result.status).toBe('failed');
|
|
1947
|
+
expect(result.error).toBe('SubagentManager: createClient factory not provided');
|
|
1328
1948
|
});
|
|
1329
1949
|
//# sourceMappingURL=subagent-manager.test.js.map
|