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
|
@@ -6,15 +6,22 @@
|
|
|
6
6
|
* account-verification URL Google hides in the error details), and the
|
|
7
7
|
* per-attempt hand-off of the live stream to the turn collector.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
emitProviderRetryStage,
|
|
11
|
+
markProviderRecoveryExhausted,
|
|
12
|
+
sleepWithAbort,
|
|
13
|
+
withRetry,
|
|
14
|
+
} from './retry-classifier.mjs';
|
|
10
15
|
import {
|
|
11
16
|
ANTIGRAVITY_RETRY,
|
|
17
|
+
ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
|
|
12
18
|
antigravity429WaitMs,
|
|
13
19
|
isAntigravityCapacityError,
|
|
14
20
|
} from './antigravity-retry-policy.mjs';
|
|
15
|
-
import { createTimeoutSignal } from '../stall-policy.mjs';
|
|
21
|
+
import { createTimeoutSignal, firstByteWindowMs } from '../stall-policy.mjs';
|
|
22
|
+
import { MODEL_THINKING_STAGE } from '../../../shared/quiet-progress.mjs';
|
|
23
|
+
import { TIMEOUT_PHASE, isFirstByteTimeout } from '../../../shared/provider-timeout-phase.mjs';
|
|
16
24
|
import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
|
|
17
|
-
import { GEMINI_FIRST_BYTE_TIMEOUT_MS } from './gemini-stream.mjs';
|
|
18
25
|
import { _scrubTokens } from './antigravity-oauth-tokens.mjs';
|
|
19
26
|
import { applyGeminiErrorContract } from './gemini-error-contract.mjs';
|
|
20
27
|
import { DETERMINISTIC_KINDS, providerErrorKind } from './provider-error-kind.mjs';
|
|
@@ -70,13 +77,21 @@ export function antigravityError(res, text, endpoint) {
|
|
|
70
77
|
// Account verification is terminal and actionable: surface the URL Google
|
|
71
78
|
// returns instead of a raw API body the user cannot act on.
|
|
72
79
|
// Google puts the link in the error details, not the message text.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
// Order: google.rpc.Help.links, metadata.validation_url, metadata.validation_link.
|
|
81
|
+
const detailEntries = Array.isArray(detail?.details) ? detail.details : [];
|
|
82
|
+
const helpUrl = detailEntries
|
|
83
|
+
.flatMap((entry) => (Array.isArray(entry?.links) ? entry.links : []))
|
|
84
|
+
.map((link) => link?.url)
|
|
85
|
+
.find((url) => typeof url === 'string' && url.length > 0);
|
|
86
|
+
const metadataUrl = (key) =>
|
|
87
|
+
detailEntries.find(
|
|
88
|
+
(entry) =>
|
|
89
|
+
entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.[key] === 'string' && entry.metadata[key]
|
|
90
|
+
)?.metadata[key];
|
|
78
91
|
const validationUrl =
|
|
79
|
-
|
|
92
|
+
helpUrl ||
|
|
93
|
+
metadataUrl('validation_url') ||
|
|
94
|
+
metadataUrl('validation_link') ||
|
|
80
95
|
/https:\/\/\S*(?:accounts|console)\.google\.com\/\S+/.exec(message || '')?.[0] ||
|
|
81
96
|
'';
|
|
82
97
|
if (res.status === 403 && /VALIDATION_REQUIRED/i.test(text || '')) {
|
|
@@ -99,19 +114,53 @@ export function antigravityError(res, text, endpoint) {
|
|
|
99
114
|
* @param {object} deps.opts send options (stage heartbeat)
|
|
100
115
|
* @param {AbortSignal|null} deps.signal retry-loop signal (session pass-through)
|
|
101
116
|
* @param {{ beginAttempt: Function, consume: Function }} deps.collector
|
|
117
|
+
* @param {{ timeoutMs: number, maxMs: number, retries: number|null }} [deps.firstByte]
|
|
118
|
+
* first-byte window per attempt (antigravityFirstBytePolicy)
|
|
102
119
|
* @returns {() => Promise<object>} one retried request that resolves the final payload
|
|
103
120
|
*/
|
|
104
|
-
export function createAntigravityRequest({
|
|
121
|
+
export function createAntigravityRequest({
|
|
122
|
+
fetchFn,
|
|
123
|
+
endpoint,
|
|
124
|
+
headers,
|
|
125
|
+
body,
|
|
126
|
+
opts,
|
|
127
|
+
signal,
|
|
128
|
+
collector,
|
|
129
|
+
sleepFn,
|
|
130
|
+
firstByte = ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
|
|
131
|
+
}) {
|
|
105
132
|
const log = (attempt, lastErr, delayMs) => {
|
|
133
|
+
// A first-byte timeout runs on its own, shorter retry budget.
|
|
134
|
+
const firstByteLimited = isFirstByteTimeout(lastErr) && firstByte.retries != null;
|
|
106
135
|
emitProviderRetryStage(opts.onStageChange, {
|
|
107
136
|
attempt: attempt + 1,
|
|
108
|
-
maxAttempts:
|
|
137
|
+
maxAttempts: firstByteLimited
|
|
138
|
+
? Math.min(ANTIGRAVITY_RETRY.maxAttempts, firstByte.retries + 1)
|
|
139
|
+
: ANTIGRAVITY_RETRY.maxAttempts,
|
|
109
140
|
lastErr,
|
|
110
141
|
delayMs,
|
|
111
142
|
});
|
|
112
143
|
process.stderr.write(`[antigravity] retry ${attempt + 1} after ${lastErr?.message || 'transient error'}\n`);
|
|
113
144
|
};
|
|
114
|
-
|
|
145
|
+
// Stamps what the attempt tells the user: how many attempts ran and, for a
|
|
146
|
+
// first-byte timeout, how long the model was given in total. A timeout past
|
|
147
|
+
// the first-byte retry budget ends the ladder here. A caller's cancellation
|
|
148
|
+
// reason may be shared by other requests and is never stamped.
|
|
149
|
+
const noteFailure = (err, { attemptSignal, windowMs, send }) => {
|
|
150
|
+
if (!err || typeof err !== 'object' || attemptSignal?.aborted) return err;
|
|
151
|
+
send.attempts += 1;
|
|
152
|
+
err.attempts = send.attempts;
|
|
153
|
+
if (!isFirstByteTimeout(err)) return err;
|
|
154
|
+
send.firstByteTimeouts += 1;
|
|
155
|
+
send.firstByteWaitedMs += windowMs;
|
|
156
|
+
err.waitedMs = send.firstByteWaitedMs;
|
|
157
|
+
err.providerLabel = 'Antigravity';
|
|
158
|
+
if (firstByte.retries != null && send.firstByteTimeouts > firstByte.retries) {
|
|
159
|
+
markProviderRecoveryExhausted(err, { owner: 'antigravity-first-byte', attempts: send.attempts, terminal: true });
|
|
160
|
+
}
|
|
161
|
+
return err;
|
|
162
|
+
};
|
|
163
|
+
const attemptOnce = (send) =>
|
|
115
164
|
withRetry(
|
|
116
165
|
async ({ signal: attemptSignal }) => {
|
|
117
166
|
try {
|
|
@@ -119,37 +168,63 @@ export function createAntigravityRequest({ fetchFn, endpoint, headers, body, opt
|
|
|
119
168
|
} catch {
|
|
120
169
|
/* heartbeat */
|
|
121
170
|
}
|
|
122
|
-
const
|
|
123
|
-
let res;
|
|
171
|
+
const windowMs = firstByteWindowMs(firstByte, send.firstByteTimeouts);
|
|
124
172
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
173
|
+
const firstByteTimer = createTimeoutSignal(attemptSignal, windowMs, 'Antigravity first byte');
|
|
174
|
+
let res;
|
|
175
|
+
try {
|
|
176
|
+
const response = fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
|
|
177
|
+
method: 'POST',
|
|
178
|
+
headers,
|
|
179
|
+
body,
|
|
180
|
+
signal: firstByteTimer.signal,
|
|
181
|
+
dispatcher: getLlmDispatcher(),
|
|
182
|
+
});
|
|
183
|
+
// The request is on the wire and its headers are pending: the
|
|
184
|
+
// gateway sends them only with the first chunk, so this wait is
|
|
185
|
+
// the model's queueing and thinking time.
|
|
186
|
+
try {
|
|
187
|
+
opts.onStageChange?.(MODEL_THINKING_STAGE);
|
|
188
|
+
} catch {
|
|
189
|
+
/* heartbeat */
|
|
190
|
+
}
|
|
191
|
+
res = await response;
|
|
192
|
+
} catch (err) {
|
|
193
|
+
// Fetch surfaces AbortError; rethrow the timer/parent
|
|
194
|
+
// reason so same-host retry sees EPROVIDERTIMEOUT and
|
|
195
|
+
// a caller cancel stays a cancel.
|
|
196
|
+
if (firstByteTimer.signal.aborted && firstByteTimer.signal.reason instanceof Error) {
|
|
197
|
+
const reason = firstByteTimer.signal.reason;
|
|
198
|
+
if (!attemptSignal?.aborted) reason.timeoutPhase = TIMEOUT_PHASE.HEADERS;
|
|
199
|
+
throw reason;
|
|
200
|
+
}
|
|
201
|
+
throw err;
|
|
202
|
+
} finally {
|
|
203
|
+
firstByteTimer.cleanup();
|
|
138
204
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
205
|
+
// Headers arrived: the connection is live even while the model
|
|
206
|
+
// has not produced its first chunk.
|
|
207
|
+
try {
|
|
208
|
+
opts.onStreamDelta?.('transport');
|
|
209
|
+
} catch {}
|
|
210
|
+
if (!res.ok) {
|
|
211
|
+
const text = await res.text().catch(() => '');
|
|
212
|
+
const failure = antigravityError(res, text, endpoint);
|
|
213
|
+
// Capacity is paced by the local schedule below; the generic loop
|
|
214
|
+
// would sleep whatever wait the server names.
|
|
215
|
+
if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
|
|
216
|
+
throw failure;
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
opts.onStageChange?.('streaming');
|
|
220
|
+
} catch {
|
|
221
|
+
/* heartbeat */
|
|
222
|
+
}
|
|
223
|
+
collector.beginAttempt();
|
|
224
|
+
return await collector.consume(res, attemptSignal, { firstByteTimeoutMs: windowMs });
|
|
225
|
+
} catch (err) {
|
|
226
|
+
throw noteFailure(err, { attemptSignal, windowMs, send });
|
|
150
227
|
}
|
|
151
|
-
collector.beginAttempt();
|
|
152
|
-
return collector.consume(res, attemptSignal);
|
|
153
228
|
},
|
|
154
229
|
{
|
|
155
230
|
...ANTIGRAVITY_RETRY,
|
|
@@ -164,9 +239,10 @@ export function createAntigravityRequest({ fetchFn, endpoint, headers, body, opt
|
|
|
164
239
|
// gets one quick retry, a spent quota surfaces.
|
|
165
240
|
return async () => {
|
|
166
241
|
const state = { capacityRetries: 0, quickRetried: false };
|
|
242
|
+
const send = { attempts: 0, firstByteTimeouts: 0, firstByteWaitedMs: 0 };
|
|
167
243
|
for (let tried = 1; ; tried++) {
|
|
168
244
|
try {
|
|
169
|
-
return await attemptOnce();
|
|
245
|
+
return await attemptOnce(send);
|
|
170
246
|
} catch (err) {
|
|
171
247
|
const waitMs = antigravity429WaitMs(err, state);
|
|
172
248
|
if (waitMs == null) {
|
|
@@ -20,7 +20,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
|
|
|
20
20
|
// version (gpt-6.1-sol requires >= 0.159.0, measured 2026-10-09), so the
|
|
21
21
|
// release workflow raises this to the published CLI version on every release
|
|
22
22
|
// (scripts/sync-client-version-floors.mjs).
|
|
23
|
-
export const CODEX_CLIENT_VERSION_FLOOR = '0.
|
|
23
|
+
export const CODEX_CLIENT_VERSION_FLOOR = '0.163.0';
|
|
24
24
|
export const CODEX_CLI_NPM_PACKAGE = '@openai/codex';
|
|
25
25
|
const live = createNpmVersionSource(CODEX_CLI_NPM_PACKAGE, { persistKey: 'codex-cli' });
|
|
26
26
|
|
|
@@ -2,23 +2,25 @@
|
|
|
2
2
|
* Command Code provider (commandcode.ai Provider API).
|
|
3
3
|
*
|
|
4
4
|
* Credentials are a Studio-issued API key (command-code-oauth-tokens.mjs).
|
|
5
|
-
* Each model is served on
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Command Code API host. The key never expires and
|
|
9
|
-
* 401 means the user must sign in again.
|
|
5
|
+
* Each model is served on a wire its /models row declares (wire-route.mjs
|
|
6
|
+
* picks among them): Chat Completions and Responses through the
|
|
7
|
+
* OpenAI-compatible engine, Messages through the Anthropic engine. Both
|
|
8
|
+
* clients are pinned to the Command Code API host. The key never expires and
|
|
9
|
+
* has no refresh grant: a 401 means the user must sign in again.
|
|
10
10
|
*/
|
|
11
11
|
import { noteErrorUsage } from './lib/note-error-usage.mjs';
|
|
12
12
|
import { fileMtimeMs, normalizeExpiresAtMs, scrubOAuthSecrets } from './lib/oauth-token-utils.mjs';
|
|
13
|
+
import { originBoundFetch } from './lib/origin-bound-fetch.mjs';
|
|
14
|
+
import { withInclusiveUsage } from './lib/inclusive-usage.mjs';
|
|
13
15
|
import { OpenAICompatProvider, preloadOpenAICompatRuntime } from './openai-compat.mjs';
|
|
14
16
|
import { COMPAT_RETRY_POLICY } from './openai-compat-retry-profile.mjs';
|
|
15
17
|
import { listCompatModels } from './openai-compat-models.mjs';
|
|
16
18
|
import { AnthropicProvider } from './anthropic.mjs';
|
|
17
|
-
import { toInclusiveOpenCodeGoUsage as toInclusiveUsage } from './opencode-go.mjs';
|
|
18
19
|
import { sanitizeToolPairs } from '../session/context-utils.mjs';
|
|
19
20
|
import { preparePdfTextForProvider } from './media-normalization.mjs';
|
|
20
|
-
import { currentUsageContext } from '../../../shared/llm/usage-context.mjs';
|
|
21
21
|
import { makeModelCache } from './model-cache.mjs';
|
|
22
|
+
import { resolveWireRoute, sendOnRoute } from './wire-route.mjs';
|
|
23
|
+
import { gatewayMessagesOpts } from './wire-gateway.mjs';
|
|
22
24
|
import {
|
|
23
25
|
API_ORIGIN,
|
|
24
26
|
CREDITS_URL,
|
|
@@ -38,8 +40,11 @@ export {
|
|
|
38
40
|
export { beginOAuthLogin, loginOAuth } from './command-code-oauth-login.mjs';
|
|
39
41
|
|
|
40
42
|
export const DEFAULT_MODEL = 'deepseek/deepseek-v4-flash';
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
+
const ENDPOINT_WIRES = Object.freeze({
|
|
44
|
+
'/chat/completions': 'chat',
|
|
45
|
+
'/messages': 'messages',
|
|
46
|
+
'/responses': 'responses',
|
|
47
|
+
});
|
|
43
48
|
// The Anthropic SDK appends /v1/messages itself.
|
|
44
49
|
const MESSAGES_BASE_URL = `${API_ORIGIN}/provider`;
|
|
45
50
|
const FIVE_HOURS_MS = 5 * 60 * 60 * 1000;
|
|
@@ -56,35 +61,45 @@ const commandCodeModelCache = makeModelCache({
|
|
|
56
61
|
});
|
|
57
62
|
|
|
58
63
|
/**
|
|
59
|
-
* The
|
|
60
|
-
*
|
|
61
|
-
|
|
64
|
+
* The wires a /models row declares (`supported_endpoints`), or null when it
|
|
65
|
+
* declares none — such a row is served on Chat Completions by convention.
|
|
66
|
+
*/
|
|
67
|
+
export function modelEndpoints(item) {
|
|
68
|
+
const declared = item?.supported_endpoints;
|
|
69
|
+
if (!Array.isArray(declared)) return null;
|
|
70
|
+
const wires = [];
|
|
71
|
+
for (const endpoint of declared) {
|
|
72
|
+
const path = String(endpoint).replace(/^\/?(?:provider\/)?(?:v1\/)?/, '/');
|
|
73
|
+
const wire = Object.hasOwn(ENDPOINT_WIRES, path) ? ENDPOINT_WIRES[path] : null;
|
|
74
|
+
if (wire && !wires.includes(wire)) wires.push(wire);
|
|
75
|
+
}
|
|
76
|
+
return wires;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The route for a model with these declared endpoints (null: undeclared, Chat).
|
|
80
|
+
// `undefined`: nothing describes the model, so no wire is ruled out.
|
|
81
|
+
function commandCodeRoute(model, endpoints, ctx = {}) {
|
|
82
|
+
return resolveWireRoute(PROVIDER_ID, model, {
|
|
83
|
+
...ctx,
|
|
84
|
+
endpoints: endpoints === undefined ? null : (endpoints ?? ['chat']),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The wire a /models row is served on (wire-route.mjs over its declared
|
|
90
|
+
* endpoints): Responses for GPT / Muse / Grok when advertised, otherwise Chat
|
|
91
|
+
* when declared or undeclared, Messages when it is the only one, Responses
|
|
92
|
+
* for a Responses-only row; null when it declares none of them.
|
|
62
93
|
*/
|
|
63
94
|
export function modelWire(item) {
|
|
64
95
|
if (typeof item?.id !== 'string' || !item.id) return null;
|
|
65
|
-
|
|
66
|
-
if (!Array.isArray(endpoints)) return 'chat';
|
|
67
|
-
const declared = endpoints.map((endpoint) => String(endpoint).replace(/^\/?(?:provider\/)?(?:v1\/)?/, '/'));
|
|
68
|
-
if (declared.includes(CHAT_ENDPOINT)) return 'chat';
|
|
69
|
-
if (declared.includes(MESSAGES_ENDPOINT)) return 'messages';
|
|
70
|
-
return null;
|
|
96
|
+
return commandCodeRoute(item.id, modelEndpoints(item))?.wire || null;
|
|
71
97
|
}
|
|
72
98
|
|
|
73
|
-
// Every request either engine makes goes through this fetch:
|
|
74
|
-
//
|
|
75
|
-
// and redirects are never followed (any 3xx is an error).
|
|
99
|
+
// Every request either engine makes goes through this fetch: only the Command
|
|
100
|
+
// Code API origin, never a redirect.
|
|
76
101
|
function apiOnlyFetch(fetchImpl) {
|
|
77
|
-
return
|
|
78
|
-
const url = new URL(String(input?.url ?? input));
|
|
79
|
-
if (url.origin !== API_ORIGIN) {
|
|
80
|
-
throw new Error(`[command-code-oauth] refusing to send the API key to ${url.host}`);
|
|
81
|
-
}
|
|
82
|
-
const res = await (fetchImpl || globalThis.fetch)(input, { ...init, redirect: 'manual' });
|
|
83
|
-
if (res.status >= 300 && res.status < 400) {
|
|
84
|
-
throw new Error(`[command-code-oauth] refusing to follow a redirect from ${url.host}`);
|
|
85
|
-
}
|
|
86
|
-
return res;
|
|
87
|
-
};
|
|
102
|
+
return originBoundFetch(API_ORIGIN, fetchImpl, PROVIDER_ID);
|
|
88
103
|
}
|
|
89
104
|
|
|
90
105
|
// Anthropic engine bound to this credential: only the Command Code key is
|
|
@@ -98,15 +113,11 @@ class CommandCodeMessagesEngine extends AnthropicProvider {
|
|
|
98
113
|
client.fetch = apiOnlyFetch(this.config.fetchImpl);
|
|
99
114
|
return client;
|
|
100
115
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (err && typeof err === 'object') {
|
|
105
|
-
if (err.usage) err.usage = toInclusiveUsage(err.usage);
|
|
106
|
-
if (err.partialUsage) err.partialUsage = toInclusiveUsage(err.partialUsage);
|
|
116
|
+
// The roster's output ceiling reaches the shared request builder.
|
|
117
|
+
_sendOnce(messages, model, tools, opts) {
|
|
118
|
+
return super._sendOnce(messages, model, tools, gatewayMessagesOpts(this.config, model, messages, opts));
|
|
107
119
|
}
|
|
108
|
-
|
|
109
|
-
};
|
|
120
|
+
}
|
|
110
121
|
|
|
111
122
|
function rosterRow(item) {
|
|
112
123
|
const contextWindow = Number(item.context_window ?? item.max_context_window ?? item.context_length ?? 0);
|
|
@@ -118,6 +129,11 @@ function rosterRow(item) {
|
|
|
118
129
|
...(name ? { name: name.trim() } : {}),
|
|
119
130
|
...(contextWindow > 0 ? { contextWindow } : {}),
|
|
120
131
|
...(outputTokens > 0 ? { outputTokens } : {}),
|
|
132
|
+
// The full declared endpoint set: the cached route metadata a later
|
|
133
|
+
// send falls back on when the live roster cannot be read.
|
|
134
|
+
...(Array.isArray(item.supported_endpoints)
|
|
135
|
+
? { supportedEndpoints: item.supported_endpoints.map((endpoint) => String(endpoint)) }
|
|
136
|
+
: {}),
|
|
121
137
|
};
|
|
122
138
|
}
|
|
123
139
|
|
|
@@ -147,11 +163,16 @@ function scrubErrorSecrets(err, apiKey) {
|
|
|
147
163
|
}
|
|
148
164
|
|
|
149
165
|
// Redact where the transport first surfaces errors (request open and stream
|
|
150
|
-
// iteration)
|
|
166
|
+
// iteration) on the Chat and Responses endpoints, so the shared retry
|
|
167
|
+
// reporter never logs the key.
|
|
151
168
|
function redactClientErrors(client, apiKey) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
169
|
+
redactCreateErrors(client?.chat?.completions, apiKey);
|
|
170
|
+
redactCreateErrors(client?.responses, apiKey);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function redactCreateErrors(endpoint, apiKey) {
|
|
174
|
+
if (!endpoint || !apiKey || endpoint.create?.commandCodeRedacting === apiKey) return;
|
|
175
|
+
const create = endpoint.create.bind(endpoint);
|
|
155
176
|
const wrapped = async (...args) => {
|
|
156
177
|
try {
|
|
157
178
|
const stream = await create(...args);
|
|
@@ -177,7 +198,7 @@ function redactClientErrors(client, apiKey) {
|
|
|
177
198
|
}
|
|
178
199
|
};
|
|
179
200
|
wrapped.commandCodeRedacting = apiKey;
|
|
180
|
-
|
|
201
|
+
endpoint.create = wrapped;
|
|
181
202
|
}
|
|
182
203
|
|
|
183
204
|
// Same for the Anthropic client's streaming request (read through
|
|
@@ -253,8 +274,9 @@ export class CommandCodeOAuthProvider {
|
|
|
253
274
|
_defaultModelKey = null;
|
|
254
275
|
_messages = null;
|
|
255
276
|
_messagesKey = null;
|
|
256
|
-
// Model id →
|
|
257
|
-
|
|
277
|
+
// Model id → declared endpoint wires (null: undeclared) from the roster
|
|
278
|
+
// fetched with `_wiresKey`.
|
|
279
|
+
_endpoints = new Map();
|
|
258
280
|
_wiresKey = null;
|
|
259
281
|
|
|
260
282
|
constructor(config) {
|
|
@@ -315,6 +337,8 @@ export class CommandCodeOAuthProvider {
|
|
|
315
337
|
apiKey,
|
|
316
338
|
baseURL: MESSAGES_BASE_URL,
|
|
317
339
|
disableBetaHeaders: true,
|
|
340
|
+
modelMaxOutputTokens: (model) =>
|
|
341
|
+
commandCodeModelCache.loadSync({ allowStale: true })?.find((row) => row?.id === model)?.outputTokens,
|
|
318
342
|
// x-api-key from the SDK plus the bearer form of the same key.
|
|
319
343
|
extraHeaders: { Authorization: `Bearer ${apiKey}` },
|
|
320
344
|
});
|
|
@@ -324,8 +348,9 @@ export class CommandCodeOAuthProvider {
|
|
|
324
348
|
return engine;
|
|
325
349
|
}
|
|
326
350
|
|
|
327
|
-
// Servable rows from /models
|
|
328
|
-
//
|
|
351
|
+
// Servable rows from /models (any declared Chat, Messages or Responses
|
|
352
|
+
// endpoint, or none declared); only the latest fetch with the still-active
|
|
353
|
+
// key publishes the roster and the per-model endpoint map.
|
|
329
354
|
async _fetchRoster(apiKey, signal = null) {
|
|
330
355
|
const publish = commandCodeModelCache.beginSave(() => loadTokens()?.apiKey === apiKey);
|
|
331
356
|
const body = await requestCommandCodeJson(`${PROVIDER_BASE_URL}/models`, apiKey, {
|
|
@@ -338,16 +363,30 @@ export class CommandCodeOAuthProvider {
|
|
|
338
363
|
const items = list.filter((item) => modelWire(item));
|
|
339
364
|
publish(items.map(rosterRow));
|
|
340
365
|
if (this.tokens?.apiKey === apiKey) {
|
|
341
|
-
|
|
366
|
+
// Rows accumulate for one key: a later roster that misses a model
|
|
367
|
+
// leaves the endpoints it was last listed with.
|
|
368
|
+
const known = this._wiresKey === apiKey ? this._endpoints : new Map();
|
|
369
|
+
for (const item of items) known.set(item.id, modelEndpoints(item));
|
|
370
|
+
this._endpoints = known;
|
|
342
371
|
this._wiresKey = apiKey;
|
|
343
372
|
}
|
|
344
373
|
return items;
|
|
345
374
|
}
|
|
346
375
|
|
|
347
|
-
//
|
|
348
|
-
//
|
|
349
|
-
//
|
|
350
|
-
|
|
376
|
+
// A model's declared endpoints: what this credential's rosters listed,
|
|
377
|
+
// then the persisted roster (a roster miss or a roster that cannot be read
|
|
378
|
+
// right now must not move a known Messages-only model to Chat). null is a
|
|
379
|
+
// row declaring none (Chat); undefined is a model nothing describes.
|
|
380
|
+
_endpointsFor(apiKey, model) {
|
|
381
|
+
if (this._wiresKey === apiKey && this._endpoints.has(model)) return this._endpoints.get(model);
|
|
382
|
+
const cached = commandCodeModelCache.loadSync({ allowStale: true })?.find((row) => row?.id === model);
|
|
383
|
+
return cached ? modelEndpoints({ supported_endpoints: cached.supportedEndpoints }) : undefined;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// This credential's route for a model (the roster is fetched once when
|
|
387
|
+
// missing; a roster that cannot be read falls back on the persisted rows);
|
|
388
|
+
// a rejected key is surfaced.
|
|
389
|
+
async _routeFor(inner, model, ctx = {}) {
|
|
351
390
|
if (this._wiresKey !== inner.apiKey) {
|
|
352
391
|
try {
|
|
353
392
|
await listCompatModels(inner, { throwOnError: true });
|
|
@@ -355,7 +394,16 @@ export class CommandCodeOAuthProvider {
|
|
|
355
394
|
if (isUnauthorized(err)) throw err;
|
|
356
395
|
}
|
|
357
396
|
}
|
|
358
|
-
|
|
397
|
+
const endpoints = this._endpointsFor(inner.apiKey, model);
|
|
398
|
+
return commandCodeRoute(model, endpoints, {
|
|
399
|
+
...ctx,
|
|
400
|
+
override: this.config?.modelWires?.[model] ?? null,
|
|
401
|
+
known: endpoints !== undefined,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
resolveWireRoute(model, ctx = {}) {
|
|
406
|
+
return this._routeFor(this._ensureInner(), model, ctx);
|
|
359
407
|
}
|
|
360
408
|
|
|
361
409
|
// A rejected key needs a fresh sign-in; the gateway's own detail stays attached.
|
|
@@ -382,17 +430,21 @@ export class CommandCodeOAuthProvider {
|
|
|
382
430
|
throw this._shapeError(err, this.tokens?.apiKey);
|
|
383
431
|
}
|
|
384
432
|
const apiKey = this._innerKey;
|
|
385
|
-
// The model's
|
|
386
|
-
//
|
|
387
|
-
const { compatWireApi: _wire, responsesTransport: _transport, ...
|
|
433
|
+
// The model's route (the session's pinned one, else its declared
|
|
434
|
+
// endpoints) picks the wire; a caller's compat wire flag cannot move it.
|
|
435
|
+
const { compatWireApi: _wire, responsesTransport: _transport, ...callerOpts } = sendOpts || {};
|
|
388
436
|
try {
|
|
389
437
|
const useModel = model || (await this._pickDefaultModel(inner));
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
438
|
+
// One clear "unsupported" refusal moves the send to the next wire once.
|
|
439
|
+
return await sendOnRoute(this, useModel, tools, callerOpts, messages, (wire, history, opts) => {
|
|
440
|
+
if (wire === 'messages') return this._sendMessages(apiKey, history, useModel, tools, opts);
|
|
441
|
+
// _doSend directly: the compat wrapper's 401 handler reloads a static
|
|
442
|
+
// config key, which does not apply to this credential.
|
|
443
|
+
if (wire === 'responses') {
|
|
444
|
+
return inner._doSend(history, useModel, tools, { ...opts, compatWireApi: 'responses' });
|
|
445
|
+
}
|
|
446
|
+
return inner._doSend(history, useModel, tools, opts);
|
|
447
|
+
});
|
|
396
448
|
} catch (err) {
|
|
397
449
|
throw this._shapeError(err, apiKey);
|
|
398
450
|
}
|
|
@@ -405,14 +457,7 @@ export class CommandCodeOAuthProvider {
|
|
|
405
457
|
async _sendMessages(apiKey, messages, model, tools, opts) {
|
|
406
458
|
const engine = this._ensureMessages(apiKey);
|
|
407
459
|
const prepared = await preparePdfTextForProvider(sanitizeToolPairs(messages), engine);
|
|
408
|
-
|
|
409
|
-
if (identity) identity.normalizeAbandonedUsage = toInclusiveUsage;
|
|
410
|
-
try {
|
|
411
|
-
const result = await engine._doSend(prepared, model, tools, opts);
|
|
412
|
-
return result?.usage ? { ...result, usage: toInclusiveUsage(result.usage) } : result;
|
|
413
|
-
} catch (err) {
|
|
414
|
-
throw normalizeUsageError(err);
|
|
415
|
-
}
|
|
460
|
+
return withInclusiveUsage(() => engine._doSend(prepared, model, tools, opts));
|
|
416
461
|
}
|
|
417
462
|
|
|
418
463
|
async listModels() {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Shared request controls for Chat Completions and Responses gateways.
|
|
2
2
|
import { emitProviderRetryStage, retryDelayLabel } from './retry-classifier.mjs';
|
|
3
|
+
import { isTogetherBaseURL } from './openai-compat-reasoning-field.mjs';
|
|
3
4
|
|
|
4
5
|
// withRetry onRetry for the compat stream sends: one stderr line plus a
|
|
5
6
|
// display-only 'reconnecting' stage for the UI.
|
|
@@ -13,8 +14,83 @@ export function compatStreamRetryReporter(label, opts) {
|
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
// Providers whose docs accept `required` / named tool_choice, and the subset
|
|
18
|
+
// that also documents `parallel_tool_calls`. DeepSeek documents no
|
|
19
|
+
// parallel_tool_calls, and rejects forced choices in thinking mode.
|
|
20
|
+
const FORCED_CHOICE_PROVIDERS = new Set([
|
|
21
|
+
'xai',
|
|
22
|
+
'deepseek',
|
|
23
|
+
'openrouter',
|
|
24
|
+
'mistral',
|
|
25
|
+
'groq',
|
|
26
|
+
'fireworks',
|
|
27
|
+
'together',
|
|
28
|
+
'command-code-oauth',
|
|
29
|
+
]);
|
|
30
|
+
const PARALLEL_CALLS_PROVIDERS = new Set([
|
|
31
|
+
'xai',
|
|
32
|
+
'openrouter',
|
|
33
|
+
'mistral',
|
|
34
|
+
'groq',
|
|
35
|
+
'fireworks',
|
|
36
|
+
'together',
|
|
37
|
+
'command-code-oauth',
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
function hostMatches(baseURL, domain) {
|
|
41
|
+
try {
|
|
42
|
+
const host = new URL(String(baseURL || '')).hostname.toLowerCase();
|
|
43
|
+
return host === domain || host.endsWith(`.${domain}`);
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function compatToolFamily(provider, baseURL) {
|
|
50
|
+
if (FORCED_CHOICE_PROVIDERS.has(provider)) return provider;
|
|
51
|
+
if (isTogetherBaseURL(baseURL)) return 'together';
|
|
52
|
+
if (hostMatches(baseURL, 'fireworks.ai')) return 'fireworks';
|
|
53
|
+
if (hostMatches(baseURL, 'mistral.ai')) return 'mistral';
|
|
54
|
+
if (hostMatches(baseURL, 'groq.com')) return 'groq';
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function forcedToolChoice(choice, wire) {
|
|
59
|
+
if (choice === 'required') return 'required';
|
|
60
|
+
if (!choice || typeof choice !== 'object') return null;
|
|
61
|
+
const name = choice.function?.name || choice.name;
|
|
62
|
+
if (typeof name !== 'string' || !name) return null;
|
|
63
|
+
return wire === 'responses' ? { type: 'function', name } : { type: 'function', function: { name } };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Tool-choice controls. `none` is universal. With `ctx` ({ provider, baseURL,
|
|
68
|
+
* wire: 'chat'|'responses', thinking: 'enabled'|'disabled'|null }) the
|
|
69
|
+
* documented providers also get explicit `required` / named tool_choice and an
|
|
70
|
+
* explicit boolean `opts.parallelToolCalls`; without it only `none` applies.
|
|
71
|
+
* DeepSeek rejects forced choices while thinking is explicitly enabled and
|
|
72
|
+
* keeps omitting them when thinking is left to the server default.
|
|
73
|
+
*/
|
|
74
|
+
export function applyCompatToolChoice(body, opts = {}, ctx = null) {
|
|
75
|
+
if (!(body.tools?.length > 0)) return body;
|
|
76
|
+
if (opts.toolChoice === 'none') body.tool_choice = 'none';
|
|
77
|
+
const family = ctx?.provider ? compatToolFamily(ctx.provider, ctx.baseURL) : null;
|
|
78
|
+
if (!family) return body;
|
|
79
|
+
const forced = forcedToolChoice(opts.toolChoice, ctx.wire);
|
|
80
|
+
if (forced) {
|
|
81
|
+
if (family === 'deepseek' && ctx.thinking === 'enabled') {
|
|
82
|
+
throw Object.assign(
|
|
83
|
+
new Error(
|
|
84
|
+
'[deepseek] tool_choice "required" or a named tool is not supported in thinking mode; disable thinking (effort none) to force a tool call'
|
|
85
|
+
),
|
|
86
|
+
{ code: 'unsupported_tool_choice' }
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
if (family !== 'deepseek' || ctx.thinking === 'disabled') body.tool_choice = forced;
|
|
90
|
+
}
|
|
91
|
+
if (typeof opts.parallelToolCalls === 'boolean' && PARALLEL_CALLS_PROVIDERS.has(family)) {
|
|
92
|
+
body.parallel_tool_calls = opts.parallelToolCalls;
|
|
93
|
+
}
|
|
18
94
|
return body;
|
|
19
95
|
}
|
|
20
96
|
|