@qduc/term2 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +17 -7
- package/dist/agent.js.map +1 -1
- package/dist/app-helpers.d.ts +4 -0
- package/dist/app-helpers.d.ts.map +1 -1
- package/dist/app-helpers.js +6 -0
- package/dist/app-helpers.js.map +1 -1
- package/dist/app.d.ts +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +142 -13
- package/dist/app.js.map +1 -1
- package/dist/cli.js +112 -28
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-approve-command.js +3 -3
- package/dist/commands/auto-approve-command.js.map +1 -1
- package/dist/commands/compact-command.d.ts +6 -0
- package/dist/commands/compact-command.d.ts.map +1 -0
- package/dist/commands/compact-command.js +12 -0
- package/dist/commands/compact-command.js.map +1 -0
- package/dist/commands/guarded-settings-command.d.ts +3 -1
- package/dist/commands/guarded-settings-command.d.ts.map +1 -1
- package/dist/commands/guarded-settings-command.js +21 -5
- package/dist/commands/guarded-settings-command.js.map +1 -1
- package/dist/commands/mode-commands.d.ts +9 -2
- package/dist/commands/mode-commands.d.ts.map +1 -1
- package/dist/commands/mode-commands.js +12 -3
- package/dist/commands/mode-commands.js.map +1 -1
- package/dist/commands/usage-command.d.ts +10 -1
- package/dist/commands/usage-command.d.ts.map +1 -1
- package/dist/commands/usage-command.js +11 -1
- package/dist/commands/usage-command.js.map +1 -1
- package/dist/components/InputBox.js +14 -1
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
- package/dist/components/input/ApplicationInputSurface.js +2 -0
- package/dist/components/input/ApplicationInputSurface.js.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.js +1 -1
- package/dist/components/input/FirstRunSetupPrompt.js.map +1 -1
- package/dist/components/input/MentorPoolMenuSession.d.ts +9 -0
- package/dist/components/input/MentorPoolMenuSession.d.ts.map +1 -0
- package/dist/components/input/MentorPoolMenuSession.js +131 -0
- package/dist/components/input/MentorPoolMenuSession.js.map +1 -0
- package/dist/components/input/MenuSurface.d.ts.map +1 -1
- package/dist/components/input/MenuSurface.js +16 -3
- package/dist/components/input/MenuSurface.js.map +1 -1
- package/dist/components/input/PendingQueueList.d.ts.map +1 -1
- package/dist/components/input/PendingQueueList.js +22 -5
- package/dist/components/input/PendingQueueList.js.map +1 -1
- package/dist/components/input/ProviderMenuSession.d.ts.map +1 -1
- package/dist/components/input/ProviderMenuSession.js +1 -0
- package/dist/components/input/ProviderMenuSession.js.map +1 -1
- package/dist/components/input/SettingsMenuSession.d.ts.map +1 -1
- package/dist/components/input/SettingsMenuSession.js +35 -22
- package/dist/components/input/SettingsMenuSession.js.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.js +6 -0
- package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
- package/dist/components/input/menu-controller.d.ts.map +1 -1
- package/dist/components/input/menu-controller.js +18 -1
- package/dist/components/input/menu-controller.js.map +1 -1
- package/dist/components/input/menu-registry.d.ts.map +1 -1
- package/dist/components/input/menu-registry.js +2 -0
- package/dist/components/input/menu-registry.js.map +1 -1
- package/dist/components/input/menu-types.d.ts +5 -0
- package/dist/components/input/menu-types.d.ts.map +1 -1
- package/dist/components/input/triggers.d.ts.map +1 -1
- package/dist/components/input/triggers.js +33 -0
- package/dist/components/input/triggers.js.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.d.ts +2 -0
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +156 -64
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts +12 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +208 -53
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +11 -1
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +30 -13
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +5 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +45 -3
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/layout/live-task-rows.d.ts +16 -0
- package/dist/components/layout/live-task-rows.d.ts.map +1 -0
- package/dist/components/layout/live-task-rows.js +28 -0
- package/dist/components/layout/live-task-rows.js.map +1 -0
- package/dist/components/layout/terminal-text-budget.d.ts +4 -0
- package/dist/components/layout/terminal-text-budget.d.ts.map +1 -0
- package/dist/components/layout/terminal-text-budget.js +18 -0
- package/dist/components/layout/terminal-text-budget.js.map +1 -0
- package/dist/components/menu/CopyMenu.d.ts +1 -0
- package/dist/components/menu/CopyMenu.d.ts.map +1 -1
- package/dist/components/menu/CopyMenu.js +15 -2
- package/dist/components/menu/CopyMenu.js.map +1 -1
- package/dist/components/menu/MentorPoolSelectionMenu.d.ts +13 -0
- package/dist/components/menu/MentorPoolSelectionMenu.d.ts.map +1 -0
- package/dist/components/menu/MentorPoolSelectionMenu.js +98 -0
- package/dist/components/menu/MentorPoolSelectionMenu.js.map +1 -0
- package/dist/components/menu/ModelSelectionMenu.d.ts +1 -0
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js +22 -7
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.js +27 -2
- package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.js +5 -0
- package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/menu/SlashCommandMenu.js +12 -9
- package/dist/components/menu/SlashCommandMenu.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.d.ts +9 -0
- package/dist/components/message/CommandGroupSummary.d.ts.map +1 -0
- package/dist/components/message/CommandGroupSummary.js +31 -0
- package/dist/components/message/CommandGroupSummary.js.map +1 -0
- package/dist/components/message/CommandMessage.d.ts +8 -0
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +54 -25
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/MessageList.d.ts +6 -2
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +64 -10
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts +1 -0
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +18 -3
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +43 -0
- package/dist/components/message/command-grouping.d.ts.map +1 -0
- package/dist/components/message/command-grouping.js +142 -0
- package/dist/components/message/command-grouping.js.map +1 -0
- package/dist/components/message/command-message-helpers.d.ts +6 -5
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +36 -0
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +136 -90
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts +11 -0
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts.map +1 -0
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js +50 -0
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js.map +1 -0
- package/dist/components/prompt/QueuePausedPrompt.d.ts.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.js +14 -8
- package/dist/components/prompt/QueuePausedPrompt.js.map +1 -1
- package/dist/context/InputContext.d.ts +1 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js +2 -0
- package/dist/context/InputContext.js.map +1 -1
- package/dist/contracts/application-stream.d.ts +14 -0
- package/dist/contracts/application-stream.d.ts.map +1 -1
- package/dist/contracts/conversation.d.ts +24 -1
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/contracts/conversation.js +8 -0
- package/dist/contracts/conversation.js.map +1 -1
- package/dist/contracts/provider-input.d.ts +15 -0
- package/dist/contracts/provider-input.d.ts.map +1 -1
- package/dist/contracts/provider-input.js +6 -1
- package/dist/contracts/provider-input.js.map +1 -1
- package/dist/contracts/streamed-model-turn.d.ts +22 -1
- package/dist/contracts/streamed-model-turn.d.ts.map +1 -1
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/session-runtime.d.ts +10 -0
- package/dist/core/session-runtime.d.ts.map +1 -0
- package/dist/core/session-runtime.js +9 -0
- package/dist/core/session-runtime.js.map +1 -0
- package/dist/gateway/assertion.d.ts +38 -0
- package/dist/gateway/assertion.d.ts.map +1 -0
- package/dist/gateway/assertion.js +146 -0
- package/dist/gateway/assertion.js.map +1 -0
- package/dist/gateway/contracts.d.ts +124 -0
- package/dist/gateway/contracts.d.ts.map +1 -0
- package/dist/gateway/contracts.js +13 -0
- package/dist/gateway/contracts.js.map +1 -0
- package/dist/gateway/gateway.d.ts +72 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +1277 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/index.d.ts +22 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +22 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/interaction-protocol.d.ts +76 -0
- package/dist/gateway/interaction-protocol.d.ts.map +1 -0
- package/dist/gateway/interaction-protocol.js +548 -0
- package/dist/gateway/interaction-protocol.js.map +1 -0
- package/dist/gateway/launcher.d.ts +8 -0
- package/dist/gateway/launcher.d.ts.map +1 -0
- package/dist/gateway/launcher.js +20 -0
- package/dist/gateway/launcher.js.map +1 -0
- package/dist/gateway/lifecycle.d.ts +12 -0
- package/dist/gateway/lifecycle.d.ts.map +1 -0
- package/dist/gateway/lifecycle.js +38 -0
- package/dist/gateway/lifecycle.js.map +1 -0
- package/dist/gateway/persistence/admission-persistence.d.ts +82 -0
- package/dist/gateway/persistence/admission-persistence.d.ts.map +1 -0
- package/dist/gateway/persistence/admission-persistence.js +215 -0
- package/dist/gateway/persistence/admission-persistence.js.map +1 -0
- package/dist/gateway/persistence/contracts.d.ts +94 -0
- package/dist/gateway/persistence/contracts.d.ts.map +1 -0
- package/dist/gateway/persistence/contracts.js +32 -0
- package/dist/gateway/persistence/contracts.js.map +1 -0
- package/dist/gateway/persistence/coordinator.d.ts +25 -0
- package/dist/gateway/persistence/coordinator.d.ts.map +1 -0
- package/dist/gateway/persistence/coordinator.js +181 -0
- package/dist/gateway/persistence/coordinator.js.map +1 -0
- package/dist/gateway/persistence/event-journal.d.ts +31 -0
- package/dist/gateway/persistence/event-journal.d.ts.map +1 -0
- package/dist/gateway/persistence/event-journal.js +378 -0
- package/dist/gateway/persistence/event-journal.js.map +1 -0
- package/dist/gateway/persistence/interaction-checkpoint.d.ts +17 -0
- package/dist/gateway/persistence/interaction-checkpoint.d.ts.map +1 -0
- package/dist/gateway/persistence/interaction-checkpoint.js +75 -0
- package/dist/gateway/persistence/interaction-checkpoint.js.map +1 -0
- package/dist/gateway/persistence/projection.d.ts +53 -0
- package/dist/gateway/persistence/projection.d.ts.map +1 -0
- package/dist/gateway/persistence/projection.js +226 -0
- package/dist/gateway/persistence/projection.js.map +1 -0
- package/dist/gateway/persistence/retention.d.ts +16 -0
- package/dist/gateway/persistence/retention.d.ts.map +1 -0
- package/dist/gateway/persistence/retention.js +93 -0
- package/dist/gateway/persistence/retention.js.map +1 -0
- package/dist/gateway/persistence/session-index.d.ts +34 -0
- package/dist/gateway/persistence/session-index.d.ts.map +1 -0
- package/dist/gateway/persistence/session-index.js +348 -0
- package/dist/gateway/persistence/session-index.js.map +1 -0
- package/dist/gateway/persistence/session-persistence.d.ts +68 -0
- package/dist/gateway/persistence/session-persistence.d.ts.map +1 -0
- package/dist/gateway/persistence/session-persistence.js +165 -0
- package/dist/gateway/persistence/session-persistence.js.map +1 -0
- package/dist/gateway/persistence/storage.d.ts +13 -0
- package/dist/gateway/persistence/storage.d.ts.map +1 -0
- package/dist/gateway/persistence/storage.js +87 -0
- package/dist/gateway/persistence/storage.js.map +1 -0
- package/dist/gateway/replay-ledger.d.ts +30 -0
- package/dist/gateway/replay-ledger.d.ts.map +1 -0
- package/dist/gateway/replay-ledger.js +83 -0
- package/dist/gateway/replay-ledger.js.map +1 -0
- package/dist/gateway/runtime-factory.d.ts +84 -0
- package/dist/gateway/runtime-factory.d.ts.map +1 -0
- package/dist/gateway/runtime-factory.js +213 -0
- package/dist/gateway/runtime-factory.js.map +1 -0
- package/dist/gateway/safe-log.d.ts +15 -0
- package/dist/gateway/safe-log.d.ts.map +1 -0
- package/dist/gateway/safe-log.js +89 -0
- package/dist/gateway/safe-log.js.map +1 -0
- package/dist/gateway/server-session.d.ts +65 -0
- package/dist/gateway/server-session.d.ts.map +1 -0
- package/dist/gateway/server-session.js +252 -0
- package/dist/gateway/server-session.js.map +1 -0
- package/dist/gateway/server.d.ts +42 -0
- package/dist/gateway/server.d.ts.map +1 -0
- package/dist/gateway/server.js +126 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/worker-boundary.d.ts +40 -0
- package/dist/gateway/worker-boundary.d.ts.map +1 -0
- package/dist/gateway/worker-boundary.js +149 -0
- package/dist/gateway/worker-boundary.js.map +1 -0
- package/dist/gateway/workspace-admission.d.ts +37 -0
- package/dist/gateway/workspace-admission.d.ts.map +1 -0
- package/dist/gateway/workspace-admission.js +285 -0
- package/dist/gateway/workspace-admission.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.d.ts +6 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +3 -0
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +39 -3
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +5 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +17 -3
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts +5 -0
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.js +11 -0
- package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +1 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +22 -4
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-grok-credit-usage.d.ts +20 -0
- package/dist/hooks/use-grok-credit-usage.d.ts.map +1 -0
- package/dist/hooks/use-grok-credit-usage.js +48 -0
- package/dist/hooks/use-grok-credit-usage.js.map +1 -0
- package/dist/hooks/use-mentor-pool-selection.d.ts +103 -0
- package/dist/hooks/use-mentor-pool-selection.d.ts.map +1 -0
- package/dist/hooks/use-mentor-pool-selection.js +642 -0
- package/dist/hooks/use-mentor-pool-selection.js.map +1 -0
- package/dist/hooks/use-provider-selection.d.ts +10 -0
- package/dist/hooks/use-provider-selection.d.ts.map +1 -1
- package/dist/hooks/use-provider-selection.js +105 -6
- package/dist/hooks/use-provider-selection.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +10 -2
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/lib/agent-chat-service.d.ts +3 -6
- package/dist/lib/agent-chat-service.d.ts.map +1 -1
- package/dist/lib/agent-chat-service.js +11 -1
- package/dist/lib/agent-chat-service.js.map +1 -1
- package/dist/lib/agent-client.d.ts +23 -3
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +227 -20
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +2 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +8 -2
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +2 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +33 -7
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/lib/editor-impl.d.ts.map +1 -1
- package/dist/lib/editor-impl.js +14 -17
- package/dist/lib/editor-impl.js.map +1 -1
- package/dist/lib/harness-input-idle.d.ts +16 -0
- package/dist/lib/harness-input-idle.d.ts.map +1 -0
- package/dist/lib/harness-input-idle.js +51 -0
- package/dist/lib/harness-input-idle.js.map +1 -0
- package/dist/lib/input-owner.d.ts +3 -0
- package/dist/lib/input-owner.d.ts.map +1 -1
- package/dist/lib/input-owner.js +2 -0
- package/dist/lib/input-owner.js.map +1 -1
- package/dist/lib/subagent-bridge.d.ts +3 -3
- package/dist/lib/subagent-bridge.d.ts.map +1 -1
- package/dist/lib/subagent-bridge.js +16 -9
- package/dist/lib/subagent-bridge.js.map +1 -1
- package/dist/lib/tool-invoke.d.ts +2 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +3 -0
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +5 -0
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/context-compaction.d.ts +4 -0
- package/dist/prompts/context-compaction.d.ts.map +1 -0
- package/dist/prompts/context-compaction.js +18 -0
- package/dist/prompts/context-compaction.js.map +1 -0
- package/dist/prompts/context-compaction.ts +23 -0
- package/dist/prompts/explorer-delegation-contract.test.ts +44 -0
- package/dist/prompts/gpt-5.6.md +1 -1
- package/dist/prompts/kimi.md +1 -1
- package/dist/prompts/orchestrator.md +10 -1
- package/dist/prompts/plan-mode-info.md +4 -4
- package/dist/prompts/plan-mode-stub.md +7 -0
- package/dist/prompts/prefix-quality.test.ts +102 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +4 -1
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +12 -4
- package/dist/prompts/prompt-constructor.ts +4 -1
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +4 -2
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.test.ts +10 -0
- package/dist/prompts/subagent-delegation.ts +4 -2
- package/dist/prompts/subagents/explorer.md +16 -5
- package/dist/prompts/subagents/librarian.md +3 -1
- package/dist/prompts/subagents/mentor.md +2 -0
- package/dist/prompts/subagents/worker.md +3 -1
- package/dist/providers/aborted-stream-recorder.d.ts +20 -0
- package/dist/providers/aborted-stream-recorder.d.ts.map +1 -0
- package/dist/providers/aborted-stream-recorder.js +63 -0
- package/dist/providers/aborted-stream-recorder.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 -1
- package/dist/providers/ai-sdk-streamed-model.js +64 -1
- package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
- package/dist/providers/chained-wire-state.d.ts +6 -0
- package/dist/providers/chained-wire-state.d.ts.map +1 -1
- package/dist/providers/chained-wire-state.js +1 -3
- package/dist/providers/chained-wire-state.js.map +1 -1
- package/dist/providers/codex-auth.d.ts +73 -2
- package/dist/providers/codex-auth.d.ts.map +1 -1
- package/dist/providers/codex-auth.js +166 -2
- package/dist/providers/codex-auth.js.map +1 -1
- package/dist/providers/codex-responses-model.d.ts +10 -2
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +348 -184
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/codex-turn-converter.d.ts.map +1 -1
- package/dist/providers/codex-turn-converter.js +7 -1
- package/dist/providers/codex-turn-converter.js.map +1 -1
- package/dist/providers/codex.provider.d.ts +28 -4
- package/dist/providers/codex.provider.d.ts.map +1 -1
- package/dist/providers/codex.provider.js +106 -81
- package/dist/providers/codex.provider.js.map +1 -1
- package/dist/providers/common/provider-errors.d.ts +20 -0
- package/dist/providers/common/provider-errors.d.ts.map +1 -1
- package/dist/providers/common/provider-errors.js +35 -0
- package/dist/providers/common/provider-errors.js.map +1 -1
- package/dist/providers/grok-auth.d.ts +105 -0
- package/dist/providers/grok-auth.d.ts.map +1 -0
- package/dist/providers/grok-auth.js +316 -0
- package/dist/providers/grok-auth.js.map +1 -0
- package/dist/providers/grok-credit-usage.d.ts +53 -0
- package/dist/providers/grok-credit-usage.d.ts.map +1 -0
- package/dist/providers/grok-credit-usage.js +108 -0
- package/dist/providers/grok-credit-usage.js.map +1 -0
- package/dist/providers/grok.provider.d.ts +24 -0
- package/dist/providers/grok.provider.d.ts.map +1 -0
- package/dist/providers/grok.provider.js +153 -0
- package/dist/providers/grok.provider.js.map +1 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jwt-claims.d.ts +12 -0
- package/dist/providers/jwt-claims.d.ts.map +1 -0
- package/dist/providers/jwt-claims.js +25 -0
- package/dist/providers/jwt-claims.js.map +1 -0
- package/dist/providers/luna-responses-lite-wire-protocol.d.ts +1 -0
- package/dist/providers/luna-responses-lite-wire-protocol.d.ts.map +1 -1
- package/dist/providers/luna-responses-lite-wire-protocol.js +19 -0
- package/dist/providers/luna-responses-lite-wire-protocol.js.map +1 -1
- package/dist/providers/model-catalog/catalog.generated.d.ts +643 -275
- package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
- package/dist/providers/model-catalog/catalog.generated.js +643 -275
- package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
- package/dist/providers/model-catalog/generate-catalog.d.ts.map +1 -1
- package/dist/providers/model-catalog/generate-catalog.js +21 -1
- package/dist/providers/model-catalog/generate-catalog.js.map +1 -1
- package/dist/providers/oauth-account-store.d.ts +84 -0
- package/dist/providers/oauth-account-store.d.ts.map +1 -0
- package/dist/providers/oauth-account-store.js +142 -0
- package/dist/providers/oauth-account-store.js.map +1 -0
- package/dist/providers/oauth-accounts.d.ts +24 -0
- package/dist/providers/oauth-accounts.d.ts.map +1 -0
- package/dist/providers/oauth-accounts.js +37 -0
- package/dist/providers/oauth-accounts.js.map +1 -0
- package/dist/providers/oauth-pkce.d.ts +53 -0
- package/dist/providers/oauth-pkce.d.ts.map +1 -0
- package/dist/providers/oauth-pkce.js +200 -0
- package/dist/providers/oauth-pkce.js.map +1 -0
- package/dist/providers/oauth-session-account.d.ts +5 -0
- package/dist/providers/oauth-session-account.d.ts.map +1 -0
- package/dist/providers/oauth-session-account.js +24 -0
- package/dist/providers/oauth-session-account.js.map +1 -0
- package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
- package/dist/providers/openai-chat-completions-model.js +37 -16
- package/dist/providers/openai-chat-completions-model.js.map +1 -1
- package/dist/providers/openai-compatible-lazy.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts +5 -0
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +32 -2
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openai-responses-model.d.ts +22 -4
- package/dist/providers/openai-responses-model.d.ts.map +1 -1
- package/dist/providers/openai-responses-model.js +126 -51
- package/dist/providers/openai-responses-model.js.map +1 -1
- package/dist/providers/openai.provider.d.ts.map +1 -1
- package/dist/providers/openai.provider.js +23 -2
- package/dist/providers/openai.provider.js.map +1 -1
- package/dist/providers/opencode-routing.d.ts +2 -0
- package/dist/providers/opencode-routing.d.ts.map +1 -1
- package/dist/providers/opencode-routing.js +12 -6
- package/dist/providers/opencode-routing.js.map +1 -1
- package/dist/providers/opencode-transport-discovery.d.ts +18 -0
- package/dist/providers/opencode-transport-discovery.d.ts.map +1 -0
- package/dist/providers/opencode-transport-discovery.js +115 -0
- package/dist/providers/opencode-transport-discovery.js.map +1 -0
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/provider-opaque-compatibility.d.ts +58 -0
- package/dist/providers/provider-opaque-compatibility.d.ts.map +1 -0
- package/dist/providers/provider-opaque-compatibility.js +80 -0
- package/dist/providers/provider-opaque-compatibility.js.map +1 -0
- package/dist/providers/provider-service.d.ts +1 -1
- package/dist/providers/provider-service.d.ts.map +1 -1
- package/dist/providers/provider-service.js.map +1 -1
- package/dist/providers/registry.d.ts +10 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/responses-websocket-sessions.d.ts +25 -0
- package/dist/providers/responses-websocket-sessions.d.ts.map +1 -0
- package/dist/providers/responses-websocket-sessions.js +102 -0
- package/dist/providers/responses-websocket-sessions.js.map +1 -0
- package/dist/providers/websocket-close-evidence.d.ts +45 -0
- package/dist/providers/websocket-close-evidence.d.ts.map +1 -0
- package/dist/providers/websocket-close-evidence.js +78 -0
- package/dist/providers/websocket-close-evidence.js.map +1 -0
- package/dist/providers/websocket-receive-watchdog.d.ts +9 -1
- package/dist/providers/websocket-receive-watchdog.d.ts.map +1 -1
- package/dist/providers/websocket-receive-watchdog.js +27 -1
- package/dist/providers/websocket-receive-watchdog.js.map +1 -1
- package/dist/providers/websocket-request-dispatch.d.ts +35 -0
- package/dist/providers/websocket-request-dispatch.d.ts.map +1 -0
- package/dist/providers/websocket-request-dispatch.js +23 -0
- package/dist/providers/websocket-request-dispatch.js.map +1 -0
- package/dist/scripts/eval-context-compaction/runner.d.ts +2 -0
- package/dist/scripts/eval-context-compaction/runner.d.ts.map +1 -0
- package/dist/scripts/eval-context-compaction/runner.js +159 -0
- package/dist/scripts/eval-context-compaction/runner.js.map +1 -0
- package/dist/services/agent-runtime/agent-handle.d.ts.map +1 -1
- package/dist/services/agent-runtime/agent-handle.js +8 -5
- package/dist/services/agent-runtime/agent-handle.js.map +1 -1
- package/dist/services/agent-runtime/agent-runtime.d.ts +1 -1
- package/dist/services/agent-runtime/agent-runtime.js +1 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts +61 -7
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.js +476 -141
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
- package/dist/services/agent-runtime/context-compaction/index.d.ts +56 -0
- package/dist/services/agent-runtime/context-compaction/index.d.ts.map +1 -0
- package/dist/services/agent-runtime/context-compaction/index.js +131 -0
- package/dist/services/agent-runtime/context-compaction/index.js.map +1 -0
- package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts +81 -0
- package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -0
- package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +214 -0
- package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -0
- package/dist/services/agent-runtime/executor.d.ts +1 -1
- package/dist/services/agent-runtime/executor.d.ts.map +1 -1
- package/dist/services/agent-runtime/executor.js +5 -5
- package/dist/services/agent-runtime/executor.js.map +1 -1
- package/dist/services/agent-runtime/generation-guard.d.ts +17 -2
- package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -1
- package/dist/services/agent-runtime/generation-guard.js +41 -4
- package/dist/services/agent-runtime/generation-guard.js.map +1 -1
- package/dist/services/agent-runtime/run-budget.d.ts +131 -0
- package/dist/services/agent-runtime/run-budget.d.ts.map +1 -0
- package/dist/services/agent-runtime/run-budget.js +268 -0
- package/dist/services/agent-runtime/run-budget.js.map +1 -0
- package/dist/services/agent-runtime/tool-invocation-context.d.ts +12 -0
- package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -1
- package/dist/services/agent-runtime/tool-invocation-context.js.map +1 -1
- package/dist/services/agent-runtime/types.d.ts +5 -4
- package/dist/services/agent-runtime/types.d.ts.map +1 -1
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +2 -1
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/approval/approval-decision-executor.d.ts +6 -1
- package/dist/services/approval/approval-decision-executor.d.ts.map +1 -1
- package/dist/services/approval/approval-decision-executor.js +15 -3
- package/dist/services/approval/approval-decision-executor.js.map +1 -1
- package/dist/services/approval/approval-decision-policy.d.ts.map +1 -1
- package/dist/services/approval/approval-decision-policy.js +3 -0
- package/dist/services/approval/approval-decision-policy.js.map +1 -1
- package/dist/services/approval/approval-flow-coordinator.d.ts +2 -0
- package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
- package/dist/services/approval/approval-flow-coordinator.js +14 -2
- package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
- package/dist/services/approval/background-subagent-approval-controller.d.ts +3 -1
- package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -1
- package/dist/services/approval/background-subagent-approval-controller.js +7 -4
- package/dist/services/approval/background-subagent-approval-controller.js.map +1 -1
- package/dist/services/approval/shell-auto-approval-resolver.d.ts +5 -0
- package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
- package/dist/services/approval/shell-auto-approval-resolver.js +8 -0
- package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
- package/dist/services/approval/tool-approval-batch-coordinator.js +20 -11
- package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
- package/dist/services/approval/tool-ownership-registry.d.ts +5 -1
- package/dist/services/approval/tool-ownership-registry.d.ts.map +1 -1
- package/dist/services/approval/tool-ownership-registry.js +5 -22
- package/dist/services/approval/tool-ownership-registry.js.map +1 -1
- package/dist/services/background-task-activity.d.ts +79 -0
- package/dist/services/background-task-activity.d.ts.map +1 -0
- package/dist/services/background-task-activity.js +34 -0
- package/dist/services/background-task-activity.js.map +1 -0
- package/dist/services/command-message-streaming.d.ts +4 -2
- package/dist/services/command-message-streaming.d.ts.map +1 -1
- package/dist/services/command-message-streaming.js +2 -2
- package/dist/services/command-message-streaming.js.map +1 -1
- package/dist/services/conversation/conversation-adapter-factory.d.ts +6 -2
- package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter-factory.js +5 -1
- package/dist/services/conversation/conversation-adapter-factory.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +41 -9
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +218 -37
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-decoder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-decoder.js +4 -0
- package/dist/services/conversation/conversation-decoder.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +58 -2
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-message-projection.d.ts.map +1 -1
- package/dist/services/conversation/conversation-message-projection.js +7 -3
- package/dist/services/conversation/conversation-message-projection.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +103 -11
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +3 -0
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.d.ts +38 -2
- package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.js +160 -16
- package/dist/services/conversation/conversation-persistence.js.map +1 -1
- package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation/conversation-replay.js +27 -0
- package/dist/services/conversation/conversation-replay.js.map +1 -1
- package/dist/services/conversation/conversation-result-builder.d.ts +6 -2
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.js +60 -1
- package/dist/services/conversation/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation/conversation-runtime-factory.d.ts +9 -1
- package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -1
- package/dist/services/conversation/conversation-runtime-factory.js +5 -1
- package/dist/services/conversation/conversation-runtime-factory.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +33 -3
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +149 -1
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/conversation-state-projector.d.ts +9 -2
- package/dist/services/conversation/conversation-state-projector.d.ts.map +1 -1
- package/dist/services/conversation/conversation-state-projector.js +51 -6
- package/dist/services/conversation/conversation-state-projector.js.map +1 -1
- package/dist/services/conversation/conversation-state-schema.d.ts +8 -4
- package/dist/services/conversation/conversation-state-schema.d.ts.map +1 -1
- package/dist/services/conversation/conversation-state-schema.js +24 -2
- package/dist/services/conversation/conversation-state-schema.js.map +1 -1
- package/dist/services/conversation/conversation-store.d.ts +2 -0
- package/dist/services/conversation/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation/conversation-store.js +8 -0
- package/dist/services/conversation/conversation-store.js.map +1 -1
- package/dist/services/conversation/run-item-normalizer.d.ts.map +1 -1
- package/dist/services/conversation/run-item-normalizer.js +24 -1
- package/dist/services/conversation/run-item-normalizer.js.map +1 -1
- package/dist/services/conversation-agent-client.d.ts +30 -2
- package/dist/services/conversation-agent-client.d.ts.map +1 -1
- package/dist/services/cost/model-cost.d.ts +13 -1
- package/dist/services/cost/model-cost.d.ts.map +1 -1
- package/dist/services/cost/model-cost.js +59 -0
- package/dist/services/cost/model-cost.js.map +1 -1
- package/dist/services/cost/subscription-providers.d.ts +2 -0
- package/dist/services/cost/subscription-providers.d.ts.map +1 -0
- package/dist/services/cost/subscription-providers.js +14 -0
- package/dist/services/cost/subscription-providers.js.map +1 -0
- package/dist/services/grok/grok-credit-usage-service.d.ts +62 -0
- package/dist/services/grok/grok-credit-usage-service.d.ts.map +1 -0
- package/dist/services/grok/grok-credit-usage-service.js +137 -0
- package/dist/services/grok/grok-credit-usage-service.js.map +1 -0
- package/dist/services/history-service.d.ts +9 -0
- package/dist/services/history-service.d.ts.map +1 -1
- package/dist/services/history-service.js +49 -2
- package/dist/services/history-service.js.map +1 -1
- package/dist/services/hooks/hook-composition.d.ts +17 -0
- package/dist/services/hooks/hook-composition.d.ts.map +1 -0
- package/dist/services/hooks/hook-composition.js +19 -0
- package/dist/services/hooks/hook-composition.js.map +1 -0
- package/dist/services/logging/conversation-log-events.d.ts +36 -2
- package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-events.js +17 -0
- package/dist/services/logging/conversation-log-events.js.map +1 -1
- package/dist/services/logging/conversation-log-writer.d.ts +8 -1
- package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
- package/dist/services/logging/conversation-log-writer.js +145 -10
- 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 +18 -0
- package/dist/services/logging/conversation-logger.js.map +1 -1
- package/dist/services/logging/logging-service.d.ts +6 -6
- package/dist/services/logging/logging-service.d.ts.map +1 -1
- package/dist/services/logging/logging-service.js.map +1 -1
- package/dist/services/logging/provider-traffic.d.ts +18 -2
- package/dist/services/logging/provider-traffic.d.ts.map +1 -1
- package/dist/services/logging/provider-traffic.js +293 -142
- 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 +20 -1
- package/dist/services/memory/memory-capabilities.js.map +1 -1
- package/dist/services/mode-notices.d.ts +1 -6
- package/dist/services/mode-notices.d.ts.map +1 -1
- package/dist/services/mode-notices.js +16 -3
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/model-service.d.ts +2 -2
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/queue/queue-controller.d.ts +1 -1
- package/dist/services/queue/queue-controller.d.ts.map +1 -1
- package/dist/services/queue/queue-controller.js +19 -5
- package/dist/services/queue/queue-controller.js.map +1 -1
- package/dist/services/retry/chain-recovery-fingerprint.d.ts +10 -0
- package/dist/services/retry/chain-recovery-fingerprint.d.ts.map +1 -0
- package/dist/services/retry/chain-recovery-fingerprint.js +23 -0
- package/dist/services/retry/chain-recovery-fingerprint.js.map +1 -0
- package/dist/services/retry/recovery-executor.d.ts.map +1 -1
- package/dist/services/retry/recovery-executor.js +10 -9
- 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 -0
- 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 +34 -2
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-contracts.d.ts +14 -0
- package/dist/services/retry/retry-contracts.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.d.ts +17 -3
- package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.js +48 -7
- package/dist/services/retry/retry-error-classification.js.map +1 -1
- package/dist/services/retry/retry-errors.d.ts +4 -0
- package/dist/services/retry/retry-errors.d.ts.map +1 -1
- package/dist/services/retry/retry-errors.js +7 -0
- package/dist/services/retry/retry-errors.js.map +1 -1
- package/dist/services/retry/retry-event-presenter.d.ts.map +1 -1
- package/dist/services/retry/retry-event-presenter.js +20 -0
- package/dist/services/retry/retry-event-presenter.js.map +1 -1
- package/dist/services/runtime-setting-router.d.ts.map +1 -1
- package/dist/services/runtime-setting-router.js +6 -0
- package/dist/services/runtime-setting-router.js.map +1 -1
- package/dist/services/service-interfaces.d.ts +111 -13
- package/dist/services/service-interfaces.d.ts.map +1 -1
- package/dist/services/session/background-task-control.d.ts +6 -0
- package/dist/services/session/background-task-control.d.ts.map +1 -1
- package/dist/services/session/background-task-control.js +31 -6
- package/dist/services/session/background-task-control.js.map +1 -1
- package/dist/services/session/background-task-liveness.d.ts +2 -18
- package/dist/services/session/background-task-liveness.d.ts.map +1 -1
- package/dist/services/session/background-task-liveness.js +7 -22
- package/dist/services/session/background-task-liveness.js.map +1 -1
- package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
- package/dist/services/session/continuation-plan-applier.js +23 -0
- package/dist/services/session/continuation-plan-applier.js.map +1 -1
- package/dist/services/session/continuation-recovery-handler.d.ts +2 -0
- package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/continuation-recovery-handler.js +7 -1
- package/dist/services/session/continuation-recovery-handler.js.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.d.ts +1 -0
- package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
- package/dist/services/session/initial-turn-recovery-handler.js +12 -2
- package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
- package/dist/services/session/session-client-factory.d.ts +3 -1
- package/dist/services/session/session-client-factory.d.ts.map +1 -1
- package/dist/services/session/session-client-factory.js +2 -2
- package/dist/services/session/session-client-factory.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +10 -0
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +130 -7
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-manager.d.ts +3 -0
- package/dist/services/session/session-manager.d.ts.map +1 -1
- package/dist/services/session/session-manager.js +6 -0
- package/dist/services/session/session-manager.js.map +1 -1
- package/dist/services/session/session-stream-processor.d.ts +2 -0
- package/dist/services/session/session-stream-processor.d.ts.map +1 -1
- package/dist/services/session/session-stream-processor.js +7 -1
- package/dist/services/session/session-stream-processor.js.map +1 -1
- package/dist/services/session/session-tool-tracker.d.ts +17 -6
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
- package/dist/services/session/session-tool-tracker.js +19 -7
- package/dist/services/session/session-tool-tracker.js.map +1 -1
- package/dist/services/session/terminal-result-collector.d.ts +2 -2
- package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
- package/dist/services/session/terminal-result-collector.js +2 -1
- package/dist/services/session/terminal-result-collector.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +1 -0
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-coordinator.d.ts +1 -1
- package/dist/services/session/turn-coordinator.d.ts.map +1 -1
- package/dist/services/session/turn-coordinator.js +31 -6
- package/dist/services/session/turn-coordinator.js.map +1 -1
- package/dist/services/session/turn-workflow.d.ts +4 -1
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +48 -7
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/settings/settings-persistence.d.ts +33 -0
- package/dist/services/settings/settings-persistence.d.ts.map +1 -1
- package/dist/services/settings/settings-persistence.js +102 -4
- package/dist/services/settings/settings-persistence.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +122 -2
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +120 -5
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-service.d.ts +57 -3
- package/dist/services/settings/settings-service.d.ts.map +1 -1
- package/dist/services/settings/settings-service.js +171 -28
- package/dist/services/settings/settings-service.js.map +1 -1
- package/dist/services/settings/settings-service.mock.d.ts +1 -1
- package/dist/services/settings/settings-service.mock.d.ts.map +1 -1
- package/dist/services/settings/settings-service.mock.js +3 -6
- package/dist/services/settings/settings-service.mock.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +18 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +27 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +165 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -0
- package/dist/services/shell/background-shell-registry.d.ts +10 -0
- package/dist/services/shell/background-shell-registry.d.ts.map +1 -1
- package/dist/services/shell/background-shell-registry.js +9 -1
- package/dist/services/shell/background-shell-registry.js.map +1 -1
- package/dist/services/shell/background-shell-watches.d.ts +28 -3
- package/dist/services/shell/background-shell-watches.d.ts.map +1 -1
- package/dist/services/shell/background-shell-watches.js +41 -9
- package/dist/services/shell/background-shell-watches.js.map +1 -1
- package/dist/services/ssh-service.d.ts +81 -9
- package/dist/services/ssh-service.d.ts.map +1 -1
- package/dist/services/ssh-service.js +211 -37
- package/dist/services/ssh-service.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts +2 -0
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +44 -8
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/subagents/execution-runner.d.ts +1 -1
- package/dist/services/subagents/execution-runner.d.ts.map +1 -1
- package/dist/services/subagents/execution-runner.js +60 -23
- package/dist/services/subagents/execution-runner.js.map +1 -1
- package/dist/services/subagents/foreground-subagent-lease.d.ts +11 -1
- package/dist/services/subagents/foreground-subagent-lease.d.ts.map +1 -1
- package/dist/services/subagents/foreground-subagent-lease.js +10 -1
- package/dist/services/subagents/foreground-subagent-lease.js.map +1 -1
- package/dist/services/subagents/mentor-runner.d.ts +1 -1
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
- package/dist/services/subagents/mentor-runner.js +121 -16
- package/dist/services/subagents/mentor-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts +11 -1
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +99 -35
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/role-loader.d.ts +6 -0
- package/dist/services/subagents/role-loader.d.ts.map +1 -1
- package/dist/services/subagents/role-loader.js +6 -1
- package/dist/services/subagents/role-loader.js.map +1 -1
- package/dist/services/subagents/runtime.d.ts.map +1 -1
- package/dist/services/subagents/runtime.js +7 -0
- package/dist/services/subagents/runtime.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.d.ts +4 -0
- package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +80 -16
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-manager.d.ts +1 -1
- package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
- package/dist/services/subagents/subagent-manager.js +4 -4
- package/dist/services/subagents/subagent-manager.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +19 -1
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +22 -0
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/subagent-run-control.d.ts +9 -1
- package/dist/services/subagents/subagent-run-control.d.ts.map +1 -1
- package/dist/services/subagents/subagent-run-control.js +12 -13
- package/dist/services/subagents/subagent-run-control.js.map +1 -1
- package/dist/services/subagents/tool-policy.d.ts.map +1 -1
- package/dist/services/subagents/tool-policy.js +11 -3
- package/dist/services/subagents/tool-policy.js.map +1 -1
- package/dist/services/subagents/types.d.ts +25 -2
- package/dist/services/subagents/types.d.ts.map +1 -1
- package/dist/services/subagents/types.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +20 -1
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +40 -2
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts +26 -1
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +103 -33
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/services/workspace/active-workspace-root.d.ts +6 -0
- package/dist/services/workspace/active-workspace-root.d.ts.map +1 -1
- package/dist/services/workspace/active-workspace-root.js +22 -0
- package/dist/services/workspace/active-workspace-root.js.map +1 -1
- package/dist/test-helpers/ink-testing.d.ts.map +1 -1
- package/dist/test-helpers/ink-testing.js +4 -1
- package/dist/test-helpers/ink-testing.js.map +1 -1
- package/dist/test-helpers/terminal-e2e.d.ts.map +1 -1
- package/dist/test-helpers/terminal-e2e.js +12 -2
- package/dist/test-helpers/terminal-e2e.js.map +1 -1
- package/dist/tools/agent/activate-skill.d.ts.map +1 -1
- package/dist/tools/agent/activate-skill.js +3 -2
- package/dist/tools/agent/activate-skill.js.map +1 -1
- package/dist/tools/agent/ask-mentor.d.ts.map +1 -1
- package/dist/tools/agent/ask-mentor.js +7 -3
- package/dist/tools/agent/ask-mentor.js.map +1 -1
- package/dist/tools/agent/ask-user-constants.d.ts +2 -2
- package/dist/tools/agent/ask-user-constants.d.ts.map +1 -1
- package/dist/tools/agent/ask-user-constants.js +1 -1
- package/dist/tools/agent/ask-user-constants.js.map +1 -1
- package/dist/tools/agent/run-subagent-async.d.ts +2 -11
- package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent-async.js +10 -2
- package/dist/tools/agent/run-subagent-async.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +15 -7
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/file/apply-patch.d.ts +2 -0
- package/dist/tools/file/apply-patch.d.ts.map +1 -1
- package/dist/tools/file/apply-patch.js +64 -17
- package/dist/tools/file/apply-patch.js.map +1 -1
- package/dist/tools/file/code-context.d.ts +5 -0
- package/dist/tools/file/code-context.d.ts.map +1 -1
- package/dist/tools/file/code-context.js +20 -6
- package/dist/tools/file/code-context.js.map +1 -1
- package/dist/tools/file/create-file.d.ts.map +1 -1
- package/dist/tools/file/create-file.js +11 -5
- package/dist/tools/file/create-file.js.map +1 -1
- package/dist/tools/file/edit-healing.d.ts +7 -0
- package/dist/tools/file/edit-healing.d.ts.map +1 -1
- package/dist/tools/file/edit-healing.js +7 -7
- package/dist/tools/file/edit-healing.js.map +1 -1
- package/dist/tools/file/glob.d.ts +3 -0
- package/dist/tools/file/glob.d.ts.map +1 -1
- package/dist/tools/file/glob.js +10 -3
- package/dist/tools/file/glob.js.map +1 -1
- package/dist/tools/file/grep.d.ts +5 -0
- package/dist/tools/file/grep.d.ts.map +1 -1
- package/dist/tools/file/grep.js +11 -6
- package/dist/tools/file/grep.js.map +1 -1
- package/dist/tools/file/patch-healing.d.ts +31 -0
- package/dist/tools/file/patch-healing.d.ts.map +1 -0
- package/dist/tools/file/patch-healing.js +231 -0
- package/dist/tools/file/patch-healing.js.map +1 -0
- package/dist/tools/file/read-file.d.ts +5 -0
- package/dist/tools/file/read-file.d.ts.map +1 -1
- package/dist/tools/file/read-file.js +44 -17
- package/dist/tools/file/read-file.js.map +1 -1
- package/dist/tools/file/search-replace.d.ts.map +1 -1
- package/dist/tools/file/search-replace.js +24 -6
- package/dist/tools/file/search-replace.js.map +1 -1
- package/dist/tools/format-helpers.d.ts +6 -0
- package/dist/tools/format-helpers.d.ts.map +1 -1
- package/dist/tools/format-helpers.js +23 -0
- 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 +2 -2
- package/dist/tools/memory/memory-tools.js.map +1 -1
- package/dist/tools/system/shell.d.ts +16 -1
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +91 -25
- package/dist/tools/system/shell.js.map +1 -1
- package/dist/tools/types.d.ts +9 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/web/web-fetch.d.ts.map +1 -1
- package/dist/tools/web/web-fetch.js +12 -14
- package/dist/tools/web/web-fetch.js.map +1 -1
- package/dist/tools/web/web-search.d.ts.map +1 -1
- package/dist/tools/web/web-search.js +3 -2
- package/dist/tools/web/web-search.js.map +1 -1
- package/dist/types/message.d.ts +1 -1
- package/dist/types/message.d.ts.map +1 -1
- package/dist/utils/ai/provider-credentials.d.ts +1 -1
- package/dist/utils/ai/provider-credentials.d.ts.map +1 -1
- package/dist/utils/ai/provider-credentials.js +18 -2
- package/dist/utils/ai/provider-credentials.js.map +1 -1
- package/dist/utils/ai/token-usage.d.ts +3 -1
- package/dist/utils/ai/token-usage.d.ts.map +1 -1
- package/dist/utils/ai/token-usage.js +7 -2
- package/dist/utils/ai/token-usage.js.map +1 -1
- package/dist/utils/apply-diff.d.ts.map +1 -1
- package/dist/utils/apply-diff.js +8 -0
- package/dist/utils/apply-diff.js.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +73 -3
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/error-helpers.d.ts.map +1 -1
- package/dist/utils/error-helpers.js +8 -0
- package/dist/utils/error-helpers.js.map +1 -1
- package/dist/utils/inject-warning-into-tool-output.d.ts +30 -0
- package/dist/utils/inject-warning-into-tool-output.d.ts.map +1 -1
- package/dist/utils/inject-warning-into-tool-output.js +39 -0
- package/dist/utils/inject-warning-into-tool-output.js.map +1 -1
- package/dist/utils/output/bound-tool-result.d.ts +42 -0
- package/dist/utils/output/bound-tool-result.d.ts.map +1 -0
- package/dist/utils/output/bound-tool-result.js +81 -0
- package/dist/utils/output/bound-tool-result.js.map +1 -0
- package/dist/utils/output/tty-osc.d.ts +1 -1
- package/dist/utils/output/tty-osc.js +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +122 -8
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/execute-shell.d.ts +8 -0
- package/dist/utils/shell/execute-shell.d.ts.map +1 -1
- package/dist/utils/shell/execute-shell.js +36 -30
- package/dist/utils/shell/execute-shell.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-env.d.ts +1 -0
- package/dist/utils/shell/sandbox/sandbox-env.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-env.js +2 -0
- package/dist/utils/shell/sandbox/sandbox-env.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts +2 -0
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.js +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.js.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js +1 -2
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js.map +1 -1
- package/dist/utils/shell/shell-child-registry.d.ts +11 -0
- package/dist/utils/shell/shell-child-registry.d.ts.map +1 -0
- package/dist/utils/shell/shell-child-registry.js +40 -0
- package/dist/utils/shell/shell-child-registry.js.map +1 -0
- package/dist/utils/shell/shell-output.d.ts +11 -0
- package/dist/utils/shell/shell-output.d.ts.map +1 -1
- package/dist/utils/shell/shell-output.js +24 -10
- package/dist/utils/shell/shell-output.js.map +1 -1
- package/dist/utils/shell/temp-sweep.d.ts +28 -0
- package/dist/utils/shell/temp-sweep.d.ts.map +1 -0
- package/dist/utils/shell/temp-sweep.js +140 -0
- package/dist/utils/shell/temp-sweep.js.map +1 -0
- package/dist/utils/streaming/extract-command-messages.d.ts +12 -5
- package/dist/utils/streaming/extract-command-messages.d.ts.map +1 -1
- package/dist/utils/streaming/extract-command-messages.js +29 -33
- package/dist/utils/streaming/extract-command-messages.js.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.d.ts +8 -0
- package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming/streaming-session-factory.js +3 -0
- package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
- package/dist/utils/value-suggestions.d.ts +8 -0
- package/dist/utils/value-suggestions.d.ts.map +1 -1
- package/dist/utils/value-suggestions.js +71 -0
- package/dist/utils/value-suggestions.js.map +1 -1
- package/package.json +14 -10
- package/dist/utils/output/synchronized-output.d.ts +0 -35
- package/dist/utils/output/synchronized-output.d.ts.map +0 -1
- package/dist/utils/output/synchronized-output.js +0 -66
- package/dist/utils/output/synchronized-output.js.map +0 -1
|
@@ -5,13 +5,15 @@ import { isZodToolParameterSchema } from '../../tools/types.js';
|
|
|
5
5
|
import { normalizeToolParameters } from '../../lib/tool-invoke.js';
|
|
6
6
|
import { isCancellationError, isHarnessInvariantError } from '../../lib/harness-invariant-error.js';
|
|
7
7
|
import { ApprovalLedger } from './tool-invocation-context.js';
|
|
8
|
+
import { RunBudget, isRunBudgetInteraction, } from './run-budget.js';
|
|
8
9
|
import { addTokenUsage, normalizeUsage } from '../../utils/ai/token-usage.js';
|
|
9
10
|
import { computeModelCost } from '../../services/cost/model-cost.js';
|
|
10
11
|
import { getCatalogPricingVersion, getModelPricing } from '../../services/cost/pricing.js';
|
|
11
12
|
import { GenerationDeadline, GenerationGuard, GenerationGuardError, } from './generation-guard.js';
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
* — the SDK-era `callModelInputFilter` hook is deliberately
|
|
14
|
+
* Compatibility error for legacy callers without a staged run budget. The loop
|
|
15
|
+
* owns turn counting — the SDK-era `callModelInputFilter` hook is deliberately
|
|
16
|
+
* not reintroduced.
|
|
15
17
|
*/
|
|
16
18
|
export class MaxTurnsExceededError extends Error {
|
|
17
19
|
maxTurns;
|
|
@@ -65,6 +67,8 @@ class EventQueue {
|
|
|
65
67
|
* turns and silently drop later turns' records.
|
|
66
68
|
*/
|
|
67
69
|
let nextCostRequestSeq = 0;
|
|
70
|
+
let nextToolBatchSeq = 0;
|
|
71
|
+
const DEFAULT_MAX_PARALLEL_TOOL_CALLS = 3;
|
|
68
72
|
/**
|
|
69
73
|
* Small provider-neutral agent loop. It owns model-turn sequencing and tool
|
|
70
74
|
* execution; providers only implement `StreamedModelTurn`.
|
|
@@ -74,6 +78,7 @@ export class ApplicationRunLoop {
|
|
|
74
78
|
#contextCompactionSessionState;
|
|
75
79
|
#activeAbortController = null;
|
|
76
80
|
#runInFlight = false;
|
|
81
|
+
#segmentGeneration = 0;
|
|
77
82
|
/**
|
|
78
83
|
* Set when a segment ends holding approvals, meaning the turn is pausing
|
|
79
84
|
* rather than finishing. Injections offered during the pause wait here for
|
|
@@ -93,6 +98,8 @@ export class ApplicationRunLoop {
|
|
|
93
98
|
*/
|
|
94
99
|
#turnOpen = false;
|
|
95
100
|
#pendingSteers = [];
|
|
101
|
+
/** The run whose budget an out-of-band grant applies to, held across a pause. */
|
|
102
|
+
#activeRunBudgetState;
|
|
96
103
|
constructor(deps) {
|
|
97
104
|
this.#deps = deps;
|
|
98
105
|
this.#contextCompactionSessionState = deps.contextCompactionSessionState ?? { disabled: false };
|
|
@@ -134,6 +141,38 @@ export class ApplicationRunLoop {
|
|
|
134
141
|
this.#activeAbortController?.abort();
|
|
135
142
|
this.#activeAbortController = null;
|
|
136
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Grant one finite continuation extension to the current logical run.
|
|
146
|
+
*
|
|
147
|
+
* The interactive prompt calls this before resuming because it has to show
|
|
148
|
+
* the human a refusal rather than a silent stop. The grant is recorded so the
|
|
149
|
+
* matching `approve` does not charge a second one.
|
|
150
|
+
*/
|
|
151
|
+
grantRunBudgetExtension(grantedBy = 'human') {
|
|
152
|
+
const state = this.#activeRunBudgetState;
|
|
153
|
+
if (!state?.runBudget)
|
|
154
|
+
return { granted: false, extensionsGranted: 0 };
|
|
155
|
+
const grant = state.runBudget.grantExtension(grantedBy);
|
|
156
|
+
if (grant.granted)
|
|
157
|
+
state.runBudgetGrantConsumed = true;
|
|
158
|
+
return grant;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Charge this interaction's extension unless a caller already took it.
|
|
162
|
+
*
|
|
163
|
+
* An ungranted arrival here means nobody was prompted — the continuation
|
|
164
|
+
* applier, non-interactive mode, `--auto-approve`. That is a parent-class
|
|
165
|
+
* grant, so it is capped and eventually refuses.
|
|
166
|
+
*/
|
|
167
|
+
#takeRunBudgetGrant(state) {
|
|
168
|
+
if (state.runBudgetGrantConsumed) {
|
|
169
|
+
state.runBudgetGrantConsumed = false;
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
if (!state.runBudget)
|
|
173
|
+
return true;
|
|
174
|
+
return state.runBudget.grantExtension('parent').granted;
|
|
175
|
+
}
|
|
137
176
|
/**
|
|
138
177
|
* Hand the running turn a user message to send with its next model request.
|
|
139
178
|
*
|
|
@@ -250,7 +289,9 @@ export class ApplicationRunLoop {
|
|
|
250
289
|
history: normalizeHistory(input),
|
|
251
290
|
// A response ID is usable only after its provider origin is recorded.
|
|
252
291
|
// This also makes old callers that omit providerId fail closed.
|
|
253
|
-
responseId: options.
|
|
292
|
+
responseId: options.disableChainingForAttempt !== true &&
|
|
293
|
+
options.providerId &&
|
|
294
|
+
options.supportsConversationChaining === true
|
|
254
295
|
? options.previousResponseId ?? undefined
|
|
255
296
|
: undefined,
|
|
256
297
|
pendingApprovals: [],
|
|
@@ -260,6 +301,7 @@ export class ApplicationRunLoop {
|
|
|
260
301
|
? options.providerId
|
|
261
302
|
: undefined,
|
|
262
303
|
requestPreparation: options.requestPreparation,
|
|
304
|
+
disableChainingForAttempt: options.disableChainingForAttempt === true,
|
|
263
305
|
sessionId: options.sessionId,
|
|
264
306
|
turnId: options.turnId,
|
|
265
307
|
hookScope: options.hookScope,
|
|
@@ -267,12 +309,36 @@ export class ApplicationRunLoop {
|
|
|
267
309
|
approvals: options.approvals ?? new ApprovalLedger(),
|
|
268
310
|
turnCount: 0,
|
|
269
311
|
maxTurns: options.maxTurns,
|
|
312
|
+
...(options.runBudget
|
|
313
|
+
? {
|
|
314
|
+
runBudget: new RunBudget(options.runBudget),
|
|
315
|
+
onRunBudgetEvent: options.onRunBudgetEvent,
|
|
316
|
+
wrapUpOnCriticalRunBudget: options.wrapUpOnCriticalRunBudget,
|
|
317
|
+
runBudgetEscalation: options.runBudget.escalation,
|
|
318
|
+
}
|
|
319
|
+
: {}),
|
|
320
|
+
automaticCompactionsThisRun: 0,
|
|
270
321
|
};
|
|
271
322
|
state.approve = (interruption) => {
|
|
323
|
+
if (isRunBudgetInteraction(interruption)) {
|
|
324
|
+
// Continuing past an exhausted envelope must cost a finite extension no
|
|
325
|
+
// matter which surface answered. A caller that already took the grant
|
|
326
|
+
// (the interactive prompt, which needs the outcome before resuming)
|
|
327
|
+
// marks it consumed; every other path — the continuation applier,
|
|
328
|
+
// non-interactive, --auto-approve — lands here ungranted and takes it
|
|
329
|
+
// now. Without this, an auto-approved 'y' would resume with every stage
|
|
330
|
+
// still latched and never check in again.
|
|
331
|
+
state.runBudgetInteractionDecision = this.#takeRunBudgetGrant(state) ? 'continue' : 'stop';
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
272
334
|
state.approvalDecision = 'approved';
|
|
273
335
|
state.approvalDecisionCallId = getInterruptionCallId(interruption);
|
|
274
336
|
};
|
|
275
337
|
state.reject = (interruption, approvalOptions) => {
|
|
338
|
+
if (isRunBudgetInteraction(interruption)) {
|
|
339
|
+
state.runBudgetInteractionDecision = 'stop';
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
276
342
|
state.approvalDecision = 'rejected';
|
|
277
343
|
state.approvalDecisionCallId = getInterruptionCallId(interruption);
|
|
278
344
|
state.approvalMessage = approvalOptions?.message;
|
|
@@ -298,6 +364,15 @@ export class ApplicationRunLoop {
|
|
|
298
364
|
// Handles created before cost accounting existed have no record list.
|
|
299
365
|
if (!state.costRecords)
|
|
300
366
|
state.costRecords = [];
|
|
367
|
+
if (!state.runBudget && options.runBudget) {
|
|
368
|
+
state.runBudget = new RunBudget(options.runBudget);
|
|
369
|
+
}
|
|
370
|
+
if (options.runBudget)
|
|
371
|
+
state.runBudgetEscalation = options.runBudget.escalation;
|
|
372
|
+
if (options.onRunBudgetEvent)
|
|
373
|
+
state.onRunBudgetEvent = options.onRunBudgetEvent;
|
|
374
|
+
if (options.wrapUpOnCriticalRunBudget)
|
|
375
|
+
state.wrapUpOnCriticalRunBudget = true;
|
|
301
376
|
// Response IDs are provider-owned. A handle from before provenance was
|
|
302
377
|
// recorded, a missing providerId, or a provider switch must never forward
|
|
303
378
|
// its opaque ID. In particular, do not use previousResponseId as a
|
|
@@ -336,6 +411,11 @@ export class ApplicationRunLoop {
|
|
|
336
411
|
// root closure for callers that do not provide one again.
|
|
337
412
|
if (options.requestPreparation)
|
|
338
413
|
state.requestPreparation = options.requestPreparation;
|
|
414
|
+
if (options.disableChainingForAttempt === true) {
|
|
415
|
+
state.disableChainingForAttempt = true;
|
|
416
|
+
state.responseId = undefined;
|
|
417
|
+
state.responseProviderId = undefined;
|
|
418
|
+
}
|
|
339
419
|
if (options.sessionId !== undefined)
|
|
340
420
|
state.sessionId = options.sessionId;
|
|
341
421
|
if (options.turnId !== undefined)
|
|
@@ -346,10 +426,12 @@ export class ApplicationRunLoop {
|
|
|
346
426
|
}
|
|
347
427
|
#run(state, options) {
|
|
348
428
|
const queue = new EventQueue();
|
|
429
|
+
const segmentGeneration = ++this.#segmentGeneration;
|
|
349
430
|
this.abortSegment();
|
|
350
431
|
const controller = new AbortController();
|
|
351
432
|
this.#activeAbortController = controller;
|
|
352
433
|
this.#runInFlight = true;
|
|
434
|
+
state.runBudget?.resume();
|
|
353
435
|
// This segment is running, so the turn is no longer paused between them.
|
|
354
436
|
this.#turnPaused = false;
|
|
355
437
|
if (options.signal) {
|
|
@@ -368,6 +450,15 @@ export class ApplicationRunLoop {
|
|
|
368
450
|
get turn() {
|
|
369
451
|
return { count: state.turnCount, max: state.maxTurns };
|
|
370
452
|
},
|
|
453
|
+
get budget() {
|
|
454
|
+
return state.runBudget
|
|
455
|
+
? {
|
|
456
|
+
takeSoftEvidence: () => state.runBudget?.takeSoftEvidence(),
|
|
457
|
+
takeStallEvidence: () => state.runBudget?.takeStallEvidence(),
|
|
458
|
+
remainingPolicy: () => state.runBudget?.remainingPolicy(),
|
|
459
|
+
}
|
|
460
|
+
: undefined;
|
|
461
|
+
},
|
|
371
462
|
};
|
|
372
463
|
const output = [];
|
|
373
464
|
const stream = createAgentStream({
|
|
@@ -397,6 +488,9 @@ export class ApplicationRunLoop {
|
|
|
397
488
|
throw error;
|
|
398
489
|
})
|
|
399
490
|
.finally(() => {
|
|
491
|
+
state.runBudget?.pause();
|
|
492
|
+
if (segmentGeneration !== this.#segmentGeneration)
|
|
493
|
+
return;
|
|
400
494
|
if (this.#activeAbortController === controller)
|
|
401
495
|
this.#activeAbortController = null;
|
|
402
496
|
this.#runInFlight = false;
|
|
@@ -406,10 +500,13 @@ export class ApplicationRunLoop {
|
|
|
406
500
|
// that ends with nothing outstanding has truly finished the turn, and
|
|
407
501
|
// then anything still waiting has to be sent as its own turn instead.
|
|
408
502
|
const pendingApprovals = state.pendingApprovals?.length ?? 0;
|
|
503
|
+
const pendingBudgetInteraction = state.pendingRunBudgetInteraction !== undefined;
|
|
409
504
|
const cancelled = stream.cancelled === true;
|
|
410
|
-
this.#turnPaused = pendingApprovals > 0 && !cancelled && exitError === undefined;
|
|
505
|
+
this.#turnPaused = (pendingApprovals > 0 || pendingBudgetInteraction) && !cancelled && exitError === undefined;
|
|
411
506
|
if (this.#turnPaused)
|
|
412
507
|
return;
|
|
508
|
+
if (this.#activeRunBudgetState === state)
|
|
509
|
+
this.#activeRunBudgetState = undefined;
|
|
413
510
|
// A declared turn outlives its segments — this one may be about to be
|
|
414
511
|
// retried, or resumed past a post-execute gate. Its owner says when it
|
|
415
512
|
// is over.
|
|
@@ -417,17 +514,33 @@ export class ApplicationRunLoop {
|
|
|
417
514
|
return;
|
|
418
515
|
this.#releasePendingSteers({
|
|
419
516
|
pendingApprovals,
|
|
517
|
+
pendingBudgetInteraction,
|
|
420
518
|
cancelled,
|
|
421
519
|
error: exitError instanceof Error ? exitError.name : exitError ? String(exitError) : undefined,
|
|
422
520
|
turnCount: state.turnCount,
|
|
423
521
|
});
|
|
424
522
|
});
|
|
523
|
+
this.#activeRunBudgetState = state.runBudget ? state : undefined;
|
|
425
524
|
return stream;
|
|
426
525
|
}
|
|
427
526
|
async #execute(state, stream, queue, options, toolContext, requestAbortController) {
|
|
428
527
|
while (true) {
|
|
429
528
|
if (options.signal?.aborted)
|
|
430
529
|
throw Object.assign(new Error('Operation aborted'), { name: 'AbortError' });
|
|
530
|
+
if (state.pendingRunBudgetInteraction) {
|
|
531
|
+
if (state.runBudgetInteractionDecision === 'stop') {
|
|
532
|
+
state.pendingRunBudgetInteraction = undefined;
|
|
533
|
+
state.runBudgetInteractionDecision = undefined;
|
|
534
|
+
return finish(stream, state, queue);
|
|
535
|
+
}
|
|
536
|
+
if (state.runBudgetInteractionDecision === 'continue') {
|
|
537
|
+
state.pendingRunBudgetInteraction = undefined;
|
|
538
|
+
state.runBudgetInteractionDecision = undefined;
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
return this.#pauseForRunBudgetInteraction(state, stream, queue);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
431
544
|
state.pendingApprovals ??= state.pendingApproval ? [state.pendingApproval] : [];
|
|
432
545
|
if (state.pendingApprovals.length > 0 && state.approvalDecision) {
|
|
433
546
|
const selectedIndex = state.approvalDecisionCallId
|
|
@@ -445,27 +558,20 @@ export class ApplicationRunLoop {
|
|
|
445
558
|
else {
|
|
446
559
|
state.approvals.rejectTool({ toolName: pending.toolName, callId: pending.callId }, { message: state.approvalMessage });
|
|
447
560
|
}
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
const result = typeof rawResult === 'string' ? rawResult : JSON.stringify(rawResult);
|
|
452
|
-
const resultItem = {
|
|
453
|
-
type: 'function_call_result',
|
|
454
|
-
callId: pending.callId,
|
|
455
|
-
name: pending.toolName,
|
|
456
|
-
output: result,
|
|
457
|
-
};
|
|
458
|
-
state.history.push(resultItem);
|
|
459
|
-
state.input.push({ type: 'tool_result', id: pending.callId, output: result });
|
|
460
|
-
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
561
|
+
pending.plan.status = 'ready';
|
|
562
|
+
if (!approved)
|
|
563
|
+
pending.plan.output = state.approvalMessage ?? 'rejected';
|
|
461
564
|
state.pendingApprovals.splice(pendingIndex, 1);
|
|
462
565
|
state.pendingApproval = state.pendingApprovals[0];
|
|
463
566
|
state.approvalDecision = undefined;
|
|
464
567
|
state.approvalDecisionCallId = undefined;
|
|
465
568
|
state.approvalMessage = undefined;
|
|
569
|
+
await this.#settleToolPlan(state, stream, queue, toolContext);
|
|
466
570
|
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
467
|
-
if (state.pendingApprovals.length > 0)
|
|
571
|
+
if (state.pendingApprovals.length > 0) {
|
|
572
|
+
this.#turnPaused = true;
|
|
468
573
|
return finish(stream, state, queue);
|
|
574
|
+
}
|
|
469
575
|
// Nothing is outstanding, so this segment is terminal — see
|
|
470
576
|
// `stopAfterApprovalResolution`. Stopping here rather than at the
|
|
471
577
|
// request boundary below is what keeps the just-recorded tool result
|
|
@@ -473,32 +579,115 @@ export class ApplicationRunLoop {
|
|
|
473
579
|
if (options.stopAfterApprovalResolution)
|
|
474
580
|
return finish(stream, state, queue);
|
|
475
581
|
}
|
|
582
|
+
// A budget interaction can park a response after its tool calls are
|
|
583
|
+
// recorded but before any body runs. Resume those retained calls only
|
|
584
|
+
// after processing an ordinary approval decision for that same plan.
|
|
585
|
+
if (state.toolPlan) {
|
|
586
|
+
await this.#settleToolPlan(state, stream, queue, toolContext);
|
|
587
|
+
if (state.pendingApprovals?.length) {
|
|
588
|
+
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
589
|
+
this.#turnPaused = true;
|
|
590
|
+
return finish(stream, state, queue);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
476
593
|
// The request boundary: every tool result of the previous round is in
|
|
477
594
|
// history, and the next request has not been built. A user message
|
|
478
595
|
// admitted here reaches the model in sequence, mid-turn.
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
596
|
+
if (!state.requestBoundaryReady) {
|
|
597
|
+
this.#admitPendingSteers(state, stream, queue);
|
|
598
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
599
|
+
if (state.pendingRunBudgetInteraction)
|
|
600
|
+
return this.#pauseForRunBudgetInteraction(state, stream, queue);
|
|
601
|
+
if (options.boundaryCompaction) {
|
|
602
|
+
const compactionStartedAt = Date.now();
|
|
603
|
+
const compaction = await options.boundaryCompaction.compact({
|
|
604
|
+
history: state.history,
|
|
605
|
+
automaticCompactionsThisRun: state.automaticCompactionsThisRun ?? 0,
|
|
606
|
+
signal: options.signal,
|
|
607
|
+
onStarted: (provider) => outputPush(stream, queue, { type: 'context_compaction_started', provider, strategy: 'local' }),
|
|
608
|
+
});
|
|
609
|
+
if (compaction.kind === 'compacted') {
|
|
610
|
+
state.history.splice(0, state.history.length, ...compaction.history);
|
|
611
|
+
state.input.splice(0, state.input.length, ...normalizeApplicationInput(compaction.modelInput));
|
|
612
|
+
state.responseId = undefined;
|
|
613
|
+
state.responseProviderId = undefined;
|
|
614
|
+
if (compaction.costRecords?.length) {
|
|
615
|
+
state.costRecords ??= [];
|
|
616
|
+
state.costRecords.push(...compaction.costRecords);
|
|
617
|
+
}
|
|
618
|
+
state.automaticCompactionsThisRun = (state.automaticCompactionsThisRun ?? 0) + 1;
|
|
619
|
+
outputPush(stream, queue, {
|
|
620
|
+
type: 'context_compaction_completed',
|
|
621
|
+
provider: state.currentProviderId ?? 'unknown',
|
|
622
|
+
strategy: 'local',
|
|
623
|
+
durationMs: Math.max(0, Date.now() - compactionStartedAt),
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
else if (compaction.kind === 'failed') {
|
|
627
|
+
outputPush(stream, queue, {
|
|
628
|
+
type: 'context_compaction_failed',
|
|
629
|
+
provider: compaction.provider,
|
|
630
|
+
strategy: 'local',
|
|
631
|
+
durationMs: Math.max(0, Date.now() - compactionStartedAt),
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
// Summarization is an asynchronous part of this same request
|
|
635
|
+
// boundary. Admit anything that arrived while it was in flight after
|
|
636
|
+
// applying a replacement, so the steer cannot be overwritten by the
|
|
637
|
+
// checkpoint or miss a terminal model request.
|
|
638
|
+
this.#admitPendingSteers(state, stream, queue);
|
|
639
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
640
|
+
if (state.pendingRunBudgetInteraction)
|
|
641
|
+
return this.#pauseForRunBudgetInteraction(state, stream, queue);
|
|
642
|
+
}
|
|
643
|
+
state.turnCount += 1;
|
|
644
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
645
|
+
if (state.pendingRunBudgetInteraction) {
|
|
646
|
+
state.requestBoundaryReady = true;
|
|
647
|
+
return this.#pauseForRunBudgetInteraction(state, stream, queue);
|
|
648
|
+
}
|
|
649
|
+
// Retain the legacy error only for callers that have not adopted staged
|
|
650
|
+
// budgets. A configured run budget turns the same count into critical
|
|
651
|
+
// evidence and lets the decision surface choose what happens next.
|
|
652
|
+
if (!state.runBudget && state.maxTurns !== undefined && state.turnCount > state.maxTurns) {
|
|
653
|
+
throw new MaxTurnsExceededError(state.maxTurns);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
state.requestBoundaryReady = undefined;
|
|
483
658
|
}
|
|
484
659
|
const model = await this.#deps.resolveModel(state.agent.model);
|
|
485
660
|
let sawToolCall = false;
|
|
661
|
+
const streamedToolCalls = [];
|
|
486
662
|
let completion;
|
|
487
663
|
let pendingNativeReasoning;
|
|
488
664
|
// Stable process-unique request id, allocated immediately before dispatch
|
|
489
665
|
// so a cost record can be settled exactly once (success or failure).
|
|
490
666
|
const requestId = this.#nextRequestId();
|
|
667
|
+
const criticalWrapUp = state.criticalWrapUpPending === true && state.criticalWrapUpDispatched !== true;
|
|
668
|
+
if (criticalWrapUp)
|
|
669
|
+
state.criticalWrapUpDispatched = true;
|
|
670
|
+
const disableChaining = state.disableChainingForAttempt === true;
|
|
671
|
+
if (disableChaining) {
|
|
672
|
+
state.disableChainingForAttempt = false;
|
|
673
|
+
state.responseId = undefined;
|
|
674
|
+
state.responseProviderId = undefined;
|
|
675
|
+
}
|
|
491
676
|
const request = {
|
|
492
|
-
instructions:
|
|
677
|
+
instructions: criticalWrapUp
|
|
678
|
+
? `${state.agent.instructions}\n\nBudget containment is terminal. Do not call tools. In this one final response, summarize what you completed, the evidence you have, and what remains.`
|
|
679
|
+
: state.agent.instructions,
|
|
493
680
|
...(state.supportsConversationChaining &&
|
|
681
|
+
!disableChaining &&
|
|
494
682
|
state.responseId &&
|
|
495
683
|
state.responseProviderId !== undefined &&
|
|
496
684
|
state.responseProviderId === state.currentProviderId
|
|
497
685
|
? { previousResponseId: state.responseId }
|
|
498
686
|
: {}),
|
|
687
|
+
...(disableChaining ? { disableChaining: true } : {}),
|
|
499
688
|
input: state.input,
|
|
500
|
-
tools: toModelTools(state.agent.tools),
|
|
501
|
-
applicationTools: state.agent.tools,
|
|
689
|
+
tools: toModelTools(criticalWrapUp ? [] : state.agent.tools),
|
|
690
|
+
applicationTools: criticalWrapUp ? [] : state.agent.tools,
|
|
502
691
|
...(state.agent.modelSettings?.temperature !== undefined
|
|
503
692
|
? { temperature: state.agent.modelSettings.temperature }
|
|
504
693
|
: {}),
|
|
@@ -527,7 +716,7 @@ export class ApplicationRunLoop {
|
|
|
527
716
|
...options.generationGuard,
|
|
528
717
|
});
|
|
529
718
|
const consume = async () => {
|
|
530
|
-
const deadline = new GenerationDeadline(generationGuard.requestDeadlineMs, () => requestAbortController.abort());
|
|
719
|
+
const deadline = new GenerationDeadline(generationGuard.requestDeadlineMs, () => requestAbortController.abort(), () => generationGuard.progress);
|
|
531
720
|
let iterator;
|
|
532
721
|
let iteratorFinished = false;
|
|
533
722
|
try {
|
|
@@ -572,7 +761,7 @@ export class ApplicationRunLoop {
|
|
|
572
761
|
generationGuard.observeToolCall(event.arguments);
|
|
573
762
|
pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
|
|
574
763
|
sawToolCall = true;
|
|
575
|
-
|
|
764
|
+
streamedToolCalls.push(event);
|
|
576
765
|
}
|
|
577
766
|
}
|
|
578
767
|
}
|
|
@@ -610,10 +799,27 @@ export class ApplicationRunLoop {
|
|
|
610
799
|
// persistence and replay, and a cost event must never become a
|
|
611
800
|
// restored history item.
|
|
612
801
|
queue.push({ type: 'cost_update', record });
|
|
802
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
613
803
|
throw error;
|
|
614
804
|
}
|
|
615
|
-
if (!completion)
|
|
616
|
-
|
|
805
|
+
if (!completion) {
|
|
806
|
+
// A few application-owned model fixtures (and legacy adapters) end a
|
|
807
|
+
// tool-call stream immediately after the call and use the next request
|
|
808
|
+
// as the continuation boundary. Preserve that contract while routing
|
|
809
|
+
// the calls through the same ordered dispatcher. An empty stream still
|
|
810
|
+
// fails closed as an incomplete model turn.
|
|
811
|
+
if (streamedToolCalls.length === 0)
|
|
812
|
+
throw new Error('Application model turn ended without completion');
|
|
813
|
+
if (criticalWrapUp)
|
|
814
|
+
return finish(stream, state, queue);
|
|
815
|
+
await this.#dispatchToolCalls(state, stream, queue, streamedToolCalls, toolContext);
|
|
816
|
+
if (state.pendingApprovals && state.pendingApprovals.length > 0) {
|
|
817
|
+
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
818
|
+
this.#turnPaused = true;
|
|
819
|
+
return finish(stream, state, queue);
|
|
820
|
+
}
|
|
821
|
+
continue;
|
|
822
|
+
}
|
|
617
823
|
// Commit the authoritative terminal state before handling terminal-only
|
|
618
824
|
// tool calls. Approval may pause immediately after this point, and the
|
|
619
825
|
// continuation must still carry the response that produced the calls.
|
|
@@ -675,11 +881,18 @@ export class ApplicationRunLoop {
|
|
|
675
881
|
providerUsd: completion.costUsd,
|
|
676
882
|
});
|
|
677
883
|
queue.push({ type: 'cost_update', record });
|
|
884
|
+
// Cost and usage arrive in the same completion metadata, so surface both
|
|
885
|
+
// live. The footer is a per-request indicator: emit this request's own
|
|
886
|
+
// usage, never the run accumulator in `state.usage`.
|
|
887
|
+
if (normalizedCompletionUsage)
|
|
888
|
+
queue.push({ type: 'usage_update', usage: normalizedCompletionUsage });
|
|
889
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
678
890
|
stream.lastResponseId = completion.responseId;
|
|
679
891
|
stream.rawResponses?.push(completion);
|
|
680
892
|
// Some provider adapters report function calls only in the terminal
|
|
681
893
|
// completion rather than as separate stream events. Their reasoning may
|
|
682
894
|
// likewise be terminal-only, so associate it before replaying calls.
|
|
895
|
+
const toolCalls = [...streamedToolCalls];
|
|
683
896
|
if (!sawToolCall) {
|
|
684
897
|
for (const item of completion.output) {
|
|
685
898
|
if (item.type === 'reasoning')
|
|
@@ -690,7 +903,7 @@ export class ApplicationRunLoop {
|
|
|
690
903
|
continue;
|
|
691
904
|
pendingNativeReasoning = commitPendingNativeReasoning(state, stream, queue, pendingNativeReasoning);
|
|
692
905
|
sawToolCall = true;
|
|
693
|
-
|
|
906
|
+
toolCalls.push(item);
|
|
694
907
|
}
|
|
695
908
|
}
|
|
696
909
|
// A native reasoning item belongs to the completed assistant turn even
|
|
@@ -730,108 +943,192 @@ export class ApplicationRunLoop {
|
|
|
730
943
|
outputPush(stream, queue, { type: 'item', item });
|
|
731
944
|
state.input.push({ type: 'message', role: 'assistant', content: [{ type: 'text', text: assistantText }] });
|
|
732
945
|
}
|
|
946
|
+
// Tool calls are dispatched only after the reasoning, provider-opaque,
|
|
947
|
+
// and assistant-text items from the same completion are committed. A
|
|
948
|
+
// response that carries both prose and a tool call must serialize as
|
|
949
|
+
// text -> function_call -> function_call_result; dispatching first left
|
|
950
|
+
// the text stranded after its own tool result, where the assistant
|
|
951
|
+
// message merger glued it onto the *next* turn's tool call and every
|
|
952
|
+
// request ended with a bare assistant message. Models read that as a
|
|
953
|
+
// turn truncated mid-sentence and restart instead of progressing.
|
|
954
|
+
if (!state.criticalWrapUpPending && toolCalls.length > 0) {
|
|
955
|
+
await this.#dispatchToolCalls(state, stream, queue, toolCalls, toolContext);
|
|
956
|
+
}
|
|
957
|
+
// A critical subagent gets exactly this final tool-free model call.
|
|
958
|
+
if (criticalWrapUp)
|
|
959
|
+
return finish(stream, state, queue);
|
|
960
|
+
if (state.pendingRunBudgetInteraction && toolCalls.length > 0) {
|
|
961
|
+
return this.#pauseForRunBudgetInteraction(state, stream, queue);
|
|
962
|
+
}
|
|
733
963
|
if (state.pendingApprovals.length > 0) {
|
|
734
964
|
stream.interruptions = state.pendingApprovals.map((item) => item.interruption);
|
|
965
|
+
this.#turnPaused = true;
|
|
735
966
|
return finish(stream, state, queue);
|
|
736
967
|
}
|
|
737
|
-
if (!sawToolCall)
|
|
968
|
+
if (!sawToolCall) {
|
|
969
|
+
// Evidence discovered when a response has already completed needs no
|
|
970
|
+
// human boundary: there is no later request or tool to block.
|
|
971
|
+
state.pendingRunBudgetInteraction = undefined;
|
|
738
972
|
return finish(stream, state, queue);
|
|
973
|
+
}
|
|
739
974
|
}
|
|
740
975
|
}
|
|
741
|
-
async #
|
|
742
|
-
const
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
callId: event.id,
|
|
747
|
-
name: event.name,
|
|
748
|
-
arguments: event.arguments,
|
|
749
|
-
};
|
|
750
|
-
state.history.push(callItem);
|
|
751
|
-
state.input.push({ type: 'tool_call', id: event.id, name: event.name, arguments: event.arguments });
|
|
752
|
-
outputPush(stream, queue, { type: 'item', item: callItem });
|
|
753
|
-
if (!definition) {
|
|
754
|
-
const output = `Unknown tool: ${event.name}`;
|
|
755
|
-
const resultItem = {
|
|
756
|
-
type: 'function_call_result',
|
|
976
|
+
async #dispatchToolCalls(state, stream, queue, events, toolContext) {
|
|
977
|
+
const plan = events.map((event) => {
|
|
978
|
+
const definition = state.agent.tools.find((tool) => tool.name === event.name);
|
|
979
|
+
const callItem = {
|
|
980
|
+
type: 'function_call',
|
|
757
981
|
callId: event.id,
|
|
758
982
|
name: event.name,
|
|
759
|
-
|
|
983
|
+
arguments: event.arguments,
|
|
760
984
|
};
|
|
761
|
-
state.history.push(
|
|
762
|
-
state.input.push({ type: '
|
|
763
|
-
outputPush(stream, queue, { type: 'item', item:
|
|
764
|
-
return
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
// executor fallbacks on the strict JSON-schema path.
|
|
770
|
-
const params = normalizeToolParameters(args, definition.parameters);
|
|
771
|
-
// Consult this run's ledger before prompting: a decision already taken
|
|
772
|
-
// (in the parent run and replayed in, or earlier in this run) must not
|
|
773
|
-
// prompt again. This is what makes approval replay observable.
|
|
774
|
-
const alreadyDecided = state.approvals.isToolApproved({ toolName: event.name, callId: event.id });
|
|
775
|
-
if (alreadyDecided === false) {
|
|
776
|
-
const message = state.approvals.getRejectionMessage(event.name, event.id) ?? 'Tool execution was not approved.';
|
|
777
|
-
const resultItem = {
|
|
778
|
-
type: 'function_call_result',
|
|
779
|
-
callId: event.id,
|
|
780
|
-
name: event.name,
|
|
781
|
-
output: message,
|
|
985
|
+
state.history.push(callItem);
|
|
986
|
+
state.input.push({ type: 'tool_call', id: event.id, name: event.name, arguments: event.arguments });
|
|
987
|
+
outputPush(stream, queue, { type: 'item', item: callItem });
|
|
988
|
+
return {
|
|
989
|
+
event,
|
|
990
|
+
definition,
|
|
991
|
+
parallelSafe: false,
|
|
992
|
+
status: 'ready',
|
|
782
993
|
};
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
994
|
+
});
|
|
995
|
+
state.toolPlan = plan;
|
|
996
|
+
for (const entry of plan) {
|
|
997
|
+
const { event, definition } = entry;
|
|
998
|
+
if (!definition) {
|
|
999
|
+
entry.output = `Unknown tool: ${event.name}`;
|
|
1000
|
+
continue;
|
|
1001
|
+
}
|
|
1002
|
+
// Keep the raw-model invocation contract: normalization repairs the
|
|
1003
|
+
// accepted object shape but intentionally does not Zod-parse it, which
|
|
1004
|
+
// would apply schema defaults before execute. web_fetch relies on its
|
|
1005
|
+
// executor fallbacks on the strict JSON-schema path.
|
|
1006
|
+
entry.params = normalizeToolParameters(parseArguments(event.arguments), definition.parameters);
|
|
1007
|
+
const stallEvent = state.runBudget?.observeToolCall({
|
|
794
1008
|
name: event.name,
|
|
795
|
-
output,
|
|
796
|
-
};
|
|
797
|
-
state.history.push(resultItem);
|
|
798
|
-
state.input.push({ type: 'tool_result', id: event.id, output });
|
|
799
|
-
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
800
|
-
return;
|
|
801
|
-
}
|
|
802
|
-
if (await definition.needsApproval(params, toolContext)) {
|
|
803
|
-
const pending = {
|
|
804
|
-
callId: event.id,
|
|
805
|
-
toolName: event.name,
|
|
806
1009
|
argumentsText: event.arguments,
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
1010
|
+
effect: definition.effect,
|
|
1011
|
+
});
|
|
1012
|
+
if (stallEvent) {
|
|
1013
|
+
this.#emitRunBudgetEvent(state, stallEvent, 'Tool stall evidence', stream, queue);
|
|
1014
|
+
}
|
|
1015
|
+
// Consult this run's ledger before prompting: a decision already taken
|
|
1016
|
+
// (in the parent run and replayed in, or earlier in this run) must not
|
|
1017
|
+
// prompt again. This is what makes approval replay observable.
|
|
1018
|
+
const alreadyDecided = state.approvals.isToolApproved({ toolName: event.name, callId: event.id });
|
|
1019
|
+
if (alreadyDecided === false) {
|
|
1020
|
+
entry.output = state.approvals.getRejectionMessage(event.name, event.id) ?? 'Tool execution was not approved.';
|
|
1021
|
+
continue;
|
|
1022
|
+
}
|
|
1023
|
+
if (alreadyDecided !== true && (await definition.needsApproval(entry.params, toolContext))) {
|
|
1024
|
+
entry.status = 'approval_pending';
|
|
1025
|
+
const pending = {
|
|
810
1026
|
callId: event.id,
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
1027
|
+
toolName: event.name,
|
|
1028
|
+
argumentsText: event.arguments,
|
|
1029
|
+
interruption: {
|
|
1030
|
+
type: 'tool_approval_item',
|
|
1031
|
+
rawItem: { type: 'function_call', callId: event.id, name: event.name, arguments: event.arguments },
|
|
1032
|
+
callId: event.id,
|
|
1033
|
+
name: event.name,
|
|
1034
|
+
arguments: event.arguments,
|
|
1035
|
+
},
|
|
1036
|
+
definition,
|
|
1037
|
+
params: entry.params,
|
|
1038
|
+
plan: entry,
|
|
1039
|
+
};
|
|
1040
|
+
state.pendingApprovals ??= [];
|
|
1041
|
+
state.pendingApprovals.push(pending);
|
|
1042
|
+
continue;
|
|
1043
|
+
}
|
|
1044
|
+
entry.parallelSafe = await isParallelSafe(definition, entry.params, toolContext);
|
|
1045
|
+
}
|
|
1046
|
+
state.pendingApproval = state.pendingApprovals?.[0];
|
|
1047
|
+
stream.interruptions = (state.pendingApprovals ?? []).map((item) => item.interruption);
|
|
1048
|
+
this.#deps.logDiagnostic?.('tool parallel eligibility', {
|
|
1049
|
+
decisions: plan.map((entry) => ({
|
|
1050
|
+
callId: entry.event.id,
|
|
1051
|
+
toolName: entry.event.name,
|
|
1052
|
+
parallelSafe: entry.parallelSafe,
|
|
1053
|
+
approvalPending: entry.status === 'approval_pending',
|
|
1054
|
+
})),
|
|
1055
|
+
});
|
|
1056
|
+
// A main-agent budget escalation is a real boundary: retain the planned
|
|
1057
|
+
// calls, but do not execute one more tool while human judgement is pending.
|
|
1058
|
+
if (!state.pendingRunBudgetInteraction) {
|
|
1059
|
+
await this.#settleToolPlan(state, stream, queue, toolContext);
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
async #settleToolPlan(state, stream, queue, toolContext) {
|
|
1063
|
+
const plan = state.toolPlan;
|
|
1064
|
+
if (!plan)
|
|
822
1065
|
return;
|
|
1066
|
+
const maxParallelToolCalls = Math.max(1, Math.floor(this.#deps.resolveMaxParallelToolCalls?.() ?? DEFAULT_MAX_PARALLEL_TOOL_CALLS));
|
|
1067
|
+
while (true) {
|
|
1068
|
+
const firstPending = plan.find((entry) => entry.status !== 'completed');
|
|
1069
|
+
if (!firstPending) {
|
|
1070
|
+
state.toolPlan = undefined;
|
|
1071
|
+
return;
|
|
1072
|
+
}
|
|
1073
|
+
if (firstPending.status === 'approval_pending')
|
|
1074
|
+
return;
|
|
1075
|
+
const group = [];
|
|
1076
|
+
for (const entry of plan) {
|
|
1077
|
+
if (entry.status === 'completed')
|
|
1078
|
+
continue;
|
|
1079
|
+
if (entry.status === 'approval_pending')
|
|
1080
|
+
break;
|
|
1081
|
+
if (group.length > 0 && (!entry.parallelSafe || !group[0].parallelSafe || group.length >= maxParallelToolCalls))
|
|
1082
|
+
break;
|
|
1083
|
+
group.push(entry);
|
|
1084
|
+
if (!entry.parallelSafe)
|
|
1085
|
+
break;
|
|
1086
|
+
}
|
|
1087
|
+
const batchId = `tool-batch-${++nextToolBatchSeq}`;
|
|
1088
|
+
this.#deps.logDiagnostic?.('tool batch dispatched', {
|
|
1089
|
+
batchId,
|
|
1090
|
+
callIds: group.map((entry) => entry.event.id),
|
|
1091
|
+
parallel: group.length > 1,
|
|
1092
|
+
maxParallelToolCalls,
|
|
1093
|
+
dispatchOrder: group.map((entry) => entry.event.id),
|
|
1094
|
+
});
|
|
1095
|
+
if (group.length > 1) {
|
|
1096
|
+
const results = await Promise.allSettled(group.map((entry) => this.#invokePlannedTool(entry, toolContext, state)));
|
|
1097
|
+
const rejected = results.find((result) => result.status === 'rejected');
|
|
1098
|
+
if (rejected)
|
|
1099
|
+
throw rejected.reason;
|
|
1100
|
+
for (const [index, result] of results.entries()) {
|
|
1101
|
+
this.#appendToolResult(state, stream, queue, group[index], result.value);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
else {
|
|
1105
|
+
const result = await this.#invokePlannedTool(group[0], toolContext, state);
|
|
1106
|
+
this.#appendToolResult(state, stream, queue, group[0], result);
|
|
1107
|
+
}
|
|
1108
|
+
this.#deps.logDiagnostic?.('tool batch settled', {
|
|
1109
|
+
batchId,
|
|
1110
|
+
settlementOrder: group.map((entry) => entry.event.id),
|
|
1111
|
+
});
|
|
823
1112
|
}
|
|
824
|
-
|
|
1113
|
+
}
|
|
1114
|
+
async #invokePlannedTool(entry, toolContext, state) {
|
|
1115
|
+
entry.status = 'completed';
|
|
1116
|
+
if (entry.output !== undefined)
|
|
1117
|
+
return entry.output;
|
|
1118
|
+
return this.#invokeTool(entry.definition, entry.params, toolContext, entry.event.id, state);
|
|
1119
|
+
}
|
|
1120
|
+
#appendToolResult(state, stream, queue, entry, result) {
|
|
825
1121
|
const output = typeof result === 'string' ? result : JSON.stringify(result);
|
|
826
1122
|
const resultItem = {
|
|
827
1123
|
type: 'function_call_result',
|
|
828
|
-
callId: event.id,
|
|
829
|
-
name: event.name,
|
|
1124
|
+
callId: entry.event.id,
|
|
1125
|
+
name: entry.event.name,
|
|
830
1126
|
output,
|
|
831
1127
|
};
|
|
832
1128
|
state.history.push(resultItem);
|
|
833
|
-
state.input.push({ type: 'tool_result', id: event.id, output });
|
|
1129
|
+
state.input.push({ type: 'tool_result', id: entry.event.id, output });
|
|
834
1130
|
outputPush(stream, queue, { type: 'item', item: resultItem });
|
|
1131
|
+
this.#evaluateRunBudget(state, stream, queue);
|
|
835
1132
|
}
|
|
836
1133
|
/**
|
|
837
1134
|
* A tool that throws must not take the run down with it.
|
|
@@ -864,6 +1161,9 @@ export class ApplicationRunLoop {
|
|
|
864
1161
|
attempt,
|
|
865
1162
|
scope: state?.hookScope ?? 'root',
|
|
866
1163
|
};
|
|
1164
|
+
// Dispatch mark must run before execute so a mid-tool stream failure can
|
|
1165
|
+
// settle the ledger as unknown rather than aborted.
|
|
1166
|
+
this.#deps.getOnToolDispatch?.()?.(callId);
|
|
867
1167
|
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.before(lifecycleContext));
|
|
868
1168
|
try {
|
|
869
1169
|
const result = await definition.execute(params, toolContext, { toolCall: { callId } });
|
|
@@ -876,15 +1176,6 @@ export class ApplicationRunLoop {
|
|
|
876
1176
|
throw error;
|
|
877
1177
|
}
|
|
878
1178
|
const message = error instanceof Error ? error.message : String(error);
|
|
879
|
-
// Feeding the same failure back forever is its own failure mode: some
|
|
880
|
-
// errors no argument can fix. Repeat the identical result once, then say
|
|
881
|
-
// so plainly rather than inviting a third identical attempt.
|
|
882
|
-
const repeated = state ? countRepeatedFailure(state, definition.name, params, message) : 1;
|
|
883
|
-
if (repeated > MAX_IDENTICAL_TOOL_FAILURES) {
|
|
884
|
-
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.`;
|
|
885
|
-
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
|
|
886
|
-
return result;
|
|
887
|
-
}
|
|
888
1179
|
const result = `Error: ${message}`;
|
|
889
1180
|
await this.#notifyToolLifecycle(() => this.#deps.toolLifecycle?.error(lifecycleContext, error, Date.now() - startedAt, true));
|
|
890
1181
|
return result;
|
|
@@ -909,6 +1200,49 @@ export class ApplicationRunLoop {
|
|
|
909
1200
|
state.costRecords = [...(state.costRecords ?? []), record];
|
|
910
1201
|
return record;
|
|
911
1202
|
}
|
|
1203
|
+
#evaluateRunBudget(state, stream, queue) {
|
|
1204
|
+
if (!state.runBudget)
|
|
1205
|
+
return;
|
|
1206
|
+
for (const event of state.runBudget.evaluate({
|
|
1207
|
+
turns: state.turnCount,
|
|
1208
|
+
costRecords: state.costRecords ?? [],
|
|
1209
|
+
})) {
|
|
1210
|
+
this.#emitRunBudgetEvent(state, event, 'Run budget evidence', stream, queue);
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
#emitRunBudgetEvent(state, event, message, stream, queue) {
|
|
1214
|
+
if (event.type === 'budget_stage' && event.stage === 'critical' && state.wrapUpOnCriticalRunBudget) {
|
|
1215
|
+
state.criticalWrapUpPending = true;
|
|
1216
|
+
}
|
|
1217
|
+
if (!state.wrapUpOnCriticalRunBudget &&
|
|
1218
|
+
!state.pendingRunBudgetInteraction &&
|
|
1219
|
+
state.runBudgetEscalation !== 'warn' &&
|
|
1220
|
+
this.#requiresHumanBudgetDecision(event)) {
|
|
1221
|
+
state.pendingRunBudgetInteraction = { type: 'run_budget_interaction', event };
|
|
1222
|
+
state.runBudgetGrantConsumed = false;
|
|
1223
|
+
}
|
|
1224
|
+
if (stream && queue)
|
|
1225
|
+
outputPush(stream, queue, { type: 'run_budget', evidence: event });
|
|
1226
|
+
try {
|
|
1227
|
+
state.onRunBudgetEvent?.(event);
|
|
1228
|
+
}
|
|
1229
|
+
catch {
|
|
1230
|
+
// Evidence observers are delivery adapters, not budget owners.
|
|
1231
|
+
this.#deps.logDiagnostic?.('Run budget event observer failed', { type: event.type });
|
|
1232
|
+
}
|
|
1233
|
+
this.#deps.logDiagnostic?.(message, event);
|
|
1234
|
+
}
|
|
1235
|
+
#requiresHumanBudgetDecision(event) {
|
|
1236
|
+
return event.type === 'tool_stall' || (event.type === 'budget_stage' && event.stage !== 'soft');
|
|
1237
|
+
}
|
|
1238
|
+
#pauseForRunBudgetInteraction(state, stream, queue) {
|
|
1239
|
+
const interaction = state.pendingRunBudgetInteraction;
|
|
1240
|
+
if (!interaction)
|
|
1241
|
+
return finish(stream, state, queue);
|
|
1242
|
+
stream.interruptions = [interaction];
|
|
1243
|
+
this.#turnPaused = true;
|
|
1244
|
+
return finish(stream, state, queue);
|
|
1245
|
+
}
|
|
912
1246
|
async #notifyToolLifecycle(operation) {
|
|
913
1247
|
if (!operation)
|
|
914
1248
|
return;
|
|
@@ -921,27 +1255,6 @@ export class ApplicationRunLoop {
|
|
|
921
1255
|
}
|
|
922
1256
|
}
|
|
923
1257
|
}
|
|
924
|
-
/**
|
|
925
|
-
* How many times an identical failing call is fed back before the loop stops
|
|
926
|
-
* inviting retries. One repeat is worth allowing: a transient failure resolves,
|
|
927
|
-
* and a model given the error often corrects on its second attempt.
|
|
928
|
-
*/
|
|
929
|
-
const MAX_IDENTICAL_TOOL_FAILURES = 2;
|
|
930
|
-
function countRepeatedFailure(state, toolName, params, message) {
|
|
931
|
-
let key;
|
|
932
|
-
try {
|
|
933
|
-
key = JSON.stringify([toolName, params, message]);
|
|
934
|
-
}
|
|
935
|
-
catch {
|
|
936
|
-
// Unserializable params cannot be compared for identity; treat every such
|
|
937
|
-
// failure as distinct rather than collapsing unrelated calls together.
|
|
938
|
-
return 1;
|
|
939
|
-
}
|
|
940
|
-
state.toolFailureCounts ??= new Map();
|
|
941
|
-
const count = (state.toolFailureCounts.get(key) ?? 0) + 1;
|
|
942
|
-
state.toolFailureCounts.set(key, count);
|
|
943
|
-
return count;
|
|
944
|
-
}
|
|
945
1258
|
function outputPush(stream, queue, item) {
|
|
946
1259
|
stream.output.push(item);
|
|
947
1260
|
if (stream.newItems !== stream.output)
|
|
@@ -967,6 +1280,15 @@ function finish(stream, state, queue) {
|
|
|
967
1280
|
* Chat-Completions continuation field. Generic reasoning remains display-only
|
|
968
1281
|
* so providers with different native formats are not given a foreign field.
|
|
969
1282
|
*/
|
|
1283
|
+
/**
|
|
1284
|
+
* True when any lane namespace in the metadata carries an `encrypted_content`
|
|
1285
|
+
* blob — the shape every Responses adapter produces, whichever vendor it is.
|
|
1286
|
+
*/
|
|
1287
|
+
function hasNamespacedEncryptedReasoning(metadata) {
|
|
1288
|
+
if (!metadata)
|
|
1289
|
+
return false;
|
|
1290
|
+
return Object.values(metadata).some((value) => asRecord(value)?.encrypted_content !== undefined);
|
|
1291
|
+
}
|
|
970
1292
|
function appendNativeReasoning(current, event) {
|
|
971
1293
|
const nativeReasoning = event.providerMetadata?.reasoning_content;
|
|
972
1294
|
if (typeof nativeReasoning === 'string') {
|
|
@@ -983,8 +1305,10 @@ function appendNativeReasoning(current, event) {
|
|
|
983
1305
|
}
|
|
984
1306
|
// Responses providers return encrypted reasoning only on their terminal
|
|
985
1307
|
// output. Their metadata is namespaced, so retain it without turning it into
|
|
986
|
-
// the Chat-Completions-only reasoning_content convention.
|
|
987
|
-
|
|
1308
|
+
// the Chat-Completions-only reasoning_content convention. Match on the
|
|
1309
|
+
// namespaced shape rather than an allowlist of lane names: an allowlist
|
|
1310
|
+
// silently drops the reasoning of every Responses lane added later.
|
|
1311
|
+
if (hasNamespacedEncryptedReasoning(event.providerMetadata)) {
|
|
988
1312
|
return {
|
|
989
1313
|
...(event.id ? { id: event.id } : current?.id ? { id: current.id } : {}),
|
|
990
1314
|
text: event.text,
|
|
@@ -1043,6 +1367,17 @@ function parseArguments(value) {
|
|
|
1043
1367
|
return {};
|
|
1044
1368
|
}
|
|
1045
1369
|
}
|
|
1370
|
+
async function isParallelSafe(definition, params, context) {
|
|
1371
|
+
if (typeof definition.parallelSafe === 'function') {
|
|
1372
|
+
try {
|
|
1373
|
+
return await definition.parallelSafe(params, context);
|
|
1374
|
+
}
|
|
1375
|
+
catch {
|
|
1376
|
+
return false;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
return definition.parallelSafe === true;
|
|
1380
|
+
}
|
|
1046
1381
|
function getInterruptionCallId(value) {
|
|
1047
1382
|
if (typeof value !== 'object' || value === null)
|
|
1048
1383
|
return undefined;
|