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
|
@@ -17,8 +17,11 @@ import {
|
|
|
17
17
|
} from './media-normalization.mjs';
|
|
18
18
|
import { customToolCallFromResponseItem, nativeToolSearchCallFromArguments } from './custom-tool-wire.mjs';
|
|
19
19
|
import { providerReplayItems } from './lib/provider-replay.mjs';
|
|
20
|
+
import { acceptedWireTools } from './lib/claude-bridge-schema.mjs';
|
|
20
21
|
import { ensureResponsesCallOutputs } from './lib/wire-pairing.mjs';
|
|
21
22
|
import { responsesEffortUpdates } from './effort-configuration.mjs';
|
|
23
|
+
import { convertMessagesToResponsesInput } from './openai-responses-input.mjs';
|
|
24
|
+
import { COMPAT_REASONING_METADATA_KEY, contentWithThinkingChunk } from './openai-compat-reasoning-field.mjs';
|
|
22
25
|
|
|
23
26
|
function positiveTokenInt(value) {
|
|
24
27
|
const n = Number(value);
|
|
@@ -39,19 +42,23 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
|
|
|
39
42
|
// strict providers (xai) reject unknown roles/types and would 400 the
|
|
40
43
|
// request. Documented in v0.1.160 (GPT reasoning replay).
|
|
41
44
|
//
|
|
42
|
-
// DeepSeek
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
// assistant reasoning_content is replayed; reasoning_effort itself remains
|
|
49
|
-
// caller/user-selected.
|
|
45
|
+
// DeepSeek thinking-mode models with tools REQUIRE the prior turn's
|
|
46
|
+
// `reasoning_content` echoed back (400 without it); without tools it is
|
|
47
|
+
// ignored, so the caller (options.replaysReasoningContent) always replays it.
|
|
48
|
+
// xAI reasoning models preserve their official multi-turn shape and cache
|
|
49
|
+
// prefix stability when prior assistant reasoning_content is replayed;
|
|
50
|
+
// reasoning_effort itself remains caller/user-selected.
|
|
50
51
|
//
|
|
51
52
|
// Custom providers pass options.customReplay (custom-reasoning.mjs replay
|
|
52
53
|
// eligibility). When it is a boolean it alone decides; a replaying custom
|
|
53
54
|
// endpoint also needs a non-empty reasoning_content on every assistant
|
|
54
55
|
// tool-call turn, so missing/empty reasoning there is padded with " ".
|
|
56
|
+
//
|
|
57
|
+
// options.reasoningShape (openai-compat-reasoning-field.mjs) names the
|
|
58
|
+
// endpoint families with their own reasoning fields; they decide the resend
|
|
59
|
+
// key and win over the flags above. options.developerRole keeps the
|
|
60
|
+
// `developer` role for endpoints that document it; every other chat endpoint
|
|
61
|
+
// only knows `system`, so developer instructions go out as system messages.
|
|
55
62
|
const customReplay = typeof options.customReplay === 'boolean' ? options.customReplay : null;
|
|
56
63
|
const replaysReasoningContent = customReplay ?? (options.replaysReasoningContent === true || providerName === 'xai');
|
|
57
64
|
const out = [];
|
|
@@ -62,8 +69,25 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
|
|
|
62
69
|
const details = metadata?.reasoning_details ?? metadata?.reasoningDetails;
|
|
63
70
|
return Array.isArray(details) && details.length ? details : null;
|
|
64
71
|
};
|
|
72
|
+
const shape = options.reasoningShape || null;
|
|
73
|
+
// Receive and resend fields differ per endpoint family: the key a reply's
|
|
74
|
+
// reasoning arrived on is recorded in providerMetadata at receive time.
|
|
75
|
+
const receivedField = (message) => message?.providerMetadata?.[COMPAT_REASONING_METADATA_KEY]?.reasoningField;
|
|
76
|
+
const attachShapeReasoning = (msg, message, stored) => {
|
|
77
|
+
if (!stored) return;
|
|
78
|
+
if (shape.resend === 'same_key') {
|
|
79
|
+
msg[receivedField(message) === 'reasoning' ? 'reasoning' : 'reasoning_content'] = stored;
|
|
80
|
+
} else if (shape.resend === 'reasoning') {
|
|
81
|
+
// OpenRouter: reasoning_details replace the text when present.
|
|
82
|
+
if (!openRouterReasoningDetails(message)) msg.reasoning = stored;
|
|
83
|
+
} else if (shape.resend === 'content_chunks' && receivedField(message) === 'content_chunks') {
|
|
84
|
+
msg.content = contentWithThinkingChunk(msg.content, stored);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
65
87
|
const attachAssistantReasoning = (msg, message) => {
|
|
66
|
-
if (
|
|
88
|
+
if (shape) {
|
|
89
|
+
attachShapeReasoning(msg, message, typeof message.reasoningContent === 'string' ? message.reasoningContent : '');
|
|
90
|
+
} else if (customReplay) {
|
|
67
91
|
const stored = typeof message.reasoningContent === 'string' ? message.reasoningContent : '';
|
|
68
92
|
if (stored) msg.reasoning_content = stored;
|
|
69
93
|
else if (Array.isArray(msg.tool_calls) && msg.tool_calls.length) msg.reasoning_content = ' ';
|
|
@@ -104,8 +128,12 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
|
|
|
104
128
|
continue;
|
|
105
129
|
}
|
|
106
130
|
const msg = {
|
|
107
|
-
role: m.role,
|
|
108
|
-
content: normalizeContentForOpenAIChat(m.content, {
|
|
131
|
+
role: m.role === 'developer' && options.developerRole !== true ? 'system' : m.role,
|
|
132
|
+
content: normalizeContentForOpenAIChat(m.content, {
|
|
133
|
+
role: m.role,
|
|
134
|
+
nativePdf: options.nativePdf,
|
|
135
|
+
cacheControl: options.cacheControl === true,
|
|
136
|
+
}),
|
|
109
137
|
};
|
|
110
138
|
out.push(m.role === 'assistant' ? attachAssistantReasoning(msg, m) : msg);
|
|
111
139
|
}
|
|
@@ -113,18 +141,6 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
|
|
|
113
141
|
return out;
|
|
114
142
|
}
|
|
115
143
|
|
|
116
|
-
// deepseek-reasoner returns 400 when `reasoning_content` appears in the input
|
|
117
|
-
// messages; every other DeepSeek thinking model needs it back once tools are in
|
|
118
|
-
// play. Unknown DeepSeek ids default to replaying: a missing echo breaks the
|
|
119
|
-
// tool loop, while a stray field on a non-thinking model is ignored.
|
|
120
|
-
export function deepseekReplaysReasoningContent(model) {
|
|
121
|
-
return !/reasoner/.test(
|
|
122
|
-
String(model || '')
|
|
123
|
-
.trim()
|
|
124
|
-
.toLowerCase()
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
144
|
export function toOpenAITools(tools) {
|
|
129
145
|
return tools.map((t) => ({
|
|
130
146
|
type: 'function',
|
|
@@ -146,9 +162,42 @@ function functionToolFromSessionTool(t, name = t?.name) {
|
|
|
146
162
|
};
|
|
147
163
|
}
|
|
148
164
|
|
|
149
|
-
|
|
165
|
+
// xAI hosts tool search itself (docs.x.ai progressive tool disclosure): a
|
|
166
|
+
// `{type:'tool_search'}` server tool loads the definitions of function tools
|
|
167
|
+
// marked `defer_loading: true`, and the server returns the search as
|
|
168
|
+
// tool_search_call / tool_search_output items. The client loader (`load_tool`)
|
|
169
|
+
// is therefore replaced by that one server tool; with deferred tools but no
|
|
170
|
+
// loader the server tool is still added, or the deferred tools could never load.
|
|
171
|
+
function toServerToolSearchTools(tools) {
|
|
172
|
+
let hasSearch = false;
|
|
173
|
+
let hasDeferred = false;
|
|
174
|
+
const out = tools.map((t) => {
|
|
175
|
+
if (t?.name === 'load_tool' || t?.name === 'tool_search') {
|
|
176
|
+
if (hasSearch) return null;
|
|
177
|
+
hasSearch = true;
|
|
178
|
+
return { type: 'tool_search' };
|
|
179
|
+
}
|
|
180
|
+
if (t?.deferLoading === true || t?.defer_loading === true) {
|
|
181
|
+
hasDeferred = true;
|
|
182
|
+
return { ...functionToolFromSessionTool(t), defer_loading: true };
|
|
183
|
+
}
|
|
184
|
+
return functionToolFromSessionTool(t);
|
|
185
|
+
});
|
|
186
|
+
if (hasDeferred && !hasSearch) out.push({ type: 'tool_search' });
|
|
187
|
+
return out.filter(Boolean);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function toResponsesTools(allTools, options = {}) {
|
|
150
191
|
const provider = String(options?.provider || '').toLowerCase();
|
|
192
|
+
// A Responses endpoint rejects the whole request for one invalid
|
|
193
|
+
// `parameters`; a tool broken even after lowering is left out and reported.
|
|
194
|
+
const tools = acceptedWireTools(allTools, 'openai', options?.onToolExcluded, `[${provider || 'responses'}] tool`);
|
|
195
|
+
if (options?.serverToolSearch === true) return toServerToolSearchTools(tools);
|
|
196
|
+
// A route pinned with verified native deferred tools declares the native
|
|
197
|
+
// client tool_search tool and marks deferred definitions `defer_loading`.
|
|
198
|
+
const nativeDeferred = options?.nativeDeferredTools === true;
|
|
151
199
|
const allowNativeToolSearch =
|
|
200
|
+
nativeDeferred ||
|
|
152
201
|
options?.nativeToolSearch === true ||
|
|
153
202
|
(options?.nativeToolSearch !== false && (provider === 'openai' || provider === 'openai-oauth'));
|
|
154
203
|
return tools.map((t) => {
|
|
@@ -170,6 +219,9 @@ export function toResponsesTools(tools, options = {}) {
|
|
|
170
219
|
// tools (e.g. apply_patch) as ordinary function tools instead. Grammar
|
|
171
220
|
// tools may carry no usable inputSchema, so fall back to a permissive
|
|
172
221
|
// object schema so grok still registers a valid function tool.
|
|
222
|
+
if (nativeDeferred && (t?.deferLoading === true || t?.defer_loading === true)) {
|
|
223
|
+
return { ...functionToolFromSessionTool(t), defer_loading: true };
|
|
224
|
+
}
|
|
173
225
|
return functionToolFromSessionTool(t);
|
|
174
226
|
});
|
|
175
227
|
}
|
|
@@ -237,7 +289,7 @@ export function parseResponsesToolCalls(response, label) {
|
|
|
237
289
|
} else if (item?.type === 'custom_tool_call') {
|
|
238
290
|
const call = customToolCallFromResponseItem(item);
|
|
239
291
|
if (call) out.push(call);
|
|
240
|
-
} else if (item?.type === 'tool_search_call') {
|
|
292
|
+
} else if (item?.type === 'tool_search_call' && item.execution !== 'server') {
|
|
241
293
|
const searchArgs =
|
|
242
294
|
item.arguments && typeof item.arguments === 'object' && !Array.isArray(item.arguments)
|
|
243
295
|
? item.arguments
|
|
@@ -409,16 +461,41 @@ export function toXaiResponsesInput(messages, providerState, options = {}) {
|
|
|
409
461
|
let history = [];
|
|
410
462
|
if (Array.isArray(state?.encryptedReasoningHistory)) history = state.encryptedReasoningHistory;
|
|
411
463
|
else if (Array.isArray(state?.encryptedReasoningItems)) {
|
|
412
|
-
history = [{ messageIndex: seen, items: state.encryptedReasoningItems }];
|
|
464
|
+
history = [{ messageIndex: seen, items: state.encryptedReasoningItems, owner: state.owner }];
|
|
413
465
|
}
|
|
414
466
|
for (const entry of history) {
|
|
415
467
|
const index = Number(entry?.messageIndex);
|
|
416
468
|
if (!Number.isInteger(index) || index < 0 || !Array.isArray(entry?.items)) continue;
|
|
469
|
+
// Owner-tagged reasoning (compat routes) never replays under another
|
|
470
|
+
// owner, even when a caller passes provider state across providers.
|
|
471
|
+
if (entry.owner !== undefined && entry.owner !== replayProvider) continue;
|
|
417
472
|
const bucket = reasoningByMessageIndex.get(index) || [];
|
|
418
473
|
bucket.push(...entry.items.map((item) => ({ ...item })));
|
|
419
474
|
reasoningByMessageIndex.set(index, bucket);
|
|
420
475
|
}
|
|
421
476
|
}
|
|
477
|
+
if (options.nativeLowering === true) {
|
|
478
|
+
// Native-item-capable Responses routes share the first-party lowering:
|
|
479
|
+
// native tool_search / custom calls keep their own output type, and only
|
|
480
|
+
// this route's own replay tag and reasoning state are replayed.
|
|
481
|
+
return {
|
|
482
|
+
input: convertMessagesToResponsesInput(messages, {
|
|
483
|
+
startIndex,
|
|
484
|
+
includeSystem,
|
|
485
|
+
nativePdf: options.nativePdf,
|
|
486
|
+
replayProvider,
|
|
487
|
+
// Compat-owned tool_search payloads are tagged with the route name.
|
|
488
|
+
nativeToolSearchProvider: options.providerName,
|
|
489
|
+
replayOwnedReasoning: true,
|
|
490
|
+
reasoningByMessageIndex,
|
|
491
|
+
effortProjection: options.effortProjection,
|
|
492
|
+
splitToolContent: (content) => splitToolContentForXaiResponses(content, { nativePdf: options.nativePdf }),
|
|
493
|
+
}),
|
|
494
|
+
previousResponseId,
|
|
495
|
+
startIndex,
|
|
496
|
+
continuationResetReason: resetReason,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
422
499
|
const pendingToolMedia = [];
|
|
423
500
|
const flushToolMedia = () => {
|
|
424
501
|
if (!pendingToolMedia.length) return;
|
|
@@ -5,6 +5,7 @@ import { consumeCompatResponsesStream } from './openai-compat-stream.mjs';
|
|
|
5
5
|
import { PROVIDER_FIRST_BYTE_TIMEOUT_MS, createPassthroughSignal } from '../stall-policy.mjs';
|
|
6
6
|
import {
|
|
7
7
|
nativeResponsesTools,
|
|
8
|
+
resolveCompatMaxOutputTokens,
|
|
8
9
|
toOpenAIMessages,
|
|
9
10
|
toResponsesTools,
|
|
10
11
|
toXaiResponsesInput,
|
|
@@ -26,17 +27,34 @@ import { applyCompatToolChoice, compatStreamRetryReporter } from './compat-reque
|
|
|
26
27
|
import { envFlag as _envFlag } from '../../../shared/env.mjs';
|
|
27
28
|
import { resolveResponsesTransportPolicy, RESPONSES_TRANSPORT_CAPABILITIES } from './openai-transport-policy.mjs';
|
|
28
29
|
|
|
30
|
+
// Server-side tool search is strictly opt-in, from the provider's own config
|
|
31
|
+
// (`xaiServerToolSearch`, shared by grok-oauth's inner xai provider) or the
|
|
32
|
+
// request opts. Unset, every xAI request body is unchanged: deferred tools go
|
|
33
|
+
// out as plain function tools and the client `load_tool` stays a function.
|
|
34
|
+
// Server-executed search items replay through the owner-tagged providerReplay
|
|
35
|
+
// envelope in either mode and are never dispatched locally.
|
|
36
|
+
function xaiServerToolSearchEnabled(provider, opts) {
|
|
37
|
+
return (opts.xaiServerToolSearch ?? provider.config?.xaiServerToolSearch) === true;
|
|
38
|
+
}
|
|
39
|
+
|
|
29
40
|
// Tool list, parallel tool calls, tool choice and reasoning effort shared by
|
|
30
41
|
// the HTTP/SSE and WebSocket Responses bodies.
|
|
31
42
|
function applyXaiResponsesToolsAndEffort(params, { provider, tools, opts, useModel }) {
|
|
32
43
|
const nativeTools = nativeResponsesTools(opts);
|
|
33
44
|
if (tools?.length || nativeTools.length) {
|
|
34
|
-
|
|
45
|
+
const toolOptions = xaiServerToolSearchEnabled(provider, opts)
|
|
46
|
+
? { provider: 'xai', serverToolSearch: true, onToolExcluded: opts.onToolExcluded }
|
|
47
|
+
: { provider: 'xai', onToolExcluded: opts.onToolExcluded };
|
|
48
|
+
params.tools = [...nativeTools, ...toResponsesTools(tools || [], toolOptions)];
|
|
35
49
|
}
|
|
36
50
|
// Explicit parallel tool calls, matching the OpenAI Responses
|
|
37
51
|
// reference shape. Probe-verified accepted by api.x.ai (HTTP 200,
|
|
38
|
-
// 2026-08-16); absent, the service default decides per turn.
|
|
39
|
-
|
|
52
|
+
// 2026-08-16); absent, the service default decides per turn. An explicit
|
|
53
|
+
// caller `parallelToolCalls:false` is honored (docs.x.ai function-calling).
|
|
54
|
+
if (params.tools?.length) params.parallel_tool_calls = opts.parallelToolCalls !== false;
|
|
55
|
+
// Caller output cap (docs.x.ai text best-practices): max_output_tokens.
|
|
56
|
+
const maxOutputTokens = resolveCompatMaxOutputTokens(opts);
|
|
57
|
+
if (maxOutputTokens) params.max_output_tokens = maxOutputTokens;
|
|
40
58
|
applyCompatToolChoice(params, opts);
|
|
41
59
|
const reasoningEffort = normalizeXaiReasoningEffort(
|
|
42
60
|
opts.xaiReasoningEffort ??
|
|
@@ -201,7 +219,8 @@ export async function sendXaiResponsesWebSocket(provider, messages, useModel, to
|
|
|
201
219
|
onTextDelta: typeof opts.onTextDelta === 'function' ? opts.onTextDelta : null,
|
|
202
220
|
onStageChange: typeof opts.onStageChange === 'function' ? opts.onStageChange : null,
|
|
203
221
|
externalSignal: signal,
|
|
204
|
-
|
|
222
|
+
// A forked request runs in its own transport scope (transport-scope.mjs).
|
|
223
|
+
poolKey: opts.transportScope || opts.sessionId || opts.session?.id || null,
|
|
205
224
|
cacheKey: cacheRouting.key,
|
|
206
225
|
iteration,
|
|
207
226
|
useModel,
|
|
@@ -235,13 +235,18 @@ export function useXaiResponsesApi(opts, config) {
|
|
|
235
235
|
}
|
|
236
236
|
|
|
237
237
|
export function useXaiResponsesWebSocket(opts, config) {
|
|
238
|
+
// A pinned route (grok-oauth's cli-chat-proxy) takes its transport from the
|
|
239
|
+
// config alone: the xAI WebSocket connector targets api.x.ai, so no request
|
|
240
|
+
// option or env override may carry the OAuth bearer there.
|
|
238
241
|
const raw =
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
config?.transportPinned === true
|
|
243
|
+
? config.responsesTransport
|
|
244
|
+
: (opts?.xaiResponsesTransport ??
|
|
245
|
+
opts?.xaiTransport ??
|
|
246
|
+
config?.responsesTransport ??
|
|
247
|
+
config?.transport ??
|
|
248
|
+
process.env.MIXDOG_XAI_RESPONSES_TRANSPORT ??
|
|
249
|
+
process.env.MIXDOG_XAI_TRANSPORT);
|
|
245
250
|
// Reference xAI/Grok parity is HTTP/SSE. WebSocket remains available only
|
|
246
251
|
// when a caller explicitly selects a WS transport.
|
|
247
252
|
if (raw == null || raw === '') return false;
|
|
@@ -15,7 +15,12 @@ import {
|
|
|
15
15
|
import { withEffortRejectionFallback } from './effort-rejection.mjs';
|
|
16
16
|
import { applyCompatErrorContract } from './openai-compat-error-contract.mjs';
|
|
17
17
|
import { sendCompatResponses } from './openai-compat-responses.mjs';
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
COMPAT_RETRY_POLICY,
|
|
20
|
+
COMPAT_RETRY_PROFILES,
|
|
21
|
+
XAI_COMPAT_RETRY_POLICY,
|
|
22
|
+
compatFirstResponseBudget,
|
|
23
|
+
} from './openai-compat-retry-profile.mjs';
|
|
19
24
|
import { sendCompatChat, recoverCompatNonStreaming } from './openai-compat-chat-send.mjs';
|
|
20
25
|
import { sendXaiResponses, sendXaiResponsesWebSocket } from './openai-compat-xai-send.mjs';
|
|
21
26
|
import {
|
|
@@ -78,6 +83,9 @@ export class OpenAICompatProvider {
|
|
|
78
83
|
this.config = config;
|
|
79
84
|
this.baseURL = baseURL;
|
|
80
85
|
this.apiKey = apiKey;
|
|
86
|
+
// Whether Chat content blocks keep their Anthropic-style `cache_control`
|
|
87
|
+
// (OpenRouter documents it); a gateway that does not ignores or rejects it.
|
|
88
|
+
this.chatCacheControl = (config.chatCacheControl ?? preset?.chatCacheControl) === true;
|
|
81
89
|
// Merge caller-supplied headers (config.extraHeaders) over the preset's.
|
|
82
90
|
// Used e.g. by grok-oauth to inject the Grok CLI client headers for the
|
|
83
91
|
// grok-build proxy. Backward-compatible: providers that pass no
|
|
@@ -97,6 +105,11 @@ export class OpenAICompatProvider {
|
|
|
97
105
|
}
|
|
98
106
|
}
|
|
99
107
|
}
|
|
108
|
+
// First-response budget of a chat profile with its own first-byte window;
|
|
109
|
+
// null keeps the agent watchdog default.
|
|
110
|
+
firstResponseBudget() {
|
|
111
|
+
return compatFirstResponseBudget(this.name, this.config?.chatProfile);
|
|
112
|
+
}
|
|
100
113
|
get _preconnectFn() {
|
|
101
114
|
return typeof this.config?.preconnectFn === 'function' ? this.config.preconnectFn : preconnect;
|
|
102
115
|
}
|
|
@@ -256,7 +269,9 @@ export class OpenAICompatProvider {
|
|
|
256
269
|
return fetchCompatModelItems(this);
|
|
257
270
|
}
|
|
258
271
|
async listModels() {
|
|
259
|
-
|
|
272
|
+
// A failed /models request must surface; an empty list would be cached as
|
|
273
|
+
// a complete catalog by the shared catalog loader.
|
|
274
|
+
return listCompatModels(this, { throwOnError: true });
|
|
260
275
|
}
|
|
261
276
|
async isAvailable() {
|
|
262
277
|
return isCompatProviderAvailable(this);
|
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
openAiCatalogMeta,
|
|
3
|
+
openAiSupportsExtendedRetention,
|
|
4
|
+
openAiUsesPromptCacheOptions,
|
|
5
|
+
} from './openai-model-capabilities.mjs';
|
|
2
6
|
|
|
3
|
-
// Public Responses contracts are independent of the OAuth backend.
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
const SNAPSHOT_SUFFIX = /-\d{4}-\d{2}-\d{2}$/;
|
|
7
|
+
// Public Responses contracts are independent of the OAuth backend. Service
|
|
8
|
+
// tiers come from the model catalog (the service-tier price columns), so a
|
|
9
|
+
// model the catalog lists works without an edit. Only a model no catalog
|
|
10
|
+
// describes (cold install) falls back to the documented ids known before the
|
|
11
|
+
// catalogs carried these columns.
|
|
9
12
|
const PRE_CATALOG_GPT_56_PLUS =
|
|
10
13
|
/^(?:gpt-6-(?:astra|sol|luna)|gpt-6\.1-sol|gpt-5\.6-(?:sol|terra|luna))(?:-\d{4}-\d{2}-\d{2})?$/;
|
|
11
14
|
const PRE_CATALOG_EARLIER_FAST = /^gpt-5\.(?:5|4|4-mini)(?:-\d{4}|$)/;
|
|
12
15
|
const PRE_CATALOG_ULTRAFAST = /^(?:gpt-6-astra|gpt-6\.1-sol)(?:-\d{4}-\d{2}-\d{2})?$/;
|
|
13
16
|
const modelId = (model) => String(model?.id || model || '').trim();
|
|
14
17
|
|
|
15
|
-
// The catalog metadata of one model. A dated snapshot reads as its undated
|
|
16
|
-
// alias when only the alias is listed.
|
|
17
|
-
function openAiCatalogMeta(model) {
|
|
18
|
-
const id = String(model?.id || model || '').trim();
|
|
19
|
-
for (const candidate of new Set([id, id.replace(SNAPSHOT_SUFFIX, '')])) {
|
|
20
|
-
const meta = candidate ? getModelMetadataSync(candidate, 'openai') : null;
|
|
21
|
-
if (meta) return meta;
|
|
22
|
-
}
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
18
|
export function openAiDirectSupportsFast(model) {
|
|
27
19
|
const meta = openAiCatalogMeta(model);
|
|
28
20
|
// The catalog's declaration (true or false) decides; a published Priority
|
|
@@ -40,13 +32,13 @@ export function openAiDirectSupportsUltrafast(model) {
|
|
|
40
32
|
return PRE_CATALOG_ULTRAFAST.test(modelId(model));
|
|
41
33
|
}
|
|
42
34
|
|
|
43
|
-
// OpenAI bills prompt-cache writes from GPT-5.6 on, and exactly those models
|
|
44
|
-
// take prompt_cache_options in place of prompt_cache_retention, so a published
|
|
45
|
-
// cache-write rate selects the new form.
|
|
46
35
|
// https://developers.openai.com/api/docs/guides/prompt-caching
|
|
36
|
+
// GPT-5.6 and later: prompt_cache_options.ttl. Earlier models: 24h
|
|
37
|
+
// prompt_cache_retention only on the documented extended-retention list;
|
|
38
|
+
// every other model gets no lifetime field (never inferred from pricing).
|
|
47
39
|
function promptCacheForm(model) {
|
|
48
|
-
|
|
49
|
-
return
|
|
40
|
+
if (openAiUsesPromptCacheOptions(model) || PRE_CATALOG_GPT_56_PLUS.test(modelId(model))) return 'options';
|
|
41
|
+
return openAiSupportsExtendedRetention(model) ? 'retention' : null;
|
|
50
42
|
}
|
|
51
43
|
|
|
52
44
|
export function applyOpenAIDirectCachePolicy(body, model, storeResponses) {
|
|
@@ -6,7 +6,16 @@
|
|
|
6
6
|
* Returns an OK response whose body is ready to stream; every failure path
|
|
7
7
|
* throws with the initial-response markers the retry classifier reads.
|
|
8
8
|
*/
|
|
9
|
+
import { promisify } from 'node:util';
|
|
9
10
|
import zlib from 'node:zlib';
|
|
11
|
+
import {
|
|
12
|
+
REQ_COMPRESSION_MIN_BYTES,
|
|
13
|
+
compressBody,
|
|
14
|
+
createCompressionLatch,
|
|
15
|
+
hasContentEncoding,
|
|
16
|
+
resendIfEncodingRejected,
|
|
17
|
+
withContentEncoding,
|
|
18
|
+
} from './lib/request-compression.mjs';
|
|
10
19
|
import { traceAgentFetch } from '../agent-trace.mjs';
|
|
11
20
|
import { PROVIDER_HTTP_RESPONSE_TIMEOUT_MS, createTimeoutSignal } from '../stall-policy.mjs';
|
|
12
21
|
import { CODEX_REQUEST_RETRY_BACKOFF_MS, CODEX_RETRY_JITTER_RATIO } from './openai-retry-policy.mjs';
|
|
@@ -37,7 +46,6 @@ const OPENAI_REQUEST_RETRY_OPTS = Object.freeze({
|
|
|
37
46
|
retryJitterRatio: CODEX_RETRY_JITTER_RATIO,
|
|
38
47
|
});
|
|
39
48
|
|
|
40
|
-
|
|
41
49
|
// Request-layer retry: 5xx and typed transport
|
|
42
50
|
// failures only. 408 and 429 are NOT retried here; they surface to the outer
|
|
43
51
|
// stream-retry layer, which owns their budget and honors Retry-After.
|
|
@@ -52,31 +60,29 @@ function isRetryableHttpFailure(err) {
|
|
|
52
60
|
}
|
|
53
61
|
// Request-body zstd gate. Namespace import: on Node runtimes without zlib
|
|
54
62
|
// zstd bindings the named export would fail at module load, so the call site
|
|
55
|
-
// typeof-guards zlib.
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
function _openaiReqZstdDisabled() {
|
|
59
|
-
return _openaiReqZstdLatch || process.env.MIXDOG_OPENAI_REQ_ZSTD === '0';
|
|
60
|
-
}
|
|
61
|
-
function _disableOpenaiReqZstd() {
|
|
62
|
-
_openaiReqZstdLatch = true;
|
|
63
|
-
}
|
|
64
|
-
function _zstdHeaders(headers, bodyForSend) {
|
|
65
|
-
return bodyForSend.encoding ? { ...headers, 'Content-Encoding': bodyForSend.encoding } : headers;
|
|
66
|
-
}
|
|
63
|
+
// typeof-guards zlib.zstdCompress instead.
|
|
64
|
+
const _openaiReqZstdLatch = createCompressionLatch('MIXDOG_OPENAI_REQ_ZSTD');
|
|
65
|
+
export const _resetOpenaiReqZstdLatchForTest = _openaiReqZstdLatch.reset;
|
|
67
66
|
|
|
68
67
|
// Request-body zstd: compression is enabled for the codex backend on the
|
|
69
68
|
// OpenAI provider — the server decompresses Content-Encoding: zstd.
|
|
70
|
-
// openai-direct is excluded: only the codex backend is verified.
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
69
|
+
// openai-direct is excluded: only the codex backend is verified. Compression
|
|
70
|
+
// runs on the libuv threadpool (zlib.zstdCompress, promisified) so it never
|
|
71
|
+
// blocks the main thread; runtimes without the async zstd binding send plain.
|
|
72
|
+
// Env kill-switch; the 400/415 resend + latch policy is shared
|
|
73
|
+
// (lib/request-compression.mjs).
|
|
74
|
+
async function encodeRequestBody(auth, headers, rawBytes) {
|
|
75
|
+
const plain = { bytes: rawBytes, encoding: null };
|
|
76
|
+
if (
|
|
77
|
+
auth?.type === 'openai-direct' ||
|
|
78
|
+
_openaiReqZstdLatch.disabled() ||
|
|
79
|
+
typeof zlib.zstdCompress !== 'function' ||
|
|
80
|
+
rawBytes.length < REQ_COMPRESSION_MIN_BYTES ||
|
|
81
|
+
hasContentEncoding(headers)
|
|
82
|
+
) {
|
|
83
|
+
return plain;
|
|
84
|
+
}
|
|
85
|
+
return compressBody(rawBytes, promisify(zlib.zstdCompress), 'zstd');
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
async function postWithRetries({
|
|
@@ -91,15 +97,32 @@ async function postWithRetries({
|
|
|
91
97
|
_sleepFn,
|
|
92
98
|
}) {
|
|
93
99
|
const label = httpLabel(auth);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
let httpError = null;
|
|
97
|
-
for (let attempt = 0; attempt <= CODEX_REQUEST_MAX_RETRIES; attempt++) {
|
|
100
|
+
const bodyForSend = await encodeRequestBody(auth, headers, rawBytes);
|
|
101
|
+
const fetchOnce = async (bytes, sendHeaders) => {
|
|
98
102
|
const headerTimeout = createTimeoutSignal(
|
|
99
103
|
totalTimeout.signal,
|
|
100
104
|
PROVIDER_HTTP_RESPONSE_TIMEOUT_MS,
|
|
101
105
|
`${label} initial response`
|
|
102
106
|
);
|
|
107
|
+
try {
|
|
108
|
+
return await fetchFn(responsesUrl, {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: sendHeaders,
|
|
111
|
+
body: bytes,
|
|
112
|
+
signal: headerTimeout.signal,
|
|
113
|
+
dispatcher: getLlmDispatcher(),
|
|
114
|
+
});
|
|
115
|
+
} catch (err) {
|
|
116
|
+
throw headerTimeout.signal?.aborted && headerTimeout.signal.reason instanceof Error
|
|
117
|
+
? headerTimeout.signal.reason
|
|
118
|
+
: err;
|
|
119
|
+
} finally {
|
|
120
|
+
headerTimeout.cleanup();
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
let response;
|
|
124
|
+
let httpError = null;
|
|
125
|
+
for (let attempt = 0; attempt <= CODEX_REQUEST_MAX_RETRIES; attempt++) {
|
|
103
126
|
let requestError = null;
|
|
104
127
|
try {
|
|
105
128
|
// Keep the established stage name for consumers, while making each
|
|
@@ -113,32 +136,20 @@ async function postWithRetries({
|
|
|
113
136
|
retry: attempt > 0,
|
|
114
137
|
});
|
|
115
138
|
} catch {}
|
|
116
|
-
response =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
139
|
+
response = bodyForSend.encoding
|
|
140
|
+
? await fetchOnce(bodyForSend.bytes, withContentEncoding(headers, bodyForSend.encoding))
|
|
141
|
+
: await fetchOnce(rawBytes, headers);
|
|
142
|
+
// Encoding rejection (400/415): resent uncompressed inside this attempt,
|
|
143
|
+
// so it never consumes a retry; the latch flips only if that succeeds.
|
|
144
|
+
response = await resendIfEncodingRejected({
|
|
145
|
+
response,
|
|
146
|
+
encoded: Boolean(bodyForSend.encoding),
|
|
147
|
+
resend: () => fetchOnce(rawBytes, headers),
|
|
148
|
+
latch: _openaiReqZstdLatch,
|
|
122
149
|
});
|
|
123
150
|
} catch (err) {
|
|
124
|
-
requestError =
|
|
125
|
-
headerTimeout.signal?.aborted && headerTimeout.signal.reason instanceof Error
|
|
126
|
-
? headerTimeout.signal.reason
|
|
127
|
-
: err;
|
|
128
|
-
} finally {
|
|
129
|
-
headerTimeout.cleanup();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// zstd rejection fallback: a 400 on a compressed request latches
|
|
133
|
-
// compression OFF process-wide and replays this attempt uncompressed.
|
|
134
|
-
if (response && response.status === 400 && bodyForSend.encoding) {
|
|
135
|
-
_disableOpenaiReqZstd();
|
|
136
|
-
bodyForSend = { bytes: rawBytes, encoding: null };
|
|
137
|
-
await response.arrayBuffer().catch(() => {});
|
|
138
151
|
response = undefined;
|
|
139
|
-
|
|
140
|
-
attempt--;
|
|
141
|
-
continue;
|
|
152
|
+
requestError = err;
|
|
142
153
|
}
|
|
143
154
|
// The error body is read exactly once, here, into the contract fields.
|
|
144
155
|
httpError = null;
|
|
@@ -183,8 +194,9 @@ async function postWithRetries({
|
|
|
183
194
|
// Uncapped for retryable errors; the attempt count is
|
|
184
195
|
// the bound, and the abort signal cancels the wait.
|
|
185
196
|
// The shared schedule carries a leading duplicate (withRetry convention).
|
|
186
|
-
|
|
187
|
-
const delayMs =
|
|
197
|
+
const raw = OPENAI_REQUEST_RETRY_OPTS.backoffMs[attempt + 1];
|
|
198
|
+
const delayMs =
|
|
199
|
+
retryAfterMsFromError(attemptFailure) ?? jitterDelayMs(raw, OPENAI_REQUEST_RETRY_OPTS.retryJitterRatio);
|
|
188
200
|
emitProviderRetryStage(onStageChange, {
|
|
189
201
|
attempt: attempt + 2,
|
|
190
202
|
maxAttempts: CODEX_REQUEST_MAX_RETRIES + 1,
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { recomputeToolInFlight } from '../response-state.mjs';
|
|
8
8
|
import { parseJsonObject } from '../response-items.mjs';
|
|
9
|
+
import { withToolCallNamespace } from '../../custom-tool-wire.mjs';
|
|
10
|
+
import { isIncompleteToolItem } from '../../lib/responses-terminal-fields.mjs';
|
|
9
11
|
|
|
10
12
|
function outputItemKind(item) {
|
|
11
13
|
if (item.type === 'reasoning') return 'reasoning';
|
|
@@ -19,10 +21,10 @@ export function createOutputItemEvents({ state, items, meaningful }) {
|
|
|
19
21
|
const onOutputItemAdded = (item) => {
|
|
20
22
|
if (item?.type === 'function_call') {
|
|
21
23
|
toolTracker.mark(item);
|
|
22
|
-
state.pendingCalls.set(
|
|
23
|
-
|
|
24
|
-
callId: item.call_id || '',
|
|
25
|
-
|
|
24
|
+
state.pendingCalls.set(
|
|
25
|
+
item.id || '',
|
|
26
|
+
withToolCallNamespace({ name: item.name || '', callId: item.call_id || '' }, item)
|
|
27
|
+
);
|
|
26
28
|
state.toolInFlight = true;
|
|
27
29
|
} else if (item?.type === 'tool_search_call') {
|
|
28
30
|
// Mark tool_search as in-flight the moment the item is added,
|
|
@@ -66,12 +68,15 @@ export function createOutputItemEvents({ state, items, meaningful }) {
|
|
|
66
68
|
meaningful('tool');
|
|
67
69
|
return;
|
|
68
70
|
}
|
|
69
|
-
const call =
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
const call = withToolCallNamespace(
|
|
72
|
+
{
|
|
73
|
+
id: pending?.callId || event.call_id || '',
|
|
74
|
+
name: pending?.name || event.name || '',
|
|
75
|
+
arguments: parseJsonObject(event.arguments),
|
|
76
|
+
_pendingItemId: itemId,
|
|
77
|
+
},
|
|
78
|
+
pending
|
|
79
|
+
);
|
|
75
80
|
state.toolCalls.push(call);
|
|
76
81
|
if (call.id && call.name) {
|
|
77
82
|
delete call._pendingItemId;
|
|
@@ -81,9 +86,17 @@ export function createOutputItemEvents({ state, items, meaningful }) {
|
|
|
81
86
|
};
|
|
82
87
|
|
|
83
88
|
const onOutputItemDone = (item) => {
|
|
89
|
+
if (isIncompleteToolItem(item)) {
|
|
90
|
+
// Server-truncated call: stays in flight, never collected or replayed.
|
|
91
|
+
toolTracker.mark(item);
|
|
92
|
+
state.toolInFlight = true;
|
|
93
|
+
meaningful('tool');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
84
96
|
items.pushResponseItem(item);
|
|
85
97
|
items.pushReasoningItem(item);
|
|
86
98
|
items.pushWebSearchCall(item);
|
|
99
|
+
state.refusals.absorbMessage(item);
|
|
87
100
|
if (item.type === 'function_call') {
|
|
88
101
|
const tc = state.toolCalls.find((t) => t._pendingItemId === (item.id || ''));
|
|
89
102
|
if (tc) items.completePendingCall(tc, item);
|