@qduc/term2 0.7.0 → 0.7.1
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 +0 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +28 -8
- 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 +35 -11
- package/dist/app.js.map +1 -1
- package/dist/cli.integration.test.d.ts +2 -0
- package/dist/cli.integration.test.d.ts.map +1 -0
- package/dist/cli.integration.test.js +102 -0
- package/dist/cli.integration.test.js.map +1 -0
- package/dist/cli.js +20 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-approve-command.d.ts +10 -0
- package/dist/commands/auto-approve-command.d.ts.map +1 -0
- package/dist/commands/auto-approve-command.js +40 -0
- package/dist/commands/auto-approve-command.js.map +1 -0
- package/dist/commands/clear-command.d.ts +3 -0
- package/dist/commands/clear-command.d.ts.map +1 -0
- package/dist/commands/clear-command.js +12 -0
- package/dist/commands/clear-command.js.map +1 -0
- package/dist/commands/copy-command.d.ts +10 -0
- package/dist/commands/copy-command.d.ts.map +1 -0
- package/dist/commands/copy-command.js +25 -0
- package/dist/commands/copy-command.js.map +1 -0
- package/dist/commands/effort-command.d.ts +11 -0
- package/dist/commands/effort-command.d.ts.map +1 -0
- package/dist/commands/effort-command.js +34 -0
- package/dist/commands/effort-command.js.map +1 -0
- package/dist/commands/guarded-settings-command.d.ts +14 -0
- package/dist/commands/guarded-settings-command.d.ts.map +1 -0
- package/dist/commands/guarded-settings-command.js +23 -0
- package/dist/commands/guarded-settings-command.js.map +1 -0
- package/dist/commands/handoff-command.d.ts +10 -0
- package/dist/commands/handoff-command.d.ts.map +1 -0
- package/dist/commands/handoff-command.js +17 -0
- package/dist/commands/handoff-command.js.map +1 -0
- package/dist/commands/mode-commands.d.ts +32 -0
- package/dist/commands/mode-commands.d.ts.map +1 -0
- package/dist/commands/mode-commands.js +64 -0
- package/dist/commands/mode-commands.js.map +1 -0
- package/dist/commands/model-command.d.ts +11 -0
- package/dist/commands/model-command.d.ts.map +1 -0
- package/dist/commands/model-command.js +35 -0
- package/dist/commands/model-command.js.map +1 -0
- package/dist/commands/quit-command.d.ts +3 -0
- package/dist/commands/quit-command.d.ts.map +1 -0
- package/dist/commands/quit-command.js +10 -0
- package/dist/commands/quit-command.js.map +1 -0
- package/dist/commands/retry-command.d.ts +19 -0
- package/dist/commands/retry-command.d.ts.map +1 -0
- package/dist/commands/retry-command.js +30 -0
- package/dist/commands/retry-command.js.map +1 -0
- package/dist/commands/undo-command.d.ts +15 -0
- package/dist/commands/undo-command.d.ts.map +1 -0
- package/dist/commands/undo-command.js +28 -0
- package/dist/commands/undo-command.js.map +1 -0
- package/dist/commands/usage-command.d.ts +3 -0
- package/dist/commands/usage-command.d.ts.map +1 -0
- package/dist/commands/usage-command.js +11 -0
- package/dist/commands/usage-command.js.map +1 -0
- package/dist/components/ApprovalPrompt.test.d.ts +2 -0
- package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.test.js +23 -0
- package/dist/components/ApprovalPrompt.test.js.map +1 -0
- package/dist/components/BottomArea.d.ts +3 -0
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js +3 -3
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/InputBox.d.ts +1 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +2 -1
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/LiveResponse.test.d.ts +2 -0
- package/dist/components/LiveResponse.test.d.ts.map +1 -0
- package/dist/components/LiveResponse.test.js +13 -0
- package/dist/components/LiveResponse.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
- package/dist/components/StatusBar.d.ts +4 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +17 -3
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/StatusBar.test.js +15 -0
- package/dist/components/StatusBar.test.js.map +1 -1
- package/dist/components/TextInput.d.ts +42 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +398 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput.test.d.ts.map +1 -0
- package/dist/components/TextInput.test.js +75 -0
- package/dist/components/TextInput.test.js.map +1 -0
- package/dist/contracts/conversation.d.ts +3 -0
- package/dist/contracts/conversation.d.ts.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-app-commands.d.ts +11 -32
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +64 -369
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-commands.test.js +24 -15
- package/dist/hooks/use-app-commands.test.js.map +1 -1
- package/dist/hooks/use-conversation.clear.test.js +49 -1
- package/dist/hooks/use-conversation.clear.test.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +4 -1
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +11 -22
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +2 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.js +118 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.js.map +1 -0
- package/dist/hooks/use-mode-handlers.d.ts +4 -1
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +6 -1
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
- package/dist/hooks/use-runtime-settings.js +2 -2
- package/dist/hooks/use-runtime-settings.js.map +1 -1
- package/dist/hooks/use-runtime-settings.test.js +0 -1
- package/dist/hooks/use-runtime-settings.test.js.map +1 -1
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-slash-commands.js +10 -0
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-slash-commands.test.js +35 -5
- package/dist/hooks/use-slash-commands.test.js.map +1 -1
- package/dist/hooks/use-undo-selection.d.ts.map +1 -1
- package/dist/hooks/use-undo-selection.js +3 -1
- package/dist/hooks/use-undo-selection.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 +8 -3
- package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -1
- package/dist/lib/openai-agent-client.js +7 -1
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/shell.d.ts +7 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +56 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/tool-selection-policy.d.ts.map +1 -1
- package/dist/lib/tool-selection-policy.js +43 -2
- package/dist/lib/tool-selection-policy.js.map +1 -1
- package/dist/lib/tool-selection-policy.test.js +39 -0
- package/dist/lib/tool-selection-policy.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/prompts/gpt-5-modern.md +0 -6
- package/dist/prompts/gpt-5.md +4 -7
- package/dist/prompts/search-via-shell.d.ts.map +1 -1
- package/dist/prompts/search-via-shell.js +0 -1
- package/dist/prompts/search-via-shell.js.map +1 -1
- package/dist/prompts/search-via-shell.ts +0 -1
- package/dist/prompts/shell-auto-approval.d.ts +2 -2
- package/dist/prompts/shell-auto-approval.d.ts.map +1 -1
- package/dist/prompts/shell-auto-approval.js +6 -6
- package/dist/prompts/shell-auto-approval.js.map +1 -1
- package/dist/prompts/shell-auto-approval.ts +6 -6
- package/dist/prompts/simple-mentor.md +215 -0
- package/dist/prompts/simple-prev.md +55 -0
- package/dist/prompts/simple.md +31 -53
- package/dist/prompts/subagent-delegation.js +2 -2
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.ts +2 -2
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +2 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +8 -4
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js +119 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/ai-sdk-openai.provider.d.ts +14 -0
- package/dist/providers/ai-sdk-openai.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openai.provider.js +18 -0
- package/dist/providers/ai-sdk-openai.provider.js.map +1 -0
- package/dist/providers/codex-responses-model.d.ts +4 -3
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +26 -16
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-responses-model.test.js +115 -1
- package/dist/providers/codex-responses-model.test.js.map +1 -1
- package/dist/providers/codex.provider.d.ts +0 -2
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +2 -6
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/codex.provider.test.js +4 -31
- package/dist/providers/codex.provider.test.js.map +1 -1
- package/dist/providers/custom-provider-adapter.test.js +3 -3
- package/dist/providers/custom-provider-adapter.test.js.map +1 -1
- package/dist/providers/fallback-responses-model.d.ts.map +1 -1
- package/dist/providers/fallback-responses-model.js +152 -83
- package/dist/providers/fallback-responses-model.js.map +1 -1
- package/dist/providers/fallback-responses-model.test.js +289 -0
- package/dist/providers/fallback-responses-model.test.js.map +1 -1
- package/dist/providers/github-copilot/converters.d.ts +45 -0
- package/dist/providers/github-copilot/converters.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.js +118 -0
- package/dist/providers/github-copilot/converters.js.map +1 -0
- package/dist/providers/github-copilot/converters.test.d.ts +2 -0
- package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.test.js +162 -0
- package/dist/providers/github-copilot/converters.test.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
- package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
- package/dist/providers/github-copilot/index.d.ts +4 -0
- package/dist/providers/github-copilot/index.d.ts.map +1 -0
- package/dist/providers/github-copilot/index.js +4 -0
- package/dist/providers/github-copilot/index.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts +24 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.js +15 -0
- package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
- package/dist/providers/github-copilot/model.js +498 -0
- package/dist/providers/github-copilot/model.js.map +1 -0
- 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 +15 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.js +25 -0
- package/dist/providers/github-copilot/provider.js.map +1 -0
- package/dist/providers/github-copilot/provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.test.js +52 -0
- package/dist/providers/github-copilot/provider.test.js.map +1 -0
- package/dist/providers/github-copilot/utils.d.ts +20 -0
- package/dist/providers/github-copilot/utils.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.js +142 -0
- package/dist/providers/github-copilot/utils.js.map +1 -0
- package/dist/providers/github-copilot/utils.test.d.ts +2 -0
- package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.test.js +21 -0
- package/dist/providers/github-copilot/utils.test.js.map +1 -0
- package/dist/providers/openai-compatible/api.d.ts +17 -0
- package/dist/providers/openai-compatible/api.d.ts.map +1 -0
- package/dist/providers/openai-compatible/api.js +58 -0
- package/dist/providers/openai-compatible/api.js.map +1 -0
- package/dist/providers/openai-compatible/model.d.ts +17 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -0
- package/dist/providers/openai-compatible/model.js +473 -0
- package/dist/providers/openai-compatible/model.js.map +1 -0
- package/dist/providers/openai-compatible/provider.d.ts +22 -0
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible/provider.js +43 -0
- package/dist/providers/openai-compatible/provider.js.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts +2 -0
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js +258 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -0
- package/dist/providers/openai-compatible/utils.d.ts +3 -0
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
- package/dist/providers/openai-compatible/utils.js +11 -0
- package/dist/providers/openai-compatible/utils.js.map +1 -0
- package/dist/providers/openai-compatible-behavior-gate.test.js +42 -1
- package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +2 -2
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +3 -3
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai.provider.js +5 -3
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/openrouter/api.d.ts +39 -0
- package/dist/providers/openrouter/api.d.ts.map +1 -0
- package/dist/providers/openrouter/api.js +164 -0
- package/dist/providers/openrouter/api.js.map +1 -0
- package/dist/providers/openrouter/converters.d.ts +8 -0
- package/dist/providers/openrouter/converters.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.js +391 -0
- package/dist/providers/openrouter/converters.js.map +1 -0
- package/dist/providers/openrouter/converters.test.d.ts +2 -0
- package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.test.js +179 -0
- package/dist/providers/openrouter/converters.test.js.map +1 -0
- package/dist/providers/openrouter/index.d.ts +4 -0
- package/dist/providers/openrouter/index.d.ts.map +1 -0
- package/dist/providers/openrouter/index.js +4 -0
- package/dist/providers/openrouter/index.js.map +1 -0
- package/dist/providers/openrouter/model.d.ts +14 -0
- package/dist/providers/openrouter/model.d.ts.map +1 -0
- package/dist/providers/openrouter/model.js +457 -0
- package/dist/providers/openrouter/model.js.map +1 -0
- package/dist/providers/openrouter/provider.d.ts +15 -0
- package/dist/providers/openrouter/provider.d.ts.map +1 -0
- package/dist/providers/openrouter/provider.js +21 -0
- package/dist/providers/openrouter/provider.js.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.d.ts +2 -0
- package/dist/providers/openrouter/reasoning-content.test.d.ts.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.js +122 -0
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -0
- package/dist/providers/openrouter/utils.d.ts +11 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -0
- package/dist/providers/openrouter/utils.js +29 -0
- package/dist/providers/openrouter/utils.js.map +1 -0
- package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
- package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
- package/dist/providers/openrouter.api.retry.test.js +148 -0
- package/dist/providers/openrouter.api.retry.test.js.map +1 -0
- package/dist/providers/openrouter.test.d.ts +2 -0
- package/dist/providers/openrouter.test.d.ts.map +1 -0
- package/dist/providers/openrouter.test.js +1449 -0
- package/dist/providers/openrouter.test.js.map +1 -0
- package/dist/providers/protocol-client.d.ts +17 -0
- package/dist/providers/protocol-client.d.ts.map +1 -0
- package/dist/providers/protocol-client.js +57 -0
- package/dist/providers/protocol-client.js.map +1 -0
- package/dist/providers/protocol-client.test.d.ts +2 -0
- package/dist/providers/protocol-client.test.d.ts.map +1 -0
- package/dist/providers/protocol-client.test.js +55 -0
- package/dist/providers/protocol-client.test.js.map +1 -0
- package/dist/providers/timed-responses-ws-model.d.ts +20 -0
- package/dist/providers/timed-responses-ws-model.d.ts.map +1 -0
- package/dist/providers/timed-responses-ws-model.js +381 -0
- package/dist/providers/timed-responses-ws-model.js.map +1 -0
- package/dist/providers/timed-responses-ws-model.test.d.ts +2 -0
- package/dist/providers/timed-responses-ws-model.test.d.ts.map +1 -0
- package/dist/providers/timed-responses-ws-model.test.js +441 -0
- package/dist/providers/timed-responses-ws-model.test.js.map +1 -0
- package/dist/providers/timed-ws-connection.d.ts +26 -0
- package/dist/providers/timed-ws-connection.d.ts.map +1 -0
- package/dist/providers/timed-ws-connection.js +156 -0
- package/dist/providers/timed-ws-connection.js.map +1 -0
- package/dist/providers/timed-ws-connection.test.d.ts +2 -0
- package/dist/providers/timed-ws-connection.test.d.ts.map +1 -0
- package/dist/providers/timed-ws-connection.test.js +223 -0
- package/dist/providers/timed-ws-connection.test.js.map +1 -0
- package/dist/providers/timed-ws-timeouts.d.ts +6 -0
- package/dist/providers/timed-ws-timeouts.d.ts.map +1 -0
- package/dist/providers/timed-ws-timeouts.js +6 -0
- package/dist/providers/timed-ws-timeouts.js.map +1 -0
- package/dist/safety-checker.js +57 -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.map +1 -1
- package/dist/services/command-message-streaming.js +8 -3
- package/dist/services/command-message-streaming.js.map +1 -1
- package/dist/services/conversation-clear-save.test.js +4 -5
- package/dist/services/conversation-clear-save.test.js.map +1 -1
- package/dist/services/conversation-events.d.ts +4 -0
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-history-repair.d.ts.map +1 -1
- package/dist/services/conversation-history-repair.js +81 -26
- package/dist/services/conversation-history-repair.js.map +1 -1
- package/dist/services/conversation-integration.test.js +109 -0
- package/dist/services/conversation-integration.test.js.map +1 -1
- package/dist/services/conversation-log-events.d.ts +16 -10
- package/dist/services/conversation-log-events.d.ts.map +1 -1
- package/dist/services/conversation-log-events.js +1 -1
- package/dist/services/conversation-log-events.js.map +1 -1
- package/dist/services/conversation-log-writer.js +1 -1
- package/dist/services/conversation-log-writer.js.map +1 -1
- package/dist/services/conversation-persistence-types.d.ts +32 -0
- package/dist/services/conversation-persistence-types.d.ts.map +1 -1
- package/dist/services/conversation-persistence.d.ts +6 -0
- package/dist/services/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation-persistence.js +42 -40
- package/dist/services/conversation-persistence.js.map +1 -1
- package/dist/services/conversation-persistence.test.js +356 -107
- 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 +219 -11
- package/dist/services/conversation-replay.js.map +1 -1
- package/dist/services/conversation-replay.test.js +370 -31
- package/dist/services/conversation-replay.test.js.map +1 -1
- package/dist/services/conversation-result-builder.d.ts +2 -0
- package/dist/services/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.js +4 -0
- package/dist/services/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +126 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-retry-policy.d.ts.map +1 -1
- package/dist/services/conversation-retry-policy.js +3 -0
- package/dist/services/conversation-retry-policy.js.map +1 -1
- package/dist/services/conversation-retry-policy.test.js +4 -0
- package/dist/services/conversation-retry-policy.test.js.map +1 -1
- package/dist/services/conversation-service.d.ts +3 -3
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +0 -3
- 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 +156 -0
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/services/conversation-session.d.ts +9 -7
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +264 -86
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-store.d.ts +16 -13
- package/dist/services/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation-store.js +62 -191
- package/dist/services/conversation-store.js.map +1 -1
- package/dist/services/conversation-store.merge-modes.removed.d.ts +2 -0
- package/dist/services/conversation-store.merge-modes.removed.d.ts.map +1 -0
- package/dist/services/conversation-store.merge-modes.removed.js +2 -0
- package/dist/services/conversation-store.merge-modes.removed.js.map +1 -0
- package/dist/services/conversation-store.merge-modes.test.d.ts +2 -0
- package/dist/services/conversation-store.merge-modes.test.d.ts.map +1 -0
- package/dist/services/conversation-store.merge-modes.test.js +2 -0
- package/dist/services/conversation-store.merge-modes.test.js.map +1 -0
- package/dist/services/conversation-store.test.js +157 -294
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/conversation-turn-items.d.ts +5 -0
- package/dist/services/conversation-turn-items.d.ts.map +1 -0
- package/dist/services/conversation-turn-items.js +351 -0
- package/dist/services/conversation-turn-items.js.map +1 -0
- package/dist/services/conversation-turn-items.test.d.ts +2 -0
- package/dist/services/conversation-turn-items.test.d.ts.map +1 -0
- package/dist/services/conversation-turn-items.test.js +68 -0
- package/dist/services/conversation-turn-items.test.js.map +1 -0
- package/dist/services/repro-error.test.d.ts +2 -0
- package/dist/services/repro-error.test.d.ts.map +1 -0
- package/dist/services/repro-error.test.js +38 -0
- package/dist/services/repro-error.test.js.map +1 -0
- package/dist/services/subagents/reasoning-inheritance.test.d.ts +2 -0
- package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +1 -0
- package/dist/services/subagents/reasoning-inheritance.test.js +73 -0
- package/dist/services/subagents/reasoning-inheritance.test.js.map +1 -0
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +32 -30
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-manager.test.js +8 -12
- package/dist/services/subagents/subagent-manager.test.js.map +1 -1
- package/dist/services/subagents/subagent-session.d.ts +1 -1
- package/dist/services/subagents/subagent-session.d.ts.map +1 -1
- package/dist/services/subagents/subagent-session.js +2 -2
- package/dist/services/subagents/subagent-session.js.map +1 -1
- package/dist/services/subagents/subagent-session.test.js +3 -3
- package/dist/services/subagents/subagent-session.test.js.map +1 -1
- package/dist/services/subagents/types.d.ts +2 -1
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/terminal-result-collector.js +43 -0
- package/dist/services/terminal-result-collector.js.map +1 -1
- package/dist/services/terminal-result-collector.test.js +44 -0
- package/dist/services/terminal-result-collector.test.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts +6 -0
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +90 -25
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/services/tool-execution-ledger.test.js +177 -2
- package/dist/services/tool-execution-ledger.test.js.map +1 -1
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +41 -23
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/apply-patch.test.js +6 -6
- package/dist/tools/apply-patch.test.js.map +1 -1
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +55 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-healing.d.ts.map +1 -1
- package/dist/tools/edit-healing.js +9 -3
- package/dist/tools/edit-healing.js.map +1 -1
- package/dist/tools/run-subagent.d.ts +0 -1
- package/dist/tools/run-subagent.d.ts.map +1 -1
- package/dist/tools/run-subagent.js +1 -8
- package/dist/tools/run-subagent.js.map +1 -1
- package/dist/tools/run-subagent.test.js +0 -18
- package/dist/tools/run-subagent.test.js.map +1 -1
- package/dist/utils/clipboard.d.ts +7 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +83 -4
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/clipboard.test.js +152 -2
- package/dist/utils/clipboard.test.js.map +1 -1
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- 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.js +348 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation-event-handler.js +3 -0
- package/dist/utils/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation-event-handler.test.js +13 -0
- package/dist/utils/conversation-event-handler.test.js.map +1 -1
- package/dist/utils/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/extract-command-messages.js +8 -4
- 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/message-utils.d.ts +7 -0
- package/dist/utils/message-utils.d.ts.map +1 -0
- package/dist/utils/message-utils.js +31 -0
- package/dist/utils/message-utils.js.map +1 -0
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
- package/dist/utils/resume-list.d.ts +15 -0
- package/dist/utils/resume-list.d.ts.map +1 -0
- package/dist/utils/resume-list.js +68 -0
- package/dist/utils/resume-list.js.map +1 -0
- package/dist/utils/resume-list.test.d.ts +2 -0
- package/dist/utils/resume-list.test.d.ts.map +1 -0
- package/dist/utils/resume-list.test.js +89 -0
- package/dist/utils/resume-list.test.js.map +1 -0
- package/package.json +2 -2
- package/readme.md +22 -7
- package/dist/components/ModelSelectionMenu.debug.test.d.ts +0 -2
- package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +0 -1
- package/dist/components/ModelSelectionMenu.debug.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 -54
- package/dist/hooks/use-path-completion.test.js.map +0 -1
- package/dist/inspect_zod.d.ts +0 -2
- package/dist/inspect_zod.d.ts.map +0 -1
- package/dist/inspect_zod.js +0 -16
- package/dist/inspect_zod.js.map +0 -1
- package/dist/providers/openai.provider.test.d.ts +0 -2
- package/dist/providers/openai.provider.test.d.ts.map +0 -1
- package/dist/providers/openai.provider.test.js +0 -22
- package/dist/providers/openai.provider.test.js.map +0 -1
- package/dist/utils/project-tree.d.ts +0 -14
- package/dist/utils/project-tree.d.ts.map +0 -1
- package/dist/utils/project-tree.js +0 -111
- package/dist/utils/project-tree.js.map +0 -1
- package/dist/utils/project-tree.test.d.ts +0 -2
- package/dist/utils/project-tree.test.d.ts.map +0 -1
- package/dist/utils/project-tree.test.js +0 -149
- package/dist/utils/project-tree.test.js.map +0 -1
- package/dist/utils/terminal-clear.d.ts +0 -7
- package/dist/utils/terminal-clear.d.ts.map +0 -1
- package/dist/utils/terminal-clear.js +0 -5
- package/dist/utils/terminal-clear.js.map +0 -1
- package/dist/utils/terminal-clear.test.d.ts +0 -2
- package/dist/utils/terminal-clear.test.d.ts.map +0 -1
- package/dist/utils/terminal-clear.test.js +0 -13
- package/dist/utils/terminal-clear.test.js.map +0 -1
|
@@ -3,7 +3,7 @@ import { decideRetry, isTransientRetryableError, MAX_HALLUCINATION_RETRIES, MAX_
|
|
|
3
3
|
import { getProvider } from '../providers/index.js';
|
|
4
4
|
import { ApprovalState } from './approval-state.js';
|
|
5
5
|
import { collectTerminalResult } from './terminal-result-collector.js';
|
|
6
|
-
import { getMethod } from './interruption-info.js';
|
|
6
|
+
import { getMethod, getCallIdFromObject } from './interruption-info.js';
|
|
7
7
|
import { createStreamAccumulator, processStreamEvents } from './stream-event-processor.js';
|
|
8
8
|
import { ShellAutoApprovalResolver } from './shell-auto-approval-resolver.js';
|
|
9
9
|
import { ApprovalFlowCoordinator } from './approval-flow-coordinator.js';
|
|
@@ -11,29 +11,8 @@ import { buildConversationResult, toTerminalEvent } from './conversation-result-
|
|
|
11
11
|
import { normalizeUserTurn } from '../types/user-turn.js';
|
|
12
12
|
import { collectDuplicateToolCallResultPairs, InputSurgeGuard } from './input-surge-guard.js';
|
|
13
13
|
import { LargeUncachedInputGuard } from './large-uncached-input-guard.js';
|
|
14
|
-
import { reconcileHistoryWithToolLedger, ToolExecutionLedger, } from './tool-execution-ledger.js';
|
|
14
|
+
import { reconcileHistoryWithToolLedger, ToolExecutionLedger, callIdOf, toolNameOf, outputOf, } from './tool-execution-ledger.js';
|
|
15
15
|
import { describeError } from '../utils/error-helpers.js';
|
|
16
|
-
const asRecordLocal = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : null;
|
|
17
|
-
const rawItemLocal = (item) => {
|
|
18
|
-
const rec = asRecordLocal(item);
|
|
19
|
-
if (!rec)
|
|
20
|
-
return null;
|
|
21
|
-
return asRecordLocal(rec.rawItem) ?? rec;
|
|
22
|
-
};
|
|
23
|
-
const callIdOfLocal = (item) => {
|
|
24
|
-
const raw = rawItemLocal(item);
|
|
25
|
-
const cid = raw?.callId ?? raw?.call_id ?? raw?.tool_call_id ?? raw?.toolCallId ?? raw?.id;
|
|
26
|
-
return typeof cid === 'string' && cid ? cid : null;
|
|
27
|
-
};
|
|
28
|
-
const toolNameOfLocal = (item) => {
|
|
29
|
-
const raw = rawItemLocal(item);
|
|
30
|
-
const name = raw?.name ?? asRecordLocal(item)?.name;
|
|
31
|
-
return typeof name === 'string' && name ? name : 'unknown';
|
|
32
|
-
};
|
|
33
|
-
const outputOfLocal = (item) => {
|
|
34
|
-
const raw = rawItemLocal(item);
|
|
35
|
-
return raw?.output ?? asRecordLocal(item)?.output;
|
|
36
|
-
};
|
|
37
16
|
const supportsConversationChaining = (providerId) => {
|
|
38
17
|
const providerDef = getProvider(providerId);
|
|
39
18
|
return providerDef?.capabilities?.supportsConversationChaining ?? false;
|
|
@@ -85,8 +64,11 @@ export class ConversationSession {
|
|
|
85
64
|
largeUncachedInputGuard = new LargeUncachedInputGuard();
|
|
86
65
|
toolLedger = new ToolExecutionLedger();
|
|
87
66
|
generation = 0;
|
|
67
|
+
#inputSurgeKind = 'delta';
|
|
68
|
+
currentPersistedTurnItems = [];
|
|
69
|
+
currentReasoningBuffer = '';
|
|
70
|
+
currentAssistantTextBuffer = '';
|
|
88
71
|
settingsService;
|
|
89
|
-
pendingModeNotice = null;
|
|
90
72
|
logSink = null;
|
|
91
73
|
constructor(id, { agentClient, deps, sessionStartedAt, }) {
|
|
92
74
|
this.id = id;
|
|
@@ -154,28 +136,11 @@ export class ConversationSession {
|
|
|
154
136
|
#buildOutgoingInput(turn, { includeTurn }) {
|
|
155
137
|
const provider = this.#getProviderForGuard() ?? 'openai';
|
|
156
138
|
const supportsChaining = supportsConversationChaining(provider);
|
|
157
|
-
const history = this
|
|
139
|
+
const history = this.#getCanonicalHistory();
|
|
158
140
|
const outgoingHistory = includeTurn ? [...history, this.#makeUserInputItem(turn)] : history;
|
|
159
141
|
const useChaining = supportsChaining && (!!this.previousResponseId || outgoingHistory.length <= 1);
|
|
160
|
-
const notice = this.pendingModeNotice;
|
|
161
142
|
const latestInput = outgoingHistory[outgoingHistory.length - 1] ?? turn.text;
|
|
162
143
|
const chainedInput = turn.images?.length ? latestInput : turn.text;
|
|
163
|
-
if (notice) {
|
|
164
|
-
if (useChaining) {
|
|
165
|
-
const userItem = typeof chainedInput === 'string' ? { role: 'user', type: 'message', content: chainedInput } : chainedInput;
|
|
166
|
-
const noticeItem = { role: 'system', type: 'message', content: notice };
|
|
167
|
-
return {
|
|
168
|
-
streamInput: [noticeItem, userItem],
|
|
169
|
-
inputSurgeKind: 'delta',
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
const noticeItem = { role: 'user', type: 'message', content: notice };
|
|
173
|
-
return {
|
|
174
|
-
streamInput: [...outgoingHistory, noticeItem],
|
|
175
|
-
inputSurgeKind: 'full_history',
|
|
176
|
-
modeNoticeToPersist: notice,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
144
|
return {
|
|
180
145
|
streamInput: useChaining ? (typeof chainedInput === 'string' ? chainedInput : [chainedInput]) : outgoingHistory,
|
|
181
146
|
inputSurgeKind: useChaining ? 'delta' : 'full_history',
|
|
@@ -224,6 +189,8 @@ export class ConversationSession {
|
|
|
224
189
|
this.shellAutoApproval.clearCache();
|
|
225
190
|
this.inputSurgeGuard.reset();
|
|
226
191
|
this.largeUncachedInputGuard.reset();
|
|
192
|
+
this.#inputSurgeKind = 'delta';
|
|
193
|
+
this.#resetPersistedTurnState();
|
|
227
194
|
const clearConversations = getMethod(this.agentClient, 'clearConversations');
|
|
228
195
|
clearConversations?.call(this.agentClient);
|
|
229
196
|
}
|
|
@@ -240,6 +207,8 @@ export class ConversationSession {
|
|
|
240
207
|
this.shellAutoApproval.clearCache();
|
|
241
208
|
this.inputSurgeGuard.reset();
|
|
242
209
|
this.largeUncachedInputGuard.markUndoOrRewind();
|
|
210
|
+
this.#inputSurgeKind = 'delta';
|
|
211
|
+
this.#resetPersistedTurnState();
|
|
243
212
|
this.#log({ type: 'undo', removedUserTurns: 1, snapshot: this.getCurrentSnapshot() });
|
|
244
213
|
return removed;
|
|
245
214
|
}
|
|
@@ -259,6 +228,8 @@ export class ConversationSession {
|
|
|
259
228
|
this.shellAutoApproval.clearCache();
|
|
260
229
|
this.inputSurgeGuard.reset();
|
|
261
230
|
this.largeUncachedInputGuard.markUndoOrRewind();
|
|
231
|
+
this.#inputSurgeKind = 'delta';
|
|
232
|
+
this.#resetPersistedTurnState();
|
|
262
233
|
this.#log({ type: 'undo', removedUserTurns: n, snapshot: this.getCurrentSnapshot() });
|
|
263
234
|
return removed;
|
|
264
235
|
}
|
|
@@ -305,13 +276,69 @@ export class ConversationSession {
|
|
|
305
276
|
: this.settingsService?.get('agent.provider');
|
|
306
277
|
const model = this.settingsService?.get('agent.model');
|
|
307
278
|
return {
|
|
308
|
-
history: this
|
|
279
|
+
history: this.#getCanonicalHistory(),
|
|
309
280
|
previousResponseId: this.previousResponseId,
|
|
310
281
|
toolLedger: this.toolLedger.export(),
|
|
311
282
|
...(model ? { model } : {}),
|
|
312
283
|
...(provider ? { provider } : {}),
|
|
313
284
|
};
|
|
314
285
|
}
|
|
286
|
+
#getCurrentAssistantTurnState() {
|
|
287
|
+
const getProvider = getMethod(this.agentClient, 'getProvider');
|
|
288
|
+
const provider = getProvider
|
|
289
|
+
? getProvider.call(this.agentClient)
|
|
290
|
+
: this.settingsService?.get('agent.provider');
|
|
291
|
+
const model = this.settingsService?.get('agent.model');
|
|
292
|
+
return {
|
|
293
|
+
previousResponseId: this.previousResponseId,
|
|
294
|
+
...(model ? { model } : {}),
|
|
295
|
+
...(provider ? { provider } : {}),
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
#flushReasoningItem() {
|
|
299
|
+
if (this.currentReasoningBuffer) {
|
|
300
|
+
this.currentPersistedTurnItems.push({
|
|
301
|
+
type: 'reasoning',
|
|
302
|
+
text: this.currentReasoningBuffer,
|
|
303
|
+
});
|
|
304
|
+
this.currentReasoningBuffer = '';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
#flushAssistantTextItem() {
|
|
308
|
+
if (this.currentAssistantTextBuffer) {
|
|
309
|
+
this.currentPersistedTurnItems.push({
|
|
310
|
+
type: 'assistant_text',
|
|
311
|
+
text: this.currentAssistantTextBuffer,
|
|
312
|
+
});
|
|
313
|
+
this.currentAssistantTextBuffer = '';
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
#recordToolCallItem(callId, toolName, args) {
|
|
317
|
+
this.#flushReasoningItem();
|
|
318
|
+
this.#flushAssistantTextItem();
|
|
319
|
+
this.currentPersistedTurnItems.push({
|
|
320
|
+
type: 'tool_call',
|
|
321
|
+
callId,
|
|
322
|
+
toolName,
|
|
323
|
+
arguments: args,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
#recordToolResultItem(callId, toolName, status, output) {
|
|
327
|
+
this.#flushReasoningItem();
|
|
328
|
+
this.#flushAssistantTextItem();
|
|
329
|
+
this.currentPersistedTurnItems.push({
|
|
330
|
+
type: 'tool_result',
|
|
331
|
+
callId,
|
|
332
|
+
toolName,
|
|
333
|
+
status,
|
|
334
|
+
output,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
#resetPersistedTurnState() {
|
|
338
|
+
this.currentPersistedTurnItems = [];
|
|
339
|
+
this.currentReasoningBuffer = '';
|
|
340
|
+
this.currentAssistantTextBuffer = '';
|
|
341
|
+
}
|
|
315
342
|
#log(event) {
|
|
316
343
|
if (!this.logSink)
|
|
317
344
|
return;
|
|
@@ -330,7 +357,20 @@ export class ConversationSession {
|
|
|
330
357
|
if (!this.logSink)
|
|
331
358
|
return;
|
|
332
359
|
switch (event.type) {
|
|
360
|
+
case 'text_delta':
|
|
361
|
+
if (this.currentReasoningBuffer) {
|
|
362
|
+
this.#flushReasoningItem();
|
|
363
|
+
}
|
|
364
|
+
this.currentAssistantTextBuffer += event.delta;
|
|
365
|
+
return;
|
|
366
|
+
case 'reasoning_delta':
|
|
367
|
+
if (this.currentAssistantTextBuffer) {
|
|
368
|
+
this.#flushAssistantTextItem();
|
|
369
|
+
}
|
|
370
|
+
this.currentReasoningBuffer += event.delta;
|
|
371
|
+
return;
|
|
333
372
|
case 'tool_started':
|
|
373
|
+
this.#recordToolCallItem(event.toolCallId, event.toolName, event.arguments);
|
|
334
374
|
this.#log({
|
|
335
375
|
type: 'tool_started',
|
|
336
376
|
toolCallId: event.toolCallId,
|
|
@@ -340,6 +380,11 @@ export class ConversationSession {
|
|
|
340
380
|
return;
|
|
341
381
|
case 'command_message':
|
|
342
382
|
this.#log({ type: 'command_message', message: event.message });
|
|
383
|
+
if (event.message.callId &&
|
|
384
|
+
event.message.toolName &&
|
|
385
|
+
(event.message.status === 'completed' || event.message.status === 'failed')) {
|
|
386
|
+
this.#recordToolResultItem(event.message.callId, event.message.toolName, event.message.status === 'failed' ? 'failed' : 'completed', event.message.output);
|
|
387
|
+
}
|
|
343
388
|
return;
|
|
344
389
|
case 'approval_required':
|
|
345
390
|
this.#log({
|
|
@@ -364,24 +409,44 @@ export class ConversationSession {
|
|
|
364
409
|
this.#log({ type: 'subagent_completed', result: event.result });
|
|
365
410
|
return;
|
|
366
411
|
case 'error':
|
|
367
|
-
this.#log({
|
|
412
|
+
this.#log({
|
|
413
|
+
type: 'error',
|
|
414
|
+
message: event.message,
|
|
415
|
+
...(event.kind ? { kind: event.kind } : {}),
|
|
416
|
+
...(event.stack ? { stack: event.stack } : {}),
|
|
417
|
+
});
|
|
368
418
|
return;
|
|
369
419
|
case 'final': {
|
|
370
|
-
const
|
|
371
|
-
this
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
420
|
+
const turnState = this.#getCurrentAssistantTurnState();
|
|
421
|
+
const toolLedger = this.toolLedger.export();
|
|
422
|
+
this.#flushReasoningItem();
|
|
423
|
+
this.#flushAssistantTextItem();
|
|
424
|
+
const turnItemsToLog = event.turnItems ? [...event.turnItems] : [...this.currentPersistedTurnItems];
|
|
425
|
+
if (event.finalText && !turnItemsToLog.some((item) => item.type === 'assistant_text')) {
|
|
426
|
+
turnItemsToLog.push({
|
|
427
|
+
type: 'assistant_text',
|
|
377
428
|
text: event.finalText,
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
// Invariant check: if transcript contains tool_result, matching call IDs exist in the live tool ledger.
|
|
432
|
+
for (const item of turnItemsToLog) {
|
|
433
|
+
if (item.type === 'tool_result') {
|
|
434
|
+
const exists = toolLedger.some((t) => t.callId === item.callId);
|
|
435
|
+
if (!exists) {
|
|
436
|
+
this.logger.warn(`Invariant violation: tool_result callId ${item.callId} not found in toolLedger`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const turn = {
|
|
441
|
+
items: turnItemsToLog,
|
|
442
|
+
};
|
|
443
|
+
this.#log({
|
|
444
|
+
type: 'assistant_turn',
|
|
445
|
+
turn,
|
|
382
446
|
...(event.usage ? { usage: event.usage } : {}),
|
|
383
|
-
|
|
447
|
+
state: turnState,
|
|
384
448
|
});
|
|
449
|
+
this.#resetPersistedTurnState();
|
|
385
450
|
return;
|
|
386
451
|
}
|
|
387
452
|
default:
|
|
@@ -398,9 +463,13 @@ export class ConversationSession {
|
|
|
398
463
|
this.emittedToolStartedCallIds.add(event.toolCallId);
|
|
399
464
|
return event;
|
|
400
465
|
}
|
|
466
|
+
#getCanonicalHistory() {
|
|
467
|
+
return reconcileHistoryWithToolLedger(this.conversationStore.getHistory(), this.toolLedger.export())
|
|
468
|
+
.history;
|
|
469
|
+
}
|
|
401
470
|
exportState() {
|
|
402
471
|
return {
|
|
403
|
-
history: this
|
|
472
|
+
history: this.#getCanonicalHistory(),
|
|
404
473
|
previousResponseId: this.previousResponseId,
|
|
405
474
|
toolLedger: this.toolLedger.export(),
|
|
406
475
|
};
|
|
@@ -433,21 +502,28 @@ export class ConversationSession {
|
|
|
433
502
|
addShellContext(historyText) {
|
|
434
503
|
this.conversationStore.addShellContext(historyText);
|
|
435
504
|
}
|
|
436
|
-
queueModeNotice(text) {
|
|
437
|
-
this.pendingModeNotice = text;
|
|
438
|
-
}
|
|
439
505
|
/**
|
|
440
506
|
* Abort the current running operation
|
|
441
507
|
*/
|
|
442
508
|
abort() {
|
|
443
|
-
this.approvalFlow.
|
|
509
|
+
const pending = this.approvalFlow.getPending();
|
|
510
|
+
const callId = pending ? getCallIdFromObject(pending.interruption) : undefined;
|
|
511
|
+
if (this.approvalFlow.abort()) {
|
|
512
|
+
this.toolLedger.recordAbortedApproval('Tool execution was not approved.', 'Tool execution was not approved.', callId);
|
|
513
|
+
}
|
|
444
514
|
}
|
|
445
515
|
/**
|
|
446
516
|
* Phase 4: stream conversation events as an async iterator.
|
|
447
517
|
*
|
|
448
518
|
* This is the transport-friendly primitive that can later be bridged to SSE/WebSockets.
|
|
449
519
|
*/
|
|
450
|
-
async *run(input, {
|
|
520
|
+
async *run(input, { skipUserMessage = false, flexServiceTierFallbackCount = 0, hallucinationRetryCount = 0, transientRetryCount = 0, } = {}) {
|
|
521
|
+
if (!skipUserMessage ||
|
|
522
|
+
hallucinationRetryCount > 0 ||
|
|
523
|
+
flexServiceTierFallbackCount > 0 ||
|
|
524
|
+
transientRetryCount > 0) {
|
|
525
|
+
this.#resetPersistedTurnState();
|
|
526
|
+
}
|
|
451
527
|
const gen = this.generation;
|
|
452
528
|
let stream = null;
|
|
453
529
|
const turn = normalizeUserTurn(input);
|
|
@@ -504,15 +580,15 @@ export class ConversationSession {
|
|
|
504
580
|
onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
|
|
505
581
|
onFunctionResultItem: (item) => {
|
|
506
582
|
this.toolLedger.recordFunctionResult(item);
|
|
507
|
-
const cid =
|
|
583
|
+
const cid = callIdOf(item);
|
|
508
584
|
if (cid && this.logSink) {
|
|
509
585
|
const entry = this.toolLedger.export().find((e) => e.callId === cid);
|
|
510
586
|
this.#log({
|
|
511
587
|
type: 'tool_result',
|
|
512
588
|
callId: cid,
|
|
513
|
-
toolName: entry?.toolName ??
|
|
589
|
+
toolName: entry?.toolName ?? toolNameOf(item),
|
|
514
590
|
status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
|
|
515
|
-
output: entry?.output ??
|
|
591
|
+
output: entry?.output ?? outputOf(item),
|
|
516
592
|
...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
|
|
517
593
|
});
|
|
518
594
|
}
|
|
@@ -530,7 +606,16 @@ export class ConversationSession {
|
|
|
530
606
|
source: 'abortResolution',
|
|
531
607
|
stream: continuedStream,
|
|
532
608
|
});
|
|
533
|
-
|
|
609
|
+
const s = continuedStream;
|
|
610
|
+
const terminal = !continuedStream.interruptions || continuedStream.interruptions.length === 0;
|
|
611
|
+
if (terminal) {
|
|
612
|
+
if (this.#inputSurgeKind === 'delta') {
|
|
613
|
+
this.conversationStore.appendOutput(s.output);
|
|
614
|
+
}
|
|
615
|
+
else {
|
|
616
|
+
this.conversationStore.replaceHistory(s.history);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
534
619
|
}
|
|
535
620
|
// Check if another interruption occurred
|
|
536
621
|
if (continuedStream.interruptions && continuedStream.interruptions.length > 0) {
|
|
@@ -563,22 +648,10 @@ export class ConversationSession {
|
|
|
563
648
|
// resync (fresh start with just the current message). After undo the chain
|
|
564
649
|
// is severed (previousResponseId = null) while prior turns remain in the
|
|
565
650
|
// local store, so we fall back to full-history mode to re-establish context.
|
|
566
|
-
const { streamInput, inputSurgeKind
|
|
651
|
+
const { streamInput, inputSurgeKind } = this.#buildOutgoingInput(turn, {
|
|
567
652
|
includeTurn: false,
|
|
568
653
|
});
|
|
569
|
-
|
|
570
|
-
this.pendingModeNotice = null;
|
|
571
|
-
}
|
|
572
|
-
if (modeNoticeToPersist) {
|
|
573
|
-
// Persist the notice at the tail (append-only) rather than splicing
|
|
574
|
-
// it before the last user turn or sending it as a one-shot item.
|
|
575
|
-
// Mid-history insertion adds a stray ephemeral cache breakpoint (see
|
|
576
|
-
// addCacheControlToLastTwoMessages) and a transient item makes
|
|
577
|
-
// consecutive requests diverge at the tail — both break the
|
|
578
|
-
// Claude/Qwen prompt cache. Appending keeps the cached prefix
|
|
579
|
-
// byte-identical and only growing.
|
|
580
|
-
this.conversationStore.addModeNotice(modeNoticeToPersist);
|
|
581
|
-
}
|
|
654
|
+
this.#inputSurgeKind = inputSurgeKind;
|
|
582
655
|
const surgeDecision = this.inputSurgeGuard.inspect(streamInput, { kind: inputSurgeKind });
|
|
583
656
|
if (surgeDecision.action === 'block') {
|
|
584
657
|
let droppedUserMessage;
|
|
@@ -628,7 +701,16 @@ export class ConversationSession {
|
|
|
628
701
|
source: 'startStream',
|
|
629
702
|
stream,
|
|
630
703
|
});
|
|
631
|
-
|
|
704
|
+
const s = stream;
|
|
705
|
+
const terminal = !stream.interruptions || stream.interruptions.length === 0;
|
|
706
|
+
if (terminal) {
|
|
707
|
+
if (inputSurgeKind === 'delta') {
|
|
708
|
+
this.conversationStore.appendOutput(s.output);
|
|
709
|
+
}
|
|
710
|
+
else {
|
|
711
|
+
this.conversationStore.replaceHistory(s.history);
|
|
712
|
+
}
|
|
713
|
+
}
|
|
632
714
|
}
|
|
633
715
|
const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
|
|
634
716
|
if (inputSurgeKind === 'delta') {
|
|
@@ -649,6 +731,14 @@ export class ConversationSession {
|
|
|
649
731
|
mode: this.#getTrafficMode(),
|
|
650
732
|
});
|
|
651
733
|
if (resolvedResult.type === 'approval_required') {
|
|
734
|
+
if (resolvedResult.approval.callId) {
|
|
735
|
+
this.toolLedger.recordFunctionCall({
|
|
736
|
+
type: 'function_call',
|
|
737
|
+
callId: resolvedResult.approval.callId,
|
|
738
|
+
name: resolvedResult.approval.toolName,
|
|
739
|
+
arguments: resolvedResult.approval.argumentsText,
|
|
740
|
+
});
|
|
741
|
+
}
|
|
652
742
|
this.logger.debug('Tool approval required', {
|
|
653
743
|
eventType: 'approval.required',
|
|
654
744
|
category: 'approval',
|
|
@@ -694,6 +784,45 @@ export class ConversationSession {
|
|
|
694
784
|
});
|
|
695
785
|
return;
|
|
696
786
|
}
|
|
787
|
+
if (isTransientRetryableError(error) && transientRetryCount < MAX_TRANSIENT_RETRIES) {
|
|
788
|
+
const attempt = transientRetryCount + 1;
|
|
789
|
+
const delay = Math.min(500 * Math.pow(2, attempt - 1), 30000);
|
|
790
|
+
this.logger.warn('Transient upstream error detected, retrying turn', {
|
|
791
|
+
eventType: 'retry.transient',
|
|
792
|
+
category: 'retry',
|
|
793
|
+
phase: 'retry',
|
|
794
|
+
retryType: 'upstream',
|
|
795
|
+
retryAttempt: attempt,
|
|
796
|
+
attempt,
|
|
797
|
+
maxRetries: MAX_TRANSIENT_RETRIES,
|
|
798
|
+
sessionId: this.id,
|
|
799
|
+
traceId: this.logger.getCorrelationId(),
|
|
800
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
801
|
+
delayMs: delay,
|
|
802
|
+
});
|
|
803
|
+
yield {
|
|
804
|
+
type: 'retry',
|
|
805
|
+
toolName: 'turn',
|
|
806
|
+
attempt,
|
|
807
|
+
maxRetries: MAX_TRANSIENT_RETRIES,
|
|
808
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
809
|
+
retryType: 'upstream',
|
|
810
|
+
};
|
|
811
|
+
if (!this.#isCurrentGeneration(gen))
|
|
812
|
+
return;
|
|
813
|
+
if (stream) {
|
|
814
|
+
this.toolLedger.import(ledgerSnapshot);
|
|
815
|
+
}
|
|
816
|
+
else {
|
|
817
|
+
this.conversationStore.removeLastUserMessage();
|
|
818
|
+
}
|
|
819
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
820
|
+
yield* this.run(turn, {
|
|
821
|
+
skipUserMessage: Boolean(stream),
|
|
822
|
+
transientRetryCount: attempt,
|
|
823
|
+
});
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
697
826
|
const decision = decideRetry(error, hallucinationRetryCount, Boolean(stream), streamHistoryLength);
|
|
698
827
|
if (decision.kind === 'retry') {
|
|
699
828
|
this.logger.warn('Recoverable model error detected, retrying', {
|
|
@@ -734,6 +863,13 @@ export class ConversationSession {
|
|
|
734
863
|
}
|
|
735
864
|
if (stream && this.#isCurrentGeneration(gen)) {
|
|
736
865
|
this.toolLedger.markOpenCallsAborted(error instanceof Error ? error.message : String(error));
|
|
866
|
+
// Persist completed tool call/result pairs (and the recovery notice) into
|
|
867
|
+
// canonical history so the next user turn doesn't ship a request with two
|
|
868
|
+
// consecutive user messages and no record of the tool activity.
|
|
869
|
+
const reconciled = reconcileHistoryWithToolLedger(this.conversationStore.getHistory(), this.toolLedger.export());
|
|
870
|
+
if (reconciled.addedCompletedPairs > 0 || reconciled.droppedIncompleteCalls > 0) {
|
|
871
|
+
this.conversationStore.replaceHistory(reconciled.history);
|
|
872
|
+
}
|
|
737
873
|
const recoverySummary = this.toolLedger.getRecoverySummary();
|
|
738
874
|
if (recoverySummary) {
|
|
739
875
|
yield {
|
|
@@ -747,6 +883,7 @@ export class ConversationSession {
|
|
|
747
883
|
yield {
|
|
748
884
|
type: 'error',
|
|
749
885
|
message: describeError(error),
|
|
886
|
+
...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
|
|
750
887
|
...(droppedUserMessage ? { droppedUserMessage } : {}),
|
|
751
888
|
};
|
|
752
889
|
this.logger.error('Conversation stream error', {
|
|
@@ -756,6 +893,7 @@ export class ConversationSession {
|
|
|
756
893
|
sessionId: this.id,
|
|
757
894
|
traceId: this.logger.getCorrelationId(),
|
|
758
895
|
errorMessage: describeError(error),
|
|
896
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
759
897
|
});
|
|
760
898
|
throw error;
|
|
761
899
|
}
|
|
@@ -771,6 +909,14 @@ export class ConversationSession {
|
|
|
771
909
|
if (!plan) {
|
|
772
910
|
return;
|
|
773
911
|
}
|
|
912
|
+
if (answer !== 'y') {
|
|
913
|
+
const interruption = plan.pendingApprovalContext.interruption;
|
|
914
|
+
const callId = getCallIdFromObject(interruption);
|
|
915
|
+
const output = rejectionReason
|
|
916
|
+
? `Tool execution was not approved. User's reason: ${rejectionReason}`
|
|
917
|
+
: 'Tool execution was not approved.';
|
|
918
|
+
this.toolLedger.recordAbortedApproval(output, output, callId);
|
|
919
|
+
}
|
|
774
920
|
const { pendingApprovalContext: { state, toolCallArgumentsById, emittedCommandIds: previouslyEmittedIds }, toolStartedEvent, removeInterceptor, } = plan;
|
|
775
921
|
if (toolStartedEvent) {
|
|
776
922
|
const filtered = this.#dedupeToolStarted(toolStartedEvent);
|
|
@@ -800,15 +946,15 @@ export class ConversationSession {
|
|
|
800
946
|
onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
|
|
801
947
|
onFunctionResultItem: (item) => {
|
|
802
948
|
this.toolLedger.recordFunctionResult(item);
|
|
803
|
-
const cid =
|
|
949
|
+
const cid = callIdOf(item);
|
|
804
950
|
if (cid && this.logSink) {
|
|
805
951
|
const entry = this.toolLedger.export().find((e) => e.callId === cid);
|
|
806
952
|
this.#log({
|
|
807
953
|
type: 'tool_result',
|
|
808
954
|
callId: cid,
|
|
809
|
-
toolName: entry?.toolName ??
|
|
955
|
+
toolName: entry?.toolName ?? toolNameOf(item),
|
|
810
956
|
status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
|
|
811
|
-
output: entry?.output ??
|
|
957
|
+
output: entry?.output ?? outputOf(item),
|
|
812
958
|
...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
|
|
813
959
|
});
|
|
814
960
|
}
|
|
@@ -826,13 +972,30 @@ export class ConversationSession {
|
|
|
826
972
|
source: 'continueRunStream',
|
|
827
973
|
stream,
|
|
828
974
|
});
|
|
829
|
-
|
|
975
|
+
const s = stream;
|
|
976
|
+
const terminal = !stream.interruptions || stream.interruptions.length === 0;
|
|
977
|
+
if (terminal) {
|
|
978
|
+
if (this.#inputSurgeKind === 'delta') {
|
|
979
|
+
this.conversationStore.appendOutput(s.output);
|
|
980
|
+
}
|
|
981
|
+
else {
|
|
982
|
+
this.conversationStore.replaceHistory(s.history);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
830
985
|
}
|
|
831
986
|
// Merge previously emitted command IDs with newly emitted ones
|
|
832
987
|
// This prevents duplicates when result.history contains commands from the initial stream
|
|
833
988
|
const allEmittedIds = new Set([...previouslyEmittedIds, ...acc.emittedCommandIds]);
|
|
834
989
|
const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
|
|
835
990
|
if (resolvedResult.type === 'approval_required') {
|
|
991
|
+
if (resolvedResult.approval.callId) {
|
|
992
|
+
this.toolLedger.recordFunctionCall({
|
|
993
|
+
type: 'function_call',
|
|
994
|
+
callId: resolvedResult.approval.callId,
|
|
995
|
+
name: resolvedResult.approval.toolName,
|
|
996
|
+
arguments: resolvedResult.approval.argumentsText,
|
|
997
|
+
});
|
|
998
|
+
}
|
|
836
999
|
this.logger.debug('Tool approval required', {
|
|
837
1000
|
eventType: 'approval.required',
|
|
838
1001
|
category: 'approval',
|
|
@@ -879,9 +1042,19 @@ export class ConversationSession {
|
|
|
879
1042
|
}
|
|
880
1043
|
}
|
|
881
1044
|
catch (error) {
|
|
1045
|
+
this.logger.error('Conversation stream error during continuation', {
|
|
1046
|
+
eventType: 'stream.failed',
|
|
1047
|
+
category: 'stream',
|
|
1048
|
+
phase: 'abort',
|
|
1049
|
+
sessionId: this.id,
|
|
1050
|
+
traceId: this.logger.getCorrelationId(),
|
|
1051
|
+
errorMessage: describeError(error),
|
|
1052
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
1053
|
+
});
|
|
882
1054
|
yield {
|
|
883
1055
|
type: 'error',
|
|
884
1056
|
message: describeError(error),
|
|
1057
|
+
...(error instanceof Error && error.stack ? { stack: error.stack } : {}),
|
|
885
1058
|
};
|
|
886
1059
|
throw error;
|
|
887
1060
|
}
|
|
@@ -981,6 +1154,7 @@ export class ConversationSession {
|
|
|
981
1154
|
emittedCommandIds,
|
|
982
1155
|
usage,
|
|
983
1156
|
toolCallArgumentsById: this.toolCallArgumentsById,
|
|
1157
|
+
turnItems: this.currentPersistedTurnItems,
|
|
984
1158
|
}, {
|
|
985
1159
|
approvalFlow: this.approvalFlow,
|
|
986
1160
|
shellAutoApproval: this.shellAutoApproval,
|
|
@@ -996,6 +1170,7 @@ export class ConversationSession {
|
|
|
996
1170
|
let continuationApprovalUsage;
|
|
997
1171
|
const commandMessages = [];
|
|
998
1172
|
let approvalRequiredResult;
|
|
1173
|
+
let continuationTurnItems;
|
|
999
1174
|
for await (const event of this['continue']({ answer: 'y' })) {
|
|
1000
1175
|
if (event.type === 'approval_required') {
|
|
1001
1176
|
continuationApprovalUsage = event.usage;
|
|
@@ -1024,7 +1199,9 @@ export class ConversationSession {
|
|
|
1024
1199
|
if (event.commandMessages) {
|
|
1025
1200
|
commandMessages.push(...event.commandMessages);
|
|
1026
1201
|
}
|
|
1027
|
-
|
|
1202
|
+
if (event.turnItems) {
|
|
1203
|
+
continuationTurnItems = event.turnItems;
|
|
1204
|
+
}
|
|
1028
1205
|
}
|
|
1029
1206
|
else {
|
|
1030
1207
|
yield event;
|
|
@@ -1044,6 +1221,7 @@ export class ConversationSession {
|
|
|
1044
1221
|
finalText: finalText || 'Done.',
|
|
1045
1222
|
...(reasoningText ? { reasoningText } : {}),
|
|
1046
1223
|
...(combinedUsage && Object.keys(combinedUsage).length > 0 ? { usage: combinedUsage } : {}),
|
|
1224
|
+
turnItems: continuationTurnItems ?? this.currentPersistedTurnItems,
|
|
1047
1225
|
};
|
|
1048
1226
|
}
|
|
1049
1227
|
}
|