@qduc/term2 0.7.3 → 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 +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +31 -31
- package/dist/agent.js.map +1 -1
- package/dist/agent.test.js +167 -130
- 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 +84 -261
- 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 +31 -31
- package/dist/cli.integration.test.js.map +1 -1
- package/dist/cli.js +28 -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.js +100 -6
- package/dist/components/ApprovalPrompt.ask-user.test.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts +2 -0
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +72 -16
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.d.ts +6 -0
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +36 -10
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/BottomArea.test.js +69 -0
- 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.map +1 -1
- package/dist/components/Common/MenuContainer.js.map +1 -1
- package/dist/components/Common/MenuContainer.test.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.test.js +24 -53
- package/dist/components/Common/MenuContainer.test.js.map +1 -1
- 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 +9 -1
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +10 -8
- 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 +3 -1
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +8 -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 +10 -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 +5 -3
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +129 -32
- 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 +372 -180
- package/dist/components/InputBox.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.map +1 -1
- package/dist/components/MessageList.js +42 -15
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +99 -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/ProviderSelectionMenu.d.ts.map +1 -1
- package/dist/components/ProviderSelectionMenu.js +14 -0
- package/dist/components/ProviderSelectionMenu.js.map +1 -1
- package/dist/components/ProviderSelectionMenu.test.js +20 -0
- package/dist/components/ProviderSelectionMenu.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 +7 -4
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +6 -2
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +162 -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 +66 -32
- package/dist/hooks/use-conversation.clear.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +21 -54
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +192 -227
- 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 +1 -1
- package/dist/hooks/use-escape-key.d.ts.map +1 -1
- package/dist/hooks/use-escape-key.js +9 -1
- package/dist/hooks/use-escape-key.js.map +1 -1
- package/dist/hooks/use-escape-key.test.js +90 -62
- 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 +7 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +23 -2
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-mode-handlers.test.js +14 -5
- package/dist/hooks/use-mode-handlers.test.js.map +1 -1
- 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.test.js +10 -10
- 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 +10 -15
- package/dist/hooks/use-provider-selection.d.ts.map +1 -1
- package/dist/hooks/use-provider-selection.js +143 -219
- package/dist/hooks/use-provider-selection.js.map +1 -1
- package/dist/hooks/use-provider-selection.test.js +207 -141
- package/dist/hooks/use-provider-selection.test.js.map +1 -1
- 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 +5 -1
- 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.test.js +37 -37
- 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 +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +9 -1
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +91 -80
- 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 +6 -1
- package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
- package/dist/hooks/use-trigger-detection.js +35 -14
- package/dist/hooks/use-trigger-detection.js.map +1 -1
- package/dist/hooks/use-trigger-detection.test.js +56 -14
- 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 +18 -18
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts +30 -41
- 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 +258 -531
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +443 -188
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +100 -168
- 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 +38 -2
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +76 -5
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +136 -97
- 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 +14 -7
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +15 -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 +5 -9
- package/dist/prompts/plan-mode-info.md +23 -14
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +9 -8
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.js +42 -48
- package/dist/prompts/prompt-constructor.test.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +42 -49
- package/dist/prompts/prompt-constructor.ts +9 -8
- 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 +6 -4
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.js +29 -22
- package/dist/prompts/subagent-delegation.test.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +30 -22
- package/dist/prompts/subagent-delegation.ts +6 -4
- package/dist/prompts/subagents/mentor-mode.md +20 -0
- package/dist/prompts/subagents/mentor.md +12 -2
- package/dist/prompts/subagents/worktree-hygiene.md +1 -1
- 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.test.js +34 -34
- 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.test.js +29 -29
- package/dist/providers/anthropic-middleware.test.js.map +1 -1
- 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 +568 -12
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-responses-model.test.js +729 -98
- 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 +23 -17
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/codex.provider.test.js +131 -123
- 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 +30 -22
- package/dist/providers/custom-provider-adapter.test.js.map +1 -1
- package/dist/providers/fallback-responses-model.d.ts +27 -3
- package/dist/providers/fallback-responses-model.d.ts.map +1 -1
- package/dist/providers/fallback-responses-model.js +189 -266
- package/dist/providers/fallback-responses-model.js.map +1 -1
- package/dist/providers/fallback-responses-model.test.js +495 -175
- package/dist/providers/fallback-responses-model.test.js.map +1 -1
- package/dist/providers/fetch/composer.d.ts +3 -3
- package/dist/providers/fetch/composer.d.ts.map +1 -1
- package/dist/providers/fetch/composer.js +11 -3
- package/dist/providers/fetch/composer.js.map +1 -1
- package/dist/providers/fetch/composer.test.js +158 -61
- package/dist/providers/fetch/composer.test.js.map +1 -1
- package/dist/providers/fetch/logging-middleware.d.ts +2 -3
- package/dist/providers/fetch/logging-middleware.d.ts.map +1 -1
- package/dist/providers/fetch/logging-middleware.js +16 -93
- 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 +1 -0
- package/dist/providers/openai-compatible-lazy.js.map +1 -1
- package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
- package/dist/providers/openai-compatible-middleware.js +9 -0
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +2 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +18 -8
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-compatible.provider.test.js +223 -217
- package/dist/providers/openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/openai.provider.d.ts +3 -3
- package/dist/providers/openai.provider.d.ts.map +1 -1
- package/dist/providers/openai.provider.js +32 -24
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openai.provider.test.js +46 -12
- package/dist/providers/openai.provider.test.js.map +1 -1
- package/dist/providers/opencode.provider.test.js +71 -71
- package/dist/providers/opencode.provider.test.js.map +1 -1
- package/dist/providers/openrouter.provider.createRunner.test.js +35 -33
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
- package/dist/providers/openrouter.provider.js +1 -1
- 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 +7 -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 +71 -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 +6 -6
- 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-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 +20 -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 +9 -1
- package/dist/services/conversation-replay.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 +23 -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 +8 -7
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +31 -29
- 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 +4 -3
- package/dist/services/conversation-session-reasoning.test.js.map +1 -1
- package/dist/services/conversation-session.auto-approval.test.js +86 -55
- 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 -107
- 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 -1258
- 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.test.js +13 -13
- package/dist/services/file-service.test.js.map +1 -1
- 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 -1
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +0 -46
- 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.map +1 -1
- package/dist/services/mode-notices.js +9 -4
- 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 +1 -1
- package/dist/services/notification-service.d.ts.map +1 -1
- package/dist/services/notification-service.js +1 -1
- package/dist/services/notification-service.js.map +1 -1
- package/dist/services/notification-service.test.js +75 -75
- 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.test.js +22 -22
- 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 +35 -0
- 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-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-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-schema.d.ts +25 -2
- package/dist/services/settings-schema.d.ts.map +1 -1
- package/dist/services/settings-schema.js +19 -0
- 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 +0 -1
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +1 -44
- 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 +7 -3
- package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +8 -6
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.test.js +30 -22
- package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -1
- package/dist/services/shell-auto-approval-resolver.d.ts +2 -2
- package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -1
- package/dist/services/shell-auto-approval-resolver.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 +12 -5
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +25 -896
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-manager.test.js +626 -537
- 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/ask-user-constants.d.ts +1 -1
- package/dist/tools/ask-user-constants.d.ts.map +1 -1
- package/dist/tools/ask-user-constants.js +1 -1
- package/dist/tools/ask-user-constants.js.map +1 -1
- package/dist/tools/ask-user.d.ts +5 -2
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +60 -9
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/ask-user.test.js +91 -28
- package/dist/tools/ask-user.test.js.map +1 -1
- 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 +63 -5
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +30 -7
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/format-helpers.test.js +29 -29
- package/dist/tools/format-helpers.test.js.map +1 -1
- 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.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.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.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.test.js +11 -11
- package/dist/utils/header-sanitizer.test.js.map +1 -1
- package/dist/utils/home-directory-start-guard.test.js +22 -22
- package/dist/utils/home-directory-start-guard.test.js.map +1 -1
- package/dist/utils/inject-warning-into-tool-output.d.ts +6 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -1
- package/dist/utils/inject-warning-into-tool-output.js +28 -2
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -1
- 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/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/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,18 +1,65 @@
|
|
|
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
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
|
+
];
|
|
7
39
|
const createSessionContextService = () => ({
|
|
8
40
|
runWithContext: (_context, fn) => fn(),
|
|
9
41
|
getContext: () => null,
|
|
10
42
|
});
|
|
11
43
|
const SubagentManager = class extends RealSubagentManager {
|
|
12
44
|
constructor(deps) {
|
|
45
|
+
const sessionContextService = deps.sessionContextService ?? createSessionContextService();
|
|
13
46
|
super({
|
|
14
47
|
...deps,
|
|
15
|
-
sessionContextService
|
|
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
|
+
})),
|
|
16
63
|
});
|
|
17
64
|
}
|
|
18
65
|
};
|
|
@@ -42,6 +89,78 @@ function createMockSettings(values = {}) {
|
|
|
42
89
|
function getAgentTool(agent, name) {
|
|
43
90
|
return agent.tools.find((tool) => tool.name === name);
|
|
44
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
|
+
}
|
|
45
164
|
// ========== Provider Mocks ==========
|
|
46
165
|
let mentorManagerRunnerCalls = [];
|
|
47
166
|
let mentorManagerResponseCounter = 0;
|
|
@@ -49,22 +168,23 @@ let mentorManagerProviderRegistered = false;
|
|
|
49
168
|
function ensureMentorManagerProviderRegistered() {
|
|
50
169
|
if (!mentorManagerProviderRegistered) {
|
|
51
170
|
registerProvider({
|
|
52
|
-
id:
|
|
171
|
+
id: PROVIDER_MENTOR_MANAGER,
|
|
53
172
|
label: 'Mock Mentor Manager',
|
|
54
173
|
createRunner: () => ({
|
|
55
174
|
run: async (_agent, _input, _options) => {
|
|
56
175
|
mentorManagerRunnerCalls.push({ input: _input, options: _options, agent: _agent });
|
|
57
176
|
mentorManagerResponseCounter++;
|
|
58
|
-
|
|
177
|
+
const result = {
|
|
59
178
|
status: 'completed',
|
|
60
179
|
finalOutput: `mentor-response-${mentorManagerResponseCounter}`,
|
|
61
180
|
responseId: `resp-${mentorManagerResponseCounter}`,
|
|
62
181
|
history: [],
|
|
63
182
|
messages: [],
|
|
64
183
|
};
|
|
184
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
65
185
|
},
|
|
66
186
|
}),
|
|
67
|
-
fetchModels: async () => [{ id:
|
|
187
|
+
fetchModels: async () => [{ id: MODEL_MOCK }],
|
|
68
188
|
});
|
|
69
189
|
mentorManagerProviderRegistered = true;
|
|
70
190
|
}
|
|
@@ -74,25 +194,26 @@ let explorerRunnerCalls = [];
|
|
|
74
194
|
function ensureExplorerProviderRegistered() {
|
|
75
195
|
if (!explorerManagerProviderRegistered) {
|
|
76
196
|
registerProvider({
|
|
77
|
-
id:
|
|
197
|
+
id: PROVIDER_EXPLORER,
|
|
78
198
|
label: 'Mock Explorer Provider',
|
|
79
199
|
createRunner: () => ({
|
|
80
200
|
run: async (_agent, input, options) => {
|
|
81
201
|
explorerRunnerCalls.push({ input, agent: _agent, options });
|
|
82
|
-
|
|
202
|
+
const result = {
|
|
83
203
|
status: 'completed',
|
|
84
204
|
finalOutput: 'Found the relevant files.',
|
|
85
205
|
history: [],
|
|
86
206
|
messages: [],
|
|
87
207
|
};
|
|
208
|
+
return options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
88
209
|
},
|
|
89
210
|
}),
|
|
90
|
-
fetchModels: async () => [{ id:
|
|
211
|
+
fetchModels: async () => [{ id: MODEL_MOCK }],
|
|
91
212
|
});
|
|
92
213
|
explorerManagerProviderRegistered = true;
|
|
93
214
|
}
|
|
94
215
|
}
|
|
95
|
-
|
|
216
|
+
beforeEach(() => {
|
|
96
217
|
mentorManagerRunnerCalls = [];
|
|
97
218
|
mentorManagerResponseCounter = 0;
|
|
98
219
|
explorerRunnerCalls = [];
|
|
@@ -100,115 +221,115 @@ test.beforeEach(() => {
|
|
|
100
221
|
ensureExplorerProviderRegistered();
|
|
101
222
|
});
|
|
102
223
|
// ========== run() with unknown role ==========
|
|
103
|
-
|
|
224
|
+
it.sequential('run() returns failed result for unknown role', async () => {
|
|
104
225
|
const settings = createMockSettings({
|
|
105
|
-
'agent.model':
|
|
106
|
-
'agent.provider':
|
|
226
|
+
'agent.model': MODEL_MOCK,
|
|
227
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
107
228
|
});
|
|
108
229
|
const manager = new SubagentManager({
|
|
109
230
|
logger: createMockLogger(),
|
|
110
231
|
settings,
|
|
111
232
|
sessionContextService: createSessionContextService(),
|
|
112
233
|
});
|
|
113
|
-
const result = await manager.run({ role:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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);
|
|
117
238
|
});
|
|
118
239
|
// ========== Mentor role ==========
|
|
119
|
-
|
|
240
|
+
it.sequential('run() with mentor role uses mentorModel setting', async () => {
|
|
120
241
|
const settings = createMockSettings({
|
|
121
|
-
'agent.model':
|
|
122
|
-
'agent.provider':
|
|
123
|
-
'agent.mentorModel':
|
|
124
|
-
'agent.mentorProvider':
|
|
242
|
+
'agent.model': MODEL_MAIN,
|
|
243
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
244
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
245
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
125
246
|
});
|
|
126
247
|
const manager = new SubagentManager({
|
|
127
248
|
logger: createMockLogger(),
|
|
128
249
|
settings,
|
|
129
250
|
sessionContextService: createSessionContextService(),
|
|
130
251
|
});
|
|
131
|
-
const result = await manager.run({ role:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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);
|
|
137
258
|
});
|
|
138
|
-
|
|
259
|
+
it.sequential('run() with mentor role fails when mentorModel is not set', async () => {
|
|
139
260
|
const settings = createMockSettings({
|
|
140
|
-
'agent.model':
|
|
141
|
-
'agent.provider':
|
|
261
|
+
'agent.model': MODEL_MAIN,
|
|
262
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
142
263
|
});
|
|
143
264
|
const manager = new SubagentManager({
|
|
144
265
|
logger: createMockLogger(),
|
|
145
266
|
settings,
|
|
146
267
|
sessionContextService: createSessionContextService(),
|
|
147
268
|
});
|
|
148
|
-
const result = await manager.run({ role:
|
|
149
|
-
|
|
150
|
-
|
|
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);
|
|
151
272
|
});
|
|
152
|
-
|
|
273
|
+
it.sequential('run() mentor maintains conversation history across calls', async () => {
|
|
153
274
|
const settings = createMockSettings({
|
|
154
|
-
'agent.model':
|
|
155
|
-
'agent.provider':
|
|
156
|
-
'agent.mentorModel':
|
|
157
|
-
'agent.mentorProvider':
|
|
275
|
+
'agent.model': MODEL_MAIN,
|
|
276
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
277
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
278
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
158
279
|
});
|
|
159
280
|
const manager = new SubagentManager({
|
|
160
281
|
logger: createMockLogger(),
|
|
161
282
|
settings,
|
|
162
283
|
sessionContextService: createSessionContextService(),
|
|
163
284
|
});
|
|
164
|
-
await manager.run({ role:
|
|
165
|
-
await manager.run({ role:
|
|
166
|
-
|
|
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);
|
|
167
288
|
// Second call should have history (array with previous messages)
|
|
168
|
-
|
|
169
|
-
|
|
289
|
+
expect(Array.isArray(mentorManagerRunnerCalls[1].input)).toBe(true);
|
|
290
|
+
expect(mentorManagerRunnerCalls[1].input.length > 1).toBe(true);
|
|
170
291
|
});
|
|
171
|
-
|
|
292
|
+
it.sequential('resetMentorSession() clears conversation history', async () => {
|
|
172
293
|
const settings = createMockSettings({
|
|
173
|
-
'agent.model':
|
|
174
|
-
'agent.provider':
|
|
175
|
-
'agent.mentorModel':
|
|
176
|
-
'agent.mentorProvider':
|
|
294
|
+
'agent.model': MODEL_MAIN,
|
|
295
|
+
'agent.provider': PROVIDER_MENTOR_MANAGER,
|
|
296
|
+
'agent.mentorModel': MODEL_MENTOR,
|
|
297
|
+
'agent.mentorProvider': PROVIDER_MENTOR_MANAGER,
|
|
177
298
|
});
|
|
178
299
|
const manager = new SubagentManager({
|
|
179
300
|
logger: createMockLogger(),
|
|
180
301
|
settings,
|
|
181
302
|
sessionContextService: createSessionContextService(),
|
|
182
303
|
});
|
|
183
|
-
await manager.run({ role:
|
|
184
|
-
|
|
304
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_FIRST_QUESTION });
|
|
305
|
+
expect(mentorManagerRunnerCalls[0].input.length >= 1).toBe(true);
|
|
185
306
|
manager.resetMentorSession();
|
|
186
|
-
await manager.run({ role:
|
|
307
|
+
await manager.run({ role: ROLE_MENTOR, task: TASK_FRESH_QUESTION });
|
|
187
308
|
// After reset, second call should have only 1 message (fresh start)
|
|
188
|
-
|
|
309
|
+
expect(mentorManagerRunnerCalls[1].input.length).toBe(1);
|
|
189
310
|
});
|
|
190
311
|
// ========== Explorer role ==========
|
|
191
|
-
|
|
312
|
+
it.sequential('run() with explorer role returns SubagentResult', async () => {
|
|
192
313
|
const settings = createMockSettings({
|
|
193
|
-
'agent.model':
|
|
194
|
-
'agent.provider':
|
|
314
|
+
'agent.model': MODEL_MOCK,
|
|
315
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
195
316
|
});
|
|
196
317
|
const manager = new SubagentManager({
|
|
197
318
|
logger: createMockLogger(),
|
|
198
319
|
settings,
|
|
199
320
|
sessionContextService: createSessionContextService(),
|
|
200
321
|
});
|
|
201
|
-
const result = await manager.run({ role:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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();
|
|
207
328
|
});
|
|
208
|
-
|
|
329
|
+
it.sequential('run() passes parent abort signal into the delegated provider run', async () => {
|
|
209
330
|
const settings = createMockSettings({
|
|
210
|
-
'agent.model':
|
|
211
|
-
'agent.provider':
|
|
331
|
+
'agent.model': MODEL_MOCK,
|
|
332
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
212
333
|
});
|
|
213
334
|
const manager = new SubagentManager({
|
|
214
335
|
logger: createMockLogger(),
|
|
@@ -217,13 +338,16 @@ test.serial('run() passes parent abort signal into the delegated provider run',
|
|
|
217
338
|
});
|
|
218
339
|
const abortController = new AbortController();
|
|
219
340
|
await manager.run({
|
|
220
|
-
role:
|
|
221
|
-
task:
|
|
341
|
+
role: ROLE_EXPLORER,
|
|
342
|
+
task: TASK_FIND_TS_FILES,
|
|
222
343
|
signal: abortController.signal,
|
|
223
344
|
});
|
|
224
|
-
|
|
345
|
+
expect(true).toBe(true);
|
|
225
346
|
});
|
|
226
|
-
|
|
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).
|
|
227
351
|
registerProvider({
|
|
228
352
|
id: 'mock-aborted-subagent-provider',
|
|
229
353
|
label: 'Mock Aborted Subagent Provider',
|
|
@@ -240,7 +364,7 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
|
|
|
240
364
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
241
365
|
});
|
|
242
366
|
const settings = createMockSettings({
|
|
243
|
-
'agent.model':
|
|
367
|
+
'agent.model': MODEL_MOCK,
|
|
244
368
|
'agent.provider': 'mock-aborted-subagent-provider',
|
|
245
369
|
});
|
|
246
370
|
const manager = new SubagentManager({
|
|
@@ -250,56 +374,55 @@ test.serial('run() cancels a delegated provider run when the parent signal abort
|
|
|
250
374
|
});
|
|
251
375
|
const abortController = new AbortController();
|
|
252
376
|
const resultPromise = manager.run({
|
|
253
|
-
role:
|
|
254
|
-
task:
|
|
377
|
+
role: ROLE_EXPLORER,
|
|
378
|
+
task: TASK_FIND_TS_FILES,
|
|
255
379
|
signal: abortController.signal,
|
|
256
380
|
});
|
|
257
381
|
queueMicrotask(() => abortController.abort());
|
|
258
382
|
const result = await resultPromise;
|
|
259
|
-
|
|
260
|
-
|
|
383
|
+
expect(result.status).toBe('cancelled');
|
|
384
|
+
expect(result.error?.includes('aborted') ?? false).toBe(true);
|
|
261
385
|
});
|
|
262
|
-
|
|
386
|
+
it.sequential('explorer shell tool executes GREEN commands and blocks YELLOW and RED commands', async () => {
|
|
263
387
|
const settings = createMockSettings({
|
|
264
|
-
'agent.model':
|
|
265
|
-
'agent.provider':
|
|
388
|
+
'agent.model': MODEL_MOCK,
|
|
389
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
266
390
|
});
|
|
267
391
|
const manager = new SubagentManager({
|
|
268
392
|
logger: createMockLogger(),
|
|
269
393
|
settings,
|
|
270
394
|
sessionContextService: createSessionContextService(),
|
|
271
395
|
});
|
|
272
|
-
await manager.run({ role:
|
|
273
|
-
|
|
396
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_INSPECT_WORKSPACE });
|
|
397
|
+
expect(explorerRunnerCalls.length).toBe(1);
|
|
274
398
|
const agent = explorerRunnerCalls[0].agent;
|
|
275
399
|
const shell = getAgentTool(agent, 'shell');
|
|
276
|
-
|
|
277
|
-
|
|
400
|
+
expect(shell).toBeTruthy();
|
|
401
|
+
expect(await shell.needsApproval({}, { command: 'pwd' })).toBe(false);
|
|
278
402
|
const invokeShell = async (command) => shell.invoke({}, JSON.stringify({ command }), {});
|
|
279
|
-
const
|
|
280
|
-
for (const command of ['pwd', 'ls', 'cat package.json', 'git status', 'git log --oneline']) {
|
|
403
|
+
for (const command of GREEN_SHELL_COMMANDS) {
|
|
281
404
|
const output = await invokeShell(command);
|
|
282
|
-
|
|
283
|
-
|
|
405
|
+
expect(output.includes('exit 0')).toBe(true);
|
|
406
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(false);
|
|
284
407
|
}
|
|
285
|
-
for (const command of
|
|
408
|
+
for (const command of YELLOW_SHELL_COMMANDS) {
|
|
286
409
|
const output = await invokeShell(command);
|
|
287
|
-
|
|
288
|
-
|
|
410
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
411
|
+
expect(output.includes(command)).toBe(true);
|
|
289
412
|
}
|
|
290
|
-
for (const command of
|
|
413
|
+
for (const command of RED_SHELL_COMMANDS) {
|
|
291
414
|
const output = await invokeShell(command);
|
|
292
|
-
|
|
293
|
-
|
|
415
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
416
|
+
expect(output.includes(command)).toBe(true);
|
|
294
417
|
}
|
|
295
418
|
});
|
|
296
|
-
|
|
297
|
-
const tmpDir = fs.mkdtempSync(path.join('/tmp',
|
|
298
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
299
|
-
fs.writeFileSync(path.join(tmpDir,
|
|
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');
|
|
300
423
|
const settings = createMockSettings({
|
|
301
|
-
'agent.model':
|
|
302
|
-
'agent.provider':
|
|
424
|
+
'agent.model': MODEL_MOCK,
|
|
425
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
303
426
|
});
|
|
304
427
|
const manager = new SubagentManager({
|
|
305
428
|
logger: createMockLogger(),
|
|
@@ -311,49 +434,42 @@ test.serial('explorer shell tool blocks write-like shell commands without creati
|
|
|
311
434
|
getSSHService: () => undefined,
|
|
312
435
|
},
|
|
313
436
|
});
|
|
314
|
-
await manager.run({ role:
|
|
437
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_INSPECT_TEMP_WORKSPACE });
|
|
315
438
|
const agent = explorerRunnerCalls[explorerRunnerCalls.length - 1].agent;
|
|
316
439
|
const shell = getAgentTool(agent, 'shell');
|
|
317
|
-
|
|
318
|
-
const
|
|
319
|
-
const cases = [
|
|
320
|
-
{ command: 'touch blocked-touch.txt', path: 'blocked-touch.txt' },
|
|
321
|
-
{ command: 'echo marker > blocked-redirect.txt', path: 'blocked-redirect.txt' },
|
|
322
|
-
{ command: 'cat source.txt > blocked-copy.txt', path: 'blocked-copy.txt' },
|
|
323
|
-
{ command: 'printf marker | tee blocked-tee.txt', path: 'blocked-tee.txt' },
|
|
324
|
-
];
|
|
325
|
-
for (const { command, path: relativePath } of cases) {
|
|
440
|
+
expect(shell).toBeTruthy();
|
|
441
|
+
for (const { command, path: relativePath } of TEMP_BLOCKED_CASES) {
|
|
326
442
|
const output = await shell.invoke({}, JSON.stringify({ command }), {});
|
|
327
|
-
|
|
328
|
-
|
|
443
|
+
expect(output.startsWith(EXPLORER_BLOCKED_PREFIX)).toBe(true);
|
|
444
|
+
expect(fs.existsSync(path.join(tmpDir, relativePath))).toBe(false);
|
|
329
445
|
}
|
|
330
446
|
});
|
|
331
|
-
|
|
447
|
+
it.sequential('run() with explorer role uses read-only tools only', async () => {
|
|
332
448
|
const settings = createMockSettings({
|
|
333
|
-
'agent.model':
|
|
334
|
-
'agent.provider':
|
|
449
|
+
'agent.model': MODEL_MOCK,
|
|
450
|
+
'agent.provider': PROVIDER_EXPLORER,
|
|
335
451
|
});
|
|
336
452
|
const manager = new SubagentManager({
|
|
337
453
|
logger: createMockLogger(),
|
|
338
454
|
settings,
|
|
339
455
|
sessionContextService: createSessionContextService(),
|
|
340
456
|
});
|
|
341
|
-
await manager.run({ role:
|
|
342
|
-
|
|
457
|
+
await manager.run({ role: ROLE_EXPLORER, task: TASK_FIND_FILES });
|
|
458
|
+
expect(explorerRunnerCalls.length).toBe(1);
|
|
343
459
|
const agent = explorerRunnerCalls[0].agent;
|
|
344
460
|
const toolNames = agent.tools.map((t) => t.name);
|
|
345
461
|
// Explorer should have read tools
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
462
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
463
|
+
expect(toolNames.includes('grep')).toBe(true);
|
|
464
|
+
expect(toolNames.includes('find_files')).toBe(true);
|
|
349
465
|
// Explorer should NOT have write tools
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
466
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
467
|
+
expect(toolNames.includes('search_replace')).toBe(false);
|
|
468
|
+
expect(toolNames.includes('create_file')).toBe(false);
|
|
353
469
|
// Explorer should NOT have web tools by default
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
470
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
471
|
+
expect(toolNames.includes('web_fetch')).toBe(false);
|
|
472
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
357
473
|
});
|
|
358
474
|
// ========== Researcher role ==========
|
|
359
475
|
let researcherRunnerCalls = [];
|
|
@@ -366,12 +482,13 @@ function ensureResearcherProviderRegistered() {
|
|
|
366
482
|
createRunner: () => ({
|
|
367
483
|
run: async (_agent, _input, _options) => {
|
|
368
484
|
researcherRunnerCalls.push({ agent: _agent });
|
|
369
|
-
|
|
485
|
+
const result = {
|
|
370
486
|
status: 'completed',
|
|
371
487
|
finalOutput: 'Research findings.',
|
|
372
488
|
history: [],
|
|
373
489
|
messages: [],
|
|
374
490
|
};
|
|
491
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
375
492
|
},
|
|
376
493
|
}),
|
|
377
494
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -379,11 +496,11 @@ function ensureResearcherProviderRegistered() {
|
|
|
379
496
|
researcherProviderRegistered = true;
|
|
380
497
|
}
|
|
381
498
|
}
|
|
382
|
-
|
|
499
|
+
beforeEach(() => {
|
|
383
500
|
researcherRunnerCalls = [];
|
|
384
501
|
ensureResearcherProviderRegistered();
|
|
385
502
|
});
|
|
386
|
-
|
|
503
|
+
it.sequential('run() with researcher role includes web tools', async () => {
|
|
387
504
|
const settings = createMockSettings({
|
|
388
505
|
'agent.model': 'mock-model',
|
|
389
506
|
'agent.provider': 'mock-researcher-provider',
|
|
@@ -394,15 +511,15 @@ test.serial('run() with researcher role includes web tools', async (t) => {
|
|
|
394
511
|
sessionContextService: createSessionContextService(),
|
|
395
512
|
});
|
|
396
513
|
await manager.run({ role: 'researcher', task: 'look up the latest TypeScript release' });
|
|
397
|
-
|
|
514
|
+
expect(researcherRunnerCalls.length).toBe(1);
|
|
398
515
|
const agent = researcherRunnerCalls[0].agent;
|
|
399
516
|
const toolNames = agent.tools.map((t) => t.name);
|
|
400
517
|
// Researcher should have read and web tools
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
518
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
519
|
+
expect(toolNames.includes('web_search')).toBe(true);
|
|
520
|
+
expect(toolNames.includes('web_fetch')).toBe(true);
|
|
404
521
|
// But not write tools
|
|
405
|
-
|
|
522
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
406
523
|
});
|
|
407
524
|
// ========== Worker role ==========
|
|
408
525
|
let workerRunnerCalls = [];
|
|
@@ -415,12 +532,13 @@ function ensureWorkerProviderRegistered() {
|
|
|
415
532
|
createRunner: () => ({
|
|
416
533
|
run: async (_agent, _input, _options) => {
|
|
417
534
|
workerRunnerCalls.push({ agent: _agent });
|
|
418
|
-
|
|
535
|
+
const result = {
|
|
419
536
|
status: 'completed',
|
|
420
537
|
finalOutput: 'Changes applied.',
|
|
421
538
|
history: [],
|
|
422
539
|
messages: [],
|
|
423
540
|
};
|
|
541
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
424
542
|
},
|
|
425
543
|
}),
|
|
426
544
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -428,11 +546,11 @@ function ensureWorkerProviderRegistered() {
|
|
|
428
546
|
workerProviderRegistered = true;
|
|
429
547
|
}
|
|
430
548
|
}
|
|
431
|
-
|
|
549
|
+
beforeEach(() => {
|
|
432
550
|
workerRunnerCalls = [];
|
|
433
551
|
ensureWorkerProviderRegistered();
|
|
434
552
|
});
|
|
435
|
-
|
|
553
|
+
it.sequential('run() with worker role includes write and shell tools for non-gpt model', async () => {
|
|
436
554
|
const settings = createMockSettings({
|
|
437
555
|
'agent.model': 'mock-model',
|
|
438
556
|
'agent.provider': 'mock-worker-provider',
|
|
@@ -443,19 +561,19 @@ test.serial('run() with worker role includes write and shell tools for non-gpt m
|
|
|
443
561
|
sessionContextService: createSessionContextService(),
|
|
444
562
|
});
|
|
445
563
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
446
|
-
|
|
564
|
+
expect(workerRunnerCalls.length).toBe(1);
|
|
447
565
|
const agent = workerRunnerCalls[0].agent;
|
|
448
566
|
const toolNames = agent.tools.map((t) => t.name);
|
|
449
567
|
// Worker should have read, non-gpt write tools, and shell
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
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);
|
|
454
572
|
// Should NOT have apply_patch or web tools
|
|
455
|
-
|
|
456
|
-
|
|
573
|
+
expect(toolNames.includes('apply_patch')).toBe(false);
|
|
574
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
457
575
|
});
|
|
458
|
-
|
|
576
|
+
it.sequential('run() with worker role includes write and shell tools for gpt model', async () => {
|
|
459
577
|
const settings = createMockSettings({
|
|
460
578
|
'agent.model': 'gpt-5',
|
|
461
579
|
'agent.provider': 'mock-worker-provider',
|
|
@@ -466,30 +584,80 @@ test.serial('run() with worker role includes write and shell tools for gpt model
|
|
|
466
584
|
sessionContextService: createSessionContextService(),
|
|
467
585
|
});
|
|
468
586
|
await manager.run({ role: 'worker', task: 'update the README.md file' });
|
|
469
|
-
|
|
587
|
+
expect(workerRunnerCalls.length).toBe(1);
|
|
470
588
|
const agent = workerRunnerCalls[0].agent;
|
|
471
589
|
const toolNames = agent.tools.map((t) => t.name);
|
|
472
590
|
// Worker should have read, gpt write tools (apply_patch), and shell
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
591
|
+
expect(toolNames.includes('read_file')).toBe(true);
|
|
592
|
+
expect(toolNames.includes('apply_patch')).toBe(true);
|
|
593
|
+
expect(toolNames.includes('shell')).toBe(true);
|
|
476
594
|
// Should NOT have search_replace, create_file, or web tools
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
595
|
+
expect(toolNames.includes('search_replace')).toBe(false);
|
|
596
|
+
expect(toolNames.includes('create_file')).toBe(false);
|
|
597
|
+
expect(toolNames.includes('web_search')).toBe(false);
|
|
480
598
|
});
|
|
481
|
-
|
|
599
|
+
it.sequential('run() result contains agentId and correct role', async () => {
|
|
482
600
|
const settings = createMockSettings({
|
|
483
601
|
'agent.model': 'mock-model',
|
|
484
602
|
'agent.provider': 'mock-worker-provider',
|
|
485
603
|
});
|
|
486
604
|
const manager = new SubagentManager({ logger: createMockLogger(), settings });
|
|
487
605
|
const result = await manager.run({ role: 'worker', task: 'do some work' });
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
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);
|
|
493
661
|
});
|
|
494
662
|
// ========== Write boundary enforcement ==========
|
|
495
663
|
let boundaryWorkerCalls = [];
|
|
@@ -502,12 +670,13 @@ function ensureBoundaryWorkerProviderRegistered() {
|
|
|
502
670
|
createRunner: () => ({
|
|
503
671
|
run: async (_agent, _input, _options) => {
|
|
504
672
|
boundaryWorkerCalls.push({ agent: _agent });
|
|
505
|
-
|
|
673
|
+
const result = {
|
|
506
674
|
status: 'completed',
|
|
507
675
|
finalOutput: 'Done.',
|
|
508
676
|
history: [],
|
|
509
677
|
messages: [],
|
|
510
678
|
};
|
|
679
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
511
680
|
},
|
|
512
681
|
}),
|
|
513
682
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -515,13 +684,13 @@ function ensureBoundaryWorkerProviderRegistered() {
|
|
|
515
684
|
boundaryWorkerRegistered = true;
|
|
516
685
|
}
|
|
517
686
|
}
|
|
518
|
-
|
|
687
|
+
beforeEach(() => {
|
|
519
688
|
boundaryWorkerCalls = [];
|
|
520
689
|
ensureBoundaryWorkerProviderRegistered();
|
|
521
690
|
});
|
|
522
|
-
|
|
691
|
+
it.sequential('worker write tool rejects paths outside workspace', async () => {
|
|
523
692
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-boundary-'));
|
|
524
|
-
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;
|
|
525
694
|
const mockExecutionContext = {
|
|
526
695
|
getCwd: () => tmpDir,
|
|
527
696
|
isRemote: () => false,
|
|
@@ -541,35 +710,33 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
541
710
|
role: 'worker',
|
|
542
711
|
task: 'update a file',
|
|
543
712
|
});
|
|
544
|
-
|
|
713
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
545
714
|
const agentGpt = boundaryWorkerCalls[0].agent;
|
|
546
715
|
const applyPatch = agentGpt.tools.find((t) => t.name === 'apply_patch');
|
|
547
|
-
|
|
548
|
-
|
|
716
|
+
expect(applyPatch).toBeTruthy();
|
|
717
|
+
expect(agentGpt.tools.find((t) => t.name === 'search_replace')).toBeFalsy();
|
|
549
718
|
// Call with a path inside the boundary — should NOT be rejected for boundary violation
|
|
550
719
|
const insideResult = await applyPatch.invoke({}, JSON.stringify({
|
|
551
720
|
type: 'create_file',
|
|
552
721
|
path: 'newfile.ts',
|
|
553
722
|
diff: '+hello\n',
|
|
554
723
|
}), {});
|
|
555
|
-
const
|
|
556
|
-
|
|
557
|
-
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);
|
|
558
726
|
// Call with a path outside the boundary — should be rejected
|
|
559
727
|
const outsideResult = await applyPatch.invoke({}, JSON.stringify({
|
|
560
728
|
type: 'create_file',
|
|
561
729
|
path: '../outside/file.ts',
|
|
562
730
|
diff: '+hello\n',
|
|
563
731
|
}), {});
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
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);
|
|
567
734
|
const outsideNeedsApproval = await applyPatch.needsApproval({}, {
|
|
568
735
|
type: 'create_file',
|
|
569
736
|
path: '../outside/file.ts',
|
|
570
737
|
diff: '+hello\n',
|
|
571
738
|
});
|
|
572
|
-
|
|
739
|
+
expect(outsideNeedsApproval).toBe(false);
|
|
573
740
|
// 2. Test search_replace tool under non-gpt model
|
|
574
741
|
const settingsNonGpt = createMockSettings({
|
|
575
742
|
'agent.model': 'mock-model',
|
|
@@ -585,11 +752,11 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
585
752
|
role: 'worker',
|
|
586
753
|
task: 'update a file',
|
|
587
754
|
});
|
|
588
|
-
|
|
755
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
589
756
|
const agentNonGpt = boundaryWorkerCalls[0].agent;
|
|
590
757
|
const searchReplace = agentNonGpt.tools.find((t) => t.name === 'search_replace');
|
|
591
|
-
|
|
592
|
-
|
|
758
|
+
expect(searchReplace).toBeTruthy();
|
|
759
|
+
expect(agentNonGpt.tools.find((t) => t.name === 'apply_patch')).toBeFalsy();
|
|
593
760
|
const batchOutsideResult = await searchReplace.invoke({}, JSON.stringify({
|
|
594
761
|
path: '../outside.ts',
|
|
595
762
|
replacements: [
|
|
@@ -599,13 +766,12 @@ test.serial('worker write tool rejects paths outside workspace', async (t) => {
|
|
|
599
766
|
},
|
|
600
767
|
],
|
|
601
768
|
}), {});
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
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);
|
|
605
771
|
});
|
|
606
|
-
|
|
772
|
+
it.sequential('worker writes are auto-approved within the workspace', async () => {
|
|
607
773
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-approval-'));
|
|
608
|
-
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;
|
|
609
775
|
const mockExecutionContext = {
|
|
610
776
|
getCwd: () => tmpDir,
|
|
611
777
|
isRemote: () => false,
|
|
@@ -625,23 +791,23 @@ test.serial('worker writes are auto-approved within the workspace', async (t) =>
|
|
|
625
791
|
role: 'worker',
|
|
626
792
|
task: 'update files',
|
|
627
793
|
});
|
|
628
|
-
|
|
794
|
+
expect(boundaryWorkerCalls.length).toBe(1);
|
|
629
795
|
const agent = boundaryWorkerCalls[0].agent;
|
|
630
796
|
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
631
|
-
|
|
797
|
+
expect(createFile).toBeTruthy();
|
|
632
798
|
// In-boundary writes require no interactive approval (there is no foreground
|
|
633
799
|
// approval channel for a subagent running inside a blocked parent tool call).
|
|
634
800
|
// Standard mode is off but the write still does not need approval.
|
|
635
801
|
const inBoundaryNeedsApproval = await createFile.needsApproval({}, { path: 'a.ts', content: 'x' });
|
|
636
|
-
|
|
802
|
+
expect(inBoundaryNeedsApproval).toBe(false);
|
|
637
803
|
// Out-of-boundary writes are also not surfaced for approval; they are
|
|
638
804
|
// rejected deterministically by execute() instead.
|
|
639
805
|
const outBoundaryNeedsApproval = await createFile.needsApproval({}, { path: '../escape.ts', content: 'x' });
|
|
640
|
-
|
|
806
|
+
expect(outBoundaryNeedsApproval).toBe(false);
|
|
641
807
|
});
|
|
642
|
-
|
|
808
|
+
it.sequential('worker cannot write outside the workspace', async () => {
|
|
643
809
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-default-boundary-'));
|
|
644
|
-
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;
|
|
645
811
|
const mockExecutionContext = {
|
|
646
812
|
getCwd: () => tmpDir,
|
|
647
813
|
isRemote: () => false,
|
|
@@ -660,15 +826,14 @@ test.serial('worker cannot write outside the workspace', async (t) => {
|
|
|
660
826
|
await manager.run({ role: 'worker', task: 'update a file' });
|
|
661
827
|
const agent = boundaryWorkerCalls[boundaryWorkerCalls.length - 1].agent;
|
|
662
828
|
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
663
|
-
|
|
829
|
+
expect(createFile).toBeTruthy();
|
|
664
830
|
const outsideResult = await createFile.invoke({}, JSON.stringify({ path: '../outside.ts', content: 'x' }), {});
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
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);
|
|
668
833
|
});
|
|
669
|
-
|
|
834
|
+
it.sequential('worker filesChanged tracks only successful writes for batch operations', async () => {
|
|
670
835
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-files-changed-'));
|
|
671
|
-
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;
|
|
672
837
|
registerProvider({
|
|
673
838
|
id: 'mock-worker-files-changed-provider',
|
|
674
839
|
label: 'Mock Worker Files Changed Provider',
|
|
@@ -694,12 +859,13 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
694
859
|
replacements: [{ search_content: 'x', replace_content: 'y' }],
|
|
695
860
|
}), {});
|
|
696
861
|
}
|
|
697
|
-
|
|
862
|
+
const result = {
|
|
698
863
|
status: 'completed',
|
|
699
864
|
finalOutput: 'Done.',
|
|
700
865
|
history: [],
|
|
701
866
|
messages: [],
|
|
702
867
|
};
|
|
868
|
+
return wrapResultAsAgentStream(result);
|
|
703
869
|
},
|
|
704
870
|
}),
|
|
705
871
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -718,7 +884,7 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
718
884
|
},
|
|
719
885
|
});
|
|
720
886
|
const resultGpt = await managerGpt.run({ role: 'worker', task: 'do mixed writes' });
|
|
721
|
-
|
|
887
|
+
expect(new Set(resultGpt.filesChanged)).toEqual(new Set(['a.txt']));
|
|
722
888
|
// 2. Test with non-GPT-5 model (using search_replace)
|
|
723
889
|
const managerNonGpt = new SubagentManager({
|
|
724
890
|
logger: createMockLogger(),
|
|
@@ -733,11 +899,11 @@ test.serial('worker filesChanged tracks only successful writes for batch operati
|
|
|
733
899
|
},
|
|
734
900
|
});
|
|
735
901
|
const resultNonGpt = await managerNonGpt.run({ role: 'worker', task: 'do mixed writes' });
|
|
736
|
-
|
|
902
|
+
expect(new Set(resultNonGpt.filesChanged)).toEqual(new Set(['b.txt']));
|
|
737
903
|
});
|
|
738
|
-
|
|
904
|
+
it.sequential('worker write lock rejects concurrent create_file for same path without waiting', async () => {
|
|
739
905
|
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-worker-lock-'));
|
|
740
|
-
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;
|
|
741
907
|
registerProvider({
|
|
742
908
|
id: 'mock-worker-lock-provider',
|
|
743
909
|
label: 'Mock Worker Lock Provider',
|
|
@@ -754,12 +920,13 @@ test.serial('worker write lock rejects concurrent create_file for same path with
|
|
|
754
920
|
content: 'two',
|
|
755
921
|
}), {}),
|
|
756
922
|
]);
|
|
757
|
-
|
|
923
|
+
const result = {
|
|
758
924
|
status: 'completed',
|
|
759
925
|
finalOutput: JSON.stringify({ first, second }),
|
|
760
926
|
history: [],
|
|
761
927
|
messages: [],
|
|
762
928
|
};
|
|
929
|
+
return wrapResultAsAgentStream(result);
|
|
763
930
|
},
|
|
764
931
|
}),
|
|
765
932
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -778,15 +945,15 @@ test.serial('worker write lock rejects concurrent create_file for same path with
|
|
|
778
945
|
});
|
|
779
946
|
const result = await manager.run({ role: 'worker', task: 'concurrent writes' });
|
|
780
947
|
const parsed = JSON.parse(result.finalText);
|
|
781
|
-
const first =
|
|
782
|
-
const second =
|
|
783
|
-
const allErrors = [first
|
|
784
|
-
.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:'))
|
|
785
952
|
.join(' ');
|
|
786
|
-
|
|
953
|
+
expect(allErrors.includes('already being modified')).toBe(true);
|
|
787
954
|
});
|
|
788
955
|
// ========== Session isolation ==========
|
|
789
|
-
|
|
956
|
+
it.sequential('run() creates isolated sessions for each subagent call', async () => {
|
|
790
957
|
const settings = createMockSettings({
|
|
791
958
|
'agent.model': 'mock-model',
|
|
792
959
|
'agent.provider': 'mock-explorer-provider',
|
|
@@ -796,9 +963,9 @@ test.serial('run() creates isolated sessions for each subagent call', async (t)
|
|
|
796
963
|
manager.run({ role: 'explorer', task: 'task 1' }),
|
|
797
964
|
manager.run({ role: 'explorer', task: 'task 2' }),
|
|
798
965
|
]);
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
966
|
+
expect(result1.status).toBe('completed');
|
|
967
|
+
expect(result2.status).toBe('completed');
|
|
968
|
+
expect(result1.agentId).not.toBe(result2.agentId);
|
|
802
969
|
});
|
|
803
970
|
// ========== Real-time events ==========
|
|
804
971
|
let eventToolProviderRegistered = false;
|
|
@@ -817,7 +984,8 @@ function ensureEventToolProviderRegistered() {
|
|
|
817
984
|
// Tool execution may fail (missing file); we only care that the
|
|
818
985
|
// tool-started event fired before execution.
|
|
819
986
|
}
|
|
820
|
-
|
|
987
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
988
|
+
return wrapResultAsAgentStream(result);
|
|
821
989
|
},
|
|
822
990
|
}),
|
|
823
991
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -825,7 +993,7 @@ function ensureEventToolProviderRegistered() {
|
|
|
825
993
|
eventToolProviderRegistered = true;
|
|
826
994
|
}
|
|
827
995
|
}
|
|
828
|
-
|
|
996
|
+
it.sequential('run() emits started and completed events', async () => {
|
|
829
997
|
ensureEventToolProviderRegistered();
|
|
830
998
|
const settings = createMockSettings({
|
|
831
999
|
'agent.model': 'mock-model',
|
|
@@ -840,20 +1008,15 @@ test.serial('run() emits started, tool_started and completed events', async (t)
|
|
|
840
1008
|
});
|
|
841
1009
|
const result = await manager.run({ role: 'explorer', task: 'search the code' });
|
|
842
1010
|
const started = events.find((e) => e.type === 'subagent_started');
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
const toolStarted = events.find((e) => e.type === 'subagent_tool_started');
|
|
848
|
-
t.truthy(toolStarted);
|
|
849
|
-
t.is(toolStarted.toolName, 'read_file');
|
|
850
|
-
t.is(toolStarted.agentId, result.agentId);
|
|
851
|
-
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);
|
|
852
1015
|
const completed = events.find((e) => e.type === 'subagent_completed');
|
|
853
|
-
|
|
854
|
-
|
|
1016
|
+
expect(completed).toBeTruthy();
|
|
1017
|
+
expect(completed.result.agentId).toBe(result.agentId);
|
|
855
1018
|
});
|
|
856
|
-
|
|
1019
|
+
it.sequential('run() emits a completed event even when the role is unknown', async () => {
|
|
857
1020
|
const settings = createMockSettings({ 'agent.model': 'mock-model' });
|
|
858
1021
|
const events = [];
|
|
859
1022
|
const manager = new SubagentManager({
|
|
@@ -863,13 +1026,13 @@ test.serial('run() emits a completed event even when the role is unknown', async
|
|
|
863
1026
|
onEvent: (event) => events.push(event),
|
|
864
1027
|
});
|
|
865
1028
|
await manager.run({ role: 'definitely-not-a-role', task: 'x' });
|
|
866
|
-
|
|
1029
|
+
expect(events.find((e) => e.type === 'subagent_started')).toBeTruthy();
|
|
867
1030
|
const completed = events.find((e) => e.type === 'subagent_completed');
|
|
868
|
-
|
|
869
|
-
|
|
1031
|
+
expect(completed).toBeTruthy();
|
|
1032
|
+
expect(completed.result.status).toBe('failed');
|
|
870
1033
|
});
|
|
871
1034
|
// ========== Mentor role definition sourced from markdown ==========
|
|
872
|
-
|
|
1035
|
+
it.sequential('mentor base instructions come from the mentor role markdown', async () => {
|
|
873
1036
|
const settings = createMockSettings({
|
|
874
1037
|
'agent.model': 'main-model',
|
|
875
1038
|
'agent.provider': 'mock-mentor-manager',
|
|
@@ -883,14 +1046,14 @@ test.serial('mentor base instructions come from the mentor role markdown', async
|
|
|
883
1046
|
sessionContextService: createSessionContextService(),
|
|
884
1047
|
});
|
|
885
1048
|
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
886
|
-
|
|
1049
|
+
expect(mentorManagerRunnerCalls.length).toBe(1);
|
|
887
1050
|
const instructions = mentorManagerRunnerCalls[0].agent.instructions;
|
|
888
1051
|
// Dynamically load the mentor role markdown to verify integration without brittle hardcoding
|
|
889
1052
|
const mentorPath = path.join(import.meta.dirname, '../../../source/prompts/subagents/mentor.md');
|
|
890
1053
|
const mentorContent = fs.readFileSync(mentorPath, 'utf-8');
|
|
891
1054
|
const parts = mentorContent.split('---');
|
|
892
1055
|
const expectedBody = parts[parts.length - 1].trim();
|
|
893
|
-
|
|
1056
|
+
expect(instructions.includes(expectedBody)).toBe(true);
|
|
894
1057
|
});
|
|
895
1058
|
// ========== finalText excludes pre-tool narration ==========
|
|
896
1059
|
let postToolProviderRegistered = false;
|
|
@@ -900,24 +1063,28 @@ function ensurePostToolProviderRegistered() {
|
|
|
900
1063
|
id: 'mock-post-tool-provider',
|
|
901
1064
|
label: 'Mock Post Tool Provider',
|
|
902
1065
|
createRunner: () => ({
|
|
903
|
-
run: async () =>
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
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
|
+
},
|
|
914
1081
|
}),
|
|
915
1082
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
916
1083
|
});
|
|
917
1084
|
postToolProviderRegistered = true;
|
|
918
1085
|
}
|
|
919
1086
|
}
|
|
920
|
-
|
|
1087
|
+
it.sequential('finalText is the assistant message after the last tool item', async () => {
|
|
921
1088
|
ensurePostToolProviderRegistered();
|
|
922
1089
|
const settings = createMockSettings({
|
|
923
1090
|
'agent.model': 'mock-model',
|
|
@@ -929,30 +1096,31 @@ test.serial('finalText is the assistant message after the last tool item', async
|
|
|
929
1096
|
sessionContextService: createSessionContextService(),
|
|
930
1097
|
});
|
|
931
1098
|
const result = await manager.run({ role: 'explorer', task: 'where is it' });
|
|
932
|
-
|
|
933
|
-
|
|
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);
|
|
934
1101
|
});
|
|
935
1102
|
// ========== Worker shell tool — safety gating ==========
|
|
936
|
-
|
|
1103
|
+
it.sequential('worker shell tool executes safe command without triggering approval UI', async () => {
|
|
937
1104
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-safe-'));
|
|
938
|
-
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;
|
|
939
1106
|
let shellResult = null;
|
|
940
1107
|
registerProvider({
|
|
941
1108
|
id: 'mock-worker-shell-safe-provider',
|
|
942
1109
|
label: 'Mock Worker Shell Safe Provider',
|
|
943
1110
|
createRunner: () => ({
|
|
944
|
-
run: async (agent) => {
|
|
1111
|
+
run: async (agent, _input, _options) => {
|
|
945
1112
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
946
1113
|
// needsApproval must be false for safe commands — no approval UI in workers
|
|
947
1114
|
const needsApproval = await shellTool.needsApproval({}, { command: 'ls .' });
|
|
948
|
-
|
|
1115
|
+
expect(needsApproval, 'worker shell tool must never require approval').toBe(false);
|
|
949
1116
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'echo hello' }), {});
|
|
950
|
-
|
|
1117
|
+
const result = {
|
|
951
1118
|
status: 'completed',
|
|
952
1119
|
finalOutput: 'done',
|
|
953
1120
|
history: [],
|
|
954
1121
|
messages: [],
|
|
955
1122
|
};
|
|
1123
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
956
1124
|
},
|
|
957
1125
|
}),
|
|
958
1126
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -972,29 +1140,30 @@ test.serial('worker shell tool executes safe command without triggering approval
|
|
|
972
1140
|
});
|
|
973
1141
|
await manager.run({ role: 'worker', task: 'list files' });
|
|
974
1142
|
// The shell tool should have executed and returned output (not an error block)
|
|
975
|
-
|
|
976
|
-
|
|
1143
|
+
expect(shellResult).toBeTruthy();
|
|
1144
|
+
expect(shellResult.includes('blocked for safety')).toBe(false);
|
|
977
1145
|
});
|
|
978
|
-
|
|
1146
|
+
it.sequential('worker shell tool blocks dangerous/destructive commands and returns error string', async () => {
|
|
979
1147
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-dangerous-'));
|
|
980
|
-
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;
|
|
981
1149
|
let shellResult = null;
|
|
982
1150
|
registerProvider({
|
|
983
1151
|
id: 'mock-worker-shell-dangerous-provider',
|
|
984
1152
|
label: 'Mock Worker Shell Dangerous Provider',
|
|
985
1153
|
createRunner: () => ({
|
|
986
|
-
run: async (agent) => {
|
|
1154
|
+
run: async (agent, _input, _options) => {
|
|
987
1155
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
988
1156
|
// needsApproval must always be false — dangerous commands are blocked by execute(), not approval
|
|
989
1157
|
const needsApproval = await shellTool.needsApproval({}, { command: 'rm -rf /tmp/something' });
|
|
990
|
-
|
|
1158
|
+
expect(needsApproval, 'worker shell must never trigger approval UI even for dangerous commands').toBe(false);
|
|
991
1159
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'rm -rf /tmp/something' }), {});
|
|
992
|
-
|
|
1160
|
+
const result = {
|
|
993
1161
|
status: 'completed',
|
|
994
1162
|
finalOutput: 'done',
|
|
995
1163
|
history: [],
|
|
996
1164
|
messages: [],
|
|
997
1165
|
};
|
|
1166
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
998
1167
|
},
|
|
999
1168
|
}),
|
|
1000
1169
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1014,13 +1183,13 @@ test.serial('worker shell tool blocks dangerous/destructive commands and returns
|
|
|
1014
1183
|
});
|
|
1015
1184
|
await manager.run({ role: 'worker', task: 'delete stuff' });
|
|
1016
1185
|
// The shell tool should have returned a blocked-for-safety error string, not executed
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1186
|
+
expect(shellResult).toBeTruthy();
|
|
1187
|
+
expect(shellResult.includes('blocked for safety')).toBe(true);
|
|
1188
|
+
expect(shellResult.includes('exit 0')).toBe(false);
|
|
1020
1189
|
});
|
|
1021
|
-
|
|
1190
|
+
it.sequential('worker shell tool allows YELLOW command when auto-approval evaluator approves', async () => {
|
|
1022
1191
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-yellow-ok-'));
|
|
1023
|
-
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;
|
|
1024
1193
|
let shellResult = null;
|
|
1025
1194
|
let chatCalls = 0;
|
|
1026
1195
|
let evaluatorPrompt = '';
|
|
@@ -1028,15 +1197,16 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
1028
1197
|
id: 'mock-worker-shell-yellow-approved-provider',
|
|
1029
1198
|
label: 'Mock Worker Shell Yellow Approved Provider',
|
|
1030
1199
|
createRunner: () => ({
|
|
1031
|
-
run: async (agent) => {
|
|
1200
|
+
run: async (agent, _input, _options) => {
|
|
1032
1201
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
1033
1202
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'npm run test:verbose -- --help' }), {});
|
|
1034
|
-
|
|
1203
|
+
const result = {
|
|
1035
1204
|
status: 'completed',
|
|
1036
1205
|
finalOutput: 'done',
|
|
1037
1206
|
history: [],
|
|
1038
1207
|
messages: [],
|
|
1039
1208
|
};
|
|
1209
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
1040
1210
|
},
|
|
1041
1211
|
}),
|
|
1042
1212
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1065,29 +1235,30 @@ test.serial('worker shell tool allows YELLOW command when auto-approval evaluato
|
|
|
1065
1235
|
},
|
|
1066
1236
|
});
|
|
1067
1237
|
await manager.run({ role: 'worker', task: 'run help for tests in this repository' });
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
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);
|
|
1072
1242
|
});
|
|
1073
|
-
|
|
1243
|
+
it.sequential('worker shell tool blocks YELLOW command when auto-approval evaluator rejects', async () => {
|
|
1074
1244
|
const tmpDir = fs.mkdtempSync(path.join(process.env['TMPDIR'] ?? '/tmp', 'term2-test-worker-shell-yellow-no-'));
|
|
1075
|
-
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;
|
|
1076
1246
|
let shellResult = null;
|
|
1077
1247
|
let chatCalls = 0;
|
|
1078
1248
|
registerProvider({
|
|
1079
1249
|
id: 'mock-worker-shell-yellow-rejected-provider',
|
|
1080
1250
|
label: 'Mock Worker Shell Yellow Rejected Provider',
|
|
1081
1251
|
createRunner: () => ({
|
|
1082
|
-
run: async (agent) => {
|
|
1252
|
+
run: async (agent, _input, _options) => {
|
|
1083
1253
|
const shellTool = agent.tools.find((tool) => tool.name === 'shell');
|
|
1084
1254
|
shellResult = await shellTool.invoke({}, JSON.stringify({ command: 'npm run test:verbose -- --help' }), {});
|
|
1085
|
-
|
|
1255
|
+
const result = {
|
|
1086
1256
|
status: 'completed',
|
|
1087
1257
|
finalOutput: 'done',
|
|
1088
1258
|
history: [],
|
|
1089
1259
|
messages: [],
|
|
1090
1260
|
};
|
|
1261
|
+
return _options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
1091
1262
|
},
|
|
1092
1263
|
}),
|
|
1093
1264
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1115,11 +1286,11 @@ test.serial('worker shell tool blocks YELLOW command when auto-approval evaluato
|
|
|
1115
1286
|
},
|
|
1116
1287
|
});
|
|
1117
1288
|
await manager.run({ role: 'worker', task: 'run help for tests' });
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1289
|
+
expect(chatCalls).toBe(1);
|
|
1290
|
+
expect(shellResult).toBeTruthy();
|
|
1291
|
+
expect(shellResult.includes('blocked for safety')).toBe(true);
|
|
1121
1292
|
});
|
|
1122
|
-
|
|
1293
|
+
it.sequential('run() extracts usage from error.state.usage when subagent run fails', async () => {
|
|
1123
1294
|
registerProvider({
|
|
1124
1295
|
id: 'mock-failed-usage-provider',
|
|
1125
1296
|
label: 'Mock Failed Usage Provider',
|
|
@@ -1150,15 +1321,15 @@ test.serial('run() extracts usage from error.state.usage when subagent run fails
|
|
|
1150
1321
|
role: 'explorer',
|
|
1151
1322
|
task: 'find files',
|
|
1152
1323
|
});
|
|
1153
|
-
|
|
1154
|
-
|
|
1324
|
+
expect(result.status).toBe('failed');
|
|
1325
|
+
expect(result.usage).toEqual({
|
|
1155
1326
|
prompt_tokens: 15,
|
|
1156
1327
|
completion_tokens: 25,
|
|
1157
1328
|
total_tokens: 40,
|
|
1158
1329
|
});
|
|
1159
1330
|
});
|
|
1160
1331
|
// ========== Model error retry ==========
|
|
1161
|
-
|
|
1332
|
+
it.sequential('run() retries on recoverable model error (hallucinated tool) and succeeds on second attempt', async () => {
|
|
1162
1333
|
let runCount = 0;
|
|
1163
1334
|
const events = [];
|
|
1164
1335
|
const logWarnCalls = [];
|
|
@@ -1169,14 +1340,15 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
|
|
|
1169
1340
|
run: async () => {
|
|
1170
1341
|
runCount++;
|
|
1171
1342
|
if (runCount === 1) {
|
|
1172
|
-
|
|
1343
|
+
return wrapErrorAsAgentStream(new ModelBehaviorError('Tool bash not found in agent Explorer.'));
|
|
1173
1344
|
}
|
|
1174
|
-
|
|
1345
|
+
const result = {
|
|
1175
1346
|
status: 'completed',
|
|
1176
1347
|
finalOutput: 'Success on retry',
|
|
1177
1348
|
history: [],
|
|
1178
1349
|
messages: [],
|
|
1179
1350
|
};
|
|
1351
|
+
return wrapResultAsAgentStream(result);
|
|
1180
1352
|
},
|
|
1181
1353
|
}),
|
|
1182
1354
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1197,18 +1369,18 @@ test.serial('run() retries on recoverable model error (hallucinated tool) and su
|
|
|
1197
1369
|
onEvent: (event) => events.push(event),
|
|
1198
1370
|
});
|
|
1199
1371
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1200
|
-
|
|
1201
|
-
|
|
1372
|
+
expect(result.status).toBe('completed');
|
|
1373
|
+
expect(runCount).toBe(2);
|
|
1202
1374
|
const retryEvent = events.find((e) => e.type === 'retry');
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
const retryLog = logWarnCalls.find((c) => c.meta?.eventType === 'retry.
|
|
1209
|
-
|
|
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();
|
|
1210
1382
|
});
|
|
1211
|
-
|
|
1383
|
+
it.sequential('run() exhausts retries on repeated recoverable model errors and returns failed result', async () => {
|
|
1212
1384
|
let runCount = 0;
|
|
1213
1385
|
const events = [];
|
|
1214
1386
|
registerProvider({
|
|
@@ -1217,7 +1389,7 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
|
|
|
1217
1389
|
createRunner: () => ({
|
|
1218
1390
|
run: async () => {
|
|
1219
1391
|
runCount++;
|
|
1220
|
-
|
|
1392
|
+
return wrapErrorAsAgentStream(new ModelBehaviorError('Tool bash not found in agent Explorer.'));
|
|
1221
1393
|
},
|
|
1222
1394
|
}),
|
|
1223
1395
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1233,15 +1405,15 @@ test.serial('run() exhausts retries on repeated recoverable model errors and ret
|
|
|
1233
1405
|
onEvent: (event) => events.push(event),
|
|
1234
1406
|
});
|
|
1235
1407
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
// Should have tried: initial + MAX_SUBAGENT_MODEL_RETRIES
|
|
1240
|
-
|
|
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);
|
|
1241
1413
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1242
|
-
|
|
1414
|
+
expect(retryEvents.length, 'should emit one retry event per retry attempt').toBe(MAX_SUBAGENT_MODEL_RETRIES);
|
|
1243
1415
|
});
|
|
1244
|
-
|
|
1416
|
+
it.sequential('run() does not retry on non-recoverable ModelBehaviorError', async () => {
|
|
1245
1417
|
let runCount = 0;
|
|
1246
1418
|
const events = [];
|
|
1247
1419
|
registerProvider({
|
|
@@ -1266,12 +1438,12 @@ test.serial('run() does not retry on non-recoverable ModelBehaviorError', async
|
|
|
1266
1438
|
onEvent: (event) => events.push(event),
|
|
1267
1439
|
});
|
|
1268
1440
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1269
|
-
|
|
1270
|
-
|
|
1441
|
+
expect(result.status).toBe('failed');
|
|
1442
|
+
expect(runCount, 'no retry should be attempted').toBe(1);
|
|
1271
1443
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1272
|
-
|
|
1444
|
+
expect(retryEvents.length).toBe(0);
|
|
1273
1445
|
});
|
|
1274
|
-
|
|
1446
|
+
it.sequential('run() aborted subagent returns cancelled status without model-error retry', async () => {
|
|
1275
1447
|
const events = [];
|
|
1276
1448
|
registerProvider({
|
|
1277
1449
|
id: 'mock-abort-no-retry-provider',
|
|
@@ -1296,99 +1468,13 @@ test.serial('run() aborted subagent returns cancelled status without model-error
|
|
|
1296
1468
|
onEvent: (event) => events.push(event),
|
|
1297
1469
|
});
|
|
1298
1470
|
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1299
|
-
|
|
1471
|
+
expect(result.status).toBe('cancelled');
|
|
1300
1472
|
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1301
|
-
|
|
1302
|
-
});
|
|
1303
|
-
test.serial('run() retries on transient upstream error via executeWithRetry', async (t) => {
|
|
1304
|
-
let runCount = 0;
|
|
1305
|
-
const logWarnCalls = [];
|
|
1306
|
-
registerProvider({
|
|
1307
|
-
id: 'mock-transient-retry-provider',
|
|
1308
|
-
label: 'Mock Transient Retry Provider',
|
|
1309
|
-
createRunner: () => ({
|
|
1310
|
-
run: async () => {
|
|
1311
|
-
runCount++;
|
|
1312
|
-
if (runCount === 1) {
|
|
1313
|
-
const err = new Error('rate limit');
|
|
1314
|
-
err.status = 429;
|
|
1315
|
-
err.headers = { 'retry-after': '0' };
|
|
1316
|
-
throw err;
|
|
1317
|
-
}
|
|
1318
|
-
return {
|
|
1319
|
-
status: 'completed',
|
|
1320
|
-
finalOutput: 'Success after upstream retry',
|
|
1321
|
-
history: [],
|
|
1322
|
-
messages: [],
|
|
1323
|
-
};
|
|
1324
|
-
},
|
|
1325
|
-
}),
|
|
1326
|
-
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1327
|
-
});
|
|
1328
|
-
const manager = new SubagentManager({
|
|
1329
|
-
logger: {
|
|
1330
|
-
...createMockLogger(),
|
|
1331
|
-
warn: (msg, meta) => {
|
|
1332
|
-
logWarnCalls.push({ msg, meta });
|
|
1333
|
-
},
|
|
1334
|
-
},
|
|
1335
|
-
settings: createMockSettings({
|
|
1336
|
-
'agent.model': 'mock-model',
|
|
1337
|
-
'agent.provider': 'mock-transient-retry-provider',
|
|
1338
|
-
'agent.retryAttempts': 2,
|
|
1339
|
-
}),
|
|
1340
|
-
sessionContextService: createSessionContextService(),
|
|
1341
|
-
});
|
|
1342
|
-
const result = await manager.run({ role: 'explorer', task: 'find all files' });
|
|
1343
|
-
t.is(result.status, 'completed');
|
|
1344
|
-
t.is(runCount, 2, 'should have retried once after transient error');
|
|
1345
|
-
const upstreamRetry = logWarnCalls.find((c) => c.meta?.eventType === 'retry.upstream');
|
|
1346
|
-
t.truthy(upstreamRetry, 'should log upstream retry');
|
|
1473
|
+
expect(retryEvents.length, 'abort errors should not trigger model-error retries').toBe(0);
|
|
1347
1474
|
});
|
|
1348
|
-
|
|
1475
|
+
it.sequential('run() does not restart read-only subagent from the beginning after a recoverable model error', async () => {
|
|
1349
1476
|
let runCount = 0;
|
|
1350
1477
|
const events = [];
|
|
1351
|
-
registerProvider({
|
|
1352
|
-
id: 'mock-write-then-crash-provider',
|
|
1353
|
-
label: 'Mock Write Then Crash Provider',
|
|
1354
|
-
createRunner: () => ({
|
|
1355
|
-
run: async (agent) => {
|
|
1356
|
-
runCount++;
|
|
1357
|
-
// Invoke a write tool before crashing with a recoverable model error
|
|
1358
|
-
const createFile = agent.tools.find((tool) => tool.name === 'create_file');
|
|
1359
|
-
if (createFile) {
|
|
1360
|
-
await createFile.invoke({}, JSON.stringify({ path: 'touched.ts', content: 'x' }), {});
|
|
1361
|
-
}
|
|
1362
|
-
throw new ModelBehaviorError('Tool bash not found in agent Worker.');
|
|
1363
|
-
},
|
|
1364
|
-
}),
|
|
1365
|
-
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1366
|
-
});
|
|
1367
|
-
const tmpDir = fs.mkdtempSync(path.join('/tmp', 'term2-test-write-then-crash-'));
|
|
1368
|
-
t.teardown(() => fs.rmSync(tmpDir, { recursive: true, force: true }));
|
|
1369
|
-
const manager = new SubagentManager({
|
|
1370
|
-
logger: createMockLogger(),
|
|
1371
|
-
settings: createMockSettings({
|
|
1372
|
-
'agent.model': 'mock-model',
|
|
1373
|
-
'agent.provider': 'mock-write-then-crash-provider',
|
|
1374
|
-
'agent.retryAttempts': 2,
|
|
1375
|
-
}),
|
|
1376
|
-
sessionContextService: createSessionContextService(),
|
|
1377
|
-
executionContext: {
|
|
1378
|
-
getCwd: () => tmpDir,
|
|
1379
|
-
isRemote: () => false,
|
|
1380
|
-
getSSHService: () => undefined,
|
|
1381
|
-
},
|
|
1382
|
-
onEvent: (event) => events.push(event),
|
|
1383
|
-
});
|
|
1384
|
-
const result = await manager.run({ role: 'worker', task: 'do some work' });
|
|
1385
|
-
t.is(result.status, 'failed');
|
|
1386
|
-
t.is(runCount, 1, 'must not retry when a write tool was invoked before the model error');
|
|
1387
|
-
const retryEvents = events.filter((e) => e.type === 'retry');
|
|
1388
|
-
t.is(retryEvents.length, 0, 'no retry event should be emitted');
|
|
1389
|
-
});
|
|
1390
|
-
test.serial('run() retries read-only subagent (explorer) even after read tools were called', async (t) => {
|
|
1391
|
-
let runCount = 0;
|
|
1392
1478
|
registerProvider({
|
|
1393
1479
|
id: 'mock-explorer-read-then-crash-provider',
|
|
1394
1480
|
label: 'Mock Explorer Read Then Crash Provider',
|
|
@@ -1403,7 +1489,8 @@ test.serial('run() retries read-only subagent (explorer) even after read tools w
|
|
|
1403
1489
|
}
|
|
1404
1490
|
throw new ModelBehaviorError('Tool bash not found in agent Explorer.');
|
|
1405
1491
|
}
|
|
1406
|
-
|
|
1492
|
+
const result = { status: 'completed', finalOutput: 'found it', history: [], messages: [] };
|
|
1493
|
+
return wrapResultAsAgentStream(result);
|
|
1407
1494
|
},
|
|
1408
1495
|
}),
|
|
1409
1496
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1416,76 +1503,15 @@ test.serial('run() retries read-only subagent (explorer) even after read tools w
|
|
|
1416
1503
|
'agent.retryAttempts': 2,
|
|
1417
1504
|
}),
|
|
1418
1505
|
sessionContextService: createSessionContextService(),
|
|
1506
|
+
onEvent: (event) => events.push(event),
|
|
1419
1507
|
});
|
|
1420
1508
|
const result = await manager.run({ role: 'explorer', task: 'search for something' });
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
const runInputs = [];
|
|
1426
|
-
registerProvider({
|
|
1427
|
-
id: 'mock-corrective-hallucination-provider',
|
|
1428
|
-
label: 'Mock Corrective Hallucination Provider',
|
|
1429
|
-
createRunner: () => ({
|
|
1430
|
-
run: async (_agent, input) => {
|
|
1431
|
-
const inputText = typeof input === 'string' ? input : JSON.stringify(input);
|
|
1432
|
-
runInputs.push(inputText);
|
|
1433
|
-
if (runInputs.length === 1) {
|
|
1434
|
-
throw new ModelBehaviorError('Tool bash not found in agent Explorer.');
|
|
1435
|
-
}
|
|
1436
|
-
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1437
|
-
},
|
|
1438
|
-
}),
|
|
1439
|
-
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1440
|
-
});
|
|
1441
|
-
const manager = new SubagentManager({
|
|
1442
|
-
logger: createMockLogger(),
|
|
1443
|
-
settings: createMockSettings({
|
|
1444
|
-
'agent.model': 'mock-model',
|
|
1445
|
-
'agent.provider': 'mock-corrective-hallucination-provider',
|
|
1446
|
-
'agent.retryAttempts': 2,
|
|
1447
|
-
}),
|
|
1448
|
-
sessionContextService: createSessionContextService(),
|
|
1449
|
-
});
|
|
1450
|
-
await manager.run({ role: 'explorer', task: 'do something' });
|
|
1451
|
-
t.is(runInputs.length, 2);
|
|
1452
|
-
const retryInput = runInputs[1];
|
|
1453
|
-
t.true(retryInput.includes('"bash"'), 'corrective prompt should name the hallucinated tool');
|
|
1454
|
-
t.true(retryInput.includes('does not exist'), 'corrective prompt should say the tool does not exist');
|
|
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);
|
|
1455
1513
|
});
|
|
1456
|
-
|
|
1457
|
-
const runInputs = [];
|
|
1458
|
-
registerProvider({
|
|
1459
|
-
id: 'mock-corrective-behavior-provider',
|
|
1460
|
-
label: 'Mock Corrective Behavior Provider',
|
|
1461
|
-
createRunner: () => ({
|
|
1462
|
-
run: async (_agent, input) => {
|
|
1463
|
-
const inputText = typeof input === 'string' ? input : JSON.stringify(input);
|
|
1464
|
-
runInputs.push(inputText);
|
|
1465
|
-
if (runInputs.length === 1) {
|
|
1466
|
-
throw new ModelBehaviorError('Model did not produce a final response');
|
|
1467
|
-
}
|
|
1468
|
-
return { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1469
|
-
},
|
|
1470
|
-
}),
|
|
1471
|
-
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1472
|
-
});
|
|
1473
|
-
const manager = new SubagentManager({
|
|
1474
|
-
logger: createMockLogger(),
|
|
1475
|
-
settings: createMockSettings({
|
|
1476
|
-
'agent.model': 'mock-model',
|
|
1477
|
-
'agent.provider': 'mock-corrective-behavior-provider',
|
|
1478
|
-
'agent.retryAttempts': 2,
|
|
1479
|
-
}),
|
|
1480
|
-
sessionContextService: createSessionContextService(),
|
|
1481
|
-
});
|
|
1482
|
-
await manager.run({ role: 'explorer', task: 'do something' });
|
|
1483
|
-
t.is(runInputs.length, 2);
|
|
1484
|
-
const retryInput = runInputs[1];
|
|
1485
|
-
t.true(retryInput.includes('final'), 'corrective prompt for behavior should instruct to produce a final answer');
|
|
1486
|
-
t.true(retryInput.includes('Do not call'), 'should tell model not to call more tools');
|
|
1487
|
-
});
|
|
1488
|
-
test.serial('subagent run injects warning into tool output when turns left <= 5', async (t) => {
|
|
1514
|
+
it.sequential('subagent run injects warning into tool output when turns left <= 5', async () => {
|
|
1489
1515
|
let executeOutput = null;
|
|
1490
1516
|
registerProvider({
|
|
1491
1517
|
id: 'mock-subagent-maxturns-provider',
|
|
@@ -1510,12 +1536,13 @@ test.serial('subagent run injects warning into tool output when turns left <= 5'
|
|
|
1510
1536
|
};
|
|
1511
1537
|
executeOutput = await readFileTool.invoke(mockRunContext, JSON.stringify({ path: 'package.json' }), {});
|
|
1512
1538
|
}
|
|
1513
|
-
|
|
1539
|
+
const result = {
|
|
1514
1540
|
status: 'completed',
|
|
1515
1541
|
finalOutput: 'done',
|
|
1516
1542
|
history: [],
|
|
1517
1543
|
messages: [],
|
|
1518
1544
|
};
|
|
1545
|
+
return options?.stream ? wrapResultAsAgentStream(result) : result;
|
|
1519
1546
|
},
|
|
1520
1547
|
}),
|
|
1521
1548
|
fetchModels: async () => [{ id: 'mock-model' }],
|
|
@@ -1529,11 +1556,11 @@ test.serial('subagent run injects warning into tool output when turns left <= 5'
|
|
|
1529
1556
|
sessionContextService: createSessionContextService(),
|
|
1530
1557
|
});
|
|
1531
1558
|
await manager.run({ role: 'explorer', task: 'mock task' });
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1559
|
+
expect(executeOutput).toBeTruthy();
|
|
1560
|
+
expect(executeOutput.includes('approaching the maximum turn limit')).toBe(true);
|
|
1561
|
+
expect(executeOutput.includes('4 turns left')).toBe(true);
|
|
1535
1562
|
});
|
|
1536
|
-
|
|
1563
|
+
it.sequential('execution subagents select subagent-safe model-family prompts and append role instructions', async () => {
|
|
1537
1564
|
let constructedAgentExplorer = null;
|
|
1538
1565
|
let constructedAgentWorker = null;
|
|
1539
1566
|
let constructedAgentResearcher = null;
|
|
@@ -1543,7 +1570,8 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1543
1570
|
createRunner: () => ({
|
|
1544
1571
|
run: async (agent) => {
|
|
1545
1572
|
constructedAgentExplorer = agent;
|
|
1546
|
-
|
|
1573
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1574
|
+
return wrapResultAsAgentStream(result);
|
|
1547
1575
|
},
|
|
1548
1576
|
}),
|
|
1549
1577
|
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
@@ -1554,7 +1582,8 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1554
1582
|
createRunner: () => ({
|
|
1555
1583
|
run: async (agent) => {
|
|
1556
1584
|
constructedAgentWorker = agent;
|
|
1557
|
-
|
|
1585
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1586
|
+
return wrapResultAsAgentStream(result);
|
|
1558
1587
|
},
|
|
1559
1588
|
}),
|
|
1560
1589
|
fetchModels: async () => [{ id: 'claude-3-sonnet' }],
|
|
@@ -1565,7 +1594,8 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1565
1594
|
createRunner: () => ({
|
|
1566
1595
|
run: async (agent) => {
|
|
1567
1596
|
constructedAgentResearcher = agent;
|
|
1568
|
-
|
|
1597
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1598
|
+
return wrapResultAsAgentStream(result);
|
|
1569
1599
|
},
|
|
1570
1600
|
}),
|
|
1571
1601
|
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
@@ -1580,14 +1610,14 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1580
1610
|
sessionContextService: createSessionContextService(),
|
|
1581
1611
|
});
|
|
1582
1612
|
await managerExplorer.run({ role: 'explorer', task: 'explorer task' });
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
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);
|
|
1588
1618
|
const codexIdx = constructedAgentExplorer.instructions.indexOf('nested Codex-family subagent');
|
|
1589
1619
|
const explorerIdx = constructedAgentExplorer.instructions.indexOf('You are an explorer subagent');
|
|
1590
|
-
|
|
1620
|
+
expect(codexIdx < explorerIdx).toBe(true);
|
|
1591
1621
|
// 2. Run worker subagent with claude-3-sonnet
|
|
1592
1622
|
const managerWorker = new SubagentManager({
|
|
1593
1623
|
logger: createMockLogger(),
|
|
@@ -1598,12 +1628,12 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1598
1628
|
sessionContextService: createSessionContextService(),
|
|
1599
1629
|
});
|
|
1600
1630
|
await managerWorker.run({ role: 'worker', task: 'worker task' });
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
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);
|
|
1604
1634
|
const sonnetIdx = constructedAgentWorker.instructions.indexOf('nested Anthropic-family subagent');
|
|
1605
1635
|
const workerIdx = constructedAgentWorker.instructions.indexOf('You are a worker subagent');
|
|
1606
|
-
|
|
1636
|
+
expect(sonnetIdx < workerIdx).toBe(true);
|
|
1607
1637
|
const managerResearcher = new SubagentManager({
|
|
1608
1638
|
logger: createMockLogger(),
|
|
1609
1639
|
settings: createMockSettings({
|
|
@@ -1613,11 +1643,11 @@ test.serial('execution subagents select subagent-safe model-family prompts and a
|
|
|
1613
1643
|
sessionContextService: createSessionContextService(),
|
|
1614
1644
|
});
|
|
1615
1645
|
await managerResearcher.run({ role: 'researcher', task: 'research task' });
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
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);
|
|
1619
1649
|
});
|
|
1620
|
-
|
|
1650
|
+
it.sequential('execution subagent prompts exclude top-level-only prompt content', async () => {
|
|
1621
1651
|
let constructedAgent = null;
|
|
1622
1652
|
registerProvider({
|
|
1623
1653
|
id: 'mock-top-level-exclusion-provider',
|
|
@@ -1625,7 +1655,8 @@ test.serial('execution subagent prompts exclude top-level-only prompt content',
|
|
|
1625
1655
|
createRunner: () => ({
|
|
1626
1656
|
run: async (agent) => {
|
|
1627
1657
|
constructedAgent = agent;
|
|
1628
|
-
|
|
1658
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1659
|
+
return wrapResultAsAgentStream(result);
|
|
1629
1660
|
},
|
|
1630
1661
|
}),
|
|
1631
1662
|
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
@@ -1639,14 +1670,14 @@ test.serial('execution subagent prompts exclude top-level-only prompt content',
|
|
|
1639
1670
|
sessionContextService: createSessionContextService(),
|
|
1640
1671
|
});
|
|
1641
1672
|
await manager.run({ role: 'worker', task: 'worker task' });
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
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);
|
|
1648
1679
|
});
|
|
1649
|
-
|
|
1680
|
+
it.sequential('mentor subagent is NOT affected by prompt profiles', async () => {
|
|
1650
1681
|
let mentorAgent = null;
|
|
1651
1682
|
registerProvider({
|
|
1652
1683
|
id: 'mock-prompt-test-provider-mentor',
|
|
@@ -1654,7 +1685,8 @@ test.serial('mentor subagent is NOT affected by prompt profiles', async (t) => {
|
|
|
1654
1685
|
createRunner: () => ({
|
|
1655
1686
|
run: async (agent) => {
|
|
1656
1687
|
mentorAgent = agent;
|
|
1657
|
-
|
|
1688
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1689
|
+
return wrapResultAsAgentStream(result);
|
|
1658
1690
|
},
|
|
1659
1691
|
}),
|
|
1660
1692
|
fetchModels: async () => [{ id: 'gpt-5-codex' }],
|
|
@@ -1671,14 +1703,14 @@ test.serial('mentor subagent is NOT affected by prompt profiles', async (t) => {
|
|
|
1671
1703
|
sessionContextService: createSessionContextService(),
|
|
1672
1704
|
});
|
|
1673
1705
|
await manager.run({ role: 'mentor', task: 'advise me' });
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
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);
|
|
1680
1712
|
});
|
|
1681
|
-
|
|
1713
|
+
it.sequential('subagent tool definitions conditional registration for search tools', async () => {
|
|
1682
1714
|
let workerAgentShellTrue = null;
|
|
1683
1715
|
let workerAgentShellFalse = null;
|
|
1684
1716
|
registerProvider({
|
|
@@ -1687,7 +1719,8 @@ test.serial('subagent tool definitions conditional registration for search tools
|
|
|
1687
1719
|
createRunner: () => ({
|
|
1688
1720
|
run: async (agent) => {
|
|
1689
1721
|
workerAgentShellTrue = agent;
|
|
1690
|
-
|
|
1722
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1723
|
+
return wrapResultAsAgentStream(result);
|
|
1691
1724
|
},
|
|
1692
1725
|
}),
|
|
1693
1726
|
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
@@ -1698,7 +1731,8 @@ test.serial('subagent tool definitions conditional registration for search tools
|
|
|
1698
1731
|
createRunner: () => ({
|
|
1699
1732
|
run: async (agent) => {
|
|
1700
1733
|
workerAgentShellFalse = agent;
|
|
1701
|
-
|
|
1734
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1735
|
+
return wrapResultAsAgentStream(result);
|
|
1702
1736
|
},
|
|
1703
1737
|
}),
|
|
1704
1738
|
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
@@ -1715,17 +1749,17 @@ test.serial('subagent tool definitions conditional registration for search tools
|
|
|
1715
1749
|
sessionContextService: createSessionContextService(),
|
|
1716
1750
|
});
|
|
1717
1751
|
await managerShellTrue.run({ role: 'worker', task: 'some task' });
|
|
1718
|
-
|
|
1752
|
+
expect(workerAgentShellTrue).toBeTruthy();
|
|
1719
1753
|
const toolNamesShellTrue = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
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);
|
|
1729
1763
|
// 2. Model: gpt-4o (searchViaShell is false by default), canRunShell: true
|
|
1730
1764
|
// Tools should include dedicated grep and find_files.
|
|
1731
1765
|
const managerShellFalse = new SubagentManager({
|
|
@@ -1738,15 +1772,15 @@ test.serial('subagent tool definitions conditional registration for search tools
|
|
|
1738
1772
|
sessionContextService: createSessionContextService(),
|
|
1739
1773
|
});
|
|
1740
1774
|
await managerShellFalse.run({ role: 'worker', task: 'some task' });
|
|
1741
|
-
|
|
1775
|
+
expect(workerAgentShellFalse).toBeTruthy();
|
|
1742
1776
|
const toolNamesShellFalse = workerAgentShellFalse.tools.map((tool) => tool.name);
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
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);
|
|
1750
1784
|
// 3. Model: gpt-5 with searchViaShell explicitly disabled still keeps dedicated search tools.
|
|
1751
1785
|
const managerShellOff = new SubagentManager({
|
|
1752
1786
|
logger: createMockLogger(),
|
|
@@ -1759,13 +1793,13 @@ test.serial('subagent tool definitions conditional registration for search tools
|
|
|
1759
1793
|
});
|
|
1760
1794
|
await managerShellOff.run({ role: 'worker', task: 'some task' });
|
|
1761
1795
|
const toolNamesShellOff = workerAgentShellTrue.tools.map((tool) => tool.name);
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
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);
|
|
1767
1801
|
});
|
|
1768
|
-
|
|
1802
|
+
it.sequential('explorer uses shell search when available and researcher keeps dedicated search tools', async () => {
|
|
1769
1803
|
let explorerAgent = null;
|
|
1770
1804
|
let researcherAgent = null;
|
|
1771
1805
|
registerProvider({
|
|
@@ -1774,7 +1808,8 @@ test.serial('explorer uses shell search when available and researcher keeps dedi
|
|
|
1774
1808
|
createRunner: () => ({
|
|
1775
1809
|
run: async (agent) => {
|
|
1776
1810
|
explorerAgent = agent;
|
|
1777
|
-
|
|
1811
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1812
|
+
return wrapResultAsAgentStream(result);
|
|
1778
1813
|
},
|
|
1779
1814
|
}),
|
|
1780
1815
|
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
@@ -1785,7 +1820,8 @@ test.serial('explorer uses shell search when available and researcher keeps dedi
|
|
|
1785
1820
|
createRunner: () => ({
|
|
1786
1821
|
run: async (agent) => {
|
|
1787
1822
|
researcherAgent = agent;
|
|
1788
|
-
|
|
1823
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1824
|
+
return wrapResultAsAgentStream(result);
|
|
1789
1825
|
},
|
|
1790
1826
|
}),
|
|
1791
1827
|
fetchModels: async () => [{ id: 'gpt-5' }],
|
|
@@ -1808,22 +1844,22 @@ test.serial('explorer uses shell search when available and researcher keeps dedi
|
|
|
1808
1844
|
}),
|
|
1809
1845
|
sessionContextService: createSessionContextService(),
|
|
1810
1846
|
}).run({ role: 'researcher', task: 'research files' });
|
|
1811
|
-
|
|
1847
|
+
expect(explorerAgent).toBeTruthy();
|
|
1812
1848
|
let toolNames = explorerAgent.tools.map((tool) => tool.name);
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
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();
|
|
1819
1855
|
toolNames = researcherAgent.tools.map((tool) => tool.name);
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
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);
|
|
1825
1861
|
});
|
|
1826
|
-
|
|
1862
|
+
it.sequential('remote execution disables code-context tools and guidance', async () => {
|
|
1827
1863
|
let remoteAgent = null;
|
|
1828
1864
|
registerProvider({
|
|
1829
1865
|
id: 'mock-tool-test-provider-remote',
|
|
@@ -1831,7 +1867,8 @@ test.serial('remote execution disables code-context tools and guidance', async (
|
|
|
1831
1867
|
createRunner: () => ({
|
|
1832
1868
|
run: async (agent) => {
|
|
1833
1869
|
remoteAgent = agent;
|
|
1834
|
-
|
|
1870
|
+
const result = { status: 'completed', finalOutput: 'done', history: [], messages: [] };
|
|
1871
|
+
return wrapResultAsAgentStream(result);
|
|
1835
1872
|
},
|
|
1836
1873
|
}),
|
|
1837
1874
|
fetchModels: async () => [{ id: 'gpt-4o' }],
|
|
@@ -1850,11 +1887,63 @@ test.serial('remote execution disables code-context tools and guidance', async (
|
|
|
1850
1887
|
sessionContextService: createSessionContextService(),
|
|
1851
1888
|
});
|
|
1852
1889
|
await manager.run({ role: 'explorer', task: 'inspect remote files' });
|
|
1853
|
-
|
|
1890
|
+
expect(remoteAgent).toBeTruthy();
|
|
1854
1891
|
const toolNames = remoteAgent.tools.map((tool) => tool.name);
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
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' }), {});
|
|
1909
|
+
}
|
|
1910
|
+
const err = new Error('The operation was aborted');
|
|
1911
|
+
err.name = 'AbortError';
|
|
1912
|
+
throw err;
|
|
1913
|
+
},
|
|
1914
|
+
}),
|
|
1915
|
+
fetchModels: async () => [{ id: 'mock-model' }],
|
|
1916
|
+
});
|
|
1917
|
+
const manager = new SubagentManager({
|
|
1918
|
+
logger: createMockLogger(),
|
|
1919
|
+
settings: createMockSettings({
|
|
1920
|
+
'agent.model': 'mock-model',
|
|
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',
|
|
1942
|
+
}),
|
|
1943
|
+
sessionContextService: createSessionContextService(),
|
|
1944
|
+
});
|
|
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');
|
|
1859
1948
|
});
|
|
1860
1949
|
//# sourceMappingURL=subagent-manager.test.js.map
|