@qduc/term2 0.1.5 → 0.1.7
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.map +1 -1
- package/dist/agent.js +4 -24
- package/dist/agent.js.map +1 -1
- package/dist/agent.lite-mode.test.d.ts +2 -0
- package/dist/agent.lite-mode.test.d.ts.map +1 -0
- package/dist/agent.lite-mode.test.js +39 -0
- package/dist/agent.lite-mode.test.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +11 -32
- package/dist/app.js.map +1 -1
- package/dist/app.parseInput.test.js +4 -4
- package/dist/app.parseInput.test.js.map +1 -1
- package/dist/cli.js +44 -29
- package/dist/cli.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +14 -11
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/Banner.d.ts.map +1 -1
- package/dist/components/Banner.js +4 -12
- package/dist/components/Banner.js.map +1 -1
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +4 -7
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/BottomArea.test.js +4 -6
- package/dist/components/BottomArea.test.js.map +1 -1
- package/dist/components/ChatMessage.d.ts.map +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/CommandMessage.d.ts.map +1 -1
- package/dist/components/CommandMessage.js +19 -30
- package/dist/components/CommandMessage.js.map +1 -1
- package/dist/components/CommandMessage.test.js +2 -2
- package/dist/components/CommandMessage.test.js.map +1 -1
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +3 -9
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/ErrorBoundary.test.js +2 -2
- package/dist/components/ErrorBoundary.test.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +15 -33
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.menu-logic.test.js +6 -7
- package/dist/components/InputBox.menu-logic.test.js.map +1 -1
- package/dist/components/InputBox.test.js +7 -9
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/LiveResponse.d.ts.map +1 -1
- package/dist/components/LiveResponse.js.map +1 -1
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +12 -12
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/MessageList.test.js +1 -1
- package/dist/components/MessageList.test.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.js +11 -16
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/ModelSelectionMenu.test.js +9 -9
- package/dist/components/ModelSelectionMenu.test.js.map +1 -1
- package/dist/components/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/PathSelectionMenu.js +1 -1
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +1 -1
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.test.js +4 -4
- package/dist/components/SettingsSelectionMenu.test.js.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.js +5 -6
- package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/SettingsValueSelectionMenu.test.js +5 -5
- package/dist/components/SettingsValueSelectionMenu.test.js.map +1 -1
- package/dist/components/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/SlashCommandMenu.js +1 -1
- package/dist/components/SlashCommandMenu.js.map +1 -1
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +3 -4
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/TextInput.d.ts.map +1 -1
- package/dist/components/TextInput.js +2 -1
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js.map +1 -1
- package/dist/context/InputContext.stability.test.js +1 -1
- package/dist/context/InputContext.stability.test.js.map +1 -1
- package/dist/context/InputContext.test.js +15 -15
- package/dist/context/InputContext.test.js.map +1 -1
- package/dist/debug_ask_mentor.d.ts +2 -0
- package/dist/debug_ask_mentor.d.ts.map +1 -0
- package/dist/debug_ask_mentor.js +73 -0
- package/dist/debug_ask_mentor.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts +3 -13
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +35 -184
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-input-history.d.ts.map +1 -1
- package/dist/hooks/use-input-history.js +1 -3
- package/dist/hooks/use-input-history.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +8 -10
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-path-completion.d.ts.map +1 -1
- package/dist/hooks/use-path-completion.js +6 -6
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-setting.d.ts.map +1 -1
- package/dist/hooks/use-setting.js +3 -6
- package/dist/hooks/use-setting.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +10 -12
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +46 -46
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +13 -43
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.test.js +12 -18
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
- package/dist/hooks/use-slash-commands.d.ts +1 -1
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-slash-commands.js +6 -11
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-slash-commands.test.js +24 -24
- package/dist/hooks/use-slash-commands.test.js.map +1 -1
- package/dist/lib/editor-impl.d.ts.map +1 -1
- package/dist/lib/editor-impl.js +6 -16
- package/dist/lib/editor-impl.js.map +1 -1
- package/dist/lib/editor-impl.test.js.map +1 -1
- package/dist/lib/openai-agent-client.chat.test.js +33 -8
- package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.flex-tier.test.js +5 -5
- package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -1
- package/dist/lib/openai-agent-client.js +89 -85
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +186 -12
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/openai-agent-client.test.js +17 -17
- package/dist/lib/openai-agent-client.test.js.map +1 -1
- package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
- package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.js +39 -0
- package/dist/lib/openai-strict-tool-schema.js.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.js +26 -0
- package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/modes/companion/command-index.d.ts +26 -0
- package/dist/modes/companion/command-index.d.ts.map +1 -0
- package/dist/modes/companion/command-index.js +50 -0
- package/dist/modes/companion/command-index.js.map +1 -0
- package/dist/modes/companion/command-index.test.d.ts +2 -0
- package/dist/modes/companion/command-index.test.d.ts.map +1 -0
- package/dist/modes/companion/command-index.test.js +86 -0
- package/dist/modes/companion/command-index.test.js.map +1 -0
- package/dist/modes/companion/companion-app.d.ts +12 -0
- package/dist/modes/companion/companion-app.d.ts.map +1 -0
- package/dist/modes/companion/companion-app.js +297 -0
- package/dist/modes/companion/companion-app.js.map +1 -0
- package/dist/modes/companion/companion-session.d.ts +63 -0
- package/dist/modes/companion/companion-session.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.js +146 -0
- package/dist/modes/companion/companion-session.js.map +1 -0
- package/dist/modes/companion/companion-session.test.d.ts +2 -0
- package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.test.js +28 -0
- package/dist/modes/companion/companion-session.test.js.map +1 -0
- package/dist/modes/companion/components/status-bar.d.ts +13 -0
- package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
- package/dist/modes/companion/components/status-bar.js +26 -0
- package/dist/modes/companion/components/status-bar.js.map +1 -0
- package/dist/modes/companion/context-buffer.d.ts +65 -0
- package/dist/modes/companion/context-buffer.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.js +156 -0
- package/dist/modes/companion/context-buffer.js.map +1 -0
- package/dist/modes/companion/context-buffer.test.d.ts +2 -0
- package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.test.js +154 -0
- package/dist/modes/companion/context-buffer.test.js.map +1 -0
- package/dist/modes/companion/event-detector.d.ts +46 -0
- package/dist/modes/companion/event-detector.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.js +169 -0
- package/dist/modes/companion/event-detector.js.map +1 -0
- package/dist/modes/companion/event-detector.test.d.ts +2 -0
- package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.test.js +121 -0
- package/dist/modes/companion/event-detector.test.js.map +1 -0
- package/dist/modes/companion/index.d.ts +33 -0
- package/dist/modes/companion/index.d.ts.map +1 -0
- package/dist/modes/companion/index.js +21 -0
- package/dist/modes/companion/index.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.d.ts +3 -0
- package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.js +31 -0
- package/dist/modes/companion/input-key-mapper.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.js +26 -0
- package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
- package/dist/modes/companion/input-parser.d.ts +53 -0
- package/dist/modes/companion/input-parser.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.js +114 -0
- package/dist/modes/companion/input-parser.js.map +1 -0
- package/dist/modes/companion/input-parser.test.d.ts +2 -0
- package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.test.js +123 -0
- package/dist/modes/companion/input-parser.test.js.map +1 -0
- package/dist/modes/companion/mode-manager.d.ts +41 -0
- package/dist/modes/companion/mode-manager.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.js +56 -0
- package/dist/modes/companion/mode-manager.js.map +1 -0
- package/dist/modes/companion/mode-manager.test.d.ts +2 -0
- package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.test.js +65 -0
- package/dist/modes/companion/mode-manager.test.js.map +1 -0
- package/dist/modes/companion/output-classifier.d.ts +15 -0
- package/dist/modes/companion/output-classifier.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.js +77 -0
- package/dist/modes/companion/output-classifier.js.map +1 -0
- package/dist/modes/companion/output-classifier.test.d.ts +2 -0
- package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.test.js +133 -0
- package/dist/modes/companion/output-classifier.test.js.map +1 -0
- package/dist/modes/companion/pty-wrapper.d.ts +46 -0
- package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
- package/dist/modes/companion/pty-wrapper.js +143 -0
- package/dist/modes/companion/pty-wrapper.js.map +1 -0
- package/dist/modes/companion/safety-classifier.d.ts +31 -0
- package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.js +140 -0
- package/dist/modes/companion/safety-classifier.js.map +1 -0
- package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
- package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.test.js +151 -0
- package/dist/modes/companion/safety-classifier.test.js.map +1 -0
- package/dist/modes/companion/summarizer.d.ts +24 -0
- package/dist/modes/companion/summarizer.d.ts.map +1 -0
- package/dist/modes/companion/summarizer.js +132 -0
- package/dist/modes/companion/summarizer.js.map +1 -0
- package/dist/modes/companion/terminal-history.d.ts +27 -0
- package/dist/modes/companion/terminal-history.d.ts.map +1 -0
- package/dist/modes/companion/terminal-history.js +142 -0
- package/dist/modes/companion/terminal-history.js.map +1 -0
- package/dist/no-singleton-imports.test.js +1 -1
- package/dist/no-singleton-imports.test.js.map +1 -1
- package/dist/non-interactive.d.ts +20 -0
- package/dist/non-interactive.d.ts.map +1 -0
- package/dist/non-interactive.js +86 -0
- package/dist/non-interactive.js.map +1 -0
- package/dist/non-interactive.test.d.ts +2 -0
- package/dist/non-interactive.test.d.ts.map +1 -0
- package/dist/non-interactive.test.js +213 -0
- package/dist/non-interactive.test.js.map +1 -0
- package/dist/prompts/anthropic.md +11 -11
- package/dist/prompts/codex.md +63 -63
- package/dist/prompts/gpt-5.md +95 -95
- package/dist/prompts/mentor-addon.md +6 -5
- package/dist/prompts/prompt-selector.d.ts +8 -0
- package/dist/prompts/prompt-selector.d.ts.map +1 -0
- package/dist/prompts/prompt-selector.js +21 -0
- package/dist/prompts/prompt-selector.js.map +1 -0
- package/dist/prompts/prompt-selector.test.d.ts +2 -0
- package/dist/prompts/prompt-selector.test.d.ts.map +1 -0
- package/dist/prompts/prompt-selector.test.js +21 -0
- package/dist/prompts/prompt-selector.test.js.map +1 -0
- package/dist/prompts/prompt-selector.test.ts +32 -0
- package/dist/prompts/prompt-selector.ts +30 -0
- package/dist/prompts/simple-mentor.md +8 -0
- package/dist/prompts/simple.md +58 -58
- package/dist/providers/github-copilot/model.d.ts.map +1 -1
- package/dist/providers/github-copilot/model.js +25 -108
- package/dist/providers/github-copilot/model.js.map +1 -1
- package/dist/providers/github-copilot/model.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.test.js +63 -0
- package/dist/providers/github-copilot/model.test.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +0 -5
- package/dist/providers/github-copilot/provider.d.ts.map +1 -1
- package/dist/providers/github-copilot/provider.js +2 -7
- package/dist/providers/github-copilot/provider.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai-compatible/api.d.ts.map +1 -1
- package/dist/providers/openai-compatible/api.js.map +1 -1
- package/dist/providers/openai-compatible/model.d.ts.map +1 -1
- package/dist/providers/openai-compatible/model.js +22 -56
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible/provider.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +72 -2
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -1
- package/dist/providers/openai-compatible/utils.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +5 -1
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai.provider.js +4 -0
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openrouter/api.d.ts.map +1 -1
- package/dist/providers/openrouter/api.js +5 -13
- package/dist/providers/openrouter/api.js.map +1 -1
- package/dist/providers/openrouter/converters.d.ts.map +1 -1
- package/dist/providers/openrouter/converters.js +9 -28
- package/dist/providers/openrouter/converters.js.map +1 -1
- package/dist/providers/openrouter/converters.test.js +7 -11
- package/dist/providers/openrouter/converters.test.js.map +1 -1
- package/dist/providers/openrouter/index.d.ts.map +1 -1
- package/dist/providers/openrouter/index.js.map +1 -1
- package/dist/providers/openrouter/model.d.ts.map +1 -1
- package/dist/providers/openrouter/model.js +22 -58
- package/dist/providers/openrouter/model.js.map +1 -1
- package/dist/providers/openrouter/provider.d.ts.map +1 -1
- package/dist/providers/openrouter/provider.js.map +1 -1
- package/dist/providers/openrouter/reasoning-content.test.js +1 -1
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/utils.d.ts +1 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -1
- package/dist/providers/openrouter/utils.js +5 -3
- package/dist/providers/openrouter/utils.js.map +1 -1
- package/dist/providers/openrouter.api.retry.test.js.map +1 -1
- package/dist/providers/openrouter.provider.createRunner.test.js +1 -1
- package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
- package/dist/providers/openrouter.provider.js +6 -4
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/openrouter.test.js +77 -17
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/providers/registry.d.ts +5 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/registry.test.js +11 -11
- package/dist/providers/registry.test.js.map +1 -1
- package/dist/providers/web-search/index.d.ts +1 -1
- package/dist/providers/web-search/index.d.ts.map +1 -1
- package/dist/providers/web-search/index.js.map +1 -1
- package/dist/providers/web-search/registry.d.ts.map +1 -1
- package/dist/providers/web-search/registry.js.map +1 -1
- package/dist/providers/web-search/registry.test.js +14 -14
- package/dist/providers/web-search/registry.test.js.map +1 -1
- package/dist/providers/web-search/tavily.provider.d.ts.map +1 -1
- package/dist/providers/web-search/tavily.provider.js +4 -4
- package/dist/providers/web-search/tavily.provider.js.map +1 -1
- package/dist/providers/web-search/tavily.provider.test.js +7 -7
- package/dist/providers/web-search/tavily.provider.test.js.map +1 -1
- package/dist/providers/web-search/types.d.ts.map +1 -1
- package/dist/scripts/extract-provider-traffic.d.ts +3 -0
- package/dist/scripts/extract-provider-traffic.d.ts.map +1 -0
- package/dist/scripts/extract-provider-traffic.js +32 -0
- package/dist/scripts/extract-provider-traffic.js.map +1 -0
- package/dist/services/approval-state.d.ts +24 -0
- package/dist/services/approval-state.d.ts.map +1 -0
- package/dist/services/approval-state.js +41 -0
- package/dist/services/approval-state.js.map +1 -0
- package/dist/services/approval-state.test.d.ts +2 -0
- package/dist/services/approval-state.test.d.ts.map +1 -0
- package/dist/services/approval-state.test.js +59 -0
- package/dist/services/approval-state.test.js.map +1 -0
- package/dist/services/check_mock.d.ts +2 -0
- package/dist/services/check_mock.d.ts.map +1 -0
- package/dist/services/check_mock.js +22 -0
- package/dist/services/check_mock.js.map +1 -0
- package/dist/services/command-message-streaming.d.ts +12 -0
- package/dist/services/command-message-streaming.d.ts.map +1 -0
- package/dist/services/command-message-streaming.js +68 -0
- package/dist/services/command-message-streaming.js.map +1 -0
- package/dist/services/command-message-streaming.test.d.ts +2 -0
- package/dist/services/command-message-streaming.test.d.ts.map +1 -0
- package/dist/services/command-message-streaming.test.js +78 -0
- package/dist/services/command-message-streaming.test.js.map +1 -0
- package/dist/services/conversation-events.d.ts +2 -13
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-integration.test.d.ts +2 -0
- package/dist/services/conversation-integration.test.d.ts.map +1 -0
- package/dist/services/conversation-integration.test.js +155 -0
- package/dist/services/conversation-integration.test.js.map +1 -0
- package/dist/services/conversation-service.d.ts +1 -1
- package/dist/services/conversation-service.d.ts.map +1 -1
- 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 +149 -183
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/services/conversation-session-reasoning.test.js +3 -3
- package/dist/services/conversation-session-reasoning.test.js.map +1 -1
- package/dist/services/conversation-session.d.ts +5 -17
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +164 -275
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation-store.js +3 -9
- package/dist/services/conversation-store.js.map +1 -1
- package/dist/services/conversation-store.test.js +17 -14
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/execution-context.d.ts.map +1 -1
- package/dist/services/execution-context.js.map +1 -1
- package/dist/services/execution-context.test.js +7 -7
- package/dist/services/execution-context.test.js.map +1 -1
- package/dist/services/file-service.d.ts.map +1 -1
- package/dist/services/file-service.js +5 -9
- package/dist/services/file-service.js.map +1 -1
- package/dist/services/history-service.d.ts.map +1 -1
- package/dist/services/history-service.js +3 -7
- package/dist/services/history-service.js.map +1 -1
- package/dist/services/logging-contract.d.ts +74 -0
- package/dist/services/logging-contract.d.ts.map +1 -0
- package/dist/services/logging-contract.js +157 -0
- package/dist/services/logging-contract.js.map +1 -0
- package/dist/services/logging-contract.test.d.ts +2 -0
- package/dist/services/logging-contract.test.d.ts.map +1 -0
- package/dist/services/logging-contract.test.js +66 -0
- package/dist/services/logging-contract.test.js.map +1 -0
- package/dist/services/logging-service.d.ts +5 -0
- package/dist/services/logging-service.d.ts.map +1 -1
- package/dist/services/logging-service.js +93 -21
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js +2 -2
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/model-service.test.js +6 -6
- package/dist/services/model-service.test.js.map +1 -1
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/settings-env.d.ts +9 -0
- package/dist/services/settings-env.d.ts.map +1 -0
- package/dist/services/settings-env.js +75 -0
- package/dist/services/settings-env.js.map +1 -0
- package/dist/services/settings-env.test.d.ts +2 -0
- package/dist/services/settings-env.test.d.ts.map +1 -0
- package/dist/services/settings-env.test.js +32 -0
- package/dist/services/settings-env.test.js.map +1 -0
- package/dist/services/settings-merger.d.ts +26 -0
- package/dist/services/settings-merger.d.ts.map +1 -0
- package/dist/services/settings-merger.js +122 -0
- package/dist/services/settings-merger.js.map +1 -0
- package/dist/services/settings-merger.test.d.ts +2 -0
- package/dist/services/settings-merger.test.d.ts.map +1 -0
- package/dist/services/settings-merger.test.js +26 -0
- package/dist/services/settings-merger.test.js.map +1 -0
- package/dist/services/settings-persistence.d.ts +32 -0
- package/dist/services/settings-persistence.d.ts.map +1 -0
- package/dist/services/settings-persistence.js +134 -0
- package/dist/services/settings-persistence.js.map +1 -0
- package/dist/services/settings-persistence.test.d.ts +2 -0
- package/dist/services/settings-persistence.test.d.ts.map +1 -0
- package/dist/services/settings-persistence.test.js +51 -0
- package/dist/services/settings-persistence.test.js.map +1 -0
- package/dist/services/settings-schema.d.ts +320 -0
- package/dist/services/settings-schema.d.ts.map +1 -0
- package/dist/services/settings-schema.js +272 -0
- package/dist/services/settings-schema.js.map +1 -0
- package/dist/services/settings-service.d.ts +4 -248
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +45 -641
- package/dist/services/settings-service.js.map +1 -1
- package/dist/services/settings-service.mock.d.ts.map +1 -1
- package/dist/services/settings-service.mock.js.map +1 -1
- package/dist/services/singleton-deprecation.test.js +2 -2
- package/dist/services/singleton-deprecation.test.js.map +1 -1
- package/dist/services/ssh-service.d.ts.map +1 -1
- package/dist/services/ssh-service.js +8 -7
- package/dist/services/ssh-service.js.map +1 -1
- package/dist/services/ssh-service.test.js +15 -13
- package/dist/services/ssh-service.test.js.map +1 -1
- package/dist/services/stream-event-parsing.d.ts +4 -0
- package/dist/services/stream-event-parsing.d.ts.map +1 -0
- package/dist/services/stream-event-parsing.js +76 -0
- package/dist/services/stream-event-parsing.js.map +1 -0
- package/dist/services/stream-event-parsing.test.d.ts +2 -0
- package/dist/services/stream-event-parsing.test.d.ts.map +1 -0
- package/dist/services/stream-event-parsing.test.js +59 -0
- package/dist/services/stream-event-parsing.test.js.map +1 -0
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +45 -35
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/apply-patch.test.js +23 -0
- package/dist/tools/apply-patch.test.js.map +1 -1
- package/dist/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.d.ts.map +1 -1
- package/dist/tools/ask-mentor.js +5 -15
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/ask-mentor.test.js +10 -4
- package/dist/tools/ask-mentor.test.js.map +1 -1
- package/dist/tools/create-file.d.ts.map +1 -1
- package/dist/tools/create-file.js +2 -2
- package/dist/tools/create-file.js.map +1 -1
- package/dist/tools/create-file.test.js.map +1 -1
- package/dist/tools/edit-healing.d.ts.map +1 -1
- package/dist/tools/edit-healing.js +5 -4
- package/dist/tools/edit-healing.js.map +1 -1
- package/dist/tools/edit-healing.test.js.map +1 -1
- package/dist/tools/find-files.d.ts +2 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +10 -27
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +8 -21
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +2 -6
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/grep.d.ts +2 -2
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +7 -26
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +5 -11
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +7 -13
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +1 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +15 -31
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/search.d.ts +5 -5
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +10 -29
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +3 -3
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +27 -55
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/shell.test.d.ts +2 -0
- package/dist/tools/shell.test.d.ts.map +1 -0
- package/dist/tools/shell.test.js +70 -0
- package/dist/tools/shell.test.js.map +1 -0
- package/dist/tools/tool-names.d.ts +3 -0
- package/dist/tools/tool-names.d.ts.map +1 -0
- package/dist/tools/tool-names.js +3 -0
- package/dist/tools/tool-names.js.map +1 -0
- package/dist/tools/tool-names.test.d.ts +2 -0
- package/dist/tools/tool-names.test.d.ts.map +1 -0
- package/dist/tools/tool-names.test.js +7 -0
- package/dist/tools/tool-names.test.js.map +1 -0
- package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
- package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
- package/dist/tools/tool-parameter-schema.test.js +88 -0
- package/dist/tools/tool-parameter-schema.test.js.map +1 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +3 -8
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +3 -3
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +7 -10
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +3 -3
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +6 -10
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/web-search.test.js +12 -14
- package/dist/tools/web-search.test.js.map +1 -1
- package/dist/utils/command-logger.d.ts.map +1 -1
- package/dist/utils/command-logger.js.map +1 -1
- package/dist/utils/command-safety/constants.d.ts.map +1 -1
- package/dist/utils/command-safety/constants.js +1 -9
- package/dist/utils/command-safety/constants.js.map +1 -1
- package/dist/utils/command-safety/find-helpers.d.ts.map +1 -1
- package/dist/utils/command-safety/find-helpers.js +4 -9
- package/dist/utils/command-safety/find-helpers.js.map +1 -1
- package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/find-handler.js +3 -10
- package/dist/utils/command-safety/handlers/find-handler.js.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/git-handler.js +2 -4
- package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
- package/dist/utils/command-safety/handlers/index.d.ts +1 -1
- package/dist/utils/command-safety/handlers/index.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/index.js.map +1 -1
- package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
- package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
- package/dist/utils/command-safety/handlers/types.d.ts.map +1 -1
- package/dist/utils/command-safety/index.d.ts.map +1 -1
- package/dist/utils/command-safety/index.js +4 -10
- package/dist/utils/command-safety/index.js.map +1 -1
- package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
- package/dist/utils/command-safety/path-analysis.js +9 -20
- package/dist/utils/command-safety/path-analysis.js.map +1 -1
- package/dist/utils/command-safety/utils.d.ts.map +1 -1
- package/dist/utils/command-safety/utils.js +1 -3
- package/dist/utils/command-safety/utils.js.map +1 -1
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.devnull.test.d.ts +2 -0
- package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.js +13 -0
- package/dist/utils/command-safety.devnull.test.js.map +1 -0
- package/dist/utils/command-safety.find.test.js +44 -87
- package/dist/utils/command-safety.find.test.js.map +1 -1
- package/dist/utils/command-safety.js +10 -364
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/command-safety.path.test.js +32 -67
- package/dist/utils/command-safety.path.test.js.map +1 -1
- package/dist/utils/conversation-event-handler.d.ts +4 -16
- package/dist/utils/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation-event-handler.js +4 -8
- package/dist/utils/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation-event-handler.test.js +16 -18
- package/dist/utils/conversation-event-handler.test.js.map +1 -1
- package/dist/utils/conversation-utils.d.ts.map +1 -1
- package/dist/utils/conversation-utils.js +5 -8
- package/dist/utils/conversation-utils.js.map +1 -1
- package/dist/utils/conversation-utils.test.js +45 -44
- package/dist/utils/conversation-utils.test.js.map +1 -1
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +2 -4
- package/dist/utils/diff.js.map +1 -1
- package/dist/utils/diff.test.js +12 -12
- package/dist/utils/diff.test.js.map +1 -1
- package/dist/utils/error-helpers.d.ts.map +1 -1
- package/dist/utils/error-helpers.js +2 -6
- package/dist/utils/error-helpers.js.map +1 -1
- package/dist/utils/error-helpers.test.js +32 -32
- package/dist/utils/error-helpers.test.js.map +1 -1
- package/dist/utils/execute-shell.d.ts.map +1 -1
- package/dist/utils/execute-shell.js.map +1 -1
- package/dist/utils/execute-shell.test.js.map +1 -1
- package/dist/utils/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/extract-command-messages.js +16 -21
- 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 +58 -51
- package/dist/utils/extract-command-messages.test.js.map +1 -0
- package/dist/utils/ink-render-options.d.ts.map +1 -1
- package/dist/utils/ink-render-options.js.map +1 -1
- package/dist/utils/log-viewer-filters.d.ts +29 -0
- package/dist/utils/log-viewer-filters.d.ts.map +1 -0
- package/dist/utils/log-viewer-filters.js +49 -0
- package/dist/utils/log-viewer-filters.js.map +1 -0
- package/dist/utils/log-viewer-filters.test.d.ts +2 -0
- package/dist/utils/log-viewer-filters.test.d.ts.map +1 -0
- package/dist/utils/log-viewer-filters.test.js +48 -0
- package/dist/utils/log-viewer-filters.test.js.map +1 -0
- package/dist/utils/message-buffer.d.ts.map +1 -1
- package/dist/utils/message-buffer.js.map +1 -1
- package/dist/utils/message-buffer.test.js +4 -4
- package/dist/utils/message-buffer.test.js.map +1 -1
- package/dist/utils/output-trim.d.ts.map +1 -1
- package/dist/utils/output-trim.js.map +1 -1
- package/dist/utils/provider-credentials.d.ts.map +1 -1
- package/dist/utils/provider-credentials.js +1 -1
- package/dist/utils/provider-credentials.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.d.ts +18 -0
- package/dist/utils/provider-traffic-extractor.d.ts.map +1 -0
- package/dist/utils/provider-traffic-extractor.js +121 -0
- package/dist/utils/provider-traffic-extractor.js.map +1 -0
- package/dist/utils/provider-traffic-extractor.test.d.ts +2 -0
- package/dist/utils/provider-traffic-extractor.test.d.ts.map +1 -0
- package/dist/utils/provider-traffic-extractor.test.js +84 -0
- package/dist/utils/provider-traffic-extractor.test.js.map +1 -0
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +5 -12
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/ssh-config-parser.d.ts.map +1 -1
- package/dist/utils/ssh-config-parser.js.map +1 -1
- package/dist/utils/ssh-config-parser.test.js.map +1 -1
- package/dist/utils/streaming-session-factory.d.ts +33 -0
- package/dist/utils/streaming-session-factory.d.ts.map +1 -0
- package/dist/utils/streaming-session-factory.js +75 -0
- package/dist/utils/streaming-session-factory.js.map +1 -0
- package/dist/utils/streaming-session-factory.test.d.ts +2 -0
- package/dist/utils/streaming-session-factory.test.d.ts.map +1 -0
- package/dist/utils/streaming-session-factory.test.js +74 -0
- package/dist/utils/streaming-session-factory.test.js.map +1 -0
- package/dist/utils/streaming-updater.d.ts.map +1 -1
- package/dist/utils/streaming-updater.js.map +1 -1
- package/dist/utils/throttle.d.ts.map +1 -1
- package/dist/utils/throttle.js.map +1 -1
- package/dist/utils/token-usage.d.ts.map +1 -1
- package/dist/utils/token-usage.js +1 -2
- package/dist/utils/token-usage.js.map +1 -1
- package/dist/utils/token-usage.test.js +8 -8
- package/dist/utils/token-usage.test.js.map +1 -1
- package/dist/utils/trim-tool-output.d.ts.map +1 -1
- package/dist/utils/trim-tool-output.js +1 -1
- package/dist/utils/trim-tool-output.js.map +1 -1
- package/package.json +117 -111
- package/readme.md +196 -145
- package/dist/app.model-command-feedback.test.d.ts +0 -2
- package/dist/app.model-command-feedback.test.d.ts.map +0 -1
- package/dist/app.model-command-feedback.test.js +0 -19
- package/dist/app.model-command-feedback.test.js.map +0 -1
- package/dist/components/MentorMode.test.d.ts +0 -2
- package/dist/components/MentorMode.test.d.ts.map +0 -1
- package/dist/components/MentorMode.test.js.map +0 -1
- package/dist/components/StatusBar.test.d.ts +0 -2
- package/dist/components/StatusBar.test.d.ts.map +0 -1
- package/dist/components/StatusBar.test.js +0 -19
- package/dist/components/StatusBar.test.js.map +0 -1
- package/dist/debug-schema.d.ts +0 -2
- package/dist/debug-schema.d.ts.map +0 -1
- package/dist/debug-schema.js +0 -22
- package/dist/debug-schema.js.map +0 -1
- package/dist/hooks/use-model-selection.test.d.ts +0 -2
- package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
- package/dist/hooks/use-model-selection.test.js +0 -28
- package/dist/hooks/use-model-selection.test.js.map +0 -1
- package/dist/hooks/use-path-completion.test.d.ts +0 -2
- package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
- package/dist/hooks/use-path-completion.test.js +0 -29
- package/dist/hooks/use-path-completion.test.js.map +0 -1
- package/dist/prompts/default.md.bak +0 -77
- package/dist/providers/github-copilot/model-direct.d.ts +0 -34
- package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
- package/dist/providers/github-copilot/model-direct.js +0 -443
- package/dist/providers/github-copilot/model-direct.js.map +0 -1
- package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
- package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
- package/dist/providers/openrouter/merge-messages.test.js +0 -83
- package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
- package/dist/providers/openrouter.history.test.d.ts +0 -2
- package/dist/providers/openrouter.history.test.d.ts.map +0 -1
- package/dist/providers/openrouter.history.test.js +0 -533
- package/dist/providers/openrouter.history.test.js.map +0 -1
- package/dist/reproduce_issue.test.d.ts +0 -2
- package/dist/reproduce_issue.test.d.ts.map +0 -1
- package/dist/reproduce_issue.test.js +0 -31
- package/dist/reproduce_issue.test.js.map +0 -1
- package/dist/services/conversation-session.usage.test.d.ts +0 -2
- package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
- package/dist/services/conversation-session.usage.test.js +0 -59
- package/dist/services/conversation-session.usage.test.js.map +0 -1
- package/dist/test-search-tool.d.ts +0 -2
- package/dist/test-search-tool.d.ts.map +0 -1
- package/dist/test-search-tool.js +0 -36
- package/dist/test-search-tool.js.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.js +0 -31
- package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
- package/dist/utils/message-utils.d.ts +0 -17
- package/dist/utils/message-utils.d.ts.map +0 -1
- package/dist/utils/message-utils.js +0 -52
- package/dist/utils/message-utils.js.map +0 -1
- package/dist/utils/message-utils.test.d.ts +0 -2
- package/dist/utils/message-utils.test.d.ts.map +0 -1
- package/dist/utils/message-utils.test.js +0 -48
- package/dist/utils/message-utils.test.js.map +0 -1
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { extractCommandMessages, markToolCallAsApprovalRejection
|
|
1
|
+
import { extractCommandMessages, markToolCallAsApprovalRejection } from '../utils/extract-command-messages.js';
|
|
2
2
|
import { ConversationStore } from './conversation-store.js';
|
|
3
3
|
import { ModelBehaviorError } from '@openai/agents';
|
|
4
4
|
import { extractUsage } from '../utils/token-usage.js';
|
|
5
|
+
import { getProvider } from '../providers/index.js';
|
|
6
|
+
import { extractReasoningDelta, extractTextDelta } from './stream-event-parsing.js';
|
|
7
|
+
import { captureToolCallArguments, emitCommandMessagesFromItems } from './command-message-streaming.js';
|
|
8
|
+
import { ApprovalState } from './approval-state.js';
|
|
9
|
+
import { createInvalidToolCallDiagnostic } from './logging-contract.js';
|
|
5
10
|
const getCommandFromArgs = (args) => {
|
|
6
11
|
if (!args) {
|
|
7
12
|
return '';
|
|
@@ -63,19 +68,23 @@ const isToolHallucinationError = (error) => {
|
|
|
63
68
|
const message = error.message.toLowerCase();
|
|
64
69
|
return message.includes('tool') && message.includes('not found');
|
|
65
70
|
};
|
|
71
|
+
const supportsConversationChaining = (providerId) => {
|
|
72
|
+
const providerDef = getProvider(providerId);
|
|
73
|
+
return providerDef?.capabilities?.supportsConversationChaining ?? false;
|
|
74
|
+
};
|
|
66
75
|
export class ConversationSession {
|
|
67
76
|
id;
|
|
68
77
|
agentClient;
|
|
69
78
|
logger;
|
|
70
79
|
conversationStore;
|
|
71
80
|
previousResponseId = null;
|
|
72
|
-
|
|
73
|
-
abortedApprovalContext = null;
|
|
81
|
+
approvalState = new ApprovalState();
|
|
74
82
|
textDeltaCount = 0;
|
|
75
83
|
reasoningDeltaCount = 0;
|
|
76
84
|
toolCallArgumentsById = new Map();
|
|
77
85
|
lastEventType = null;
|
|
78
86
|
eventTypeCount = 0;
|
|
87
|
+
emittedInvalidToolCallPackets = new Set();
|
|
79
88
|
// private logStreamEvent = (eventType: string, eventData: any) => {
|
|
80
89
|
// if (eventData.item) {
|
|
81
90
|
// eventType = eventData.item.type;
|
|
@@ -112,7 +121,7 @@ export class ConversationSession {
|
|
|
112
121
|
this.lastEventType = null;
|
|
113
122
|
this.eventTypeCount = 0;
|
|
114
123
|
};
|
|
115
|
-
constructor(id, { agentClient, deps
|
|
124
|
+
constructor(id, { agentClient, deps }) {
|
|
116
125
|
this.id = id;
|
|
117
126
|
this.agentClient = agentClient;
|
|
118
127
|
this.logger = deps.logger;
|
|
@@ -121,8 +130,8 @@ export class ConversationSession {
|
|
|
121
130
|
reset() {
|
|
122
131
|
this.previousResponseId = null;
|
|
123
132
|
this.conversationStore.clear();
|
|
124
|
-
this.
|
|
125
|
-
this.
|
|
133
|
+
this.approvalState.clearPending();
|
|
134
|
+
this.approvalState.consumeAborted();
|
|
126
135
|
this.toolCallArgumentsById.clear();
|
|
127
136
|
if (typeof this.agentClient.clearConversations === 'function') {
|
|
128
137
|
this.agentClient.clearConversations();
|
|
@@ -160,10 +169,14 @@ export class ConversationSession {
|
|
|
160
169
|
abort() {
|
|
161
170
|
this.agentClient.abort();
|
|
162
171
|
// Save pending approval context so we can handle it in the next message
|
|
163
|
-
if (this.
|
|
164
|
-
this.
|
|
165
|
-
|
|
166
|
-
|
|
172
|
+
if (this.approvalState.abortPending()) {
|
|
173
|
+
this.logger.debug('Aborted approval - will handle rejection on next message', {
|
|
174
|
+
eventType: 'approval.aborted',
|
|
175
|
+
category: 'approval',
|
|
176
|
+
phase: 'abort',
|
|
177
|
+
sessionId: this.id,
|
|
178
|
+
traceId: this.logger.getCorrelationId(),
|
|
179
|
+
});
|
|
167
180
|
}
|
|
168
181
|
}
|
|
169
182
|
/**
|
|
@@ -174,35 +187,40 @@ export class ConversationSession {
|
|
|
174
187
|
async *run(text, { hallucinationRetryCount = 0, skipUserMessage = false, } = {}) {
|
|
175
188
|
let stream = null;
|
|
176
189
|
try {
|
|
177
|
-
|
|
190
|
+
this.logger.info('Conversation stream start', {
|
|
191
|
+
eventType: 'stream.started',
|
|
192
|
+
category: 'stream',
|
|
193
|
+
phase: 'request_start',
|
|
194
|
+
sessionId: this.id,
|
|
195
|
+
traceId: this.logger.getCorrelationId(),
|
|
196
|
+
});
|
|
197
|
+
const abortedContext = this.approvalState.consumeAborted();
|
|
198
|
+
const shouldAddUserMessage = !skipUserMessage && !abortedContext;
|
|
178
199
|
// Maintain canonical local history regardless of provider.
|
|
179
200
|
if (shouldAddUserMessage) {
|
|
180
201
|
this.conversationStore.addUserMessage(text);
|
|
181
202
|
}
|
|
182
203
|
// If there's an aborted approval, we need to resolve it first.
|
|
183
204
|
// The user's message is a new input, but the agent is stuck waiting for tool output.
|
|
184
|
-
if (
|
|
205
|
+
if (abortedContext) {
|
|
185
206
|
this.logger.debug('Resolving aborted approval with fake execution', {
|
|
186
207
|
message: text,
|
|
187
208
|
});
|
|
188
|
-
const { state, interruption, emittedCommandIds, toolCallArgumentsById
|
|
189
|
-
this.abortedApprovalContext = null;
|
|
209
|
+
const { state, interruption, emittedCommandIds, toolCallArgumentsById } = abortedContext;
|
|
190
210
|
// Restore cached tool-call arguments captured before abort so continuation can attach them
|
|
191
211
|
this.toolCallArgumentsById.clear();
|
|
192
212
|
if (toolCallArgumentsById?.size) {
|
|
193
|
-
for (const [key, value
|
|
213
|
+
for (const [key, value] of toolCallArgumentsById.entries()) {
|
|
194
214
|
this.toolCallArgumentsById.set(key, value);
|
|
195
215
|
}
|
|
196
216
|
}
|
|
197
217
|
// Add interceptor for this tool execution
|
|
198
218
|
const toolName = interruption.name ?? 'unknown';
|
|
199
|
-
const expectedCallId = interruption.rawItem?.callId ??
|
|
200
|
-
interruption.callId;
|
|
219
|
+
const expectedCallId = interruption.rawItem?.callId ?? interruption.callId;
|
|
201
220
|
const rejectionMessage = `Tool execution was not approved. User provided new input instead: ${text}`;
|
|
202
221
|
const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
|
|
203
222
|
// Match both tool name and call ID for stricter matching
|
|
204
|
-
if (name === toolName &&
|
|
205
|
-
(!expectedCallId || toolCallId === expectedCallId)) {
|
|
223
|
+
if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
|
|
206
224
|
markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
|
|
207
225
|
return rejectionMessage;
|
|
208
226
|
}
|
|
@@ -225,8 +243,7 @@ export class ConversationSession {
|
|
|
225
243
|
this.previousResponseId = stream.lastResponseId;
|
|
226
244
|
this.conversationStore.updateFromResult(stream);
|
|
227
245
|
// Check if another interruption occurred
|
|
228
|
-
if (stream.interruptions &&
|
|
229
|
-
stream.interruptions.length > 0) {
|
|
246
|
+
if (stream.interruptions && stream.interruptions.length > 0) {
|
|
230
247
|
this.logger.warn('Another interruption occurred after fake execution - handling as approval');
|
|
231
248
|
// Let the normal flow handle this
|
|
232
249
|
const result = this.#buildResult(stream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
|
|
@@ -253,12 +270,8 @@ export class ConversationSession {
|
|
|
253
270
|
yield {
|
|
254
271
|
type: 'final',
|
|
255
272
|
finalText: result.finalText,
|
|
256
|
-
...(result.reasoningText
|
|
257
|
-
|
|
258
|
-
: {}),
|
|
259
|
-
...(result.commandMessages?.length
|
|
260
|
-
? { commandMessages: result.commandMessages }
|
|
261
|
-
: {}),
|
|
273
|
+
...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
|
|
274
|
+
...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
|
|
262
275
|
...(result.usage ? { usage: result.usage } : {}),
|
|
263
276
|
};
|
|
264
277
|
}
|
|
@@ -289,12 +302,8 @@ export class ConversationSession {
|
|
|
289
302
|
yield {
|
|
290
303
|
type: 'final',
|
|
291
304
|
finalText: result.finalText,
|
|
292
|
-
...(result.reasoningText
|
|
293
|
-
|
|
294
|
-
: {}),
|
|
295
|
-
...(result.commandMessages?.length
|
|
296
|
-
? { commandMessages: result.commandMessages }
|
|
297
|
-
: {}),
|
|
305
|
+
...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
|
|
306
|
+
...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
|
|
298
307
|
...(result.usage ? { usage: result.usage } : {}),
|
|
299
308
|
};
|
|
300
309
|
}
|
|
@@ -302,9 +311,7 @@ export class ConversationSession {
|
|
|
302
311
|
}
|
|
303
312
|
catch (error) {
|
|
304
313
|
this.logger.warn('Error resolving aborted approval with fake execution', {
|
|
305
|
-
error: error instanceof Error
|
|
306
|
-
? error.message
|
|
307
|
-
: String(error),
|
|
314
|
+
error: error instanceof Error ? error.message : String(error),
|
|
308
315
|
});
|
|
309
316
|
// Fall through to normal message flow
|
|
310
317
|
}
|
|
@@ -317,11 +324,8 @@ export class ConversationSession {
|
|
|
317
324
|
const provider = typeof this.agentClient.getProvider === 'function'
|
|
318
325
|
? this.agentClient.getProvider()
|
|
319
326
|
: 'openai';
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
stream = await this.agentClient.startStream(provider !== 'openai'
|
|
323
|
-
? this.conversationStore.getHistory()
|
|
324
|
-
: text, {
|
|
327
|
+
const supportsChaining = supportsConversationChaining(provider);
|
|
328
|
+
stream = await this.agentClient.startStream(supportsChaining ? text : this.conversationStore.getHistory(), {
|
|
325
329
|
previousResponseId: this.previousResponseId,
|
|
326
330
|
});
|
|
327
331
|
const acc = {
|
|
@@ -338,6 +342,14 @@ export class ConversationSession {
|
|
|
338
342
|
// Build terminal event (approval_required or final)
|
|
339
343
|
const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
|
|
340
344
|
if (result.type === 'approval_required') {
|
|
345
|
+
this.logger.info('Tool approval required', {
|
|
346
|
+
eventType: 'approval.required',
|
|
347
|
+
category: 'approval',
|
|
348
|
+
phase: 'approval',
|
|
349
|
+
sessionId: this.id,
|
|
350
|
+
traceId: this.logger.getCorrelationId(),
|
|
351
|
+
toolName: result.approval.toolName,
|
|
352
|
+
});
|
|
341
353
|
const interruption = result.approval.rawInterruption;
|
|
342
354
|
const callId = interruption?.rawItem?.callId ??
|
|
343
355
|
interruption?.callId ??
|
|
@@ -359,27 +371,26 @@ export class ConversationSession {
|
|
|
359
371
|
yield {
|
|
360
372
|
type: 'final',
|
|
361
373
|
finalText: result.finalText,
|
|
362
|
-
...(result.reasoningText
|
|
363
|
-
|
|
364
|
-
: {}),
|
|
365
|
-
...(result.commandMessages?.length
|
|
366
|
-
? { commandMessages: result.commandMessages }
|
|
367
|
-
: {}),
|
|
374
|
+
...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
|
|
375
|
+
...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
|
|
368
376
|
...(result.usage ? { usage: result.usage } : {}),
|
|
369
377
|
};
|
|
370
378
|
}
|
|
371
379
|
catch (error) {
|
|
372
380
|
// Handle tool hallucination: model called a non-existent tool
|
|
373
|
-
if (isToolHallucinationError(error) &&
|
|
374
|
-
|
|
375
|
-
const toolName = error instanceof Error
|
|
376
|
-
? error.message.match(/Tool (\S+) not found/)?.[1] ||
|
|
377
|
-
'unknown'
|
|
378
|
-
: 'unknown';
|
|
381
|
+
if (isToolHallucinationError(error) && hallucinationRetryCount < MAX_HALLUCINATION_RETRIES) {
|
|
382
|
+
const toolName = error instanceof Error ? error.message.match(/Tool (\S+) not found/)?.[1] || 'unknown' : 'unknown';
|
|
379
383
|
this.logger.warn('Tool hallucination detected, retrying', {
|
|
384
|
+
eventType: 'retry.hallucination',
|
|
385
|
+
category: 'retry',
|
|
386
|
+
phase: 'retry',
|
|
380
387
|
toolName,
|
|
388
|
+
retryType: 'hallucination',
|
|
389
|
+
retryAttempt: hallucinationRetryCount + 1,
|
|
381
390
|
attempt: hallucinationRetryCount + 1,
|
|
382
391
|
maxRetries: MAX_HALLUCINATION_RETRIES,
|
|
392
|
+
sessionId: this.id,
|
|
393
|
+
traceId: this.logger.getCorrelationId(),
|
|
383
394
|
errorMessage: error instanceof Error ? error.message : String(error),
|
|
384
395
|
});
|
|
385
396
|
yield {
|
|
@@ -412,6 +423,14 @@ export class ConversationSession {
|
|
|
412
423
|
type: 'error',
|
|
413
424
|
message: error instanceof Error ? error.message : String(error),
|
|
414
425
|
};
|
|
426
|
+
this.logger.error('Conversation stream error', {
|
|
427
|
+
eventType: 'stream.failed',
|
|
428
|
+
category: 'stream',
|
|
429
|
+
phase: 'abort',
|
|
430
|
+
sessionId: this.id,
|
|
431
|
+
traceId: this.logger.getCorrelationId(),
|
|
432
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
433
|
+
});
|
|
415
434
|
throw error;
|
|
416
435
|
}
|
|
417
436
|
}
|
|
@@ -421,25 +440,31 @@ export class ConversationSession {
|
|
|
421
440
|
* Named as a string-literal because `continue` is a keyword.
|
|
422
441
|
*/
|
|
423
442
|
async *['continue']({ answer, rejectionReason, }) {
|
|
424
|
-
|
|
443
|
+
const pendingApprovalContext = this.approvalState.getPending();
|
|
444
|
+
if (!pendingApprovalContext) {
|
|
425
445
|
return;
|
|
426
446
|
}
|
|
427
|
-
const { state, interruption, emittedCommandIds: previouslyEmittedIds, toolCallArgumentsById, } =
|
|
447
|
+
const { state, interruption, emittedCommandIds: previouslyEmittedIds, toolCallArgumentsById, } = pendingApprovalContext;
|
|
428
448
|
let removeInterceptor = null;
|
|
429
449
|
if (answer === 'y') {
|
|
450
|
+
this.logger.info('Tool approval granted', {
|
|
451
|
+
eventType: 'approval.granted',
|
|
452
|
+
category: 'approval',
|
|
453
|
+
phase: 'approval',
|
|
454
|
+
sessionId: this.id,
|
|
455
|
+
traceId: this.logger.getCorrelationId(),
|
|
456
|
+
});
|
|
430
457
|
state.approve(interruption);
|
|
431
458
|
}
|
|
432
459
|
else {
|
|
433
460
|
const toolName = interruption.name ?? 'unknown';
|
|
434
|
-
const expectedCallId = interruption.rawItem?.callId ??
|
|
435
|
-
interruption.callId;
|
|
461
|
+
const expectedCallId = interruption.rawItem?.callId ?? interruption.callId;
|
|
436
462
|
const rejectionMessage = rejectionReason
|
|
437
463
|
? `Tool execution was not approved. User's reason: ${rejectionReason}`
|
|
438
464
|
: 'Tool execution was not approved.';
|
|
439
465
|
if (typeof this.agentClient.addToolInterceptor === 'function') {
|
|
440
466
|
const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
|
|
441
|
-
if (name === toolName &&
|
|
442
|
-
(!expectedCallId || toolCallId === expectedCallId)) {
|
|
467
|
+
if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
|
|
443
468
|
markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
|
|
444
469
|
return rejectionMessage;
|
|
445
470
|
}
|
|
@@ -448,18 +473,21 @@ export class ConversationSession {
|
|
|
448
473
|
// Approve to continue but interceptor will return rejection message
|
|
449
474
|
state.approve(interruption);
|
|
450
475
|
// Store interceptor cleanup for after stream
|
|
451
|
-
this.
|
|
452
|
-
...this.pendingApprovalContext,
|
|
453
|
-
removeInterceptor,
|
|
454
|
-
};
|
|
476
|
+
this.approvalState.setPendingRemoveInterceptor(removeInterceptor);
|
|
455
477
|
}
|
|
456
478
|
else {
|
|
457
479
|
// Fallback for clients without tool interceptors
|
|
458
480
|
state.reject(interruption);
|
|
459
481
|
}
|
|
482
|
+
this.logger.info('Tool approval rejected', {
|
|
483
|
+
eventType: 'approval.rejected',
|
|
484
|
+
category: 'approval',
|
|
485
|
+
phase: 'approval',
|
|
486
|
+
sessionId: this.id,
|
|
487
|
+
traceId: this.logger.getCorrelationId(),
|
|
488
|
+
});
|
|
460
489
|
}
|
|
461
|
-
removeInterceptor =
|
|
462
|
-
this.pendingApprovalContext?.removeInterceptor ?? null;
|
|
490
|
+
removeInterceptor = this.approvalState.getPending()?.removeInterceptor ?? null;
|
|
463
491
|
// Restore cached tool-call arguments so continuation outputs can attach them
|
|
464
492
|
this.toolCallArgumentsById.clear();
|
|
465
493
|
if (toolCallArgumentsById?.size) {
|
|
@@ -484,12 +512,17 @@ export class ConversationSession {
|
|
|
484
512
|
this.conversationStore.updateFromResult(stream);
|
|
485
513
|
// Merge previously emitted command IDs with newly emitted ones
|
|
486
514
|
// This prevents duplicates when result.history contains commands from the initial stream
|
|
487
|
-
const allEmittedIds = new Set([
|
|
488
|
-
...previouslyEmittedIds,
|
|
489
|
-
...acc.emittedCommandIds,
|
|
490
|
-
]);
|
|
515
|
+
const allEmittedIds = new Set([...previouslyEmittedIds, ...acc.emittedCommandIds]);
|
|
491
516
|
const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
|
|
492
517
|
if (result.type === 'approval_required') {
|
|
518
|
+
this.logger.info('Tool approval required', {
|
|
519
|
+
eventType: 'approval.required',
|
|
520
|
+
category: 'approval',
|
|
521
|
+
phase: 'approval',
|
|
522
|
+
sessionId: this.id,
|
|
523
|
+
traceId: this.logger.getCorrelationId(),
|
|
524
|
+
toolName: result.approval.toolName,
|
|
525
|
+
});
|
|
493
526
|
const interruption = result.approval.rawInterruption;
|
|
494
527
|
const callId = interruption?.rawItem?.callId ??
|
|
495
528
|
interruption?.callId ??
|
|
@@ -511,12 +544,8 @@ export class ConversationSession {
|
|
|
511
544
|
yield {
|
|
512
545
|
type: 'final',
|
|
513
546
|
finalText: result.finalText,
|
|
514
|
-
...(result.reasoningText
|
|
515
|
-
|
|
516
|
-
: {}),
|
|
517
|
-
...(result.commandMessages?.length
|
|
518
|
-
? { commandMessages: result.commandMessages }
|
|
519
|
-
: {}),
|
|
547
|
+
...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
|
|
548
|
+
...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
|
|
520
549
|
...(result.usage ? { usage: result.usage } : {}),
|
|
521
550
|
};
|
|
522
551
|
}
|
|
@@ -558,7 +587,7 @@ export class ConversationSession {
|
|
|
558
587
|
case 'approval_required': {
|
|
559
588
|
sawTerminalEvent = event;
|
|
560
589
|
// pendingApprovalContext is set inside #buildResult during run()
|
|
561
|
-
const rawInterruption = this.
|
|
590
|
+
const rawInterruption = this.approvalState.getPending()?.interruption;
|
|
562
591
|
return {
|
|
563
592
|
type: 'approval_required',
|
|
564
593
|
approval: {
|
|
@@ -613,7 +642,7 @@ export class ConversationSession {
|
|
|
613
642
|
return response;
|
|
614
643
|
}
|
|
615
644
|
async handleApprovalDecision(answer, rejectionReason, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, } = {}) {
|
|
616
|
-
if (!this.
|
|
645
|
+
if (!this.approvalState.getPending()) {
|
|
617
646
|
return null;
|
|
618
647
|
}
|
|
619
648
|
let finalText = '';
|
|
@@ -640,7 +669,7 @@ export class ConversationSession {
|
|
|
640
669
|
}
|
|
641
670
|
case 'approval_required': {
|
|
642
671
|
sawTerminalEvent = event;
|
|
643
|
-
const rawInterruption = this.
|
|
672
|
+
const rawInterruption = this.approvalState.getPending()?.interruption;
|
|
644
673
|
return {
|
|
645
674
|
type: 'approval_required',
|
|
646
675
|
approval: {
|
|
@@ -748,14 +777,14 @@ export class ConversationSession {
|
|
|
748
777
|
});
|
|
749
778
|
}
|
|
750
779
|
// Log event type with deduplication for ordering understanding
|
|
751
|
-
const delta1 =
|
|
780
|
+
const delta1 = extractTextDelta(event);
|
|
752
781
|
if (delta1) {
|
|
753
782
|
const e = emitText(delta1);
|
|
754
783
|
if (e)
|
|
755
784
|
yield e;
|
|
756
785
|
}
|
|
757
786
|
if (event?.data) {
|
|
758
|
-
const delta2 =
|
|
787
|
+
const delta2 = extractTextDelta(event.data);
|
|
759
788
|
if (delta2) {
|
|
760
789
|
const e = emitText(delta2);
|
|
761
790
|
if (e)
|
|
@@ -763,71 +792,25 @@ export class ConversationSession {
|
|
|
763
792
|
}
|
|
764
793
|
}
|
|
765
794
|
// Handle reasoning items
|
|
766
|
-
const reasoningDelta = (
|
|
767
|
-
// OpenAI style
|
|
768
|
-
const data = event?.data;
|
|
769
|
-
if (data &&
|
|
770
|
-
typeof data === 'object' &&
|
|
771
|
-
data.type === 'model') {
|
|
772
|
-
const eventDetail = data.event;
|
|
773
|
-
if (eventDetail &&
|
|
774
|
-
typeof eventDetail === 'object' &&
|
|
775
|
-
eventDetail.type ===
|
|
776
|
-
'response.reasoning_summary_text.delta') {
|
|
777
|
-
return eventDetail.delta ?? '';
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
// OpenRouter style
|
|
781
|
-
const choices = event?.data?.event?.choices;
|
|
782
|
-
if (!choices)
|
|
783
|
-
return '';
|
|
784
|
-
if (Array.isArray(choices)) {
|
|
785
|
-
return choices[0]?.delta?.reasoning ?? choices[0]?.delta?.reasoning_content ?? '';
|
|
786
|
-
}
|
|
787
|
-
if (typeof choices === 'object') {
|
|
788
|
-
const byZero = choices['0'];
|
|
789
|
-
const first = byZero ?? choices[Object.keys(choices)[0]];
|
|
790
|
-
return first?.delta?.reasoning ?? first?.delta?.reasoning_content ?? '';
|
|
791
|
-
}
|
|
792
|
-
return '';
|
|
793
|
-
})();
|
|
795
|
+
const reasoningDelta = extractReasoningDelta(event);
|
|
794
796
|
if (reasoningDelta) {
|
|
795
797
|
const e = emitReasoning(reasoningDelta);
|
|
796
798
|
if (e)
|
|
797
799
|
yield e;
|
|
798
800
|
}
|
|
799
|
-
const maybeEmitCommandMessagesFromItems = (items) => {
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
for (const cmdMsg of commandMessages) {
|
|
804
|
-
if (acc.emittedCommandIds.has(cmdMsg.id)) {
|
|
805
|
-
continue;
|
|
806
|
-
}
|
|
807
|
-
if (cmdMsg.isApprovalRejection) {
|
|
808
|
-
continue;
|
|
809
|
-
}
|
|
810
|
-
acc.emittedCommandIds.add(cmdMsg.id);
|
|
811
|
-
out.push({ type: 'command_message', message: cmdMsg });
|
|
812
|
-
}
|
|
813
|
-
return out;
|
|
814
|
-
};
|
|
801
|
+
const maybeEmitCommandMessagesFromItems = (items) => emitCommandMessagesFromItems(items, {
|
|
802
|
+
toolCallArgumentsById,
|
|
803
|
+
emittedCommandIds: acc.emittedCommandIds,
|
|
804
|
+
});
|
|
815
805
|
if (event?.type === 'run_item_stream_event') {
|
|
816
|
-
|
|
806
|
+
captureToolCallArguments(event.item, toolCallArgumentsById);
|
|
817
807
|
// Emit tool_started event when a function_call is detected
|
|
818
808
|
const rawItem = event.item?.rawItem ?? event.item;
|
|
819
809
|
if (rawItem?.type === 'function_call') {
|
|
820
|
-
const callId = rawItem.callId ??
|
|
821
|
-
rawItem.call_id ??
|
|
822
|
-
rawItem.tool_call_id ??
|
|
823
|
-
rawItem.toolCallId ??
|
|
824
|
-
rawItem.id;
|
|
810
|
+
const callId = rawItem.callId ?? rawItem.call_id ?? rawItem.tool_call_id ?? rawItem.toolCallId ?? rawItem.id;
|
|
825
811
|
if (callId) {
|
|
826
812
|
const toolName = rawItem.name ?? event.item?.name;
|
|
827
|
-
const args = rawItem.arguments ??
|
|
828
|
-
rawItem.args ??
|
|
829
|
-
event.item?.arguments ??
|
|
830
|
-
event.item?.args;
|
|
813
|
+
const args = rawItem.arguments ?? rawItem.args ?? event.item?.arguments ?? event.item?.args;
|
|
831
814
|
// Providers sometimes surface arguments as a JSON string.
|
|
832
815
|
// Normalize here so downstream UI (pending/running display)
|
|
833
816
|
// can reliably render parameters.
|
|
@@ -843,6 +826,30 @@ export class ConversationSession {
|
|
|
843
826
|
return JSON.parse(trimmed);
|
|
844
827
|
}
|
|
845
828
|
catch {
|
|
829
|
+
if ((trimmed.startsWith('{') || trimmed.startsWith('[')) &&
|
|
830
|
+
!this.emittedInvalidToolCallPackets.has(String(callId))) {
|
|
831
|
+
this.emittedInvalidToolCallPackets.add(String(callId));
|
|
832
|
+
const diagnostic = createInvalidToolCallDiagnostic({
|
|
833
|
+
toolName: toolName ?? 'unknown',
|
|
834
|
+
toolCallId: String(callId),
|
|
835
|
+
rawPayload: trimmed,
|
|
836
|
+
normalizedToolCall: {
|
|
837
|
+
toolName: toolName ?? 'unknown',
|
|
838
|
+
toolCallId: String(callId),
|
|
839
|
+
arguments: args,
|
|
840
|
+
},
|
|
841
|
+
validationErrors: ['arguments must be valid JSON'],
|
|
842
|
+
traceId: this.logger.getCorrelationId() ?? 'trace-unknown',
|
|
843
|
+
retryContext: {
|
|
844
|
+
sessionId: this.id,
|
|
845
|
+
},
|
|
846
|
+
});
|
|
847
|
+
this.logger.error('Invalid tool call argument payload', {
|
|
848
|
+
...diagnostic,
|
|
849
|
+
sessionId: this.id,
|
|
850
|
+
messageId: String(callId),
|
|
851
|
+
});
|
|
852
|
+
}
|
|
846
853
|
return args;
|
|
847
854
|
}
|
|
848
855
|
})();
|
|
@@ -852,26 +859,31 @@ export class ConversationSession {
|
|
|
852
859
|
toolName: toolName ?? 'unknown',
|
|
853
860
|
arguments: normalizedArgs,
|
|
854
861
|
};
|
|
862
|
+
this.logger.info('Tool execution started', {
|
|
863
|
+
eventType: 'tool_call.execution_started',
|
|
864
|
+
category: 'tool',
|
|
865
|
+
phase: 'execution',
|
|
866
|
+
sessionId: this.id,
|
|
867
|
+
traceId: this.logger.getCorrelationId(),
|
|
868
|
+
toolName: toolName ?? 'unknown',
|
|
869
|
+
toolCallId: String(callId),
|
|
870
|
+
messageId: String(callId),
|
|
871
|
+
});
|
|
855
872
|
}
|
|
856
873
|
}
|
|
857
|
-
for (const e of maybeEmitCommandMessagesFromItems([
|
|
858
|
-
event.item,
|
|
859
|
-
])) {
|
|
874
|
+
for (const e of maybeEmitCommandMessagesFromItems([event.item])) {
|
|
860
875
|
yield e;
|
|
861
876
|
}
|
|
862
877
|
}
|
|
863
|
-
else if (event?.type === 'tool_call_output_item' ||
|
|
864
|
-
event
|
|
865
|
-
this.#captureToolCallArguments(event, toolCallArgumentsById);
|
|
878
|
+
else if (event?.type === 'tool_call_output_item' || event?.rawItem?.type === 'function_call_output') {
|
|
879
|
+
captureToolCallArguments(event, toolCallArgumentsById);
|
|
866
880
|
for (const e of maybeEmitCommandMessagesFromItems([event])) {
|
|
867
881
|
yield e;
|
|
868
882
|
}
|
|
869
883
|
}
|
|
870
884
|
}
|
|
871
885
|
const completedResult = await stream.completed;
|
|
872
|
-
const rawResponses = Array.isArray(stream?.rawResponses)
|
|
873
|
-
? stream.rawResponses
|
|
874
|
-
: [];
|
|
886
|
+
const rawResponses = Array.isArray(stream?.rawResponses) ? stream.rawResponses : [];
|
|
875
887
|
let usageFromRawResponses;
|
|
876
888
|
for (let i = rawResponses.length - 1; i >= 0; i--) {
|
|
877
889
|
const candidate = extractUsage(rawResponses[i]);
|
|
@@ -880,9 +892,7 @@ export class ConversationSession {
|
|
|
880
892
|
break;
|
|
881
893
|
}
|
|
882
894
|
}
|
|
883
|
-
const finalUsage = extractUsage(completedResult) ||
|
|
884
|
-
extractUsage(stream) ||
|
|
885
|
-
usageFromRawResponses;
|
|
895
|
+
const finalUsage = extractUsage(completedResult) || extractUsage(stream) || usageFromRawResponses;
|
|
886
896
|
if (finalUsage) {
|
|
887
897
|
acc.latestUsage = finalUsage;
|
|
888
898
|
const usageSource = extractUsage(completedResult)
|
|
@@ -898,9 +908,7 @@ export class ConversationSession {
|
|
|
898
908
|
});
|
|
899
909
|
}
|
|
900
910
|
else {
|
|
901
|
-
const completedResultRecord = completedResult &&
|
|
902
|
-
typeof completedResult === 'object' &&
|
|
903
|
-
!Array.isArray(completedResult)
|
|
911
|
+
const completedResultRecord = completedResult && typeof completedResult === 'object' && !Array.isArray(completedResult)
|
|
904
912
|
? completedResult
|
|
905
913
|
: undefined;
|
|
906
914
|
const streamRecord = stream && typeof stream === 'object' && !Array.isArray(stream)
|
|
@@ -909,14 +917,8 @@ export class ConversationSession {
|
|
|
909
917
|
this.logger.debug('No usage found in stream completion', {
|
|
910
918
|
sessionId: this.id,
|
|
911
919
|
source: 'stream_completed',
|
|
912
|
-
completedResultType: completedResult === null
|
|
913
|
-
|
|
914
|
-
: Array.isArray(completedResult)
|
|
915
|
-
? 'array'
|
|
916
|
-
: typeof completedResult,
|
|
917
|
-
completedResultKeys: completedResultRecord
|
|
918
|
-
? Object.keys(completedResultRecord)
|
|
919
|
-
: [],
|
|
920
|
+
completedResultType: completedResult === null ? 'null' : Array.isArray(completedResult) ? 'array' : typeof completedResult,
|
|
921
|
+
completedResultKeys: completedResultRecord ? Object.keys(completedResultRecord) : [],
|
|
920
922
|
streamKeys: streamRecord ? Object.keys(streamRecord) : [],
|
|
921
923
|
completedResultHasUsagePath: {
|
|
922
924
|
usage: Boolean(completedResultRecord?.usage),
|
|
@@ -928,128 +930,15 @@ export class ConversationSession {
|
|
|
928
930
|
}
|
|
929
931
|
this.flushStreamEventLog();
|
|
930
932
|
}
|
|
931
|
-
#captureToolCallArguments(item, toolCallArgumentsById) {
|
|
932
|
-
const rawItem = item?.rawItem ?? item;
|
|
933
|
-
if (!rawItem) {
|
|
934
|
-
return;
|
|
935
|
-
}
|
|
936
|
-
if (rawItem?.type !== 'function_call') {
|
|
937
|
-
return;
|
|
938
|
-
}
|
|
939
|
-
const callId = rawItem.callId ??
|
|
940
|
-
rawItem.call_id ??
|
|
941
|
-
rawItem.tool_call_id ??
|
|
942
|
-
rawItem.toolCallId ??
|
|
943
|
-
rawItem.id;
|
|
944
|
-
if (!callId) {
|
|
945
|
-
return;
|
|
946
|
-
}
|
|
947
|
-
const args = rawItem.arguments ?? rawItem.args ?? item?.arguments ?? item?.args;
|
|
948
|
-
if (!args) {
|
|
949
|
-
return;
|
|
950
|
-
}
|
|
951
|
-
toolCallArgumentsById.set(callId, args);
|
|
952
|
-
}
|
|
953
|
-
#attachCachedArguments(items = [], toolCallArgumentsById) {
|
|
954
|
-
if (!items?.length) {
|
|
955
|
-
return;
|
|
956
|
-
}
|
|
957
|
-
for (const item of items) {
|
|
958
|
-
if (!item) {
|
|
959
|
-
continue;
|
|
960
|
-
}
|
|
961
|
-
if (item.arguments ||
|
|
962
|
-
item.args ||
|
|
963
|
-
item?.rawItem?.arguments ||
|
|
964
|
-
item?.rawItem?.args) {
|
|
965
|
-
continue;
|
|
966
|
-
}
|
|
967
|
-
const rawItem = item?.rawItem ?? item;
|
|
968
|
-
const callId = rawItem?.callId ??
|
|
969
|
-
rawItem?.call_id ??
|
|
970
|
-
rawItem?.tool_call_id ??
|
|
971
|
-
rawItem?.toolCallId ??
|
|
972
|
-
rawItem?.id ??
|
|
973
|
-
item?.callId ??
|
|
974
|
-
item?.call_id ??
|
|
975
|
-
item?.tool_call_id ??
|
|
976
|
-
item?.toolCallId ??
|
|
977
|
-
item?.id;
|
|
978
|
-
if (!callId) {
|
|
979
|
-
continue;
|
|
980
|
-
}
|
|
981
|
-
const args = toolCallArgumentsById.get(callId);
|
|
982
|
-
if (!args) {
|
|
983
|
-
continue;
|
|
984
|
-
}
|
|
985
|
-
item.arguments = args;
|
|
986
|
-
}
|
|
987
|
-
}
|
|
988
|
-
#extractTextDelta(payload) {
|
|
989
|
-
if (payload === null || payload === undefined) {
|
|
990
|
-
return null;
|
|
991
|
-
}
|
|
992
|
-
if (typeof payload === 'string') {
|
|
993
|
-
return payload || null;
|
|
994
|
-
}
|
|
995
|
-
if (typeof payload !== 'object') {
|
|
996
|
-
return null;
|
|
997
|
-
}
|
|
998
|
-
const type = typeof payload.type === 'string' ? payload.type : '';
|
|
999
|
-
const looksLikeOutput = typeof type === 'string' && type.includes('output_text');
|
|
1000
|
-
const hasOutputProperties = Boolean(payload.delta ??
|
|
1001
|
-
payload.output_text ??
|
|
1002
|
-
payload.text ??
|
|
1003
|
-
payload.content);
|
|
1004
|
-
if (!looksLikeOutput && !hasOutputProperties) {
|
|
1005
|
-
return null;
|
|
1006
|
-
}
|
|
1007
|
-
const deltaCandidate = payload.delta ??
|
|
1008
|
-
payload.output_text ??
|
|
1009
|
-
payload.text ??
|
|
1010
|
-
payload.content;
|
|
1011
|
-
const text = this.#coerceToText(deltaCandidate);
|
|
1012
|
-
return text || null;
|
|
1013
|
-
}
|
|
1014
|
-
#coerceToText(value) {
|
|
1015
|
-
if (value === null || value === undefined) {
|
|
1016
|
-
return '';
|
|
1017
|
-
}
|
|
1018
|
-
if (typeof value === 'string') {
|
|
1019
|
-
return value;
|
|
1020
|
-
}
|
|
1021
|
-
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
1022
|
-
return String(value);
|
|
1023
|
-
}
|
|
1024
|
-
if (Array.isArray(value)) {
|
|
1025
|
-
return value
|
|
1026
|
-
.map(entry => this.#coerceToText(entry))
|
|
1027
|
-
.filter(Boolean)
|
|
1028
|
-
.join('');
|
|
1029
|
-
}
|
|
1030
|
-
if (typeof value === 'object') {
|
|
1031
|
-
const record = value;
|
|
1032
|
-
const candidates = ['text', 'value', 'content', 'delta'];
|
|
1033
|
-
for (const field of candidates) {
|
|
1034
|
-
if (field in record) {
|
|
1035
|
-
const text = this.#coerceToText(record[field]);
|
|
1036
|
-
if (text) {
|
|
1037
|
-
return text;
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
return '';
|
|
1043
|
-
}
|
|
1044
933
|
#buildResult(result, finalOutputOverride, reasoningOutputOverride, emittedCommandIds, usage) {
|
|
1045
934
|
if (result.interruptions && result.interruptions.length > 0) {
|
|
1046
935
|
const interruption = result.interruptions[0];
|
|
1047
|
-
this.
|
|
936
|
+
this.approvalState.setPending({
|
|
1048
937
|
state: result.state,
|
|
1049
938
|
interruption,
|
|
1050
939
|
emittedCommandIds: emittedCommandIds ?? new Set(),
|
|
1051
940
|
toolCallArgumentsById: new Map(this.toolCallArgumentsById),
|
|
1052
|
-
};
|
|
941
|
+
});
|
|
1053
942
|
let argumentsText = '';
|
|
1054
943
|
const toolName = interruption.name;
|
|
1055
944
|
// For shell_call (built-in shell tool), extract commands from action
|
|
@@ -1081,13 +970,13 @@ export class ConversationSession {
|
|
|
1081
970
|
},
|
|
1082
971
|
};
|
|
1083
972
|
}
|
|
1084
|
-
this.
|
|
973
|
+
this.approvalState.clearPending();
|
|
1085
974
|
const allCommandMessages = extractCommandMessages(result.newItems || result.history || []);
|
|
1086
975
|
// Filter out commands that were already emitted in real-time
|
|
1087
976
|
const commandMessages = emittedCommandIds
|
|
1088
|
-
? allCommandMessages.filter(msg => !emittedCommandIds.has(msg.id))
|
|
977
|
+
? allCommandMessages.filter((msg) => !emittedCommandIds.has(msg.id))
|
|
1089
978
|
: allCommandMessages;
|
|
1090
|
-
const visibleCommandMessages = commandMessages.filter(msg => !msg.isApprovalRejection);
|
|
979
|
+
const visibleCommandMessages = commandMessages.filter((msg) => !msg.isApprovalRejection);
|
|
1091
980
|
const response = {
|
|
1092
981
|
type: 'response',
|
|
1093
982
|
commandMessages: visibleCommandMessages,
|