@qduc/term2 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent.d.ts +21 -24
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +73 -21
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +3 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +283 -128
- package/dist/app.js.map +1 -1
- package/dist/cli.js +91 -27
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-approve-command.js.map +1 -1
- package/dist/commands/mode-commands.js.map +1 -1
- package/dist/commands/retry-tool-command.d.ts +13 -0
- package/dist/commands/retry-tool-command.d.ts.map +1 -0
- package/dist/commands/retry-tool-command.js +20 -0
- package/dist/commands/retry-tool-command.js.map +1 -0
- package/dist/commands/rewind-command.d.ts +37 -0
- package/dist/commands/rewind-command.d.ts.map +1 -0
- package/dist/commands/rewind-command.js +97 -0
- package/dist/commands/rewind-command.js.map +1 -0
- package/dist/commands/sandbox-command.js.map +1 -1
- package/dist/components/InputBox.d.ts +18 -32
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +178 -579
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/input/ApplicationInputSurface.d.ts +37 -0
- package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -0
- package/dist/components/input/ApplicationInputSurface.js +78 -0
- package/dist/components/input/ApplicationInputSurface.js.map +1 -0
- package/dist/components/input/MenuStackHost.d.ts +12 -0
- package/dist/components/input/MenuStackHost.d.ts.map +1 -0
- package/dist/components/input/MenuStackHost.js +13 -0
- package/dist/components/input/MenuStackHost.js.map +1 -0
- package/dist/components/input/MenuSurface.d.ts +13 -0
- package/dist/components/input/MenuSurface.d.ts.map +1 -0
- package/dist/components/input/MenuSurface.js +86 -0
- package/dist/components/input/MenuSurface.js.map +1 -0
- package/dist/components/input/ModelMenuSession.d.ts +19 -0
- package/dist/components/input/ModelMenuSession.d.ts.map +1 -0
- package/dist/components/input/ModelMenuSession.js +144 -0
- package/dist/components/input/ModelMenuSession.js.map +1 -0
- package/dist/components/input/PathMenuSession.d.ts +16 -0
- package/dist/components/input/PathMenuSession.d.ts.map +1 -0
- package/dist/components/input/PathMenuSession.js +68 -0
- package/dist/components/input/PathMenuSession.js.map +1 -0
- package/dist/components/input/PendingQueueList.d.ts +20 -0
- package/dist/components/input/PendingQueueList.d.ts.map +1 -0
- package/dist/components/input/PendingQueueList.js +26 -0
- package/dist/components/input/PendingQueueList.js.map +1 -0
- package/dist/components/input/ProviderMenuSession.d.ts +16 -0
- package/dist/components/input/ProviderMenuSession.d.ts.map +1 -0
- package/dist/components/input/ProviderMenuSession.js +93 -0
- package/dist/components/input/ProviderMenuSession.js.map +1 -0
- package/dist/components/input/RewindMenuSession.d.ts +14 -0
- package/dist/components/input/RewindMenuSession.d.ts.map +1 -0
- package/dist/components/input/RewindMenuSession.js +77 -0
- package/dist/components/input/RewindMenuSession.js.map +1 -0
- package/dist/components/input/SettingsMenuSession.d.ts +17 -0
- package/dist/components/input/SettingsMenuSession.d.ts.map +1 -0
- package/dist/components/input/SettingsMenuSession.js +136 -0
- package/dist/components/input/SettingsMenuSession.js.map +1 -0
- package/dist/components/input/SettingsValueMenuSession.d.ts +19 -0
- package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -0
- package/dist/components/input/SettingsValueMenuSession.js +113 -0
- package/dist/components/input/SettingsValueMenuSession.js.map +1 -0
- package/dist/components/input/SkillsMenuSession.d.ts +16 -0
- package/dist/components/input/SkillsMenuSession.d.ts.map +1 -0
- package/dist/components/input/SkillsMenuSession.js +64 -0
- package/dist/components/input/SkillsMenuSession.js.map +1 -0
- package/dist/components/input/SlashMenuSession.d.ts +17 -0
- package/dist/components/input/SlashMenuSession.d.ts.map +1 -0
- package/dist/components/input/SlashMenuSession.js +57 -0
- package/dist/components/input/SlashMenuSession.js.map +1 -0
- package/dist/components/input/determine-active-menu.d.ts +2 -0
- package/dist/components/input/determine-active-menu.d.ts.map +1 -1
- package/dist/components/input/determine-active-menu.js +12 -4
- package/dist/components/input/determine-active-menu.js.map +1 -1
- package/dist/components/input/insertions.d.ts +0 -13
- package/dist/components/input/insertions.d.ts.map +1 -1
- package/dist/components/input/insertions.js +0 -26
- package/dist/components/input/insertions.js.map +1 -1
- package/dist/components/input/menu-controller.d.ts +52 -0
- package/dist/components/input/menu-controller.d.ts.map +1 -0
- package/dist/components/input/menu-controller.js +690 -0
- package/dist/components/input/menu-controller.js.map +1 -0
- package/dist/components/input/menu-editor.d.ts +9 -0
- package/dist/components/input/menu-editor.d.ts.map +1 -0
- package/dist/components/input/menu-editor.js +45 -0
- package/dist/components/input/menu-editor.js.map +1 -0
- package/dist/components/input/menu-registry.d.ts +20 -0
- package/dist/components/input/menu-registry.d.ts.map +1 -0
- package/dist/components/input/menu-registry.js +25 -0
- package/dist/components/input/menu-registry.js.map +1 -0
- package/dist/components/input/menu-types.d.ts +320 -0
- package/dist/components/input/menu-types.d.ts.map +1 -0
- package/dist/components/input/menu-types.js +2 -0
- package/dist/components/input/menu-types.js.map +1 -0
- package/dist/components/input/settings-intent-host.d.ts +22 -0
- package/dist/components/input/settings-intent-host.d.ts.map +1 -0
- package/dist/components/input/settings-intent-host.js +69 -0
- package/dist/components/input/settings-intent-host.js.map +1 -0
- package/dist/components/input/triggers.d.ts +3 -0
- package/dist/components/input/triggers.d.ts.map +1 -1
- package/dist/components/input/triggers.js +258 -0
- package/dist/components/input/triggers.js.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.d.ts +16 -0
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -0
- package/dist/components/layout/BackgroundTaskManager.js +236 -0
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -0
- package/dist/components/layout/BackgroundTasksPanel.d.ts +2 -2
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +54 -33
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/Banner.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +23 -19
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +74 -48
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +3 -1
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +102 -83
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/menu/RewindMenu.d.ts +18 -0
- package/dist/components/menu/RewindMenu.d.ts.map +1 -0
- package/dist/components/menu/RewindMenu.js +59 -0
- package/dist/components/menu/RewindMenu.js.map +1 -0
- package/dist/components/message/ChatMessage.d.ts +2 -1
- package/dist/components/message/ChatMessage.d.ts.map +1 -1
- package/dist/components/message/ChatMessage.js +1 -1
- package/dist/components/message/ChatMessage.js.map +1 -1
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +138 -17
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/MemoryRenderer.d.ts.map +1 -1
- package/dist/components/message/MemoryRenderer.js +16 -10
- package/dist/components/message/MemoryRenderer.js.map +1 -1
- package/dist/components/message/MessageList.d.ts +20 -3
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +1 -1
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts +5 -1
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +12 -4
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +37 -0
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +49 -8
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts +1 -0
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +136 -59
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/context/InputContext.d.ts +15 -8
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js +92 -15
- package/dist/context/InputContext.js.map +1 -1
- package/dist/contracts/application-stream.d.ts +38 -0
- package/dist/contracts/application-stream.d.ts.map +1 -0
- package/dist/contracts/application-stream.js +2 -0
- package/dist/contracts/application-stream.js.map +1 -0
- package/dist/contracts/continuation-handle.d.ts +18 -0
- package/dist/contracts/continuation-handle.d.ts.map +1 -0
- package/dist/contracts/continuation-handle.js +22 -0
- package/dist/contracts/continuation-handle.js.map +1 -0
- package/dist/contracts/conversation-items.d.ts +47 -0
- package/dist/contracts/conversation-items.d.ts.map +1 -0
- package/dist/contracts/conversation-items.js +2 -0
- package/dist/contracts/conversation-items.js.map +1 -0
- package/dist/contracts/conversation.d.ts +44 -4
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/contracts/conversation.js +9 -0
- package/dist/contracts/conversation.js.map +1 -1
- package/dist/contracts/model-errors.d.ts +10 -0
- package/dist/contracts/model-errors.d.ts.map +1 -0
- package/dist/contracts/model-errors.js +15 -0
- package/dist/contracts/model-errors.js.map +1 -0
- package/dist/contracts/model-types.d.ts +16 -0
- package/dist/contracts/model-types.d.ts.map +1 -0
- package/dist/contracts/model-types.js +2 -0
- package/dist/contracts/model-types.js.map +1 -0
- package/dist/contracts/patch.d.ts +17 -0
- package/dist/contracts/patch.d.ts.map +1 -0
- package/dist/contracts/patch.js +2 -0
- package/dist/contracts/patch.js.map +1 -0
- package/dist/contracts/provider-input.d.ts +34 -0
- package/dist/contracts/provider-input.d.ts.map +1 -0
- package/dist/contracts/provider-input.js +2 -0
- package/dist/contracts/provider-input.js.map +1 -0
- package/dist/contracts/streamed-model-turn.d.ts +230 -0
- package/dist/contracts/streamed-model-turn.d.ts.map +1 -0
- package/dist/contracts/streamed-model-turn.js +2 -0
- package/dist/contracts/streamed-model-turn.js.map +1 -0
- package/dist/env-setup.js +1 -1
- package/dist/hooks/conversation-ui-reducer.d.ts +22 -4
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +43 -4
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/handoff-flow-reducer.d.ts +1 -36
- package/dist/hooks/handoff-flow-reducer.d.ts.map +1 -1
- package/dist/hooks/handoff-flow-reducer.js +3 -57
- package/dist/hooks/handoff-flow-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts +1 -0
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +30 -6
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +13 -11
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +90 -63
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts +18 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.js +77 -8
- package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +30 -13
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +84 -18
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-escape-key.d.ts +4 -32
- package/dist/hooks/use-escape-key.d.ts.map +1 -1
- package/dist/hooks/use-escape-key.js +27 -68
- package/dist/hooks/use-escape-key.js.map +1 -1
- package/dist/hooks/use-handoff-flow.d.ts +6 -6
- package/dist/hooks/use-handoff-flow.d.ts.map +1 -1
- package/dist/hooks/use-handoff-flow.js +110 -118
- package/dist/hooks/use-handoff-flow.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +50 -59
- 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 +20 -11
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-provider-selection.d.ts.map +1 -1
- package/dist/hooks/use-provider-selection.js +19 -16
- package/dist/hooks/use-provider-selection.js.map +1 -1
- package/dist/hooks/use-rewind-selection.d.ts +30 -0
- package/dist/hooks/use-rewind-selection.d.ts.map +1 -0
- package/dist/hooks/{use-undo-selection.js → use-rewind-selection.js} +37 -28
- package/dist/hooks/use-rewind-selection.js.map +1 -0
- package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
- package/dist/hooks/use-runtime-settings.js +4 -3
- package/dist/hooks/use-runtime-settings.js.map +1 -1
- package/dist/hooks/use-selection.d.ts +1 -0
- package/dist/hooks/use-selection.d.ts.map +1 -1
- package/dist/hooks/use-selection.js +1 -1
- package/dist/hooks/use-selection.js.map +1 -1
- package/dist/hooks/use-setting.d.ts +3 -2
- package/dist/hooks/use-setting.d.ts.map +1 -1
- package/dist/hooks/use-setting.js +1 -1
- package/dist/hooks/use-setting.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts +1 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +22 -15
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +40 -28
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-shell-mode.d.ts +3 -13
- package/dist/hooks/use-shell-mode.d.ts.map +1 -1
- package/dist/hooks/use-shell-mode.js +14 -53
- package/dist/hooks/use-shell-mode.js.map +1 -1
- package/dist/hooks/use-skill-selection.d.ts.map +1 -1
- package/dist/hooks/use-skill-selection.js +17 -11
- package/dist/hooks/use-skill-selection.js.map +1 -1
- package/dist/hooks/use-slash-commands.d.ts.map +1 -1
- package/dist/hooks/use-slash-commands.js +11 -10
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-terminal-focus-notifier.js.map +1 -1
- package/dist/lib/agent-chat-service.d.ts +12 -8
- package/dist/lib/agent-chat-service.d.ts.map +1 -1
- package/dist/lib/agent-chat-service.js +79 -44
- package/dist/lib/agent-chat-service.js.map +1 -1
- package/dist/lib/agent-client.d.ts +93 -17
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +398 -37
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +33 -15
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +104 -9
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +22 -4
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +137 -101
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/lib/chained-input-filter.d.ts +7 -1
- package/dist/lib/chained-input-filter.d.ts.map +1 -1
- package/dist/lib/chained-input-filter.js +46 -62
- package/dist/lib/chained-input-filter.js.map +1 -1
- package/dist/lib/continuation-projection-mode.d.ts +3 -0
- package/dist/lib/continuation-projection-mode.d.ts.map +1 -0
- package/dist/lib/continuation-projection-mode.js +2 -0
- package/dist/lib/continuation-projection-mode.js.map +1 -0
- package/dist/lib/editor-impl.d.ts +1 -1
- package/dist/lib/editor-impl.d.ts.map +1 -1
- package/dist/lib/editor-impl.js +1 -1
- package/dist/lib/editor-impl.js.map +1 -1
- package/dist/lib/harness-invariant-error.d.ts +22 -0
- package/dist/lib/harness-invariant-error.d.ts.map +1 -0
- package/dist/lib/harness-invariant-error.js +30 -0
- package/dist/lib/harness-invariant-error.js.map +1 -0
- package/dist/lib/input-owner.d.ts +64 -0
- package/dist/lib/input-owner.d.ts.map +1 -0
- package/dist/lib/input-owner.js +34 -0
- package/dist/lib/input-owner.js.map +1 -0
- package/dist/lib/openai-strict-tool-schema.d.ts +7 -4
- package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -1
- package/dist/lib/openai-strict-tool-schema.js +8 -0
- package/dist/lib/openai-strict-tool-schema.js.map +1 -1
- package/dist/lib/subagent-bridge.d.ts +36 -4
- package/dist/lib/subagent-bridge.d.ts.map +1 -1
- package/dist/lib/subagent-bridge.js +92 -20
- package/dist/lib/subagent-bridge.js.map +1 -1
- package/dist/lib/tool-invoke.d.ts +18 -10
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +92 -44
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/non-interactive.d.ts +14 -4
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +91 -84
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/async-subagent-delegation.d.ts +1 -4
- package/dist/prompts/async-subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/async-subagent-delegation.js +9 -47
- package/dist/prompts/async-subagent-delegation.js.map +1 -1
- package/dist/prompts/async-subagent-delegation.ts +9 -58
- package/dist/prompts/memory.md +1 -1
- package/dist/prompts/orchestrator-prompt.test.ts +15 -0
- package/dist/prompts/orchestrator.md +7 -5
- package/dist/prompts/plan-mode-info.md +1 -1
- package/dist/prompts/prompt-constructor.d.ts +1 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +5 -7
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +9 -8
- package/dist/prompts/prompt-constructor.ts +6 -7
- 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 +20 -5
- package/dist/prompts/shell-auto-approval.js.map +1 -1
- package/dist/prompts/shell-auto-approval.ts +20 -5
- package/dist/prompts/steering-notice.d.ts +16 -0
- package/dist/prompts/steering-notice.d.ts.map +1 -0
- package/dist/prompts/steering-notice.js +24 -0
- package/dist/prompts/steering-notice.js.map +1 -0
- package/dist/prompts/steering-notice.ts +24 -0
- package/dist/prompts/subagent-delegation.d.ts +6 -5
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +36 -13
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +9 -2
- package/dist/prompts/subagent-delegation.ts +54 -14
- package/dist/prompts/subagents/explorer.md +24 -14
- package/dist/prompts/subagents/worker-prompt.test.ts +2 -2
- package/dist/prompts/worktree-hygiene.md +1 -0
- package/dist/providers/ai-sdk-anthropic.provider.d.ts +3 -3
- package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-anthropic.provider.js +8 -4
- package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -1
- package/dist/providers/ai-sdk-google.provider.d.ts +5 -4
- package/dist/providers/ai-sdk-google.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-google.provider.js +23 -3
- package/dist/providers/ai-sdk-google.provider.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.d.ts +3 -7
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.js +27 -11
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.d.ts +5 -4
- package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.js +25 -3
- package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
- package/dist/providers/ai-sdk-provider-settings.d.ts +10 -0
- package/dist/providers/ai-sdk-provider-settings.d.ts.map +1 -0
- package/dist/providers/ai-sdk-provider-settings.js +37 -0
- package/dist/providers/ai-sdk-provider-settings.js.map +1 -0
- package/dist/providers/ai-sdk-streamed-model.d.ts +5 -0
- package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -0
- package/dist/providers/ai-sdk-streamed-model.js +338 -0
- package/dist/providers/ai-sdk-streamed-model.js.map +1 -0
- package/dist/providers/codex-responses-model.d.ts +39 -12
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +656 -155
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-turn-converter.d.ts +12 -0
- package/dist/providers/codex-turn-converter.d.ts.map +1 -0
- package/dist/providers/codex-turn-converter.js +168 -0
- package/dist/providers/codex-turn-converter.js.map +1 -0
- package/dist/providers/codex.provider.d.ts +21 -0
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +57 -27
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/common/openai-compatible-message-contract.d.ts +8 -0
- package/dist/providers/common/openai-compatible-message-contract.d.ts.map +1 -0
- package/dist/providers/common/openai-compatible-message-contract.js +23 -0
- package/dist/providers/common/openai-compatible-message-contract.js.map +1 -0
- package/dist/providers/common/openai-compatible-messages.d.ts +0 -4
- package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -1
- package/dist/providers/common/openai-compatible-messages.js +0 -288
- package/dist/providers/common/openai-compatible-messages.js.map +1 -1
- package/dist/providers/fetch/composer.d.ts.map +1 -1
- package/dist/providers/fetch/composer.js +1 -0
- package/dist/providers/fetch/composer.js.map +1 -1
- package/dist/providers/model-catalog/catalog.d.ts +31 -0
- package/dist/providers/model-catalog/catalog.d.ts.map +1 -0
- package/dist/providers/model-catalog/catalog.generated.d.ts +3010 -0
- package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -0
- package/dist/providers/model-catalog/catalog.generated.js +3004 -0
- package/dist/providers/model-catalog/catalog.generated.js.map +1 -0
- package/dist/providers/model-catalog/catalog.js +62 -0
- package/dist/providers/model-catalog/catalog.js.map +1 -0
- package/dist/providers/model-catalog/generate-catalog.d.ts +42 -0
- package/dist/providers/model-catalog/generate-catalog.d.ts.map +1 -0
- package/dist/providers/model-catalog/generate-catalog.js +96 -0
- package/dist/providers/model-catalog/generate-catalog.js.map +1 -0
- package/dist/providers/openai-chained-input-compatibility.d.ts +36 -0
- package/dist/providers/openai-chained-input-compatibility.d.ts.map +1 -0
- package/dist/providers/openai-chained-input-compatibility.js +60 -0
- package/dist/providers/openai-chained-input-compatibility.js.map +1 -0
- package/dist/providers/openai-chat-completions-model.d.ts +12 -0
- package/dist/providers/openai-chat-completions-model.d.ts.map +1 -0
- package/dist/providers/openai-chat-completions-model.js +271 -0
- package/dist/providers/openai-chat-completions-model.js.map +1 -0
- package/dist/providers/openai-compatible-lazy.d.ts +1 -1
- package/dist/providers/openai-compatible-lazy.d.ts.map +1 -1
- package/dist/providers/openai-compatible-lazy.js +24 -36
- package/dist/providers/openai-compatible-lazy.js.map +1 -1
- package/dist/providers/openai-compatible-middleware.d.ts +4 -1
- package/dist/providers/openai-compatible-middleware.d.ts.map +1 -1
- package/dist/providers/openai-compatible-middleware.js +15 -14
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible-response-normalizer.d.ts +10 -1
- package/dist/providers/openai-compatible-response-normalizer.d.ts.map +1 -1
- package/dist/providers/openai-compatible-response-normalizer.js +15 -4
- package/dist/providers/openai-compatible-response-normalizer.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +7 -10
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +80 -78
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-request-prefix-binding.d.ts +28 -0
- package/dist/providers/openai-request-prefix-binding.d.ts.map +1 -0
- package/dist/providers/openai-request-prefix-binding.js +78 -0
- package/dist/providers/openai-request-prefix-binding.js.map +1 -0
- package/dist/providers/openai-responses-model.d.ts +43 -0
- package/dist/providers/openai-responses-model.d.ts.map +1 -0
- package/dist/providers/openai-responses-model.js +564 -0
- package/dist/providers/openai-responses-model.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +11 -8
- package/dist/providers/openai.provider.d.ts.map +1 -1
- package/dist/providers/openai.provider.js +43 -91
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/opencode-routing.d.ts +1 -1
- package/dist/providers/opencode-routing.d.ts.map +1 -1
- package/dist/providers/opencode-routing.js +4 -2
- package/dist/providers/opencode-routing.js.map +1 -1
- package/dist/providers/opencode-session.d.ts.map +1 -1
- package/dist/providers/opencode-session.js +28 -3
- package/dist/providers/opencode-session.js.map +1 -1
- package/dist/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/providers/openrouter.provider.js +33 -33
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/provider-request-capture.d.ts +35 -0
- package/dist/providers/provider-request-capture.d.ts.map +1 -0
- package/dist/providers/provider-request-capture.js +22 -0
- package/dist/providers/provider-request-capture.js.map +1 -0
- package/dist/providers/provider-service.d.ts +9 -7
- package/dist/providers/provider-service.d.ts.map +1 -1
- package/dist/providers/provider-service.js +29 -28
- package/dist/providers/provider-service.js.map +1 -1
- package/dist/providers/registry.d.ts +14 -9
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/retrying-model.d.ts +8 -6
- package/dist/providers/retrying-model.d.ts.map +1 -1
- package/dist/providers/retrying-model.js +7 -20
- package/dist/providers/retrying-model.js.map +1 -1
- package/dist/providers/web-search/exa.provider.js.map +1 -1
- package/dist/providers/web-search/registry.js.map +1 -1
- package/dist/providers/web-search/tavily.provider.js.map +1 -1
- package/dist/providers/websocket-receive-watchdog.d.ts.map +1 -1
- package/dist/providers/websocket-receive-watchdog.js +9 -1
- package/dist/providers/websocket-receive-watchdog.js.map +1 -1
- package/dist/scripts/eval-auto-approval/runner.js +2 -0
- package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts +205 -0
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -0
- package/dist/services/agent-runtime/application-run-loop.js +1236 -0
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -0
- package/dist/services/agent-runtime/compose-agent-runtime.d.ts +3 -0
- package/dist/services/agent-runtime/compose-agent-runtime.d.ts.map +1 -1
- package/dist/services/agent-runtime/compose-agent-runtime.js +4 -0
- package/dist/services/agent-runtime/compose-agent-runtime.js.map +1 -1
- package/dist/services/agent-runtime/generation-guard.d.ts +69 -0
- package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -0
- package/dist/services/agent-runtime/generation-guard.js +270 -0
- package/dist/services/agent-runtime/generation-guard.js.map +1 -0
- package/dist/services/agent-runtime/model-resolver.d.ts.map +1 -1
- package/dist/services/agent-runtime/model-resolver.js +7 -6
- package/dist/services/agent-runtime/model-resolver.js.map +1 -1
- package/dist/services/agent-runtime/structured-output.d.ts.map +1 -1
- package/dist/services/agent-runtime/structured-output.js +1 -21
- package/dist/services/agent-runtime/structured-output.js.map +1 -1
- package/dist/services/agent-runtime/tool-invocation-context.d.ts +73 -0
- package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -0
- package/dist/services/agent-runtime/tool-invocation-context.js +66 -0
- package/dist/services/agent-runtime/tool-invocation-context.js.map +1 -0
- package/dist/services/agent-stream.d.ts +41 -2
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +46 -1
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/approval/approval-decision-executor.d.ts +42 -0
- package/dist/services/approval/approval-decision-executor.d.ts.map +1 -0
- package/dist/services/approval/approval-decision-executor.js +207 -0
- package/dist/services/approval/approval-decision-executor.js.map +1 -0
- package/dist/services/approval/approval-flow-coordinator.d.ts +25 -8
- package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
- package/dist/services/approval/approval-flow-coordinator.js +34 -167
- package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
- package/dist/services/approval/approval-replay.d.ts +52 -0
- package/dist/services/approval/approval-replay.d.ts.map +1 -0
- package/dist/services/approval/approval-replay.js +68 -0
- package/dist/services/approval/approval-replay.js.map +1 -0
- package/dist/services/approval/approval-state.d.ts +3 -6
- package/dist/services/approval/approval-state.d.ts.map +1 -1
- package/dist/services/approval/approval-state.js +0 -10
- package/dist/services/approval/approval-state.js.map +1 -1
- package/dist/services/approval/background-subagent-approval-controller.d.ts +25 -0
- package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -0
- package/dist/services/approval/background-subagent-approval-controller.js +65 -0
- package/dist/services/approval/background-subagent-approval-controller.js.map +1 -0
- package/dist/services/approval/background-subagent-approval-queue.d.ts +137 -0
- package/dist/services/approval/background-subagent-approval-queue.d.ts.map +1 -0
- package/dist/services/approval/background-subagent-approval-queue.js +200 -0
- package/dist/services/approval/background-subagent-approval-queue.js.map +1 -0
- package/dist/services/approval/non-interactive-approval-policy.d.ts +33 -0
- package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -0
- package/dist/services/approval/non-interactive-approval-policy.js +85 -0
- package/dist/services/approval/non-interactive-approval-policy.js.map +1 -0
- package/dist/services/approval/session-read-access.d.ts +10 -0
- package/dist/services/approval/session-read-access.d.ts.map +1 -1
- package/dist/services/approval/session-read-access.js +12 -0
- package/dist/services/approval/session-read-access.js.map +1 -1
- package/dist/services/approval/session-read-grant-target.d.ts +7 -0
- package/dist/services/approval/session-read-grant-target.d.ts.map +1 -0
- package/dist/services/approval/session-read-grant-target.js +36 -0
- package/dist/services/approval/session-read-grant-target.js.map +1 -0
- package/dist/services/approval/shell-auto-approval-evaluator.d.ts +11 -3
- package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
- package/dist/services/approval/shell-auto-approval-evaluator.js +140 -46
- package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/approval/shell-auto-approval-resolver.d.ts +13 -0
- package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
- package/dist/services/approval/shell-auto-approval-resolver.js +74 -6
- package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
- package/dist/services/approval/shell-sandbox-approval.d.ts +22 -1
- package/dist/services/approval/shell-sandbox-approval.d.ts.map +1 -1
- package/dist/services/approval/shell-sandbox-approval.js +31 -4
- package/dist/services/approval/shell-sandbox-approval.js.map +1 -1
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts +9 -0
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
- package/dist/services/approval/tool-approval-batch-coordinator.js +20 -4
- package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
- package/dist/services/approval/tool-owner.d.ts +5 -2
- package/dist/services/approval/tool-owner.d.ts.map +1 -1
- package/dist/services/approval/tool-owner.js +0 -56
- package/dist/services/approval/tool-owner.js.map +1 -1
- package/dist/services/approval/tool-ownership-registry.d.ts +25 -0
- package/dist/services/approval/tool-ownership-registry.d.ts.map +1 -0
- package/dist/services/approval/tool-ownership-registry.js +63 -0
- package/dist/services/approval/tool-ownership-registry.js.map +1 -0
- package/dist/services/command-message-streaming.d.ts +8 -4
- package/dist/services/command-message-streaming.d.ts.map +1 -1
- package/dist/services/command-message-streaming.js +13 -52
- package/dist/services/command-message-streaming.js.map +1 -1
- package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter-factory.js +1 -0
- package/dist/services/conversation/conversation-adapter-factory.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +112 -13
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +270 -47
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.d.ts +69 -0
- package/dist/services/conversation/conversation-admission-workflow.d.ts.map +1 -0
- package/dist/services/conversation/conversation-admission-workflow.js +110 -0
- package/dist/services/conversation/conversation-admission-workflow.js.map +1 -0
- package/dist/services/conversation/conversation-decoder.d.ts +14 -0
- package/dist/services/conversation/conversation-decoder.d.ts.map +1 -0
- package/dist/services/conversation/conversation-decoder.js +149 -0
- package/dist/services/conversation/conversation-decoder.js.map +1 -0
- package/dist/services/conversation/conversation-events.d.ts +50 -26
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-history-repair.d.ts.map +1 -1
- package/dist/services/conversation/conversation-history-repair.js +34 -37
- package/dist/services/conversation/conversation-history-repair.js.map +1 -1
- package/dist/services/conversation/conversation-message-projection.d.ts +27 -0
- package/dist/services/conversation/conversation-message-projection.d.ts.map +1 -0
- package/dist/services/conversation/conversation-message-projection.js +59 -0
- package/dist/services/conversation/conversation-message-projection.js.map +1 -0
- package/dist/services/conversation/conversation-orchestrator.d.ts +23 -14
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +358 -159
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +14 -11
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence-types.d.ts +15 -38
- package/dist/services/conversation/conversation-persistence-types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.d.ts +3 -10
- package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.js +66 -15
- package/dist/services/conversation/conversation-persistence.js.map +1 -1
- package/dist/services/conversation/conversation-replay.d.ts +7 -5
- package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation/conversation-replay.js +127 -66
- package/dist/services/conversation/conversation-replay.js.map +1 -1
- package/dist/services/conversation/conversation-result-builder.d.ts +16 -2
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.js +51 -15
- package/dist/services/conversation/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation/conversation-runtime-factory.d.ts +18 -0
- package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -1
- package/dist/services/conversation/conversation-runtime-factory.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +65 -12
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +129 -16
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/conversation-state-projector.d.ts +3 -3
- package/dist/services/conversation/conversation-state-projector.d.ts.map +1 -1
- package/dist/services/conversation/conversation-state-projector.js +18 -0
- package/dist/services/conversation/conversation-state-projector.js.map +1 -1
- package/dist/services/conversation/conversation-store.d.ts +69 -12
- package/dist/services/conversation/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation/conversation-store.js +216 -119
- package/dist/services/conversation/conversation-store.js.map +1 -1
- package/dist/services/conversation/conversation-turn-items.d.ts +8 -2
- package/dist/services/conversation/conversation-turn-items.d.ts.map +1 -1
- package/dist/services/conversation/conversation-turn-items.js +96 -275
- package/dist/services/conversation/conversation-turn-items.js.map +1 -1
- package/dist/services/conversation/journal-to-ledger.d.ts.map +1 -1
- package/dist/services/conversation/journal-to-ledger.js +4 -24
- package/dist/services/conversation/journal-to-ledger.js.map +1 -1
- package/dist/services/conversation/run-item-normalizer.d.ts +5 -0
- package/dist/services/conversation/run-item-normalizer.d.ts.map +1 -0
- package/dist/services/conversation/run-item-normalizer.js +245 -0
- package/dist/services/conversation/run-item-normalizer.js.map +1 -0
- package/dist/services/conversation/user-turn-item.d.ts +14 -0
- package/dist/services/conversation/user-turn-item.d.ts.map +1 -0
- package/dist/services/conversation/user-turn-item.js +27 -0
- package/dist/services/conversation/user-turn-item.js.map +1 -0
- package/dist/services/conversation-agent-client.d.ts +77 -6
- package/dist/services/conversation-agent-client.d.ts.map +1 -1
- package/dist/services/cost/model-cost.d.ts +147 -0
- package/dist/services/cost/model-cost.d.ts.map +1 -0
- package/dist/services/cost/model-cost.js +217 -0
- package/dist/services/cost/model-cost.js.map +1 -0
- package/dist/services/cost/pricing-overlay.d.ts +26 -0
- package/dist/services/cost/pricing-overlay.d.ts.map +1 -0
- package/dist/services/cost/pricing-overlay.js +39 -0
- package/dist/services/cost/pricing-overlay.js.map +1 -0
- package/dist/services/cost/pricing.d.ts +13 -0
- package/dist/services/cost/pricing.d.ts.map +1 -0
- package/dist/services/cost/pricing.js +76 -0
- package/dist/services/cost/pricing.js.map +1 -0
- package/dist/services/handoff/handoff-flow-reducer.d.ts +27 -0
- package/dist/services/handoff/handoff-flow-reducer.d.ts.map +1 -0
- package/dist/services/handoff/handoff-flow-reducer.js +26 -0
- package/dist/services/handoff/handoff-flow-reducer.js.map +1 -0
- package/dist/services/handoff/handoff-session.d.ts +35 -0
- package/dist/services/handoff/handoff-session.d.ts.map +1 -0
- package/dist/services/handoff/handoff-session.js +136 -0
- package/dist/services/handoff/handoff-session.js.map +1 -0
- package/dist/services/hooks/hook-contracts.d.ts +124 -0
- package/dist/services/hooks/hook-contracts.d.ts.map +1 -0
- package/dist/services/hooks/hook-contracts.js +92 -0
- package/dist/services/hooks/hook-contracts.js.map +1 -0
- package/dist/services/hooks/hook-discovery.d.ts +45 -0
- package/dist/services/hooks/hook-discovery.d.ts.map +1 -0
- package/dist/services/hooks/hook-discovery.js +255 -0
- package/dist/services/hooks/hook-discovery.js.map +1 -0
- package/dist/services/hooks/hook-editor-shim.d.ts +6 -0
- package/dist/services/hooks/hook-editor-shim.d.ts.map +1 -0
- package/dist/services/hooks/hook-editor-shim.js +190 -0
- package/dist/services/hooks/hook-editor-shim.js.map +1 -0
- package/dist/services/hooks/hook-event-factory.d.ts +19 -0
- package/dist/services/hooks/hook-event-factory.d.ts.map +1 -0
- package/dist/services/hooks/hook-event-factory.js +45 -0
- package/dist/services/hooks/hook-event-factory.js.map +1 -0
- package/dist/services/hooks/hook-module-loader.d.ts +38 -0
- package/dist/services/hooks/hook-module-loader.d.ts.map +1 -0
- package/dist/services/hooks/hook-module-loader.js +69 -0
- package/dist/services/hooks/hook-module-loader.js.map +1 -0
- package/dist/services/hooks/hook-registry.d.ts +47 -0
- package/dist/services/hooks/hook-registry.d.ts.map +1 -0
- package/dist/services/hooks/hook-registry.js +185 -0
- package/dist/services/hooks/hook-registry.js.map +1 -0
- package/dist/services/hooks/hook-service.d.ts +44 -0
- package/dist/services/hooks/hook-service.d.ts.map +1 -0
- package/dist/services/hooks/hook-service.js +138 -0
- package/dist/services/hooks/hook-service.js.map +1 -0
- package/dist/services/hooks/hook-tool-lifecycle.d.ts +6 -0
- package/dist/services/hooks/hook-tool-lifecycle.d.ts.map +1 -0
- package/dist/services/hooks/hook-tool-lifecycle.js +33 -0
- package/dist/services/hooks/hook-tool-lifecycle.js.map +1 -0
- package/dist/services/hooks/index.d.ts +2 -0
- package/dist/services/hooks/index.d.ts.map +1 -0
- package/dist/services/hooks/index.js +2 -0
- package/dist/services/hooks/index.js.map +1 -0
- package/dist/services/input-surge-guard.d.ts.map +1 -1
- package/dist/services/input-surge-guard.js +13 -34
- package/dist/services/input-surge-guard.js.map +1 -1
- package/dist/services/logging/assistant-turn-journal.d.ts +1 -1
- package/dist/services/logging/assistant-turn-journal.d.ts.map +1 -1
- package/dist/services/logging/assistant-turn-journal.js +21 -36
- package/dist/services/logging/assistant-turn-journal.js.map +1 -1
- package/dist/services/logging/conversation-log-events.d.ts +62 -7
- package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.js +9 -0
- package/dist/services/logging/conversation-log-events.js.map +1 -1
- package/dist/services/logging/conversation-log-writer.d.ts +9 -4
- package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-writer.js +183 -56
- package/dist/services/logging/conversation-log-writer.js.map +1 -1
- package/dist/services/logging/conversation-logger.d.ts.map +1 -1
- package/dist/services/logging/conversation-logger.js +24 -1
- package/dist/services/logging/conversation-logger.js.map +1 -1
- package/dist/services/logging/logging-service.d.ts.map +1 -1
- package/dist/services/logging/logging-service.js +6 -2
- package/dist/services/logging/logging-service.js.map +1 -1
- package/dist/services/logging/provider-traffic.d.ts +2 -1
- package/dist/services/logging/provider-traffic.d.ts.map +1 -1
- package/dist/services/logging/provider-traffic.js +81 -5
- package/dist/services/logging/provider-traffic.js.map +1 -1
- package/dist/services/memory/memory-capabilities.d.ts.map +1 -1
- package/dist/services/memory/memory-capabilities.js +13 -8
- package/dist/services/memory/memory-capabilities.js.map +1 -1
- package/dist/services/model-service.d.ts +3 -0
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js +3 -1
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/models/model-catalog-session.d.ts +24 -0
- package/dist/services/models/model-catalog-session.d.ts.map +1 -0
- package/dist/services/models/model-catalog-session.js +70 -0
- package/dist/services/models/model-catalog-session.js.map +1 -0
- package/dist/services/openai-candidate-observer.d.ts +18 -0
- package/dist/services/openai-candidate-observer.d.ts.map +1 -0
- package/dist/services/openai-candidate-observer.js +56 -0
- package/dist/services/openai-candidate-observer.js.map +1 -0
- package/dist/services/openai-root-checkpoint-lifecycle-observer.d.ts +20 -0
- package/dist/services/openai-root-checkpoint-lifecycle-observer.d.ts.map +1 -0
- package/dist/services/openai-root-checkpoint-lifecycle-observer.js +21 -0
- package/dist/services/openai-root-checkpoint-lifecycle-observer.js.map +1 -0
- package/dist/services/openai-root-provider-identity.d.ts +11 -0
- package/dist/services/openai-root-provider-identity.d.ts.map +1 -0
- package/dist/services/openai-root-provider-identity.js +16 -0
- package/dist/services/openai-root-provider-identity.js.map +1 -0
- package/dist/services/openai-root-selector-parity-observer.d.ts +53 -0
- package/dist/services/openai-root-selector-parity-observer.d.ts.map +1 -0
- package/dist/services/openai-root-selector-parity-observer.js +62 -0
- package/dist/services/openai-root-selector-parity-observer.js.map +1 -0
- package/dist/services/plan-mode-interceptor.js +2 -2
- package/dist/services/plan-mode-interceptor.js.map +1 -1
- package/dist/services/provider-continuity.d.ts +79 -0
- package/dist/services/provider-continuity.d.ts.map +1 -1
- package/dist/services/provider-continuity.js +170 -0
- package/dist/services/provider-continuity.js.map +1 -1
- package/dist/services/providers/provider-management-session.d.ts +12 -0
- package/dist/services/providers/provider-management-session.d.ts.map +1 -0
- package/dist/services/providers/provider-management-session.js +21 -0
- package/dist/services/providers/provider-management-session.js.map +1 -0
- package/dist/services/queue/queue-controller.d.ts +9 -14
- package/dist/services/queue/queue-controller.d.ts.map +1 -1
- package/dist/services/queue/queue-controller.js +75 -60
- package/dist/services/queue/queue-controller.js.map +1 -1
- package/dist/services/retry/conversation-retry-policy.js +3 -3
- package/dist/services/retry/conversation-retry-policy.js.map +1 -1
- package/dist/services/retry/recovery-executor.d.ts.map +1 -1
- package/dist/services/retry/recovery-executor.js +7 -8
- package/dist/services/retry/recovery-executor.js.map +1 -1
- package/dist/services/retry/recovery-policy.d.ts.map +1 -1
- package/dist/services/retry/recovery-policy.js +4 -1
- package/dist/services/retry/recovery-policy.js.map +1 -1
- package/dist/services/retry/retry-classifier.d.ts.map +1 -1
- package/dist/services/retry/retry-classifier.js +2 -1
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-contracts.d.ts +3 -5
- package/dist/services/retry/retry-contracts.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.d.ts +1 -0
- package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.js +28 -0
- package/dist/services/retry/retry-error-classification.js.map +1 -1
- package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.js +4 -1
- package/dist/services/retry/retry-event-presenter.js.map +1 -1
- package/dist/services/retry/upstream-retry-policy.js +3 -3
- package/dist/services/rtk-service.d.ts.map +1 -1
- package/dist/services/rtk-service.js +3 -15
- package/dist/services/rtk-service.js.map +1 -1
- package/dist/services/runtime-setting-router.d.ts +19 -0
- package/dist/services/runtime-setting-router.d.ts.map +1 -1
- package/dist/services/runtime-setting-router.js +33 -0
- package/dist/services/runtime-setting-router.js.map +1 -1
- package/dist/services/service-interfaces.d.ts +19 -2
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session/background-task-control.d.ts +123 -0
- package/dist/services/session/background-task-control.d.ts.map +1 -0
- package/dist/services/session/background-task-control.js +183 -0
- package/dist/services/session/background-task-control.js.map +1 -0
- package/dist/services/session/continuation-call-id-resolver.d.ts +16 -9
- package/dist/services/session/continuation-call-id-resolver.d.ts.map +1 -1
- package/dist/services/session/continuation-call-id-resolver.js +34 -48
- package/dist/services/session/continuation-call-id-resolver.js.map +1 -1
- package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
- package/dist/services/session/continuation-plan-applier.js +1 -3
- package/dist/services/session/continuation-plan-applier.js.map +1 -1
- package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/continuation-recovery-handler.js +0 -2
- package/dist/services/session/continuation-recovery-handler.js.map +1 -1
- package/dist/services/session/continuation-state.d.ts +9 -5
- package/dist/services/session/continuation-state.d.ts.map +1 -1
- package/dist/services/session/continuation-state.js +1 -1
- package/dist/services/session/continuation-state.js.map +1 -1
- package/dist/services/session/live-run.d.ts +29 -0
- package/dist/services/session/live-run.d.ts.map +1 -0
- package/dist/services/session/live-run.js +111 -0
- package/dist/services/session/live-run.js.map +1 -0
- package/dist/services/session/nested-tool-compatibility-state.d.ts +20 -0
- package/dist/services/session/nested-tool-compatibility-state.d.ts.map +1 -0
- package/dist/services/session/nested-tool-compatibility-state.js +29 -0
- package/dist/services/session/nested-tool-compatibility-state.js.map +1 -0
- package/dist/services/session/pending-interaction-state.d.ts +60 -0
- package/dist/services/session/pending-interaction-state.d.ts.map +1 -0
- package/dist/services/session/pending-interaction-state.js +132 -0
- package/dist/services/session/pending-interaction-state.js.map +1 -0
- package/dist/services/session/post-execute-pause-capability.d.ts +17 -0
- package/dist/services/session/post-execute-pause-capability.d.ts.map +1 -0
- package/dist/services/session/post-execute-pause-capability.js +27 -0
- package/dist/services/session/post-execute-pause-capability.js.map +1 -0
- package/dist/services/session/post-execute-pause-policy.d.ts +20 -0
- package/dist/services/session/post-execute-pause-policy.d.ts.map +1 -0
- package/dist/services/session/post-execute-pause-policy.js +34 -0
- package/dist/services/session/post-execute-pause-policy.js.map +1 -0
- package/dist/services/session/post-execute-pending-registry.d.ts +63 -0
- package/dist/services/session/post-execute-pending-registry.d.ts.map +1 -0
- package/dist/services/session/post-execute-pending-registry.js +123 -0
- package/dist/services/session/post-execute-pending-registry.js.map +1 -0
- package/dist/services/session/session-access-state.d.ts +24 -0
- package/dist/services/session/session-access-state.d.ts.map +1 -0
- package/dist/services/session/session-access-state.js +91 -0
- package/dist/services/session/session-access-state.js.map +1 -0
- package/dist/services/session/session-client-factory.d.ts +61 -0
- package/dist/services/session/session-client-factory.d.ts.map +1 -0
- package/dist/services/session/session-client-factory.js +103 -0
- package/dist/services/session/session-client-factory.js.map +1 -0
- package/dist/services/session/session-composition.d.ts +58 -0
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +178 -13
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-input-planner.d.ts +6 -2
- package/dist/services/session/session-input-planner.d.ts.map +1 -1
- package/dist/services/session/session-input-planner.js +4 -0
- package/dist/services/session/session-input-planner.js.map +1 -1
- package/dist/services/session/session-lifecycle.d.ts +5 -0
- package/dist/services/session/session-lifecycle.d.ts.map +1 -1
- package/dist/services/session/session-lifecycle.js +16 -6
- package/dist/services/session/session-lifecycle.js.map +1 -1
- package/dist/services/session/session-manager.d.ts +11 -1
- package/dist/services/session/session-manager.d.ts.map +1 -1
- package/dist/services/session/session-manager.js +16 -3
- package/dist/services/session/session-manager.js.map +1 -1
- package/dist/services/session/session-stream-processor.d.ts +5 -0
- package/dist/services/session/session-stream-processor.d.ts.map +1 -1
- package/dist/services/session/session-stream-processor.js +164 -35
- package/dist/services/session/session-stream-processor.js.map +1 -1
- package/dist/services/session/session-tool-tracker.d.ts +10 -21
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
- package/dist/services/session/session-tool-tracker.js +12 -52
- package/dist/services/session/session-tool-tracker.js.map +1 -1
- package/dist/services/session/terminal-result-collector.d.ts +8 -0
- package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/session/terminal-result-collector.js +18 -4
- package/dist/services/session/terminal-result-collector.js.map +1 -1
- package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts.map +1 -1
- package/dist/services/session/test-helpers/conversation-session-fixtures.js +8 -1
- package/dist/services/session/test-helpers/conversation-session-fixtures.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +2 -2
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.d.ts +4 -2
- package/dist/services/session/turn-attempt.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.js +5 -0
- package/dist/services/session/turn-attempt.js.map +1 -1
- package/dist/services/session/turn-coordinator.d.ts +32 -2
- package/dist/services/session/turn-coordinator.d.ts.map +1 -1
- package/dist/services/session/turn-coordinator.js +180 -9
- package/dist/services/session/turn-coordinator.js.map +1 -1
- package/dist/services/session/turn-status-machine.d.ts +21 -6
- package/dist/services/session/turn-status-machine.d.ts.map +1 -1
- package/dist/services/session/turn-status-machine.js +50 -13
- package/dist/services/session/turn-status-machine.js.map +1 -1
- package/dist/services/session/turn-workflow.d.ts +35 -0
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +373 -27
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/settings/ancillary-settings-migration.js +3 -3
- package/dist/services/settings/ancillary-settings-migration.js.map +1 -1
- package/dist/services/settings/custom-provider-normalization.d.ts +10 -0
- package/dist/services/settings/custom-provider-normalization.d.ts.map +1 -1
- package/dist/services/settings/custom-provider-normalization.js +35 -2
- package/dist/services/settings/custom-provider-normalization.js.map +1 -1
- package/dist/services/settings/settings-env.d.ts +3 -0
- package/dist/services/settings/settings-env.d.ts.map +1 -1
- package/dist/services/settings/settings-env.js +3 -3
- package/dist/services/settings/settings-env.js.map +1 -1
- package/dist/services/settings/settings-merger.d.ts +6 -5
- package/dist/services/settings/settings-merger.d.ts.map +1 -1
- package/dist/services/settings/settings-merger.js +9 -4
- package/dist/services/settings/settings-merger.js.map +1 -1
- package/dist/services/settings/settings-persistence.d.ts +17 -6
- package/dist/services/settings/settings-persistence.d.ts.map +1 -1
- package/dist/services/settings/settings-persistence.js +155 -28
- package/dist/services/settings/settings-persistence.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +100 -4
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +78 -8
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-service.d.ts +34 -5
- package/dist/services/settings/settings-service.d.ts.map +1 -1
- package/dist/services/settings/settings-service.js +200 -8
- package/dist/services/settings/settings-service.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +6 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/shell/background-shell-registry.d.ts +110 -0
- package/dist/services/shell/background-shell-registry.d.ts.map +1 -0
- package/dist/services/shell/background-shell-registry.js +326 -0
- package/dist/services/shell/background-shell-registry.js.map +1 -0
- package/dist/services/shell/shell-interaction-session.d.ts +43 -0
- package/dist/services/shell/shell-interaction-session.d.ts.map +1 -0
- package/dist/services/shell/shell-interaction-session.js +113 -0
- package/dist/services/shell/shell-interaction-session.js.map +1 -0
- package/dist/services/stream-event-processor.d.ts +11 -12
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +115 -352
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/stream-snapshot.d.ts +0 -1
- package/dist/services/stream-snapshot.d.ts.map +1 -1
- package/dist/services/stream-snapshot.js +0 -1
- package/dist/services/stream-snapshot.js.map +1 -1
- package/dist/services/subagents/codename-run-id.d.ts +43 -0
- package/dist/services/subagents/codename-run-id.d.ts.map +1 -0
- package/dist/services/subagents/codename-run-id.js +683 -0
- package/dist/services/subagents/codename-run-id.js.map +1 -0
- package/dist/services/subagents/execution-runner.d.ts +2 -0
- package/dist/services/subagents/execution-runner.d.ts.map +1 -1
- package/dist/services/subagents/execution-runner.js +13 -3
- package/dist/services/subagents/execution-runner.js.map +1 -1
- package/dist/services/subagents/foreground-subagent-lease.d.ts +77 -0
- package/dist/services/subagents/foreground-subagent-lease.d.ts.map +1 -0
- package/dist/services/subagents/foreground-subagent-lease.js +156 -0
- package/dist/services/subagents/foreground-subagent-lease.js.map +1 -0
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
- package/dist/services/subagents/mentor-runner.js +43 -31
- package/dist/services/subagents/mentor-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts +47 -23
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +263 -64
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/role-loader.d.ts +3 -3
- package/dist/services/subagents/role-loader.d.ts.map +1 -1
- package/dist/services/subagents/role-loader.js +6 -7
- package/dist/services/subagents/role-loader.js.map +1 -1
- package/dist/services/subagents/runtime.d.ts +10 -0
- package/dist/services/subagents/runtime.d.ts.map +1 -1
- package/dist/services/subagents/runtime.js +15 -1
- package/dist/services/subagents/runtime.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.d.ts +21 -2
- package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +156 -10
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-client-types.d.ts +2 -0
- package/dist/services/subagents/subagent-client-types.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.d.ts +26 -7
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +31 -1
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +72 -6
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +118 -10
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/subagent-session.d.ts +12 -7
- package/dist/services/subagents/subagent-session.d.ts.map +1 -1
- package/dist/services/subagents/subagent-session.js +13 -14
- package/dist/services/subagents/subagent-session.js.map +1 -1
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts +4 -5
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts.map +1 -1
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js +66 -65
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js.map +1 -1
- package/dist/services/subagents/tool-policy.d.ts +19 -17
- package/dist/services/subagents/tool-policy.d.ts.map +1 -1
- package/dist/services/subagents/tool-policy.js +89 -53
- package/dist/services/subagents/tool-policy.js.map +1 -1
- package/dist/services/subagents/types.d.ts +22 -3
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js +2 -2
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +8 -1
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +43 -16
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/services/test-helpers/mock-stream.d.ts +3 -0
- package/dist/services/test-helpers/mock-stream.d.ts.map +1 -1
- package/dist/services/test-helpers/mock-stream.js +8 -0
- package/dist/services/test-helpers/mock-stream.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts +2 -0
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +59 -81
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/test-helpers/conversation-session-with-adapter.d.ts +1 -1
- package/dist/test-helpers/conversation-session-with-adapter.d.ts.map +1 -1
- package/dist/test-helpers/conversation-session-with-adapter.js +5 -1
- package/dist/test-helpers/conversation-session-with-adapter.js.map +1 -1
- package/dist/test-helpers/ink-testing.d.ts.map +1 -1
- package/dist/test-helpers/ink-testing.js +2 -1
- package/dist/test-helpers/ink-testing.js.map +1 -1
- package/dist/tools/agent/activate-skill.d.ts +6 -1
- package/dist/tools/agent/activate-skill.d.ts.map +1 -1
- package/dist/tools/agent/activate-skill.js.map +1 -1
- package/dist/tools/agent/ask-mentor.d.ts +1 -1
- package/dist/tools/agent/ask-mentor.d.ts.map +1 -1
- package/dist/tools/agent/ask-mentor.js.map +1 -1
- package/dist/tools/agent/ask-orchestrator.d.ts +1 -1
- package/dist/tools/agent/ask-orchestrator.d.ts.map +1 -1
- package/dist/tools/agent/ask-user-constants.d.ts +6 -0
- package/dist/tools/agent/ask-user-constants.d.ts.map +1 -1
- package/dist/tools/agent/ask-user-constants.js +6 -0
- package/dist/tools/agent/ask-user-constants.js.map +1 -1
- package/dist/tools/agent/run-subagent-async.d.ts +6 -6
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent-async.js +16 -52
- package/dist/tools/agent/run-subagent-async.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts +28 -14
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +173 -68
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/file/apply-patch.d.ts +3 -1
- package/dist/tools/file/apply-patch.d.ts.map +1 -1
- package/dist/tools/file/apply-patch.js +34 -10
- package/dist/tools/file/apply-patch.js.map +1 -1
- package/dist/tools/file/code-context.d.ts +2 -2
- package/dist/tools/file/code-context.d.ts.map +1 -1
- package/dist/tools/file/code-context.js +1 -1
- package/dist/tools/file/code-context.js.map +1 -1
- package/dist/tools/file/create-file.d.ts +4 -2
- package/dist/tools/file/create-file.d.ts.map +1 -1
- package/dist/tools/file/create-file.js +10 -7
- package/dist/tools/file/create-file.js.map +1 -1
- package/dist/tools/file/edit-healing.d.ts.map +1 -1
- package/dist/tools/file/edit-healing.js +54 -35
- package/dist/tools/file/edit-healing.js.map +1 -1
- package/dist/tools/file/glob-target.d.ts +12 -0
- package/dist/tools/file/glob-target.d.ts.map +1 -0
- package/dist/tools/file/glob-target.js +22 -0
- package/dist/tools/file/glob-target.js.map +1 -0
- package/dist/tools/file/glob.d.ts +9 -2
- package/dist/tools/file/glob.d.ts.map +1 -1
- package/dist/tools/file/glob.js +12 -16
- package/dist/tools/file/glob.js.map +1 -1
- package/dist/tools/file/grep.d.ts +8 -1
- package/dist/tools/file/grep.d.ts.map +1 -1
- package/dist/tools/file/grep.js +60 -4
- package/dist/tools/file/grep.js.map +1 -1
- package/dist/tools/file/read-file.d.ts +7 -1
- package/dist/tools/file/read-file.d.ts.map +1 -1
- package/dist/tools/file/read-file.js +3 -4
- package/dist/tools/file/read-file.js.map +1 -1
- package/dist/tools/file/search-replace.d.ts +5 -3
- package/dist/tools/file/search-replace.d.ts.map +1 -1
- package/dist/tools/file/search-replace.js +29 -19
- package/dist/tools/file/search-replace.js.map +1 -1
- package/dist/tools/format-helpers.d.ts +4 -3
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +16 -17
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/memory/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory/memory-tools.js +61 -49
- package/dist/tools/memory/memory-tools.js.map +1 -1
- package/dist/tools/run-agent-workflow.d.ts +1 -1
- package/dist/tools/run-agent-workflow.d.ts.map +1 -1
- package/dist/tools/system/shell.d.ts +39 -3
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +380 -149
- package/dist/tools/system/shell.js.map +1 -1
- package/dist/tools/types.d.ts +102 -5
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +4 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/utils.d.ts +18 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +78 -0
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web/web-fetch.d.ts +1 -1
- package/dist/tools/web/web-fetch.d.ts.map +1 -1
- package/dist/tools/web/web-fetch.js.map +1 -1
- package/dist/tools/web/web-search.d.ts +1 -1
- package/dist/tools/web/web-search.d.ts.map +1 -1
- package/dist/tools/web/web-search.js.map +1 -1
- package/dist/types/message.d.ts +2 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/dist/utils/ai/model-settings.d.ts.map +1 -1
- package/dist/utils/ai/model-settings.js +0 -6
- package/dist/utils/ai/model-settings.js.map +1 -1
- package/dist/utils/ai/token-usage.d.ts +10 -5
- package/dist/utils/ai/token-usage.d.ts.map +1 -1
- package/dist/utils/ai/token-usage.js +48 -35
- package/dist/utils/ai/token-usage.js.map +1 -1
- package/dist/utils/apply-diff.d.ts +3 -0
- package/dist/utils/apply-diff.d.ts.map +1 -0
- package/dist/utils/apply-diff.js +192 -0
- package/dist/utils/apply-diff.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +72 -16
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation/conversation-utils.d.ts +5 -0
- package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-utils.js +1 -0
- package/dist/utils/conversation/conversation-utils.js.map +1 -1
- package/dist/utils/conversation/message-utils.d.ts +6 -0
- package/dist/utils/conversation/message-utils.d.ts.map +1 -1
- package/dist/utils/conversation/message-utils.js +17 -14
- package/dist/utils/conversation/message-utils.js.map +1 -1
- package/dist/utils/conversation/rewind-items.d.ts +32 -0
- package/dist/utils/conversation/rewind-items.d.ts.map +1 -0
- package/dist/utils/conversation/rewind-items.js +33 -0
- package/dist/utils/conversation/rewind-items.js.map +1 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts +10 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -1
- package/dist/utils/inject-warning-into-tool-output.js +17 -0
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +41 -4
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/command-logger.js.map +1 -1
- package/dist/utils/shell/command-safety/find-helpers.d.ts +3 -2
- package/dist/utils/shell/command-safety/find-helpers.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/find-helpers.js +34 -17
- package/dist/utils/shell/command-safety/find-helpers.js.map +1 -1
- package/dist/utils/shell/command-safety/handlers/find-handler.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/handlers/find-handler.js +0 -2
- package/dist/utils/shell/command-safety/handlers/find-handler.js.map +1 -1
- package/dist/utils/shell/command-safety/handlers/git-handler.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/handlers/git-handler.js.map +1 -1
- package/dist/utils/shell/command-safety/handlers/sed-handler.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/handlers/sed-handler.js +14 -9
- package/dist/utils/shell/command-safety/handlers/sed-handler.js.map +1 -1
- package/dist/utils/shell/command-safety/handlers/types.d.ts +5 -4
- package/dist/utils/shell/command-safety/handlers/types.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/index.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/index.js +212 -88
- package/dist/utils/shell/command-safety/index.js.map +1 -1
- package/dist/utils/shell/command-safety/utils.d.ts +2 -1
- package/dist/utils/shell/command-safety/utils.d.ts.map +1 -1
- package/dist/utils/shell/command-safety/utils.js +5 -5
- package/dist/utils/shell/command-safety/utils.js.map +1 -1
- package/dist/utils/shell/execute-shell.d.ts +24 -3
- package/dist/utils/shell/execute-shell.d.ts.map +1 -1
- package/dist/utils/shell/execute-shell.js +228 -28
- package/dist/utils/shell/execute-shell.js.map +1 -1
- package/dist/utils/shell/sandbox/denied-read-stores.d.ts +1 -8
- package/dist/utils/shell/sandbox/denied-read-stores.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/denied-read-stores.js +1 -8
- package/dist/utils/shell/sandbox/denied-read-stores.js.map +1 -1
- package/dist/utils/shell/sandbox/docker-host-control-grants.d.ts +36 -6
- package/dist/utils/shell/sandbox/docker-host-control-grants.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/docker-host-control-grants.js +47 -17
- package/dist/utils/shell/sandbox/docker-host-control-grants.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.d.ts +21 -0
- package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.js +66 -0
- package/dist/utils/shell/sandbox/sandbox-network-approval-coordinator.js.map +1 -0
- package/dist/utils/shell/shell-session.js.map +1 -1
- package/dist/utils/slash-command-dispatch.d.ts +21 -0
- package/dist/utils/slash-command-dispatch.d.ts.map +1 -0
- package/dist/utils/slash-command-dispatch.js +34 -0
- package/dist/utils/slash-command-dispatch.js.map +1 -0
- package/dist/utils/streaming/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/streaming/extract-command-messages.js +29 -51
- package/dist/utils/streaming/extract-command-messages.js.map +1 -1
- package/dist/utils/value-suggestions.d.ts.map +1 -1
- package/dist/utils/value-suggestions.js +0 -8
- package/dist/utils/value-suggestions.js.map +1 -1
- package/package.json +21 -19
- package/dist/commands/retry-command.d.ts +0 -20
- package/dist/commands/retry-command.d.ts.map +0 -1
- package/dist/commands/retry-command.js +0 -39
- package/dist/commands/retry-command.js.map +0 -1
- package/dist/commands/undo-command.d.ts +0 -15
- package/dist/commands/undo-command.d.ts.map +0 -1
- package/dist/commands/undo-command.js +0 -28
- package/dist/commands/undo-command.js.map +0 -1
- package/dist/components/input/PopupManager.d.ts +0 -88
- package/dist/components/input/PopupManager.d.ts.map +0 -1
- package/dist/components/input/PopupManager.js +0 -21
- package/dist/components/input/PopupManager.js.map +0 -1
- package/dist/components/input/popup-key-navigation.d.ts +0 -18
- package/dist/components/input/popup-key-navigation.d.ts.map +0 -1
- package/dist/components/input/popup-key-navigation.js +0 -16
- package/dist/components/input/popup-key-navigation.js.map +0 -1
- package/dist/components/input/popup-props.d.ts +0 -24
- package/dist/components/input/popup-props.d.ts.map +0 -1
- package/dist/components/input/popup-props.js +0 -72
- package/dist/components/input/popup-props.js.map +0 -1
- package/dist/components/menu/UndoSelectionMenu.d.ts +0 -12
- package/dist/components/menu/UndoSelectionMenu.d.ts.map +0 -1
- package/dist/components/menu/UndoSelectionMenu.js +0 -19
- package/dist/components/menu/UndoSelectionMenu.js.map +0 -1
- package/dist/hooks/use-mode-handlers.d.ts +0 -79
- package/dist/hooks/use-mode-handlers.d.ts.map +0 -1
- package/dist/hooks/use-mode-handlers.js +0 -183
- package/dist/hooks/use-mode-handlers.js.map +0 -1
- package/dist/hooks/use-pending-turn-guards.d.ts +0 -43
- package/dist/hooks/use-pending-turn-guards.d.ts.map +0 -1
- package/dist/hooks/use-pending-turn-guards.js +0 -120
- package/dist/hooks/use-pending-turn-guards.js.map +0 -1
- package/dist/hooks/use-trigger-detection.d.ts +0 -49
- package/dist/hooks/use-trigger-detection.d.ts.map +0 -1
- package/dist/hooks/use-trigger-detection.js +0 -104
- package/dist/hooks/use-trigger-detection.js.map +0 -1
- package/dist/hooks/use-undo-selection.d.ts +0 -23
- package/dist/hooks/use-undo-selection.d.ts.map +0 -1
- package/dist/hooks/use-undo-selection.js.map +0 -1
- package/dist/lib/agent-run-orchestrator.d.ts +0 -38
- package/dist/lib/agent-run-orchestrator.d.ts.map +0 -1
- package/dist/lib/agent-run-orchestrator.js +0 -266
- package/dist/lib/agent-run-orchestrator.js.map +0 -1
- package/dist/lib/retry-executor.d.ts +0 -16
- package/dist/lib/retry-executor.d.ts.map +0 -1
- package/dist/lib/retry-executor.js +0 -53
- package/dist/lib/retry-executor.js.map +0 -1
- package/dist/lib/runner-manager.d.ts +0 -22
- package/dist/lib/runner-manager.d.ts.map +0 -1
- package/dist/lib/runner-manager.js +0 -56
- package/dist/lib/runner-manager.js.map +0 -1
- package/dist/prompts/shell-sandbox.md +0 -18
- package/dist/prompts/simple.md +0 -53
- package/dist/prompts/simple_prev.md +0 -33
- package/dist/prompts/simple_v2.md +0 -84
- package/dist/prompts/simple_v3.md +0 -267
- package/dist/prompts/subagents/researcher.md +0 -46
- package/dist/providers/ai-sdk-agents-adapter.d.ts +0 -7
- package/dist/providers/ai-sdk-agents-adapter.d.ts.map +0 -1
- package/dist/providers/ai-sdk-agents-adapter.js +0 -80
- package/dist/providers/ai-sdk-agents-adapter.js.map +0 -1
- package/dist/providers/fallback-responses-model.d.ts +0 -46
- package/dist/providers/fallback-responses-model.d.ts.map +0 -1
- package/dist/providers/fallback-responses-model.js +0 -296
- package/dist/providers/fallback-responses-model.js.map +0 -1
- package/dist/services/stream-event-parsing.d.ts +0 -4
- package/dist/services/stream-event-parsing.d.ts.map +0 -1
- package/dist/services/stream-event-parsing.js +0 -79
- package/dist/services/stream-event-parsing.js.map +0 -1
|
@@ -0,0 +1,1236 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createContinuationHandle, unwrapContinuationHandle, } from '../../contracts/continuation-handle.js';
|
|
3
|
+
import { createAgentStream } from '../agent-stream.js';
|
|
4
|
+
import { isZodToolParameterSchema } from '../../tools/types.js';
|
|
5
|
+
import { normalizeToolParameters } from '../../lib/tool-invoke.js';
|
|
6
|
+
import { isCancellationError, isHarnessInvariantError } from '../../lib/harness-invariant-error.js';
|
|
7
|
+
import { ApprovalLedger } from './tool-invocation-context.js';
|
|
8
|
+
import { addTokenUsage, normalizeUsage } from '../../utils/ai/token-usage.js';
|
|
9
|
+
import { computeModelCost } from '../../services/cost/model-cost.js';
|
|
10
|
+
import { getCatalogPricingVersion, getModelPricing } from '../../services/cost/pricing.js';
|
|
11
|
+
import { GenerationDeadline, GenerationGuard, GenerationGuardError, } from './generation-guard.js';
|
|
12
|
+
/**
|
|
13
|
+
* Raised when a run exceeds its `maxTurns` budget. The loop owns turn counting
|
|
14
|
+
* — the SDK-era `callModelInputFilter` hook is deliberately not reintroduced.
|
|
15
|
+
*/
|
|
16
|
+
export class MaxTurnsExceededError extends Error {
|
|
17
|
+
maxTurns;
|
|
18
|
+
constructor(maxTurns) {
|
|
19
|
+
super(`Max turns (${maxTurns}) exceeded`);
|
|
20
|
+
this.name = 'MaxTurnsExceededError';
|
|
21
|
+
this.maxTurns = maxTurns;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
class EventQueue {
|
|
25
|
+
#items = [];
|
|
26
|
+
#waiters = [];
|
|
27
|
+
#closed = false;
|
|
28
|
+
#failure;
|
|
29
|
+
push(item) {
|
|
30
|
+
const waiter = this.#waiters.shift();
|
|
31
|
+
if (waiter)
|
|
32
|
+
waiter.resolve({ done: false, value: item });
|
|
33
|
+
else
|
|
34
|
+
this.#items.push(item);
|
|
35
|
+
}
|
|
36
|
+
close(error) {
|
|
37
|
+
this.#closed = true;
|
|
38
|
+
this.#failure = error;
|
|
39
|
+
for (const waiter of this.#waiters.splice(0)) {
|
|
40
|
+
if (error)
|
|
41
|
+
waiter.reject(error);
|
|
42
|
+
else
|
|
43
|
+
waiter.resolve({ done: true, value: undefined });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
next() {
|
|
47
|
+
const item = this.#items.shift();
|
|
48
|
+
if (item !== undefined)
|
|
49
|
+
return Promise.resolve({ done: false, value: item });
|
|
50
|
+
if (this.#closed) {
|
|
51
|
+
if (this.#failure)
|
|
52
|
+
return Promise.reject(this.#failure);
|
|
53
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
54
|
+
}
|
|
55
|
+
return new Promise((resolve, reject) => this.#waiters.push({ resolve, reject }));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Small provider-neutral agent loop. It owns model-turn sequencing and tool
|
|
60
|
+
* execution; providers only implement `StreamedModelTurn`.
|
|
61
|
+
*/
|
|
62
|
+
export class ApplicationRunLoop {
|
|
63
|
+
#deps;
|
|
64
|
+
#contextCompactionSessionState;
|
|
65
|
+
#activeAbortController = null;
|
|
66
|
+
#runInFlight = false;
|
|
67
|
+
/**
|
|
68
|
+
* Set when a segment ends holding approvals, meaning the turn is pausing
|
|
69
|
+
* rather than finishing. Injections offered during the pause wait here for
|
|
70
|
+
* the continuation segment instead of being refused for want of a run.
|
|
71
|
+
*/
|
|
72
|
+
#turnPaused = false;
|
|
73
|
+
/**
|
|
74
|
+
* Set while a caller that owns turn boundaries has a turn open, from before
|
|
75
|
+
* its first request is built until after its last one settles.
|
|
76
|
+
*
|
|
77
|
+
* `#runInFlight` and `#turnPaused` only ever describe a *segment*, so between
|
|
78
|
+
* them they leave every gap in a turn where no run exists yet: the startup
|
|
79
|
+
* before the first request (provider model discovery, hooks, input
|
|
80
|
+
* preparation) and the backoff before a retry restarts the stream. A turn is
|
|
81
|
+
* steerable across those gaps, and only the caller that opened the turn knows
|
|
82
|
+
* they belong to it.
|
|
83
|
+
*/
|
|
84
|
+
#turnOpen = false;
|
|
85
|
+
#pendingSteers = [];
|
|
86
|
+
constructor(deps) {
|
|
87
|
+
this.#deps = deps;
|
|
88
|
+
this.#contextCompactionSessionState = deps.contextCompactionSessionState ?? { disabled: false };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Declare a turn open, making it steerable before its first run exists.
|
|
92
|
+
*
|
|
93
|
+
* Anything still waiting belongs to a turn that never closed, and can never
|
|
94
|
+
* be admitted now.
|
|
95
|
+
*/
|
|
96
|
+
openTurn() {
|
|
97
|
+
this.#releasePendingSteers({ reason: 'superseded_by_new_turn' });
|
|
98
|
+
this.#turnOpen = true;
|
|
99
|
+
this.#turnPaused = false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Declare the turn over. Whatever is still waiting had no boundary left, so
|
|
103
|
+
* it is handed back for the caller to send as its own turn.
|
|
104
|
+
*/
|
|
105
|
+
closeTurn() {
|
|
106
|
+
this.#turnOpen = false;
|
|
107
|
+
this.#turnPaused = false;
|
|
108
|
+
this.#releasePendingSteers({ reason: 'turn_closed' });
|
|
109
|
+
}
|
|
110
|
+
abort() {
|
|
111
|
+
this.abortSegment();
|
|
112
|
+
// An aborted turn will not resume, so nothing may keep waiting on it.
|
|
113
|
+
this.#turnOpen = false;
|
|
114
|
+
this.#turnPaused = false;
|
|
115
|
+
this.#releasePendingSteers({ reason: 'aborted' });
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stop the segment currently streaming without judging the turn's fate.
|
|
119
|
+
*
|
|
120
|
+
* Resuming a paused turn goes through here, so waiting injections survive;
|
|
121
|
+
* only `abort`, which means the turn itself is over, discards them.
|
|
122
|
+
*/
|
|
123
|
+
abortSegment() {
|
|
124
|
+
this.#activeAbortController?.abort();
|
|
125
|
+
this.#activeAbortController = null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Hand the running turn a user message to send with its next model request.
|
|
129
|
+
*
|
|
130
|
+
* The loop admits it at a request boundary — after the tool results of the
|
|
131
|
+
* current round are in history and before the next request is built — so the
|
|
132
|
+
* model reads it in sequence without the turn being interrupted. Nothing is
|
|
133
|
+
* cancelled, and a tool already running is untouched.
|
|
134
|
+
*
|
|
135
|
+
* The wait spans the whole turn, not just the segment it was offered to: a
|
|
136
|
+
* turn that pauses for an approval resumes as a new segment, and the message
|
|
137
|
+
* is admitted at that segment's first boundary. A caller that declares its
|
|
138
|
+
* turn boundaries with `openTurn`/`closeTurn` extends the wait further still,
|
|
139
|
+
* to the gaps where no segment exists at all — before the first request, and
|
|
140
|
+
* across a retry that restarts the stream.
|
|
141
|
+
*
|
|
142
|
+
* Resolves `'admitted'` once the message has been admitted, `'released'`
|
|
143
|
+
* when the turn ends first (or none is running) — it offered no further
|
|
144
|
+
* request boundary, so the caller must send the message as its own turn
|
|
145
|
+
* instead — and `'retracted'` when `retractSteer` pulled it out first.
|
|
146
|
+
*
|
|
147
|
+
* `options.id` correlates this steer with `retractSteer`/`editSteer`. A
|
|
148
|
+
* steer offered without an id can never be retracted or edited in place —
|
|
149
|
+
* only released or admitted.
|
|
150
|
+
*/
|
|
151
|
+
steer(items, options) {
|
|
152
|
+
if (items.length === 0)
|
|
153
|
+
return Promise.resolve('released');
|
|
154
|
+
if (!this.#turnOpen && !this.#runInFlight && !this.#turnPaused)
|
|
155
|
+
return Promise.resolve('released');
|
|
156
|
+
return new Promise((resolve) => {
|
|
157
|
+
this.#pendingSteers.push({ id: options?.id, items, resolve });
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Drop a still-waiting steer before it reaches a request boundary. Returns
|
|
162
|
+
* `false` when the id is unknown, including when it was already admitted.
|
|
163
|
+
*
|
|
164
|
+
* Invariant: this and `#admitPendingSteers` are both synchronous, and the
|
|
165
|
+
* latter drains `#pendingSteers` in a single pass — so the two can never
|
|
166
|
+
* interleave. A retraction is decided in the same tick against whatever is
|
|
167
|
+
* currently in `#pendingSteers`; once an item has been admitted it is no
|
|
168
|
+
* longer in that array for this method to find. No locking is needed to
|
|
169
|
+
* close the race between "the user retracts" and "the turn admits".
|
|
170
|
+
*/
|
|
171
|
+
retractSteer(id) {
|
|
172
|
+
const index = this.#pendingSteers.findIndex((steer) => steer.id === id);
|
|
173
|
+
if (index < 0)
|
|
174
|
+
return false;
|
|
175
|
+
const [steer] = this.#pendingSteers.splice(index, 1);
|
|
176
|
+
steer.resolve('retracted');
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Replace a waiting steer's items in place, keeping its position (and thus
|
|
181
|
+
* its priority relative to other pending steers) and its id. Returns
|
|
182
|
+
* `false` when the id is unknown, including when it was already admitted —
|
|
183
|
+
* same synchronicity invariant as `retractSteer`.
|
|
184
|
+
*/
|
|
185
|
+
editSteer(id, items) {
|
|
186
|
+
const index = this.#pendingSteers.findIndex((steer) => steer.id === id);
|
|
187
|
+
if (index < 0)
|
|
188
|
+
return false;
|
|
189
|
+
this.#pendingSteers[index] = { ...this.#pendingSteers[index], items };
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
/** Settle every steer this run did not admit so callers stop waiting on it. */
|
|
193
|
+
#releasePendingSteers(reason = {}) {
|
|
194
|
+
const pending = this.#pendingSteers;
|
|
195
|
+
this.#pendingSteers = [];
|
|
196
|
+
if (pending.length > 0) {
|
|
197
|
+
this.#deps.logDiagnostic?.('Steer released at run end', { released: pending.length, ...reason });
|
|
198
|
+
}
|
|
199
|
+
for (const steer of pending)
|
|
200
|
+
steer.resolve('released');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Append waiting steers to the turn as ordinary user messages.
|
|
204
|
+
*
|
|
205
|
+
* They enter history and model input exactly as a user turn does — never
|
|
206
|
+
* folded into a tool result — so the provider sees the user speaking after
|
|
207
|
+
* the tool results of the round that was in flight when they typed.
|
|
208
|
+
*/
|
|
209
|
+
#admitPendingSteers(state, stream, queue) {
|
|
210
|
+
if (this.#pendingSteers.length === 0)
|
|
211
|
+
return;
|
|
212
|
+
const admitted = this.#pendingSteers;
|
|
213
|
+
this.#pendingSteers = [];
|
|
214
|
+
this.#deps.logDiagnostic?.('Steer admitted at request boundary', {
|
|
215
|
+
admitted: admitted.length,
|
|
216
|
+
turnCount: state.turnCount,
|
|
217
|
+
});
|
|
218
|
+
for (const steer of admitted) {
|
|
219
|
+
for (const item of steer.items) {
|
|
220
|
+
state.history.push(item);
|
|
221
|
+
state.input.push(...normalizeApplicationInput([item]));
|
|
222
|
+
outputPush(stream, queue, { type: 'item', item });
|
|
223
|
+
}
|
|
224
|
+
steer.resolve('admitted');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
startStream(agent, input, options = {}) {
|
|
228
|
+
// Without a declared turn scope, a fresh stream is the only evidence this
|
|
229
|
+
// loop gets that a new turn has begun: anything still waiting belonged to
|
|
230
|
+
// the previous one and must not leak into work the user did not aim it at.
|
|
231
|
+
// With one, this call may equally be the same turn restarting after a
|
|
232
|
+
// retry, which the loop cannot tell apart — so `openTurn`/`closeTurn` own
|
|
233
|
+
// the decision instead.
|
|
234
|
+
this.#turnPaused = false;
|
|
235
|
+
if (!this.#turnOpen)
|
|
236
|
+
this.#releasePendingSteers({ reason: 'superseded_by_new_turn' });
|
|
237
|
+
const state = {
|
|
238
|
+
agent,
|
|
239
|
+
input: normalizeInput(input),
|
|
240
|
+
history: normalizeHistory(input),
|
|
241
|
+
// A response ID is usable only after its provider origin is recorded.
|
|
242
|
+
// This also makes old callers that omit providerId fail closed.
|
|
243
|
+
responseId: options.providerId && options.supportsConversationChaining === true
|
|
244
|
+
? options.previousResponseId ?? undefined
|
|
245
|
+
: undefined,
|
|
246
|
+
pendingApprovals: [],
|
|
247
|
+
supportsConversationChaining: options.supportsConversationChaining === true,
|
|
248
|
+
currentProviderId: options.providerId,
|
|
249
|
+
responseProviderId: options.providerId && options.supportsConversationChaining === true && options.previousResponseId
|
|
250
|
+
? options.providerId
|
|
251
|
+
: undefined,
|
|
252
|
+
requestPreparation: options.requestPreparation,
|
|
253
|
+
sessionId: options.sessionId,
|
|
254
|
+
turnId: options.turnId,
|
|
255
|
+
hookScope: options.hookScope,
|
|
256
|
+
context: options.context,
|
|
257
|
+
approvals: options.approvals ?? new ApprovalLedger(),
|
|
258
|
+
turnCount: 0,
|
|
259
|
+
maxTurns: options.maxTurns,
|
|
260
|
+
};
|
|
261
|
+
state.approve = (interruption) => {
|
|
262
|
+
state.approvalDecision = 'approved';
|
|
263
|
+
state.approvalDecisionCallId = getInterruptionCallId(interruption);
|
|
264
|
+
};
|
|
265
|
+
state.reject = (interruption, approvalOptions) => {
|
|
266
|
+
state.approvalDecision = 'rejected';
|
|
267
|
+
state.approvalDecisionCallId = getInterruptionCallId(interruption);
|
|
268
|
+
state.approvalMessage = approvalOptions?.message;
|
|
269
|
+
};
|
|
270
|
+
return this.#run(state, options);
|
|
271
|
+
}
|
|
272
|
+
continueRunStream(handle, options = {}) {
|
|
273
|
+
const state = unwrapContinuationHandle(handle);
|
|
274
|
+
if (!state || typeof state !== 'object' || !('agent' in state) || !('input' in state)) {
|
|
275
|
+
throw new Error('Invalid application continuation state');
|
|
276
|
+
}
|
|
277
|
+
// Handles created before the ledger existed cannot resume meaningfully;
|
|
278
|
+
// give them a fresh ledger rather than crashing on `approvals` access.
|
|
279
|
+
if (!state.approvals)
|
|
280
|
+
state.approvals = new ApprovalLedger();
|
|
281
|
+
// A continuation handle from before approval batching carried only the
|
|
282
|
+
// current pending item. Normalize it into the queue used by current runs.
|
|
283
|
+
if (!state.pendingApprovals)
|
|
284
|
+
state.pendingApprovals = state.pendingApproval ? [state.pendingApproval] : [];
|
|
285
|
+
if (!state.pendingApproval && state.pendingApprovals.length > 0) {
|
|
286
|
+
state.pendingApproval = state.pendingApprovals[0];
|
|
287
|
+
}
|
|
288
|
+
// Handles created before cost accounting existed have no record list.
|
|
289
|
+
if (!state.costRecords)
|
|
290
|
+
state.costRecords = [];
|
|
291
|
+
// Response IDs are provider-owned. A handle from before provenance was
|
|
292
|
+
// recorded, a missing providerId, or a provider switch must never forward
|
|
293
|
+
// its opaque ID. In particular, do not use previousResponseId as a
|
|
294
|
+
// compatibility fallback here: its origin cannot be proven.
|
|
295
|
+
const previousProviderId = state.currentProviderId;
|
|
296
|
+
const sameProvider = typeof previousProviderId === 'string' &&
|
|
297
|
+
typeof options.providerId === 'string' &&
|
|
298
|
+
previousProviderId === options.providerId;
|
|
299
|
+
if (!sameProvider || options.supportsConversationChaining !== true) {
|
|
300
|
+
state.responseId = undefined;
|
|
301
|
+
state.responseProviderId = undefined;
|
|
302
|
+
}
|
|
303
|
+
else if (options.previousResponseId) {
|
|
304
|
+
// A same-provider caller may supply a refreshed continuity anchor (for
|
|
305
|
+
// example after persisted-session recovery). Its origin is now proven
|
|
306
|
+
// by the provider identity carried in this continuation state.
|
|
307
|
+
state.responseId = options.previousResponseId;
|
|
308
|
+
state.responseProviderId = options.providerId;
|
|
309
|
+
}
|
|
310
|
+
state.currentProviderId = options.providerId;
|
|
311
|
+
// The turn budget belongs to the run, so a resumed run keeps spending the
|
|
312
|
+
// same one rather than starting over after every approval pause.
|
|
313
|
+
if (typeof state.turnCount !== 'number')
|
|
314
|
+
state.turnCount = 0;
|
|
315
|
+
if (state.maxTurns === undefined)
|
|
316
|
+
state.maxTurns = options.maxTurns;
|
|
317
|
+
if (typeof state.supportsConversationChaining !== 'boolean') {
|
|
318
|
+
state.supportsConversationChaining = options.supportsConversationChaining === true;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
// AgentClient supplies the current provider capability on every resume.
|
|
322
|
+
state.supportsConversationChaining = options.supportsConversationChaining === true;
|
|
323
|
+
}
|
|
324
|
+
// A continuation receives a fresh immutable snapshot from the session;
|
|
325
|
+
// refresh the preparation closure when supplied, while preserving the
|
|
326
|
+
// root closure for callers that do not provide one again.
|
|
327
|
+
if (options.requestPreparation)
|
|
328
|
+
state.requestPreparation = options.requestPreparation;
|
|
329
|
+
if (options.sessionId !== undefined)
|
|
330
|
+
state.sessionId = options.sessionId;
|
|
331
|
+
if (options.turnId !== undefined)
|
|
332
|
+
state.turnId = options.turnId;
|
|
333
|
+
if (options.hookScope !== undefined)
|
|
334
|
+
state.hookScope = options.hookScope;
|
|
335
|
+
return this.#run(state, options);
|
|
336
|
+
}
|
|
337
|
+
#run(state, options) {
|
|
338
|
+
const queue = new EventQueue();
|
|
339
|
+
this.abortSegment();
|
|
340
|
+
const controller = new AbortController();
|
|
341
|
+
this.#activeAbortController = controller;
|
|
342
|
+
this.#runInFlight = true;
|
|
343
|
+
// This segment is running, so the turn is no longer paused between them.
|
|
344
|
+
this.#turnPaused = false;
|
|
345
|
+
if (options.signal) {
|
|
346
|
+
if (options.signal.aborted)
|
|
347
|
+
controller.abort();
|
|
348
|
+
else
|
|
349
|
+
options.signal.addEventListener('abort', () => controller.abort(), { once: true });
|
|
350
|
+
}
|
|
351
|
+
const effectiveOptions = { ...options, signal: controller.signal };
|
|
352
|
+
const toolContext = {
|
|
353
|
+
context: state.context,
|
|
354
|
+
approvals: state.approvals,
|
|
355
|
+
signal: effectiveOptions.signal,
|
|
356
|
+
// A getter, not a snapshot: the context object outlives every turn, and
|
|
357
|
+
// tools read it while deciding whether to warn about the turn budget.
|
|
358
|
+
get turn() {
|
|
359
|
+
return { count: state.turnCount, max: state.maxTurns };
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
const output = [];
|
|
363
|
+
const stream = createAgentStream({
|
|
364
|
+
[Symbol.asyncIterator]: () => ({ next: () => queue.next() }),
|
|
365
|
+
completed: Promise.resolve(undefined),
|
|
366
|
+
history: state.history,
|
|
367
|
+
newItems: output,
|
|
368
|
+
output,
|
|
369
|
+
finalOutput: undefined,
|
|
370
|
+
lastResponseId: state.responseId ?? null,
|
|
371
|
+
interruptions: [],
|
|
372
|
+
state: createContinuationHandle(state),
|
|
373
|
+
rawResponses: [],
|
|
374
|
+
get runUsage() {
|
|
375
|
+
return state.usage;
|
|
376
|
+
},
|
|
377
|
+
get runCostRecords() {
|
|
378
|
+
return state.costRecords ?? [];
|
|
379
|
+
},
|
|
380
|
+
});
|
|
381
|
+
let exitError;
|
|
382
|
+
stream.completed = this.#execute(state, stream, queue, effectiveOptions, toolContext, controller)
|
|
383
|
+
.catch((error) => {
|
|
384
|
+
exitError = error;
|
|
385
|
+
stream.cancelled = error instanceof Error && error.name === 'AbortError';
|
|
386
|
+
queue.close(error);
|
|
387
|
+
throw error;
|
|
388
|
+
})
|
|
389
|
+
.finally(() => {
|
|
390
|
+
if (this.#activeAbortController === controller)
|
|
391
|
+
this.#activeAbortController = null;
|
|
392
|
+
this.#runInFlight = false;
|
|
393
|
+
// A segment that ends holding approvals has paused the turn, not ended
|
|
394
|
+
// it: the caller resumes through continueRunStream, which offers
|
|
395
|
+
// another request boundary. Injections wait for it. Only a segment
|
|
396
|
+
// that ends with nothing outstanding has truly finished the turn, and
|
|
397
|
+
// then anything still waiting has to be sent as its own turn instead.
|
|
398
|
+
const pendingApprovals = state.pendingApprovals?.length ?? 0;
|
|
399
|
+
const cancelled = stream.cancelled === true;
|
|
400
|
+
this.#turnPaused = pendingApprovals > 0 && !cancelled && exitError === undefined;
|
|
401
|
+
if (this.#turnPaused)
|
|
402
|
+
return;
|
|
403
|
+
// A declared turn outlives its segments — this one may be about to be
|
|
404
|
+
// retried, or resumed past a post-execute gate. Its owner says when it
|
|
405
|
+
// is over.
|
|
406
|
+
if (this.#turnOpen)
|
|
407
|
+
return;
|
|
408
|
+
this.#releasePendingSteers({
|
|
409
|
+
pendingApprovals,
|
|
410
|
+
cancelled,
|
|
411
|
+
error: exitError instanceof Error ? exitError.name : exitError ? String(exitError) : undefined,
|
|
412
|
+
turnCount: state.turnCount,
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
return stream;
|
|
416
|
+
}
|
|
417
|
+
async #execute(state, stream, queue, options, toolContext, requestAbortController) {
|
|
418
|
+
while (true) {
|
|
419
|
+
if (options.signal?.aborted)
|
|
420
|
+
throw Object.assign(new Error('Operation aborted'), { name: 'AbortError' });
|
|
421
|
+
state.pendingApprovals ??= state.pendingApproval ? [state.pendingApproval] : [];
|
|
422
|
+
if (state.pendingApprovals.length > 0 && state.approvalDecision) {
|
|
423
|
+
const selectedIndex = state.approvalDecisionCallId
|
|
424
|
+
? state.pendingApprovals.findIndex((pending) => getInterruptionCallId(pending.interruption) === state.approvalDecisionCallId)
|
|
425
|
+
: -1;
|
|
426
|
+
if (state.approvalDecisionCallId && selectedIndex < 0) {
|
|
427
|
+
throw new Error(`Approval decision references unknown pending tool call: ${state.approvalDecisionCallId}`);
|
|
428
|
+
}
|
|
429
|
+
const pendingIndex = selectedIndex >= 0 ? selectedIndex : 0;
|
|
430
|
+
const pending = state.pendingApprovals[pendingIndex];
|
|
431
|
+
const approved = state.approvalDecision === 'approved';
|
|
432
|
+
if (approved) {
|
|
433
|
+
state.approvals.approveTool({ toolName: pending.toolName, callId: pending.callId });
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
state.approvals.rejectTool({ toolName: pending.toolName, callId: pending.callId }, { message: state.approvalMessage });
|
|
437
|
+
}
|
|
438
|
+
const rawResult = approved
|
|
439
|
+
? await this.#invokeTool(pending.definition, pending.params, toolContext, pending.callId, state)
|
|
440
|
+
: state.approvalMessage ?? 'rejected';
|
|
441
|
+
const result = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
|
|
442
|
+
const resultItem = {
|
|
443
|
+
type: 'function_call_result',
|
|
444
|
+
callId: pending.callId,
|
|
445
|
+
name: pending.toolName,
|
|
446
|
+
output: result,
|
|
447
|
+
};
|
|
448
|
+
state.history.push(resultItem);
|
|
449
|
+
state.input.push({ type: 'tool_result', id: pending.callId, output: result });
|
|
450
|
+
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
451
|
+
state.pendingApprovals.splice(pendingIndex, 1);
|
|
452
|
+
state.pendingApproval = state.pendingApprovals[0];
|
|
453
|
+
state.approvalDecision = undefined;
|
|
454
|
+
state.approvalDecisionCallId = undefined;
|
|
455
|
+
state.approvalMessage = undefined;
|
|
456
|
+
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
457
|
+
if (state.pendingApprovals.length > 0)
|
|
458
|
+
return finish(stream, state, queue);
|
|
459
|
+
// Nothing is outstanding, so this segment is terminal — see
|
|
460
|
+
// `stopAfterApprovalResolution`. Stopping here rather than at the
|
|
461
|
+
// request boundary below is what keeps the just-recorded tool result
|
|
462
|
+
// in the committed history.
|
|
463
|
+
if (options.stopAfterApprovalResolution)
|
|
464
|
+
return finish(stream, state, queue);
|
|
465
|
+
}
|
|
466
|
+
// The request boundary: every tool result of the previous round is in
|
|
467
|
+
// history, and the next request has not been built. A user message
|
|
468
|
+
// admitted here reaches the model in sequence, mid-turn.
|
|
469
|
+
this.#admitPendingSteers(state, stream, queue);
|
|
470
|
+
state.turnCount += 1;
|
|
471
|
+
if (state.maxTurns !== undefined && state.turnCount > state.maxTurns) {
|
|
472
|
+
throw new MaxTurnsExceededError(state.maxTurns);
|
|
473
|
+
}
|
|
474
|
+
const model = await this.#deps.resolveModel(state.agent.model);
|
|
475
|
+
let sawToolCall = false;
|
|
476
|
+
let completion;
|
|
477
|
+
let pendingNativeReasoning;
|
|
478
|
+
// Stable run-local request id, allocated immediately before dispatch so a
|
|
479
|
+
// cost record can be settled exactly once (success or failure).
|
|
480
|
+
const requestId = this.#nextRequestId(state);
|
|
481
|
+
const request = {
|
|
482
|
+
instructions: state.agent.instructions,
|
|
483
|
+
...(state.supportsConversationChaining &&
|
|
484
|
+
state.responseId &&
|
|
485
|
+
state.responseProviderId !== undefined &&
|
|
486
|
+
state.responseProviderId === state.currentProviderId
|
|
487
|
+
? { previousResponseId: state.responseId }
|
|
488
|
+
: {}),
|
|
489
|
+
input: state.input,
|
|
490
|
+
tools: toModelTools(state.agent.tools),
|
|
491
|
+
applicationTools: state.agent.tools,
|
|
492
|
+
...(state.agent.modelSettings?.temperature !== undefined
|
|
493
|
+
? { temperature: state.agent.modelSettings.temperature }
|
|
494
|
+
: {}),
|
|
495
|
+
...(state.agent.modelSettings?.reasoning ? { reasoning: state.agent.modelSettings.reasoning } : {}),
|
|
496
|
+
...(state.agent.modelSettings?.maxTokens !== undefined
|
|
497
|
+
? { maxTokens: state.agent.modelSettings.maxTokens }
|
|
498
|
+
: {}),
|
|
499
|
+
...(state.agent.outputType !== undefined ? { outputType: state.agent.outputType } : {}),
|
|
500
|
+
...(state.agent.modelSettings?.codex ? { codex: state.agent.modelSettings.codex } : {}),
|
|
501
|
+
...(state.agent.modelSettings?.providerData
|
|
502
|
+
? {
|
|
503
|
+
providerOptions: this.#contextCompactionSessionState.disabled
|
|
504
|
+
? Object.fromEntries(Object.entries(state.agent.modelSettings.providerData).filter(([key]) => key !== 'contextCompaction'))
|
|
505
|
+
: state.agent.modelSettings.providerData,
|
|
506
|
+
}
|
|
507
|
+
: {}),
|
|
508
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
509
|
+
};
|
|
510
|
+
const generationGuard = new GenerationGuard({
|
|
511
|
+
maxOutputCharacters: state.agent.modelSettings?.maxStreamOutputChars,
|
|
512
|
+
maxTextCharacters: state.agent.modelSettings?.maxStreamOutputChars,
|
|
513
|
+
maxReasoningCharacters: state.agent.modelSettings?.maxStreamOutputChars,
|
|
514
|
+
maxToolArgumentCharacters: state.agent.modelSettings?.maxStreamOutputChars,
|
|
515
|
+
maxCumulativeToolArgumentCharacters: state.agent.modelSettings?.maxStreamOutputChars,
|
|
516
|
+
requestDeadlineMs: state.agent.modelSettings?.maxModelRequestDurationMs,
|
|
517
|
+
...options.generationGuard,
|
|
518
|
+
});
|
|
519
|
+
const consume = async () => {
|
|
520
|
+
const deadline = new GenerationDeadline(generationGuard.requestDeadlineMs, () => requestAbortController.abort());
|
|
521
|
+
let iterator;
|
|
522
|
+
let iteratorFinished = false;
|
|
523
|
+
try {
|
|
524
|
+
iterator = model.stream(request)[Symbol.asyncIterator]();
|
|
525
|
+
while (true) {
|
|
526
|
+
const next = await deadline.wait(iterator.next());
|
|
527
|
+
if (next.done) {
|
|
528
|
+
iteratorFinished = true;
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
const event = next.value;
|
|
532
|
+
if (event.type === 'completion') {
|
|
533
|
+
generationGuard.observeCompletion(event.output);
|
|
534
|
+
completion = event;
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
if (event.type === 'text_delta') {
|
|
538
|
+
generationGuard.observeText(event.text);
|
|
539
|
+
outputPush(stream, queue, { type: 'text_delta', text: event.text });
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
if (event.type === 'codex_rate_limits') {
|
|
543
|
+
outputPush(stream, queue, { type: 'codex_rate_limits', rateLimits: event.rateLimits });
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
if (event.type === 'reasoning_delta') {
|
|
547
|
+
generationGuard.observeReasoning(event.text);
|
|
548
|
+
pendingNativeReasoning = appendNativeReasoning(pendingNativeReasoning, event);
|
|
549
|
+
outputPush(stream, queue, { type: 'reasoning_delta', text: event.text });
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
if (event.type === 'tool_call_streaming_delta') {
|
|
553
|
+
generationGuard.observeToolArgumentProgress(event.argumentCharCount);
|
|
554
|
+
outputPush(stream, queue, event);
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
if (event.type === 'context_compaction_started' || event.type === 'context_compaction_completed') {
|
|
558
|
+
outputPush(stream, queue, event);
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
if (event.type === 'tool_call') {
|
|
562
|
+
generationGuard.observeToolCall(event.arguments);
|
|
563
|
+
pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
|
|
564
|
+
sawToolCall = true;
|
|
565
|
+
await this.#handleToolCall(state, stream, queue, event, toolContext);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
finally {
|
|
570
|
+
deadline.dispose();
|
|
571
|
+
if (iterator && !iteratorFinished)
|
|
572
|
+
void iterator.return?.().catch(() => undefined);
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
const dispatch = async () => {
|
|
576
|
+
state.requestPreparation?.prepare(request);
|
|
577
|
+
await consume();
|
|
578
|
+
};
|
|
579
|
+
try {
|
|
580
|
+
if (state.requestPreparation)
|
|
581
|
+
await state.requestPreparation.run(dispatch);
|
|
582
|
+
else
|
|
583
|
+
await dispatch();
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
if (error instanceof GenerationGuardError)
|
|
587
|
+
requestAbortController.abort();
|
|
588
|
+
// Dispatch began, but no terminal completion was accepted. Record an
|
|
589
|
+
// unpriced marker so the summary stays honest (partial) rather than
|
|
590
|
+
// appearing exact. Observational only: the error still propagates.
|
|
591
|
+
const cancelled = error instanceof Error && error.name === 'AbortError';
|
|
592
|
+
this.#appendCostRecord(state, {
|
|
593
|
+
requestId,
|
|
594
|
+
provider: state.currentProviderId,
|
|
595
|
+
model: state.agent.model,
|
|
596
|
+
tier: resolveServiceTier(request),
|
|
597
|
+
outcome: cancelled ? 'cancelled' : 'failed',
|
|
598
|
+
});
|
|
599
|
+
throw error;
|
|
600
|
+
}
|
|
601
|
+
if (!completion)
|
|
602
|
+
throw new Error('Application model turn ended without completion');
|
|
603
|
+
// Commit the authoritative terminal state before handling terminal-only
|
|
604
|
+
// tool calls. Approval may pause immediately after this point, and the
|
|
605
|
+
// continuation must still carry the response that produced the calls.
|
|
606
|
+
// Response IDs are provider-chain state, not generic run metadata. Keep
|
|
607
|
+
// them out of continuation handles for providers that do not support
|
|
608
|
+
// chaining, while still exposing the completed provider response on the
|
|
609
|
+
// current stream for diagnostics.
|
|
610
|
+
if (state.supportsConversationChaining && state.currentProviderId !== undefined) {
|
|
611
|
+
state.responseId = completion.responseId;
|
|
612
|
+
state.responseProviderId = state.currentProviderId;
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
state.responseId = undefined;
|
|
616
|
+
state.responseProviderId = undefined;
|
|
617
|
+
}
|
|
618
|
+
let normalizedCompletionUsage;
|
|
619
|
+
if (completion.usage !== undefined) {
|
|
620
|
+
normalizedCompletionUsage = normalizeModelUsage(completion.usage);
|
|
621
|
+
if (normalizedCompletionUsage) {
|
|
622
|
+
const accumulated = addTokenUsage(normalizeModelUsage(state.usage), normalizedCompletionUsage);
|
|
623
|
+
state.usage = {
|
|
624
|
+
...(accumulated.prompt_tokens !== undefined ? { inputTokens: accumulated.prompt_tokens } : {}),
|
|
625
|
+
...(accumulated.completion_tokens !== undefined ? { outputTokens: accumulated.completion_tokens } : {}),
|
|
626
|
+
// `total_tokens` is the billable normalized total, including cache
|
|
627
|
+
// creation tokens. Keep it alongside the application aliases so the
|
|
628
|
+
// authoritative run accumulator never reconstructs a smaller total.
|
|
629
|
+
...(accumulated.total_tokens !== undefined ? { totalTokens: accumulated.total_tokens } : {}),
|
|
630
|
+
...(accumulated.cache_read_tokens !== undefined
|
|
631
|
+
? { cachedInputTokens: accumulated.cache_read_tokens }
|
|
632
|
+
: {}),
|
|
633
|
+
...(accumulated.cache_creation_tokens !== undefined
|
|
634
|
+
? { cacheWriteTokens: accumulated.cache_creation_tokens }
|
|
635
|
+
: {}),
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
// Providers may carry a future/opaque usage shape. Preserve the old
|
|
640
|
+
// pass-through behavior when normalization cannot recognize it.
|
|
641
|
+
state.usage = completion.usage;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
normalizedCompletionUsage = undefined;
|
|
646
|
+
}
|
|
647
|
+
// Attribute cost while the dispatched request's identity is still known.
|
|
648
|
+
this.#appendCostRecord(state, {
|
|
649
|
+
requestId,
|
|
650
|
+
provider: state.currentProviderId,
|
|
651
|
+
model: state.agent.model,
|
|
652
|
+
tier: resolveServiceTier(request),
|
|
653
|
+
outcome: 'completed',
|
|
654
|
+
usage: normalizedCompletionUsage,
|
|
655
|
+
providerUsd: completion.costUsd,
|
|
656
|
+
});
|
|
657
|
+
stream.lastResponseId = completion.responseId;
|
|
658
|
+
stream.rawResponses?.push(completion);
|
|
659
|
+
// Some provider adapters report function calls only in the terminal
|
|
660
|
+
// completion rather than as separate stream events. Their reasoning may
|
|
661
|
+
// likewise be terminal-only, so associate it before replaying calls.
|
|
662
|
+
if (!sawToolCall) {
|
|
663
|
+
for (const item of completion.output) {
|
|
664
|
+
if (item.type === 'reasoning')
|
|
665
|
+
pendingNativeReasoning = appendNativeReasoning(pendingNativeReasoning, item);
|
|
666
|
+
}
|
|
667
|
+
for (const item of completion.output) {
|
|
668
|
+
if (item.type !== 'tool_call')
|
|
669
|
+
continue;
|
|
670
|
+
pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
|
|
671
|
+
sawToolCall = true;
|
|
672
|
+
await this.#handleToolCall(state, stream, queue, item, toolContext);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
// A native reasoning item belongs to the completed assistant turn even
|
|
676
|
+
// when no tool call follows it. Commit it before assistant text so both
|
|
677
|
+
// stateless continuation and persisted canonical history retain the
|
|
678
|
+
// provider-specific metadata exactly once.
|
|
679
|
+
pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
|
|
680
|
+
// Provider-native completion items (notably OpenAI compaction items)
|
|
681
|
+
// must stay in the live provider history. The session layer later
|
|
682
|
+
// applies compaction's replacement rule; keeping the item here also
|
|
683
|
+
// makes it available to an in-flight tool continuation before that
|
|
684
|
+
// terminal history commit occurs.
|
|
685
|
+
for (const item of completion.output) {
|
|
686
|
+
if (item.type !== 'provider_opaque')
|
|
687
|
+
continue;
|
|
688
|
+
const historyItem = {
|
|
689
|
+
...item.item,
|
|
690
|
+
providerOpaque: { provider: item.provider },
|
|
691
|
+
};
|
|
692
|
+
state.history.push(historyItem);
|
|
693
|
+
state.input.push(item);
|
|
694
|
+
outputPush(stream, queue, { type: 'item', item });
|
|
695
|
+
}
|
|
696
|
+
const assistantText = completion.output
|
|
697
|
+
.filter((item) => item.type === 'message')
|
|
698
|
+
.flatMap((item) => item.content)
|
|
699
|
+
.map((part) => part.text)
|
|
700
|
+
.join('');
|
|
701
|
+
if (assistantText) {
|
|
702
|
+
stream.finalOutput = assistantText;
|
|
703
|
+
const item = {
|
|
704
|
+
type: 'message',
|
|
705
|
+
role: 'assistant',
|
|
706
|
+
content: [{ type: 'output_text', text: assistantText }],
|
|
707
|
+
};
|
|
708
|
+
state.history.push(item);
|
|
709
|
+
outputPush(stream, queue, { type: 'item', item });
|
|
710
|
+
state.input.push({ type: 'message', role: 'assistant', content: [{ type: 'text', text: assistantText }] });
|
|
711
|
+
}
|
|
712
|
+
if (state.pendingApprovals.length > 0) {
|
|
713
|
+
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
714
|
+
return finish(stream, state, queue);
|
|
715
|
+
}
|
|
716
|
+
if (!sawToolCall)
|
|
717
|
+
return finish(stream, state, queue);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
async #handleToolCall(state, stream, queue, event, toolContext) {
|
|
721
|
+
const definition = state.agent.tools.find((tool) => tool.name === event.name);
|
|
722
|
+
const args = parseArguments(event.arguments);
|
|
723
|
+
const callItem = {
|
|
724
|
+
type: 'function_call',
|
|
725
|
+
callId: event.id,
|
|
726
|
+
name: event.name,
|
|
727
|
+
arguments: event.arguments,
|
|
728
|
+
};
|
|
729
|
+
state.history.push(callItem);
|
|
730
|
+
state.input.push({ type: 'tool_call', id: event.id, name: event.name, arguments: event.arguments });
|
|
731
|
+
outputPush(stream, queue, { type: 'item', item: callItem });
|
|
732
|
+
if (!definition) {
|
|
733
|
+
const output = `Unknown tool: ${event.name}`;
|
|
734
|
+
const resultItem = {
|
|
735
|
+
type: 'function_call_result',
|
|
736
|
+
callId: event.id,
|
|
737
|
+
name: event.name,
|
|
738
|
+
output,
|
|
739
|
+
};
|
|
740
|
+
state.history.push(resultItem);
|
|
741
|
+
state.input.push({ type: 'tool_result', id: event.id, output });
|
|
742
|
+
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
// Keep the raw-model invocation contract: normalization repairs the
|
|
746
|
+
// accepted object shape but intentionally does not Zod-parse it, which
|
|
747
|
+
// would apply schema defaults before execute. web_fetch relies on its
|
|
748
|
+
// executor fallbacks on the strict JSON-schema path.
|
|
749
|
+
const params = normalizeToolParameters(args, definition.parameters);
|
|
750
|
+
// Consult this run's ledger before prompting: a decision already taken
|
|
751
|
+
// (in the parent run and replayed in, or earlier in this run) must not
|
|
752
|
+
// prompt again. This is what makes approval replay observable.
|
|
753
|
+
const alreadyDecided = state.approvals.isToolApproved({ toolName: event.name, callId: event.id });
|
|
754
|
+
if (alreadyDecided === false) {
|
|
755
|
+
const message = state.approvals.getRejectionMessage(event.name, event.id) ?? 'Tool execution was not approved.';
|
|
756
|
+
const resultItem = {
|
|
757
|
+
type: 'function_call_result',
|
|
758
|
+
callId: event.id,
|
|
759
|
+
name: event.name,
|
|
760
|
+
output: message,
|
|
761
|
+
};
|
|
762
|
+
state.history.push(resultItem);
|
|
763
|
+
state.input.push({ type: 'tool_result', id: event.id, output: message });
|
|
764
|
+
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
if (alreadyDecided === true) {
|
|
768
|
+
const result = await this.#invokeTool(definition, params, toolContext, event.id, state);
|
|
769
|
+
const output = typeof result === 'string' ? result : JSON.stringify(result);
|
|
770
|
+
const resultItem = {
|
|
771
|
+
type: 'function_call_result',
|
|
772
|
+
callId: event.id,
|
|
773
|
+
name: event.name,
|
|
774
|
+
output,
|
|
775
|
+
};
|
|
776
|
+
state.history.push(resultItem);
|
|
777
|
+
state.input.push({ type: 'tool_result', id: event.id, output });
|
|
778
|
+
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
if (await definition.needsApproval(params, toolContext)) {
|
|
782
|
+
const pending = {
|
|
783
|
+
callId: event.id,
|
|
784
|
+
toolName: event.name,
|
|
785
|
+
argumentsText: event.arguments,
|
|
786
|
+
interruption: {
|
|
787
|
+
type: 'tool_approval_item',
|
|
788
|
+
rawItem: { type: 'function_call', callId: event.id, name: event.name, arguments: event.arguments },
|
|
789
|
+
callId: event.id,
|
|
790
|
+
name: event.name,
|
|
791
|
+
arguments: event.arguments,
|
|
792
|
+
},
|
|
793
|
+
definition,
|
|
794
|
+
params,
|
|
795
|
+
};
|
|
796
|
+
state.pendingApprovals ??= [];
|
|
797
|
+
if (!state.pendingApproval)
|
|
798
|
+
state.pendingApproval = pending;
|
|
799
|
+
state.pendingApprovals.push(pending);
|
|
800
|
+
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
const result = await this.#invokeTool(definition, params, toolContext, event.id, state);
|
|
804
|
+
const output = typeof result === 'string' ? result : JSON.stringify(result);
|
|
805
|
+
const resultItem = {
|
|
806
|
+
type: 'function_call_result',
|
|
807
|
+
callId: event.id,
|
|
808
|
+
name: event.name,
|
|
809
|
+
output,
|
|
810
|
+
};
|
|
811
|
+
state.history.push(resultItem);
|
|
812
|
+
state.input.push({ type: 'tool_result', id: event.id, output });
|
|
813
|
+
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* A tool that throws must not take the run down with it.
|
|
817
|
+
*
|
|
818
|
+
* Most tools already report failure by returning `Error: ...` as their
|
|
819
|
+
* output, which the model reads and acts on. The handful that throw got the
|
|
820
|
+
* opposite treatment for no principled reason: the exception escaped to
|
|
821
|
+
* `#execute`, closed the event queue, and ended the turn — so the model never
|
|
822
|
+
* saw a recoverable problem like a path that does not exist, and the caller
|
|
823
|
+
* lost the whole turn. Worse, `#handleToolCall` pushes the `function_call`
|
|
824
|
+
* into history before executing, so an escape leaves a call with no matching
|
|
825
|
+
* result.
|
|
826
|
+
*
|
|
827
|
+
* Errors are therefore normalized into tool output, with two exceptions that
|
|
828
|
+
* must still propagate: cancellation (the run is ending on purpose) and
|
|
829
|
+
* `HarnessInvariantError` (a bug here, which the model cannot act on).
|
|
830
|
+
*/
|
|
831
|
+
async #invokeTool(definition, params, toolContext, callId, state) {
|
|
832
|
+
const startedAt = Date.now();
|
|
833
|
+
const attempt = state
|
|
834
|
+
? ((state.toolAttempts ??= new Map()).set(callId, (state.toolAttempts.get(callId) ?? 0) + 1),
|
|
835
|
+
state.toolAttempts.get(callId))
|
|
836
|
+
: 1;
|
|
837
|
+
const lifecycleContext = {
|
|
838
|
+
...(state?.sessionId ? { sessionId: state.sessionId } : {}),
|
|
839
|
+
...(state?.turnId ? { turnId: state.turnId } : {}),
|
|
840
|
+
toolCallId: callId,
|
|
841
|
+
toolName: definition.name,
|
|
842
|
+
normalizedArguments: params,
|
|
843
|
+
attempt,
|
|
844
|
+
scope: state?.hookScope ?? 'root',
|
|
845
|
+
};
|
|
846
|
+
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.before(lifecycleContext));
|
|
847
|
+
try {
|
|
848
|
+
const result = await definition.execute(params, toolContext, { toolCall: { callId } });
|
|
849
|
+
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.after(lifecycleContext, result, Date.now() - startedAt));
|
|
850
|
+
return result;
|
|
851
|
+
}
|
|
852
|
+
catch (error) {
|
|
853
|
+
if (isCancellationError(error) || isHarnessInvariantError(error) || error instanceof MaxTurnsExceededError) {
|
|
854
|
+
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, false));
|
|
855
|
+
throw error;
|
|
856
|
+
}
|
|
857
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
858
|
+
// Feeding the same failure back forever is its own failure mode: some
|
|
859
|
+
// errors no argument can fix. Repeat the identical result once, then say
|
|
860
|
+
// so plainly rather than inviting a third identical attempt.
|
|
861
|
+
const repeated = state ? countRepeatedFailure(state, definition.name, params, message) : 1;
|
|
862
|
+
if (repeated > MAX_IDENTICAL_TOOL_FAILURES) {
|
|
863
|
+
const result = `Error: ${message}\n\nThis exact call has now failed ${repeated} times with the same error. Do not call ${definition.name} with these arguments again — either change your approach or report the problem to the user.`;
|
|
864
|
+
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
|
|
865
|
+
return result;
|
|
866
|
+
}
|
|
867
|
+
const result = `Error: ${message}`;
|
|
868
|
+
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
|
|
869
|
+
return result;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
#nextRequestId(state) {
|
|
873
|
+
state.costRequestSeq = (state.costRequestSeq ?? 0) + 1;
|
|
874
|
+
return `req-${state.turnCount}-${state.costRequestSeq}`;
|
|
875
|
+
}
|
|
876
|
+
#appendCostRecord(state, input) {
|
|
877
|
+
const record = computeModelCost({
|
|
878
|
+
requestId: input.requestId,
|
|
879
|
+
provider: input.provider ?? 'unknown',
|
|
880
|
+
model: input.model,
|
|
881
|
+
serviceTier: input.tier,
|
|
882
|
+
outcome: input.outcome,
|
|
883
|
+
usage: input.usage,
|
|
884
|
+
providerUsd: input.providerUsd,
|
|
885
|
+
getPrice: (provider, model, tier) => getModelPricing(provider, model, tier),
|
|
886
|
+
pricingVersion: getCatalogPricingVersion(),
|
|
887
|
+
});
|
|
888
|
+
state.costRecords = [...(state.costRecords ?? []), record];
|
|
889
|
+
}
|
|
890
|
+
async #notifyToolLifecycle(operation) {
|
|
891
|
+
if (!operation)
|
|
892
|
+
return;
|
|
893
|
+
try {
|
|
894
|
+
await operation();
|
|
895
|
+
}
|
|
896
|
+
catch {
|
|
897
|
+
// Lifecycle observers are passive. A broken observer must not alter tool
|
|
898
|
+
// execution or turn recovery semantics.
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* How many times an identical failing call is fed back before the loop stops
|
|
904
|
+
* inviting retries. One repeat is worth allowing: a transient failure resolves,
|
|
905
|
+
* and a model given the error often corrects on its second attempt.
|
|
906
|
+
*/
|
|
907
|
+
const MAX_IDENTICAL_TOOL_FAILURES = 2;
|
|
908
|
+
function countRepeatedFailure(state, toolName, params, message) {
|
|
909
|
+
let key;
|
|
910
|
+
try {
|
|
911
|
+
key = JSON.stringify([toolName, params, message]);
|
|
912
|
+
}
|
|
913
|
+
catch {
|
|
914
|
+
// Unserializable params cannot be compared for identity; treat every such
|
|
915
|
+
// failure as distinct rather than collapsing unrelated calls together.
|
|
916
|
+
return 1;
|
|
917
|
+
}
|
|
918
|
+
state.toolFailureCounts ??= new Map();
|
|
919
|
+
const count = (state.toolFailureCounts.get(key) ?? 0) + 1;
|
|
920
|
+
state.toolFailureCounts.set(key, count);
|
|
921
|
+
return count;
|
|
922
|
+
}
|
|
923
|
+
function outputPush(stream, queue, item) {
|
|
924
|
+
stream.output.push(item);
|
|
925
|
+
if (stream.newItems !== stream.output)
|
|
926
|
+
stream.newItems.push(item);
|
|
927
|
+
queue.push(item);
|
|
928
|
+
}
|
|
929
|
+
function finish(stream, state, queue) {
|
|
930
|
+
stream.history = state.history;
|
|
931
|
+
if (state.supportsConversationChaining &&
|
|
932
|
+
state.responseId &&
|
|
933
|
+
state.responseProviderId !== undefined &&
|
|
934
|
+
state.responseProviderId === state.currentProviderId) {
|
|
935
|
+
stream.lastResponseId = state.responseId;
|
|
936
|
+
}
|
|
937
|
+
else {
|
|
938
|
+
stream.lastResponseId = null;
|
|
939
|
+
}
|
|
940
|
+
queue.close();
|
|
941
|
+
return { usage: state.usage, output: stream.output, costRecords: state.costRecords ?? [] };
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Only replay native reasoning when the provider explicitly supplies the
|
|
945
|
+
* Chat-Completions continuation field. Generic reasoning remains display-only
|
|
946
|
+
* so providers with different native formats are not given a foreign field.
|
|
947
|
+
*/
|
|
948
|
+
function appendNativeReasoning(current, event) {
|
|
949
|
+
const nativeReasoning = event.providerMetadata?.reasoning_content;
|
|
950
|
+
if (typeof nativeReasoning === 'string') {
|
|
951
|
+
const text = current?.text === nativeReasoning
|
|
952
|
+
? current.text
|
|
953
|
+
: current?.text && nativeReasoning.startsWith(current.text)
|
|
954
|
+
? nativeReasoning
|
|
955
|
+
: `${current?.text ?? ''}${nativeReasoning}`;
|
|
956
|
+
return {
|
|
957
|
+
...(event.id ? { id: event.id } : current?.id ? { id: current.id } : {}),
|
|
958
|
+
text,
|
|
959
|
+
providerMetadata: { ...event.providerMetadata, reasoning_content: text },
|
|
960
|
+
};
|
|
961
|
+
}
|
|
962
|
+
// Responses providers return encrypted reasoning only on their terminal
|
|
963
|
+
// output. Their metadata is namespaced, so retain it without turning it into
|
|
964
|
+
// the Chat-Completions-only reasoning_content convention.
|
|
965
|
+
if (asRecord(event.providerMetadata?.codex) || asRecord(event.providerMetadata?.openai)) {
|
|
966
|
+
return {
|
|
967
|
+
...(event.id ? { id: event.id } : current?.id ? { id: current.id } : {}),
|
|
968
|
+
text: event.text,
|
|
969
|
+
providerMetadata: event.providerMetadata,
|
|
970
|
+
};
|
|
971
|
+
}
|
|
972
|
+
return current;
|
|
973
|
+
}
|
|
974
|
+
function commitPendingNativeReasoning(state, stream, queue, pending) {
|
|
975
|
+
if (!pending)
|
|
976
|
+
return undefined;
|
|
977
|
+
const reasoningInput = {
|
|
978
|
+
type: 'reasoning',
|
|
979
|
+
...(pending.id ? { id: pending.id } : {}),
|
|
980
|
+
text: pending.text,
|
|
981
|
+
providerMetadata: pending.providerMetadata,
|
|
982
|
+
};
|
|
983
|
+
const reasoningHistory = {
|
|
984
|
+
type: 'reasoning',
|
|
985
|
+
...(pending.id ? { id: pending.id } : {}),
|
|
986
|
+
content: [{ type: 'reasoning_text', text: pending.text }],
|
|
987
|
+
providerData: pending.providerMetadata,
|
|
988
|
+
};
|
|
989
|
+
state.input.push(reasoningInput);
|
|
990
|
+
state.history.push(reasoningHistory);
|
|
991
|
+
outputPush(stream, queue, { type: 'item', item: reasoningHistory });
|
|
992
|
+
return undefined;
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Resolve the effective billing service tier from the dispatched request. The
|
|
996
|
+
* default service tier is standard; only a flex/batch request that was actually
|
|
997
|
+
* dispatched resolves to its tier, and anything unrecognized fails closed.
|
|
998
|
+
*/
|
|
999
|
+
function resolveServiceTier(request) {
|
|
1000
|
+
const options = request.providerOptions;
|
|
1001
|
+
const raw = options?.service_tier ?? options?.serviceTier;
|
|
1002
|
+
if (raw === 'flex' || raw === 'batch' || raw === 'standard')
|
|
1003
|
+
return raw;
|
|
1004
|
+
return raw === undefined ? 'standard' : 'unknown';
|
|
1005
|
+
}
|
|
1006
|
+
function normalizeModelUsage(usage) {
|
|
1007
|
+
if (!usage || typeof usage !== 'object')
|
|
1008
|
+
return undefined;
|
|
1009
|
+
const rawUsage = usage;
|
|
1010
|
+
return normalizeUsage({
|
|
1011
|
+
...rawUsage,
|
|
1012
|
+
cacheReadTokens: rawUsage.cachedInputTokens ?? rawUsage.cacheReadTokens,
|
|
1013
|
+
cacheCreationTokens: rawUsage.cacheWriteTokens ?? rawUsage.cacheCreationTokens,
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
function parseArguments(value) {
|
|
1017
|
+
try {
|
|
1018
|
+
return JSON.parse(value);
|
|
1019
|
+
}
|
|
1020
|
+
catch {
|
|
1021
|
+
return {};
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
function getInterruptionCallId(value) {
|
|
1025
|
+
if (typeof value !== 'object' || value === null)
|
|
1026
|
+
return undefined;
|
|
1027
|
+
const callId = value.callId;
|
|
1028
|
+
return typeof callId === 'string' ? callId : undefined;
|
|
1029
|
+
}
|
|
1030
|
+
function toModelTools(tools) {
|
|
1031
|
+
return tools.map((tool) => ({
|
|
1032
|
+
name: tool.name,
|
|
1033
|
+
description: tool.description,
|
|
1034
|
+
parameters: isJsonSchema(tool.parameters) ? tool.parameters : z.toJSONSchema(tool.parameters),
|
|
1035
|
+
}));
|
|
1036
|
+
}
|
|
1037
|
+
function isJsonSchema(value) {
|
|
1038
|
+
return typeof value === 'object' && value !== null && !isZodToolParameterSchema(value);
|
|
1039
|
+
}
|
|
1040
|
+
/**
|
|
1041
|
+
* The canonical application projection used for both model requests and
|
|
1042
|
+
* continuation-prefix comparisons. Keep this at the application boundary so
|
|
1043
|
+
* callers never need to inspect opaque continuation state.
|
|
1044
|
+
*/
|
|
1045
|
+
export function normalizeApplicationInput(input) {
|
|
1046
|
+
if (typeof input === 'string')
|
|
1047
|
+
return [{ type: 'message', role: 'user', content: [{ type: 'text', text: input }] }];
|
|
1048
|
+
const items = (Array.isArray(input) ? input : [input]);
|
|
1049
|
+
return items.flatMap((item) => normalizeInputItem(item));
|
|
1050
|
+
}
|
|
1051
|
+
function normalizeInput(input) {
|
|
1052
|
+
return normalizeApplicationInput(input);
|
|
1053
|
+
}
|
|
1054
|
+
function normalizeHistory(input) {
|
|
1055
|
+
if (typeof input === 'string')
|
|
1056
|
+
return [{ type: 'message', role: 'user', content: input }];
|
|
1057
|
+
return Array.isArray(input) ? [...input] : [input];
|
|
1058
|
+
}
|
|
1059
|
+
function asRecord(value) {
|
|
1060
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined;
|
|
1061
|
+
}
|
|
1062
|
+
function unsupportedInput(description) {
|
|
1063
|
+
throw new Error(`Unsupported restored input ${description}`);
|
|
1064
|
+
}
|
|
1065
|
+
function normalizeTextPart(value, description) {
|
|
1066
|
+
if (typeof value === 'string')
|
|
1067
|
+
return { type: 'text', text: value };
|
|
1068
|
+
const record = asRecord(value);
|
|
1069
|
+
if (!record ||
|
|
1070
|
+
!['text', 'input_text', 'output_text'].includes(String(record.type)) ||
|
|
1071
|
+
typeof record.text !== 'string') {
|
|
1072
|
+
unsupportedInput(description);
|
|
1073
|
+
}
|
|
1074
|
+
return { type: 'text', text: record.text };
|
|
1075
|
+
}
|
|
1076
|
+
function normalizeMessageImage(record) {
|
|
1077
|
+
const image = record.image ?? record.image_url;
|
|
1078
|
+
const detail = typeof record.detail === 'string' ? record.detail : undefined;
|
|
1079
|
+
if (image === undefined)
|
|
1080
|
+
return { type: 'image', ...(detail ? { detail } : {}) };
|
|
1081
|
+
if (typeof image === 'string')
|
|
1082
|
+
return { type: 'image', image, ...(detail ? { detail } : {}) };
|
|
1083
|
+
const reference = asRecord(image);
|
|
1084
|
+
if (typeof reference?.id === 'string')
|
|
1085
|
+
return { type: 'image', image: { id: reference.id }, ...(detail ? { detail } : {}) };
|
|
1086
|
+
unsupportedInput('message image reference');
|
|
1087
|
+
}
|
|
1088
|
+
function normalizeMessagePart(value) {
|
|
1089
|
+
const record = asRecord(value);
|
|
1090
|
+
if (record?.type === 'image' || record?.type === 'input_image')
|
|
1091
|
+
return normalizeMessageImage(record);
|
|
1092
|
+
return normalizeTextPart(value, record?.type ? `message content: ${record.type}` : 'message content');
|
|
1093
|
+
}
|
|
1094
|
+
function normalizeMessageContent(value) {
|
|
1095
|
+
if (value === undefined || value === null)
|
|
1096
|
+
return [{ type: 'text', text: '' }];
|
|
1097
|
+
return (Array.isArray(value) ? value : [value]).map((part) => normalizeMessagePart(part));
|
|
1098
|
+
}
|
|
1099
|
+
function isTextMessagePart(part) {
|
|
1100
|
+
return part.type === 'text';
|
|
1101
|
+
}
|
|
1102
|
+
function normalizeToolImagePart(record) {
|
|
1103
|
+
const rawImage = record.image ?? record.image_url;
|
|
1104
|
+
const detail = typeof record.detail === 'string' ? record.detail : undefined;
|
|
1105
|
+
if (rawImage === undefined)
|
|
1106
|
+
return { type: 'image', ...(detail ? { detail } : {}) };
|
|
1107
|
+
if (typeof rawImage === 'string')
|
|
1108
|
+
return { type: 'image', image: rawImage, ...(detail ? { detail } : {}) };
|
|
1109
|
+
const image = asRecord(rawImage);
|
|
1110
|
+
if (!image)
|
|
1111
|
+
unsupportedInput('tool image reference');
|
|
1112
|
+
const normalized = typeof image.id === 'string'
|
|
1113
|
+
? { id: image.id }
|
|
1114
|
+
: typeof image.url === 'string'
|
|
1115
|
+
? { url: image.url }
|
|
1116
|
+
: typeof image.fileId === 'string'
|
|
1117
|
+
? { fileId: image.fileId }
|
|
1118
|
+
: (typeof image.data === 'string' || image.data instanceof Uint8Array) && typeof image.mediaType === 'string'
|
|
1119
|
+
? { data: image.data, mediaType: image.mediaType }
|
|
1120
|
+
: undefined;
|
|
1121
|
+
if (!normalized)
|
|
1122
|
+
unsupportedInput('tool image reference');
|
|
1123
|
+
return { type: 'image', image: normalized, ...(detail ? { detail } : {}) };
|
|
1124
|
+
}
|
|
1125
|
+
function normalizeToolFilePart(record) {
|
|
1126
|
+
const rawFile = record.file ?? record.file_id ?? record.file_url;
|
|
1127
|
+
const outerFilename = typeof record.filename === 'string' ? record.filename : undefined;
|
|
1128
|
+
if (typeof rawFile === 'string')
|
|
1129
|
+
return { type: 'file', file: rawFile };
|
|
1130
|
+
const file = asRecord(rawFile);
|
|
1131
|
+
if (!file)
|
|
1132
|
+
unsupportedInput('tool file reference');
|
|
1133
|
+
if (typeof file.id === 'string')
|
|
1134
|
+
return { type: 'file', file: { id: file.id, ...(outerFilename ? { filename: outerFilename } : {}) } };
|
|
1135
|
+
if (typeof file.url === 'string')
|
|
1136
|
+
return { type: 'file', file: { url: file.url, ...(outerFilename ? { filename: outerFilename } : {}) } };
|
|
1137
|
+
const filename = outerFilename ?? (typeof file.filename === 'string' ? file.filename : undefined);
|
|
1138
|
+
if ((typeof file.data === 'string' || file.data instanceof Uint8Array) &&
|
|
1139
|
+
typeof file.mediaType === 'string' &&
|
|
1140
|
+
filename !== undefined) {
|
|
1141
|
+
return { type: 'file', file: { data: file.data, mediaType: file.mediaType, filename } };
|
|
1142
|
+
}
|
|
1143
|
+
unsupportedInput('tool file reference');
|
|
1144
|
+
}
|
|
1145
|
+
function normalizeToolResultPart(value) {
|
|
1146
|
+
const record = asRecord(value);
|
|
1147
|
+
if (record?.type === 'image' || record?.type === 'input_image')
|
|
1148
|
+
return normalizeToolImagePart(record);
|
|
1149
|
+
if (record?.type === 'file' || record?.type === 'input_file')
|
|
1150
|
+
return normalizeToolFilePart(record);
|
|
1151
|
+
return normalizeTextPart(value, record?.type ? `tool result part: ${record.type}` : 'tool result part');
|
|
1152
|
+
}
|
|
1153
|
+
function normalizeToolResultOutput(value) {
|
|
1154
|
+
if (typeof value === 'string')
|
|
1155
|
+
return value;
|
|
1156
|
+
if (value === undefined || value === null)
|
|
1157
|
+
return '';
|
|
1158
|
+
if (!Array.isArray(value))
|
|
1159
|
+
unsupportedInput('tool result output');
|
|
1160
|
+
return value.map(normalizeToolResultPart);
|
|
1161
|
+
}
|
|
1162
|
+
function normalizeReasoningText(value) {
|
|
1163
|
+
if (value === undefined || value === null)
|
|
1164
|
+
return '';
|
|
1165
|
+
if (typeof value === 'string')
|
|
1166
|
+
return value;
|
|
1167
|
+
const parts = Array.isArray(value) ? value : [value];
|
|
1168
|
+
return parts
|
|
1169
|
+
.map((part) => {
|
|
1170
|
+
const record = asRecord(part);
|
|
1171
|
+
if (!record ||
|
|
1172
|
+
!['reasoning_text', 'text', 'summary_text'].includes(String(record.type)) ||
|
|
1173
|
+
typeof record.text !== 'string') {
|
|
1174
|
+
return unsupportedInput('reasoning content part');
|
|
1175
|
+
}
|
|
1176
|
+
return record.text;
|
|
1177
|
+
})
|
|
1178
|
+
.join('');
|
|
1179
|
+
}
|
|
1180
|
+
/** True when the adapter marked this item as provider-native and opaque. */
|
|
1181
|
+
function isProviderOpaque(item) {
|
|
1182
|
+
const marker = item.providerOpaque;
|
|
1183
|
+
return typeof marker?.provider === 'string' && marker.provider.length > 0;
|
|
1184
|
+
}
|
|
1185
|
+
function normalizeInputItem(item) {
|
|
1186
|
+
if (isProviderOpaque(item)) {
|
|
1187
|
+
const { providerOpaque: _marker, ...providerItem } = item;
|
|
1188
|
+
return [{ type: 'provider_opaque', provider: item.providerOpaque.provider, item: providerItem }];
|
|
1189
|
+
}
|
|
1190
|
+
if (item.type === 'function_call') {
|
|
1191
|
+
return [
|
|
1192
|
+
{
|
|
1193
|
+
type: 'tool_call',
|
|
1194
|
+
id: String(item.callId ?? item.call_id ?? ''),
|
|
1195
|
+
name: String(item.name ?? ''),
|
|
1196
|
+
arguments: String(item.arguments ?? '{}'),
|
|
1197
|
+
},
|
|
1198
|
+
];
|
|
1199
|
+
}
|
|
1200
|
+
if (item.type === 'function_call_result' || item.type === 'function_call_output') {
|
|
1201
|
+
return [
|
|
1202
|
+
{
|
|
1203
|
+
type: 'tool_result',
|
|
1204
|
+
id: String(item.callId ?? item.call_id ?? item.tool_call_id ?? ''),
|
|
1205
|
+
output: normalizeToolResultOutput(item.output),
|
|
1206
|
+
},
|
|
1207
|
+
];
|
|
1208
|
+
}
|
|
1209
|
+
if (item.type === 'reasoning') {
|
|
1210
|
+
const providerMetadata = item.providerData;
|
|
1211
|
+
return [
|
|
1212
|
+
{
|
|
1213
|
+
type: 'reasoning',
|
|
1214
|
+
...(typeof item.id === 'string' ? { id: item.id } : {}),
|
|
1215
|
+
text: normalizeReasoningText(item.content ?? item.output ?? ''),
|
|
1216
|
+
...(providerMetadata ? { providerMetadata } : {}),
|
|
1217
|
+
},
|
|
1218
|
+
];
|
|
1219
|
+
}
|
|
1220
|
+
if (item.type !== undefined && item.type !== 'message')
|
|
1221
|
+
unsupportedInput(`item type: ${String(item.type)}`);
|
|
1222
|
+
const role = item.role === undefined
|
|
1223
|
+
? 'user'
|
|
1224
|
+
: item.role === 'assistant' || item.role === 'system' || item.role === 'user'
|
|
1225
|
+
? item.role
|
|
1226
|
+
: unsupportedInput(`message role: ${String(item.role)}`);
|
|
1227
|
+
const content = normalizeMessageContent(item.content);
|
|
1228
|
+
if (role === 'system') {
|
|
1229
|
+
const textContent = content.filter(isTextMessagePart);
|
|
1230
|
+
if (textContent.length !== content.length)
|
|
1231
|
+
unsupportedInput('system message content');
|
|
1232
|
+
return [{ type: 'message', role, content: textContent }];
|
|
1233
|
+
}
|
|
1234
|
+
return [{ type: 'message', role, content }];
|
|
1235
|
+
}
|
|
1236
|
+
//# sourceMappingURL=application-run-loop.js.map
|