mixdog 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/package.json +2 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +599 -0
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +11 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/defaults/skills/setup/SKILL.md +6 -1
- package/src/defaults/skills/setup/references/actions.md +44 -22
- package/src/defaults/skills/setup/references/surfaces.md +10 -8
- package/src/headless-exec.mjs +15 -8
- package/src/lib/keychain-cjs.cjs +20 -15
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +6 -4
- package/src/rules/lead/LEAD.md +7 -9
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
- package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
- package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +219 -196
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +208 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/index.mjs +1 -0
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
- package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +36 -33
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
- package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
- package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
- package/src/runtime/office/README.md +1 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
- package/src/runtime/office/core/office-actions-read.mjs +3 -0
- package/src/runtime/office/core/office-render-preview.mjs +2 -0
- package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
- package/src/runtime/office/core/office-sessions.mjs +5 -0
- package/src/runtime/office/core/office-transactions.mjs +3 -0
- package/src/runtime/office/core/office-write-ledger.mjs +94 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +29 -0
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
- package/src/runtime/office/pdf/pdf-render.mjs +23 -7
- package/src/runtime/office/pdf/pdf-security.mjs +2 -0
- package/src/runtime/office/portable/portable-opc.mjs +4 -1
- package/src/runtime/office/quality/visual-diff.mjs +2 -0
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +191 -0
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/buffered-appender.mjs +18 -0
- package/src/runtime/shared/config.mjs +78 -18
- package/src/runtime/shared/err-text.mjs +48 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +8 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
- package/src/runtime/shared/session-sidebar-host.mjs +38 -0
- package/src/runtime/shared/slow-span.mjs +121 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
- package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
- package/src/runtime/shared/tool-card-model.mjs +5 -2
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-output-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +22 -1
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +20 -6
- package/src/runtime/shared/tool-work-units.mjs +54 -11
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +24 -6
- package/src/runtime/shared/turn-changes.mjs +269 -100
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
- package/src/runtime/shared/turn-snapshot.mjs +865 -683
- package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +533 -0
- package/src/runtime/shared/worktrees/contract.mjs +60 -0
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
- package/src/runtime/shared/worktrees/git-head.mjs +214 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +525 -31
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +57 -20
- package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
- package/src/runtime/tidy/apply.mjs +47 -2
- package/src/runtime/tidy/run-engines.mjs +11 -5
- package/src/session-runtime/agent-tool-routing.mjs +19 -13
- package/src/session-runtime/boot/apis.mjs +20 -6
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +4 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +3 -3
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
- package/src/session-runtime/internal-tool-executor.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +70 -14
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +116 -36
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +19 -9
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/runtime-review-api.mjs +8 -2
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
- package/src/session-runtime/services/agent-tool.mjs +7 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/channel-admin.mjs +19 -3
- package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
- package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
- package/src/session-runtime/services/provider-admin.mjs +158 -15
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +17 -14
- package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
- package/src/session-runtime/setup-tool/executor.mjs +57 -9
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/tool-surface.mjs +5 -1
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/compaction-gate.mjs +25 -0
- package/src/session-runtime/turn/session-ops.mjs +7 -5
- package/src/session-runtime/turn/side-question-ops.mjs +19 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +26 -45
- package/src/session-runtime/usage-stats-api.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +35 -41
- package/src/session-runtime/workspace/transition-steps.mjs +215 -116
- package/src/session-runtime/workspace/transitions.mjs +428 -73
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-local-session-bridge.mjs +14 -1
- package/src/standalone/daemon-owner.mjs +17 -4
- package/src/standalone/daemon-pg-stop.mjs +49 -0
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stop-budget.d.mts +2 -0
- package/src/standalone/daemon-stop-budget.mjs +18 -0
- package/src/standalone/daemon-stored-session-views.mjs +25 -3
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +63 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +80 -30
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +14 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +3 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-service-api.mjs +6 -1
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
- package/src/tui/app/shell-layout/surfaces.mjs +3 -1
- package/src/tui/app/slash-commands.mjs +19 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
- package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
- package/src/tui/app/use-global-key-input.mjs +5 -12
- package/src/tui/app/use-prompt-handlers.mjs +11 -0
- package/src/tui/components/BtwPanel.jsx +53 -0
- package/src/tui/components/QuestionPanel.jsx +275 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +2897 -1722
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +4 -5
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +14 -10
- package/src/tui/session/session-api/controls.mjs +14 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +14 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +9 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +20 -8
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +179 -32
- package/src/tui/session/turn.mjs +50 -36
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/workflows/default/WORKFLOW.md +3 -1
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { makeInvalidToolArgsMarker } from '../lib/openai-tool-args.mjs';
|
|
2
2
|
import { synthLeakedOpenAICall } from '../openai-compat-stream-common.mjs';
|
|
3
3
|
import { createToolCallDedupe, dedupeToolCallList } from '../lib/leaked-toolcall.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
customToolCallFromResponseItem,
|
|
6
|
+
nativeToolSearchCallFromArguments,
|
|
7
|
+
qualifiedToolCallName,
|
|
8
|
+
withToolCallNamespace,
|
|
9
|
+
} from '../custom-tool-wire.mjs';
|
|
5
10
|
import { createActiveToolItemTracker } from '../tool-stream-state.mjs';
|
|
6
11
|
|
|
7
12
|
// tool_search_call.arguments parse. Module-scope (exported) for direct test
|
|
@@ -64,7 +69,7 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
64
69
|
} catch {}
|
|
65
70
|
}
|
|
66
71
|
function emit(call) {
|
|
67
|
-
if (!toolDedupe.shouldDispatch(call
|
|
72
|
+
if (!toolDedupe.shouldDispatch(qualifiedToolCallName(call), call?.arguments, call?.id)) return;
|
|
68
73
|
fire(call);
|
|
69
74
|
}
|
|
70
75
|
function settle() {
|
|
@@ -84,6 +89,8 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
84
89
|
}
|
|
85
90
|
function pushToolSearchCall(item) {
|
|
86
91
|
if (item?.type !== 'tool_search_call') return;
|
|
92
|
+
// Server-executed search already ran inside the response; replay-only.
|
|
93
|
+
if (item.execution === 'server') return;
|
|
87
94
|
const callId = item.call_id || item.id || '';
|
|
88
95
|
if (!callId || toolCalls.some((call) => call.id === callId)) return;
|
|
89
96
|
const call = nativeToolSearchCallFromArguments(callId, parseToolSearchArgs(item.arguments));
|
|
@@ -106,7 +113,10 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
106
113
|
const type = item?.type;
|
|
107
114
|
if (type === 'function_call') {
|
|
108
115
|
markStarted(item);
|
|
109
|
-
pendingCalls.set(
|
|
116
|
+
pendingCalls.set(
|
|
117
|
+
item.id || '',
|
|
118
|
+
withToolCallNamespace({ name: item.name || '', callId: item.call_id || '' }, item)
|
|
119
|
+
);
|
|
110
120
|
} else if (type === 'custom_tool_call' || type === 'tool_search_call') {
|
|
111
121
|
// tool_search is marked in-flight at item-added time too, so the
|
|
112
122
|
// semantic-idle stall gate's pendingToolUse never drops a mid-flight
|
|
@@ -134,7 +144,7 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
134
144
|
argumentsText: event.arguments || JSON.stringify(args),
|
|
135
145
|
});
|
|
136
146
|
if (pending?.callId && pending?.name) {
|
|
137
|
-
const call = { id: pending.callId, name: pending.name, arguments: args };
|
|
147
|
+
const call = withToolCallNamespace({ id: pending.callId, name: pending.name, arguments: args }, pending);
|
|
138
148
|
toolCalls.push(call);
|
|
139
149
|
emit(call);
|
|
140
150
|
pendingCalls.delete(itemId);
|
|
@@ -150,31 +160,45 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
150
160
|
// bundle. If salvage also fails the stream fails explicitly — masking the
|
|
151
161
|
// gap with a synthetic id just shifts the failure one turn later under a
|
|
152
162
|
// confusing "No tool output found for function call" error.
|
|
153
|
-
toolCalls.push(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
toolCalls.push(
|
|
164
|
+
withToolCallNamespace(
|
|
165
|
+
{
|
|
166
|
+
id: pending?.callId || '',
|
|
167
|
+
name: pending?.name || '',
|
|
168
|
+
arguments: args,
|
|
169
|
+
_pendingItemId: itemId,
|
|
170
|
+
_deferred: true,
|
|
171
|
+
},
|
|
172
|
+
pending
|
|
173
|
+
)
|
|
174
|
+
);
|
|
160
175
|
}
|
|
161
176
|
|
|
162
|
-
/**
|
|
177
|
+
/** A complete function_call item (output_item.done, or the terminal
|
|
178
|
+
* response output bundle) through the one deduplicated collector: it
|
|
179
|
+
* resolves the deferred placeholder for its item (canonical call_id/name
|
|
180
|
+
* from the item, missing ones kept from the placeholder), is skipped when
|
|
181
|
+
* its call_id is already recorded, and is otherwise created and
|
|
182
|
+
* dispatched — so a call present only in the terminal bundle still runs. */
|
|
163
183
|
function completeFunctionCallItem(item) {
|
|
164
184
|
const itemId = item.id || '';
|
|
165
185
|
const callId = item.call_id || '';
|
|
166
186
|
const name = item.name || '';
|
|
167
187
|
const args = parseFunctionCallArgs(argsTextOf(item.arguments));
|
|
168
188
|
const deferred = toolCalls.find((tc) => tc?._deferred && (!itemId || tc._pendingItemId === itemId));
|
|
169
|
-
if (deferred
|
|
170
|
-
deferred.id = callId;
|
|
171
|
-
deferred.name = name;
|
|
172
|
-
deferred
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
189
|
+
if (deferred) {
|
|
190
|
+
deferred.id = callId || deferred.id;
|
|
191
|
+
deferred.name = name || deferred.name;
|
|
192
|
+
withToolCallNamespace(deferred, item);
|
|
193
|
+
if (deferred.id && deferred.name) {
|
|
194
|
+
deferred.arguments =
|
|
195
|
+
deferred.arguments && Object.keys(deferred.arguments).length > 0 ? deferred.arguments : args;
|
|
196
|
+
delete deferred._deferred;
|
|
197
|
+
delete deferred._pendingItemId;
|
|
198
|
+
emit(deferred);
|
|
199
|
+
}
|
|
176
200
|
} else if (callId && name && !toolCalls.some((tc) => tc?.id === callId)) {
|
|
177
|
-
const call = { id: callId, name, arguments: args };
|
|
201
|
+
const call = withToolCallNamespace({ id: callId, name, arguments: args }, item);
|
|
178
202
|
toolCalls.push(call);
|
|
179
203
|
emit(call);
|
|
180
204
|
}
|
|
@@ -193,21 +217,6 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
193
217
|
settle();
|
|
194
218
|
}
|
|
195
219
|
|
|
196
|
-
/** response.completed salvage: when arguments.done fired before (or
|
|
197
|
-
* without) a matching output_item.added, the deferred placeholder has an
|
|
198
|
-
* empty id/name; the bundle carries the canonical call_id/name. */
|
|
199
|
-
function salvageFunctionCall(item) {
|
|
200
|
-
const tc = toolCalls.find((t) => t._deferred && t._pendingItemId === (item.id || ''));
|
|
201
|
-
if (!tc) return;
|
|
202
|
-
if (!tc.id && item.call_id) tc.id = item.call_id;
|
|
203
|
-
if (!tc.name && item.name) tc.name = item.name;
|
|
204
|
-
if (tc.id && tc.name) {
|
|
205
|
-
delete tc._deferred;
|
|
206
|
-
delete tc._pendingItemId;
|
|
207
|
-
emit(tc);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
220
|
return {
|
|
212
221
|
get calls() {
|
|
213
222
|
return toolCalls;
|
|
@@ -238,6 +247,12 @@ export function createWsToolCalls({ onToolCall, midState, replayItems }) {
|
|
|
238
247
|
completeFunctionCallItem,
|
|
239
248
|
completeToolSearchItem,
|
|
240
249
|
completeCustomToolItem,
|
|
241
|
-
|
|
250
|
+
/** A server-truncated call item: kept in flight, never collected. */
|
|
251
|
+
holdIncompleteItem: markStarted,
|
|
252
|
+
// Terminal-bundle salvage (response.completed / success response.done):
|
|
253
|
+
// the same collector as output_item.done. When arguments.done fired
|
|
254
|
+
// before (or without) output_item.added, the deferred placeholder has an
|
|
255
|
+
// empty id/name and the bundle carries the canonical call_id/name.
|
|
256
|
+
salvageFunctionCall: completeFunctionCallItem,
|
|
242
257
|
};
|
|
243
258
|
}
|
|
@@ -13,6 +13,8 @@ import { createReplayItems } from './openai-ws-response-state/replay-items.mjs';
|
|
|
13
13
|
import { createCitations } from './openai-ws-response-state/citations.mjs';
|
|
14
14
|
import { createWsToolCalls } from './openai-ws-response-state/tool-calls.mjs';
|
|
15
15
|
import { normalizeWsUsage } from './openai-ws-response-state/usage.mjs';
|
|
16
|
+
import { createRefusals, refusalResultFields } from './openai-ws-response-state/refusals.mjs';
|
|
17
|
+
import { isIncompleteToolItem } from './lib/responses-terminal-fields.mjs';
|
|
16
18
|
|
|
17
19
|
export { parseToolSearchArgs } from './openai-ws-response-state/tool-calls.mjs';
|
|
18
20
|
|
|
@@ -37,6 +39,7 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
37
39
|
const reasoningDeltas = { text: 0, summary: 0, other: 0 };
|
|
38
40
|
const replayItems = createReplayItems();
|
|
39
41
|
const citations = createCitations();
|
|
42
|
+
const refusals = createRefusals();
|
|
40
43
|
const tools = createWsToolCalls({ onToolCall, midState, replayItems });
|
|
41
44
|
const replayProvider = traceProvider === 'xai' ? 'xai-responses' : 'openai-responses';
|
|
42
45
|
const progress = (kind) => {
|
|
@@ -49,6 +52,11 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
49
52
|
// anything the per-item events never carried. Returns whether any progress
|
|
50
53
|
// was reported.
|
|
51
54
|
function salvageCompletedItem(item, relayFinalText) {
|
|
55
|
+
if (isIncompleteToolItem(item)) {
|
|
56
|
+
tools.holdIncompleteItem(item);
|
|
57
|
+
progress('tool');
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
52
60
|
replayItems.push(item);
|
|
53
61
|
let reported = false;
|
|
54
62
|
if (item.type === 'message') {
|
|
@@ -64,6 +72,10 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
64
72
|
}
|
|
65
73
|
citations.pushOutputTextAnnotations(c);
|
|
66
74
|
}
|
|
75
|
+
if (refusals.absorbMessage(item)) {
|
|
76
|
+
progress('semantic');
|
|
77
|
+
reported = true;
|
|
78
|
+
}
|
|
67
79
|
}
|
|
68
80
|
if (item.type === 'web_search_call') {
|
|
69
81
|
citations.pushWebSearchCall(item);
|
|
@@ -146,10 +158,19 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
146
158
|
noteToolInputDelta: tools.noteToolInputDelta,
|
|
147
159
|
/** response.function_call_arguments.done */
|
|
148
160
|
completeFunctionCallArguments: tools.completeFunctionCallArguments,
|
|
161
|
+
/** response.refusal.delta */
|
|
162
|
+
noteRefusalDelta: refusals.delta,
|
|
163
|
+
/** response.refusal.done */
|
|
164
|
+
noteRefusalDone: refusals.done,
|
|
149
165
|
/** response.output_item.done. Returns the progress kind to report. */
|
|
150
166
|
completeOutputItem(item) {
|
|
167
|
+
if (isIncompleteToolItem(item)) {
|
|
168
|
+
tools.holdIncompleteItem(item);
|
|
169
|
+
return 'tool';
|
|
170
|
+
}
|
|
151
171
|
replayItems.push(item);
|
|
152
172
|
const type = item?.type || '';
|
|
173
|
+
if (type === 'message') refusals.absorbMessage(item);
|
|
153
174
|
// function_call / output_text already arrive via their dedicated
|
|
154
175
|
// streaming events; `reasoning` carries encrypted_content that keeps the
|
|
155
176
|
// openai-oauth server-side prompt cache prefix warm.
|
|
@@ -189,6 +210,13 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
189
210
|
if (!responseId && response?.id) responseId = response.id;
|
|
190
211
|
return usage;
|
|
191
212
|
},
|
|
213
|
+
/** A cutoff frame's output bundle: call items the server truncated stay
|
|
214
|
+
* in flight so the cutoff reads as a pending-tool turn. */
|
|
215
|
+
holdIncompleteBundleItems(response) {
|
|
216
|
+
for (const item of response?.output || []) {
|
|
217
|
+
if (isIncompleteToolItem(item)) tools.holdIncompleteItem(item);
|
|
218
|
+
}
|
|
219
|
+
},
|
|
192
220
|
/** max_output_tokens maps cleanly to Anthropic's stop_reason=max_tokens. */
|
|
193
221
|
markMaxOutputIncomplete(reason) {
|
|
194
222
|
incompleteReason = reason;
|
|
@@ -227,6 +255,8 @@ export function createWsResponseState({ onToolCall, onStreamDelta, midState, tra
|
|
|
227
255
|
...(typeof endTurn === 'boolean' ? { endTurn } : {}),
|
|
228
256
|
responseId: responseId || undefined,
|
|
229
257
|
serviceTier: responseServiceTier || undefined,
|
|
258
|
+
// A refused turn: typed stop reason and the refusal text.
|
|
259
|
+
...refusalResultFields(refusals, content),
|
|
230
260
|
};
|
|
231
261
|
},
|
|
232
262
|
};
|
|
@@ -88,6 +88,18 @@ export function createWsEventSwitch({ response, textRelay, watchdogs, midState,
|
|
|
88
88
|
progress('tool');
|
|
89
89
|
watchdogs.bumpSemantic();
|
|
90
90
|
break;
|
|
91
|
+
// Refusal text is model output but never visible answer text: it is
|
|
92
|
+
// collected for the typed refusal result, not relayed live.
|
|
93
|
+
case 'response.refusal.delta':
|
|
94
|
+
response.noteRefusalDelta(event);
|
|
95
|
+
progress('semantic');
|
|
96
|
+
watchdogs.bumpSemantic();
|
|
97
|
+
break;
|
|
98
|
+
case 'response.refusal.done':
|
|
99
|
+
response.noteRefusalDone(event);
|
|
100
|
+
progress('semantic');
|
|
101
|
+
watchdogs.bumpSemantic();
|
|
102
|
+
break;
|
|
91
103
|
case 'response.output_item.done': {
|
|
92
104
|
const kind = response.completeOutputItem(event.item);
|
|
93
105
|
// Item-done is genuine lifecycle progress — reset semantic idle so
|
|
@@ -27,11 +27,30 @@ export function createTerminalFrameHandlers({ response, textRelay, midState, err
|
|
|
27
27
|
|
|
28
28
|
// Most incomplete reasons are real failures. max_output_tokens maps cleanly
|
|
29
29
|
// to Anthropic's stop_reason=max_tokens; treating it as an error makes
|
|
30
|
-
// Claude retry the same over-budget turn
|
|
30
|
+
// Claude retry the same over-budget turn — unless a tool call's input was
|
|
31
|
+
// still streaming: its arguments were truncated, so the cutoff is a
|
|
32
|
+
// stalled pending-tool turn (same guard as HTTP/SSE), never a clean length
|
|
33
|
+
// completion that would surface the partial call as successful.
|
|
31
34
|
function settleIncomplete(event, label, options) {
|
|
32
35
|
const usage = response.noteTerminal(event.response);
|
|
33
36
|
const reasonStr = _incompleteReasonFromEvent(event);
|
|
34
37
|
if (_isMaxOutputIncompleteReason(reasonStr)) {
|
|
38
|
+
response.holdIncompleteBundleItems(event.response);
|
|
39
|
+
if (response.pendingToolUse) {
|
|
40
|
+
const error = new Error(`${label} (max_output_tokens) with tool call in flight`);
|
|
41
|
+
try {
|
|
42
|
+
textRelay.flush();
|
|
43
|
+
} catch {
|
|
44
|
+
/* best-effort */
|
|
45
|
+
}
|
|
46
|
+
Object.assign(error, response.partialState());
|
|
47
|
+
error.streamStalled = true;
|
|
48
|
+
error.pendingToolUse = true;
|
|
49
|
+
error.incompleteReason = reasonStr;
|
|
50
|
+
if (usage) error.partialUsage = usage;
|
|
51
|
+
failWith(error, options);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
35
54
|
response.markMaxOutputIncomplete(reasonStr);
|
|
36
55
|
completeTurn();
|
|
37
56
|
return;
|
|
@@ -105,11 +124,11 @@ export function createTerminalFrameHandlers({ response, textRelay, midState, err
|
|
|
105
124
|
failWith(responseDoneStatusError(status, `${errLabel} response.done unexpected status`), { markDone: true });
|
|
106
125
|
return;
|
|
107
126
|
}
|
|
108
|
-
// Success-shaped response.done (status '' or 'completed')
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
127
|
+
// Success-shaped response.done (status '' or 'completed') is the same
|
|
128
|
+
// terminal as response.completed: usage, end_turn, and its output bundle
|
|
129
|
+
// reconciled through the same deduplicated collectors (calls that appear
|
|
130
|
+
// only in the bundle are created; unresolvable deferred calls fail).
|
|
131
|
+
onResponseCompleted(event);
|
|
113
132
|
}
|
|
114
133
|
|
|
115
134
|
function onResponseIncomplete(event) {
|
|
@@ -29,10 +29,13 @@ import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
|
|
|
29
29
|
import { noteRequestServiceTier } from '../../../shared/llm/usage-context.mjs';
|
|
30
30
|
import { resolveProviderCacheKey, resolveProviderPromptCacheLane } from '../agent-runtime/cache-strategy.mjs';
|
|
31
31
|
|
|
32
|
+
function isUnsafeToRetry(err) {
|
|
33
|
+
return err?.liveTextEmitted === true || err?.emittedToolCall === true || err?.unsafeToRetry === true;
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
function shouldFallbackDirectTransport(err, options) {
|
|
33
37
|
const status = Number(err?.httpStatus || err?.status || 0);
|
|
34
|
-
|
|
35
|
-
if (unsafeToRetry || options?.signal?.aborted || options?.enabled === false) return false;
|
|
38
|
+
if (isUnsafeToRetry(err) || options?.signal?.aborted || options?.enabled === false) return false;
|
|
36
39
|
// Public OpenAI can reject the WebSocket upgrade while still supporting
|
|
37
40
|
// the same request over HTTP/SSE. Only the shared transport's explicit
|
|
38
41
|
// handshake marker may turn these application-looking statuses into a
|
|
@@ -111,6 +114,10 @@ export class OpenAIDirectProvider {
|
|
|
111
114
|
}
|
|
112
115
|
return null;
|
|
113
116
|
}
|
|
117
|
+
/** Drop a disposed transport scope's sticky transport record. */
|
|
118
|
+
releaseTransportScope(scope) {
|
|
119
|
+
this._httpFallbackPoolKeys.delete(scope);
|
|
120
|
+
}
|
|
114
121
|
send(messages, model, tools, sendOpts) {
|
|
115
122
|
return withEffortConfigurationFallback('openai', model, sendOpts || {}, (opts) =>
|
|
116
123
|
this._sendOnce(messages, model, tools, opts)
|
|
@@ -139,8 +146,9 @@ export class OpenAIDirectProvider {
|
|
|
139
146
|
// poolKey MUST be sessionId-only. Falling back to promptCacheKey would
|
|
140
147
|
// let unrelated raw sessions sharing the same provider-scoped cache
|
|
141
148
|
// bucket reuse each other's pooled socket and inherit lastResponseId
|
|
142
|
-
// delta state, producing cross-session prompt corruption.
|
|
143
|
-
|
|
149
|
+
// delta state, producing cross-session prompt corruption. A forked
|
|
150
|
+
// request runs in its own transport scope (transport-scope.mjs).
|
|
151
|
+
const poolKey = opts.transportScope || opts.sessionId || null;
|
|
144
152
|
// cacheKey (prompt_cache_key) only groups the server-side prefix-cache
|
|
145
153
|
// shard — safe to share across sessions, unlike the sessionId poolKey
|
|
146
154
|
// above. buildRequestBody derives it from the base namespace plus a
|
|
@@ -200,8 +208,7 @@ export class OpenAIDirectProvider {
|
|
|
200
208
|
try {
|
|
201
209
|
return await sendHttp({ ...common, auth: a, opts, fetchFn: opts._fetchFn });
|
|
202
210
|
} catch (err) {
|
|
203
|
-
|
|
204
|
-
if (!reload || err?.httpStatus !== 401 || unsafe) throw err;
|
|
211
|
+
if (!reload || err?.httpStatus !== 401 || isUnsafeToRetry(err)) throw err;
|
|
205
212
|
// The replay discards this attempt; its reported usage stays billed.
|
|
206
213
|
noteErrorUsage(err);
|
|
207
214
|
process.stderr.write('[openai-ws] 401 — reloading apiKey and retrying once over HTTP\n');
|
|
@@ -228,7 +235,10 @@ export class OpenAIDirectProvider {
|
|
|
228
235
|
// ws-delta only affects the delta gate inside openai-ws-delta.mjs.
|
|
229
236
|
if (
|
|
230
237
|
transportPolicy.transport === 'http' ||
|
|
231
|
-
(poolKey &&
|
|
238
|
+
(poolKey &&
|
|
239
|
+
httpFallbackEnabled &&
|
|
240
|
+
// A forked scope follows its session's refusal; it records its own.
|
|
241
|
+
(this._httpFallbackPoolKeys.has(poolKey) || this._httpFallbackPoolKeys.has(opts.sessionId)))
|
|
232
242
|
) {
|
|
233
243
|
return await sendHttpWithKeyReload(auth);
|
|
234
244
|
}
|
|
@@ -244,8 +254,7 @@ export class OpenAIDirectProvider {
|
|
|
244
254
|
const status = err?.httpStatus;
|
|
245
255
|
// Live-text/tool invariant: never reissue a turn that already
|
|
246
256
|
// relayed visible output or dispatched a tool call.
|
|
247
|
-
const unsafeToRetry =
|
|
248
|
-
err?.liveTextEmitted === true || err?.emittedToolCall === true || err?.unsafeToRetry === true;
|
|
257
|
+
const unsafeToRetry = isUnsafeToRetry(err);
|
|
249
258
|
// (1) 401 → reload only OpenAI auth and retry once over WS.
|
|
250
259
|
// Ordinary 403 is a permission/policy decision, not evidence that
|
|
251
260
|
// an API key rotated. Match the OAuth path and keep it terminal.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Go's Gemini route: `@ai-sdk/google` models are served by the
|
|
3
|
+
* gateway's generateContent endpoint, `{base}/models/{id}:streamGenerateContent`
|
|
4
|
+
* (https://opencode.ai/docs/go/ — Endpoints table). This engine reuses the
|
|
5
|
+
* direct Gemini adapter's request builder, stream consumer, retry ladder and
|
|
6
|
+
* result shaping, and only moves the transport onto the gateway: the Go key
|
|
7
|
+
* (never GEMINI_API_KEY) goes to the Go origin only, as a bearer token and the
|
|
8
|
+
* `x-goog-api-key` header, with the session / User-Agent headers of every Go
|
|
9
|
+
* request. Gateway models have no explicit cachedContents.
|
|
10
|
+
*/
|
|
11
|
+
import { GeminiProvider, geminiRestError } from './gemini.mjs';
|
|
12
|
+
import { GEMINI_FIRST_BYTE_TIMEOUT_MS, consumeGeminiRestStreamResponse } from './gemini-stream.mjs';
|
|
13
|
+
import { geminiBareModelId } from './gemini-cache-policy.mjs';
|
|
14
|
+
import { geminiFailureUsage } from './gemini-response.mjs';
|
|
15
|
+
import { geminiEndsWithFunctionResponse, runGeminiStreamAttempts } from './gemini-retry-policy.mjs';
|
|
16
|
+
import { geminiTextLeakGuardFor } from './gemini-sdk-request.mjs';
|
|
17
|
+
import { emitProviderRetryStage } from './retry-classifier.mjs';
|
|
18
|
+
import { originBoundFetch } from './lib/origin-bound-fetch.mjs';
|
|
19
|
+
import { createPassthroughSignal, createTimeoutSignal } from '../stall-policy.mjs';
|
|
20
|
+
import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
|
|
21
|
+
import { reloadProviderApiKey, resolveProviderApiKey } from '../../../shared/provider-api-key.mjs';
|
|
22
|
+
|
|
23
|
+
const PROVIDER = 'opencode-go';
|
|
24
|
+
|
|
25
|
+
/** The generateContent request body for a built Gemini request. */
|
|
26
|
+
export function openCodeGoGeminiBody({
|
|
27
|
+
contents,
|
|
28
|
+
systemInstruction,
|
|
29
|
+
geminiTools,
|
|
30
|
+
toolConfig,
|
|
31
|
+
generationConfig,
|
|
32
|
+
safetySettings,
|
|
33
|
+
}) {
|
|
34
|
+
return {
|
|
35
|
+
contents,
|
|
36
|
+
...(systemInstruction ? { systemInstruction: { parts: [{ text: systemInstruction }] } } : {}),
|
|
37
|
+
...(geminiTools ? { tools: geminiTools } : {}),
|
|
38
|
+
...(toolConfig ? { toolConfig } : {}),
|
|
39
|
+
...(generationConfig ? { generationConfig } : {}),
|
|
40
|
+
...(safetySettings ? { safetySettings } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class OpenCodeGoGeminiEngine extends GeminiProvider {
|
|
45
|
+
name = PROVIDER;
|
|
46
|
+
|
|
47
|
+
/** @param {object} config the Go provider config; `baseURL` is the OpenAI-style `.../v1` base */
|
|
48
|
+
constructor(config) {
|
|
49
|
+
const base = String(config.baseURL || '').replace(/\/+$/, '');
|
|
50
|
+
super({
|
|
51
|
+
...config,
|
|
52
|
+
fetchFn: originBoundFetch(new URL(base).origin, config.fetchImpl, PROVIDER),
|
|
53
|
+
// No Google host to warm and no Google SDK client: this engine never uses either.
|
|
54
|
+
preconnectFn: () => {},
|
|
55
|
+
createGenAI: () => null,
|
|
56
|
+
});
|
|
57
|
+
this.gatewayBase = base;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
_getApiKey() {
|
|
61
|
+
return resolveProviderApiKey(PROVIDER, this.config);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
reloadApiKey() {
|
|
65
|
+
const key = reloadProviderApiKey(PROVIDER, this.config);
|
|
66
|
+
if (key) this.config = { ...(this.config || {}), apiKey: key };
|
|
67
|
+
return key || '';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async isAvailable() {
|
|
71
|
+
return Boolean(this._getApiKey());
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The gateway has no cachedContents resource.
|
|
75
|
+
async _ensureGeminiCache() {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
_headers(opts) {
|
|
80
|
+
const key = this._getApiKey();
|
|
81
|
+
return {
|
|
82
|
+
'Content-Type': 'application/json',
|
|
83
|
+
...(key ? { Authorization: `Bearer ${key}`, 'x-goog-api-key': key } : {}),
|
|
84
|
+
...(this.config?.extraHeaders || {}),
|
|
85
|
+
...(opts?.requestHeaders || {}),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_url(model, method) {
|
|
90
|
+
return `${this.gatewayBase}/models/${encodeURIComponent(geminiBareModelId(model))}:${method}`;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async _openGatewayStream(url, body, opts, attemptSignal) {
|
|
94
|
+
const openFirstByte = createTimeoutSignal(
|
|
95
|
+
attemptSignal,
|
|
96
|
+
GEMINI_FIRST_BYTE_TIMEOUT_MS,
|
|
97
|
+
'OpenCode Go Gemini first byte'
|
|
98
|
+
);
|
|
99
|
+
let res;
|
|
100
|
+
try {
|
|
101
|
+
res = await this._fetch(url, {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: this._headers(opts),
|
|
104
|
+
body: JSON.stringify(body),
|
|
105
|
+
signal: openFirstByte.signal,
|
|
106
|
+
dispatcher: getLlmDispatcher(),
|
|
107
|
+
});
|
|
108
|
+
} finally {
|
|
109
|
+
openFirstByte.cleanup();
|
|
110
|
+
}
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
throw geminiRestError(res, await res.text().catch(() => ''), 'OpenCode Go Gemini streamGenerateContent');
|
|
113
|
+
}
|
|
114
|
+
return res;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async _generateContent(model, body, opts, signal) {
|
|
118
|
+
const res = await this._fetch(this._url(model, 'generateContent'), {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
headers: this._headers(opts),
|
|
121
|
+
body: JSON.stringify(body),
|
|
122
|
+
signal,
|
|
123
|
+
dispatcher: getLlmDispatcher(),
|
|
124
|
+
});
|
|
125
|
+
if (!res.ok) {
|
|
126
|
+
throw geminiRestError(res, await res.text().catch(() => ''), 'OpenCode Go Gemini generateContent');
|
|
127
|
+
}
|
|
128
|
+
return await res.json();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async _streamViaSdk(stream) {
|
|
132
|
+
const { opts, signal, useModel, contents, callbacks } = stream;
|
|
133
|
+
const body = openCodeGoGeminiBody(stream);
|
|
134
|
+
const url = `${this._url(useModel, 'streamGenerateContent')}?alt=sse`;
|
|
135
|
+
const passthrough = createPassthroughSignal(signal);
|
|
136
|
+
try {
|
|
137
|
+
return await runGeminiStreamAttempts({
|
|
138
|
+
signal: passthrough.signal,
|
|
139
|
+
sleepFn: this.config?.sleepFn,
|
|
140
|
+
onRetry: ({ attempt, maxAttempts, lastErr, delayMs }) => {
|
|
141
|
+
emitProviderRetryStage(opts.onStageChange, { attempt: attempt + 1, maxAttempts, lastErr, delayMs });
|
|
142
|
+
process.stderr.write(
|
|
143
|
+
`[opencode-go:gemini] retry attempt ${attempt + 1} after ${lastErr?.message || lastErr?.code || 'transient error'}\n`
|
|
144
|
+
);
|
|
145
|
+
},
|
|
146
|
+
afterToolResult: geminiEndsWithFunctionResponse(contents),
|
|
147
|
+
run: async ({ signal: attemptSignal, connected }) => {
|
|
148
|
+
try {
|
|
149
|
+
opts.onStageChange?.('requesting');
|
|
150
|
+
} catch {
|
|
151
|
+
/* heartbeat best-effort */
|
|
152
|
+
}
|
|
153
|
+
const res = await this._openGatewayStream(url, body, opts, attemptSignal);
|
|
154
|
+
connected();
|
|
155
|
+
const textLeakGuard = geminiTextLeakGuardFor(stream);
|
|
156
|
+
const response = await consumeGeminiRestStreamResponse(res, {
|
|
157
|
+
signal: attemptSignal,
|
|
158
|
+
onStreamDelta: callbacks.onStreamDelta,
|
|
159
|
+
onTextDelta: callbacks.onTextDelta,
|
|
160
|
+
textLeakGuard,
|
|
161
|
+
label: 'OpenCode Go Gemini streamGenerateContent',
|
|
162
|
+
failureUsage: geminiFailureUsage(opts, null, useModel),
|
|
163
|
+
});
|
|
164
|
+
return { response, textLeakGuard };
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
} catch (err) {
|
|
168
|
+
const recovered = await this._recoverGeminiNonStreaming({
|
|
169
|
+
streamErr: err,
|
|
170
|
+
signal: passthrough.signal,
|
|
171
|
+
opts,
|
|
172
|
+
model: useModel,
|
|
173
|
+
generate: (fallbackSignal) => this._generateContent(useModel, body, opts, fallbackSignal),
|
|
174
|
+
});
|
|
175
|
+
if (!recovered) throw err;
|
|
176
|
+
return { response: recovered, textLeakGuard: null };
|
|
177
|
+
} finally {
|
|
178
|
+
passthrough.cleanup();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|