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
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
// Claude tool input schemas on the Antigravity gateway.
|
|
2
|
+
//
|
|
3
|
+
// The gateway's Claude bridge forwards `parametersJsonSchema` as an Anthropic
|
|
4
|
+
// `custom.input_schema`: JSON Schema draft 2020-12 with an object root and no
|
|
5
|
+
// root anyOf/oneOf/allOf/not. Following the MCP spec, a schema without
|
|
6
|
+
// `$schema` is 2020-12 and a declared dialect is honoured: draft-07 is
|
|
7
|
+
// translated to 2020-12 by the standard keyword mapping only (tuple `items` ->
|
|
8
|
+
// `prefixItems`, `additionalItems` -> `items`, `definitions` -> `$defs` with
|
|
9
|
+
// local refs rewritten, `dependencies` -> dependentRequired/dependentSchemas,
|
|
10
|
+
// keywords beside `$ref` dropped as draft-07 ignores them);
|
|
11
|
+
// any other dialect is unsupported. The result is checked with Ajv's 2020-12
|
|
12
|
+
// meta-schema and ref resolution, then against the provider's root rule. A
|
|
13
|
+
// schema that fails is invalid: nothing is rewritten to make it fit.
|
|
14
|
+
import Ajv2020 from 'ajv/dist/2020.js';
|
|
15
|
+
|
|
16
|
+
const DRAFT07 = { dropRefSiblings: true, renameDefs: true };
|
|
17
|
+
const MAP_KEYS = ['properties', 'patternProperties', '$defs', 'definitions', 'dependentSchemas'];
|
|
18
|
+
const NODE_KEYS = [
|
|
19
|
+
'items',
|
|
20
|
+
'additionalProperties',
|
|
21
|
+
'unevaluatedItems',
|
|
22
|
+
'unevaluatedProperties',
|
|
23
|
+
'contains',
|
|
24
|
+
'propertyNames',
|
|
25
|
+
'not',
|
|
26
|
+
'if',
|
|
27
|
+
'then',
|
|
28
|
+
'else',
|
|
29
|
+
'contentSchema',
|
|
30
|
+
];
|
|
31
|
+
const LIST_KEYS = ['prefixItems', 'allOf', 'anyOf', 'oneOf'];
|
|
32
|
+
const ROOT_FORBIDDEN_KEYS = ['anyOf', 'oneOf', 'allOf', 'not'];
|
|
33
|
+
|
|
34
|
+
const isPlainObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
35
|
+
export const escapePointer = (segment) => String(segment).replace(/~/g, '~0').replace(/\//g, '~1');
|
|
36
|
+
const put = (target, key, value) => {
|
|
37
|
+
Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
class SchemaProblem extends Error {
|
|
41
|
+
constructor(pointer, reason) {
|
|
42
|
+
super(reason);
|
|
43
|
+
this.pointer = pointer;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ---- dialect -----------------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
function dialectOf(schema) {
|
|
50
|
+
if (schema.$schema === undefined) return '2020-12';
|
|
51
|
+
const declared =
|
|
52
|
+
typeof schema.$schema === 'string' ? schema.$schema.replace(/^https?:\/\//, '').replace(/#$/, '') : '';
|
|
53
|
+
if (declared === 'json-schema.org/draft/2020-12/schema') return '2020-12';
|
|
54
|
+
if (declared === 'json-schema.org/draft-07/schema') return 'draft-07';
|
|
55
|
+
throw new SchemaProblem(
|
|
56
|
+
'/$schema',
|
|
57
|
+
`unsupported JSON Schema dialect ${JSON.stringify(schema.$schema)} (supported: 2020-12, draft-07)`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ---- draft-07 -> 2020-12 -------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
const isResourceId = (node) => typeof node.$id === 'string' && !node.$id.startsWith('#');
|
|
64
|
+
const rewriteRef = (ref) =>
|
|
65
|
+
ref.replace('#/definitions', (match, offset, whole) => {
|
|
66
|
+
const next = whole[offset + match.length];
|
|
67
|
+
return next === undefined || next === '/' ? '#/$defs' : match;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
function translateMap(map, ptr, ctx) {
|
|
71
|
+
const out = {};
|
|
72
|
+
for (const [name, child] of Object.entries(map))
|
|
73
|
+
put(out, name, translateDraft07(child, `${ptr}/${escapePointer(name)}`, false, ctx));
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function translateDraft07(node, ptr, isRoot, ctx) {
|
|
78
|
+
if (!isPlainObject(node)) return structuredClone(node);
|
|
79
|
+
const resource = isRoot || isResourceId(node);
|
|
80
|
+
const tuple = Array.isArray(node.items);
|
|
81
|
+
const out = {};
|
|
82
|
+
let legacyDefs;
|
|
83
|
+
// Draft-07 ignores every keyword beside `$ref`; 2020-12 evaluates them. Only
|
|
84
|
+
// the reference (and `definitions`, which a pointer ref may still resolve
|
|
85
|
+
// into) is kept, so the translated schema accepts what the original did.
|
|
86
|
+
const isRef = ctx.dropRefSiblings && typeof node.$ref === 'string';
|
|
87
|
+
for (const [key, value] of Object.entries(node)) {
|
|
88
|
+
if (isRef && key !== '$ref' && key !== 'definitions') continue;
|
|
89
|
+
const at = `${ptr}/${escapePointer(key)}`;
|
|
90
|
+
// Draft-04 boolean bounds: `minimum: n, exclusiveMinimum: true` is
|
|
91
|
+
// 2020-12's `exclusiveMinimum: n`; `false` is the default.
|
|
92
|
+
if ((key === 'exclusiveMinimum' || key === 'exclusiveMaximum') && typeof value === 'boolean') {
|
|
93
|
+
const bound = key === 'exclusiveMinimum' ? 'minimum' : 'maximum';
|
|
94
|
+
if (value && typeof node[bound] === 'number') put(out, key, node[bound]);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (
|
|
98
|
+
typeof value === 'number' &&
|
|
99
|
+
((key === 'minimum' && node.exclusiveMinimum === true) || (key === 'maximum' && node.exclusiveMaximum === true))
|
|
100
|
+
) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (key === 'items' && tuple) {
|
|
104
|
+
if (Object.hasOwn(node, 'prefixItems'))
|
|
105
|
+
throw new SchemaProblem(at, 'tuple "items" array conflicts with "prefixItems"');
|
|
106
|
+
put(
|
|
107
|
+
out,
|
|
108
|
+
'prefixItems',
|
|
109
|
+
value.map((child, i) => translateDraft07(child, `${at}/${i}`, false, ctx))
|
|
110
|
+
);
|
|
111
|
+
} else if (key === 'additionalItems' && tuple) {
|
|
112
|
+
put(out, 'items', translateDraft07(value, at, false, ctx));
|
|
113
|
+
} else if (key === 'dependencies' && isPlainObject(value)) {
|
|
114
|
+
if (Object.hasOwn(node, 'dependentRequired') || Object.hasOwn(node, 'dependentSchemas')) {
|
|
115
|
+
throw new SchemaProblem(at, '"dependencies" conflicts with dependentRequired/dependentSchemas');
|
|
116
|
+
}
|
|
117
|
+
for (const [name, dep] of Object.entries(value)) {
|
|
118
|
+
const target = Array.isArray(dep) ? 'dependentRequired' : 'dependentSchemas';
|
|
119
|
+
if (!Object.hasOwn(out, target)) put(out, target, {});
|
|
120
|
+
put(
|
|
121
|
+
out[target],
|
|
122
|
+
name,
|
|
123
|
+
Array.isArray(dep) ? structuredClone(dep) : translateDraft07(dep, `${at}/${escapePointer(name)}`, false, ctx)
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
} else if (key === 'definitions' && resource && ctx.renameDefs && isPlainObject(value)) {
|
|
127
|
+
legacyDefs = { value: translateMap(value, at, ctx), at };
|
|
128
|
+
} else if (key === '$ref' && typeof value === 'string') {
|
|
129
|
+
put(out, key, ctx.renameDefs ? rewriteRef(value) : value);
|
|
130
|
+
} else if (MAP_KEYS.includes(key) && isPlainObject(value)) {
|
|
131
|
+
put(out, key, translateMap(value, at, ctx));
|
|
132
|
+
} else if (NODE_KEYS.includes(key)) {
|
|
133
|
+
put(out, key, translateDraft07(value, at, false, ctx));
|
|
134
|
+
} else if (LIST_KEYS.includes(key) && Array.isArray(value)) {
|
|
135
|
+
put(
|
|
136
|
+
out,
|
|
137
|
+
key,
|
|
138
|
+
value.map((child, i) => translateDraft07(child, `${at}/${i}`, false, ctx))
|
|
139
|
+
);
|
|
140
|
+
} else {
|
|
141
|
+
put(out, key, structuredClone(value));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (legacyDefs) {
|
|
145
|
+
if (Object.hasOwn(out, '$defs'))
|
|
146
|
+
throw new SchemaProblem(legacyDefs.at, '"definitions" and "$defs" are both present');
|
|
147
|
+
put(out, '$defs', legacyDefs.value);
|
|
148
|
+
}
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ---- validation ----------------------------------------------------------------
|
|
153
|
+
|
|
154
|
+
// Where a `$ref` the validator could not resolve is written (diagnostics only).
|
|
155
|
+
function refPointer(node, matches, ptr = '') {
|
|
156
|
+
if (Array.isArray(node)) {
|
|
157
|
+
for (const [i, child] of node.entries()) {
|
|
158
|
+
const found = refPointer(child, matches, `${ptr}/${i}`);
|
|
159
|
+
if (found !== undefined) return found;
|
|
160
|
+
}
|
|
161
|
+
} else if (isPlainObject(node)) {
|
|
162
|
+
if (typeof node.$ref === 'string' && matches(node.$ref)) return `${ptr}/$ref`;
|
|
163
|
+
for (const [key, child] of Object.entries(node)) {
|
|
164
|
+
const found = refPointer(child, matches, `${ptr}/${escapePointer(key)}`);
|
|
165
|
+
if (found !== undefined) return found;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function assertValidDraft202012(schema) {
|
|
172
|
+
const ajv = new Ajv2020({ strict: false, validateFormats: false, validateSchema: false });
|
|
173
|
+
// Draft-04 `id` is an annotation providers ignore; Ajv would refuse it.
|
|
174
|
+
ajv.removeKeyword('id');
|
|
175
|
+
ajv.addKeyword('id');
|
|
176
|
+
if (!ajv.validateSchema(schema)) {
|
|
177
|
+
const [error] = ajv.errors;
|
|
178
|
+
throw new SchemaProblem(error.instancePath, `not a valid JSON Schema 2020-12 schema: ${error.message}`);
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
ajv.compile(schema);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
if (!error.missingRef) throw new SchemaProblem('', error.message);
|
|
184
|
+
const pointer = refPointer(schema, (ref) => error.missingRef === ref || error.missingRef.endsWith(ref)) ?? '';
|
|
185
|
+
throw new SchemaProblem(pointer, `unresolvable $ref "${error.missingRef}"`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// `rule`: 'anthropic' (object root, no root combinators), 'openai' (object
|
|
190
|
+
// root) or 'gemini' (object root, or no type at all).
|
|
191
|
+
function assertObjectRoot(schema, rule) {
|
|
192
|
+
const label = rule === 'anthropic' ? 'Anthropic input_schema root' : 'the input schema root';
|
|
193
|
+
if (rule === 'gemini' && schema.type === undefined) return;
|
|
194
|
+
if (schema.type !== 'object') throw new SchemaProblem('/type', `${label} must have type "object"`);
|
|
195
|
+
if (rule !== 'anthropic') return;
|
|
196
|
+
for (const key of ROOT_FORBIDDEN_KEYS) {
|
|
197
|
+
if (Object.hasOwn(schema, key)) {
|
|
198
|
+
throw new SchemaProblem(`/${key}`, `Anthropic input_schema does not allow a root "${key}"`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function buildSchema(inputSchema) {
|
|
204
|
+
if (!isPlainObject(inputSchema)) throw new SchemaProblem('', 'the input schema must be a JSON object schema');
|
|
205
|
+
const { $schema, ...rest } = inputSchema;
|
|
206
|
+
const schema =
|
|
207
|
+
dialectOf(inputSchema) === 'draft-07' ? translateDraft07(rest, '', true, DRAFT07) : structuredClone(rest);
|
|
208
|
+
assertValidDraft202012(schema);
|
|
209
|
+
assertObjectRoot(schema, 'anthropic');
|
|
210
|
+
return schema;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ---- per-wire normalization -----------------------------------------------------
|
|
214
|
+
//
|
|
215
|
+
// A schema the wire accepts as written is sent as written (byte-identical, so
|
|
216
|
+
// the prompt cache holds). Only a schema that fails validation is repaired --
|
|
217
|
+
// draft-07/04 constructs lowered to 2020-12 (tuple `items`, `definitions`,
|
|
218
|
+
// `dependencies`, boolean exclusive bounds, keywords beside `$ref`), a missing
|
|
219
|
+
// root `type` filled in -- and re-validated; what still fails is excluded.
|
|
220
|
+
|
|
221
|
+
function repairRoot(schema) {
|
|
222
|
+
const { type } = schema;
|
|
223
|
+
if (Array.isArray(type) && type.includes('object')) return { ...schema, type: 'object' };
|
|
224
|
+
if (type !== undefined || Object.hasOwn(schema, '$ref')) return schema;
|
|
225
|
+
const out = { type: 'object', ...schema };
|
|
226
|
+
if (!Object.hasOwn(out, 'properties') && !ROOT_FORBIDDEN_KEYS.some((k) => Object.hasOwn(out, k))) out.properties = {};
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Whether any `$ref` points into a draft-07 `#/definitions` table.
|
|
231
|
+
function refsIntoDefinitions(node) {
|
|
232
|
+
if (Array.isArray(node)) return node.some(refsIntoDefinitions);
|
|
233
|
+
if (!isPlainObject(node)) return false;
|
|
234
|
+
return Object.entries(node).some(
|
|
235
|
+
([key, value]) =>
|
|
236
|
+
(key === '$ref' && typeof value === 'string' && /^#\/definitions(\/|$)/.test(value)) || refsIntoDefinitions(value)
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Only a schema that declares draft-07/04 gets draft-07 `$ref` semantics
|
|
241
|
+
// (keywords beside `$ref` ignored); otherwise siblings are real constraints.
|
|
242
|
+
const declaresLegacyDraft = ($schema) => typeof $schema === 'string' && /draft-0[4-7]/.test($schema);
|
|
243
|
+
|
|
244
|
+
/** The lowered copy of a tool input schema for `rule`, or null when it cannot
|
|
245
|
+
* be lowered. Fixes only what validation rejects: tuple `items`, boolean
|
|
246
|
+
* exclusive bounds, `dependencies`, draft-07 `definitions` refs and the root
|
|
247
|
+
* `type`. Never mutates `inputSchema`. */
|
|
248
|
+
export function repairedToolInputSchema(inputSchema, rule) {
|
|
249
|
+
if (!isPlainObject(inputSchema)) return null;
|
|
250
|
+
const { $schema, ...rest } = inputSchema;
|
|
251
|
+
try {
|
|
252
|
+
const lowered = translateDraft07(rest, '', true, {
|
|
253
|
+
dropRefSiblings: declaresLegacyDraft($schema),
|
|
254
|
+
renameDefs: refsIntoDefinitions(rest),
|
|
255
|
+
});
|
|
256
|
+
return rule === 'gemini' ? lowered : repairRoot(lowered);
|
|
257
|
+
} catch (error) {
|
|
258
|
+
if (error instanceof SchemaProblem) return null;
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const wireProblems = new Map();
|
|
264
|
+
|
|
265
|
+
/** Why `schema` is not accepted as written on a `rule` wire, as `{ pointer,
|
|
266
|
+
* reason }`, or null. `$schema` is not validated against (the provider reads
|
|
267
|
+
* the keywords, not the dialect). */
|
|
268
|
+
function wireProblem(schema, rule) {
|
|
269
|
+
let key;
|
|
270
|
+
try {
|
|
271
|
+
key = `${rule}\0${JSON.stringify(schema) ?? 'undefined'}`;
|
|
272
|
+
} catch {
|
|
273
|
+
key = null;
|
|
274
|
+
}
|
|
275
|
+
if (key !== null && wireProblems.has(key)) return wireProblems.get(key);
|
|
276
|
+
let problem = null;
|
|
277
|
+
try {
|
|
278
|
+
if (!isPlainObject(schema)) throw new SchemaProblem('', 'the input schema must be a JSON object schema');
|
|
279
|
+
const { $schema, ...rest } = schema;
|
|
280
|
+
assertValidDraft202012(rest);
|
|
281
|
+
assertObjectRoot(rest, rule);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
if (!(error instanceof SchemaProblem)) throw error;
|
|
284
|
+
problem = { pointer: error.pointer, reason: error.message };
|
|
285
|
+
}
|
|
286
|
+
if (key !== null) {
|
|
287
|
+
if (wireProblems.size >= CACHE_LIMIT) wireProblems.clear();
|
|
288
|
+
wireProblems.set(key, problem);
|
|
289
|
+
}
|
|
290
|
+
return problem;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** The schema to send for a tool on a `rule` wire: `{ schema }` (the same
|
|
294
|
+
* object when it is accepted as written, else its lowered copy), or `{
|
|
295
|
+
* pointer, reason }` when it is broken even after lowering. */
|
|
296
|
+
export function wireInputSchema(inputSchema, rule) {
|
|
297
|
+
const problem = wireProblem(inputSchema, rule);
|
|
298
|
+
if (!problem) return { schema: inputSchema };
|
|
299
|
+
const repaired = repairedToolInputSchema(inputSchema, rule);
|
|
300
|
+
const remaining = repaired ? wireProblem(repaired, rule) : problem;
|
|
301
|
+
return remaining || { schema: repaired };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** `tools` with each unacceptable one left out (reported through
|
|
305
|
+
* `onToolExcluded`) and each repairable one carrying its lowered schema; the
|
|
306
|
+
* same array when nothing changed. A tool without a schema is sent as
|
|
307
|
+
* written, as is any tool `isExempt` names (no JSON schema on the wire). */
|
|
308
|
+
export function acceptedWireTools(tools, rule, onToolExcluded, source, isExempt = () => false) {
|
|
309
|
+
let changed = false;
|
|
310
|
+
const out = [];
|
|
311
|
+
tools.forEach((tool, index) => {
|
|
312
|
+
const schema = tool?.inputSchema;
|
|
313
|
+
if (schema == null || isExempt(tool)) {
|
|
314
|
+
out.push(tool);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const result = wireInputSchema(schema, rule);
|
|
318
|
+
if (!result.schema) {
|
|
319
|
+
reportInvalidTool(tool.name, index, result, onToolExcluded, source);
|
|
320
|
+
changed = true;
|
|
321
|
+
} else if (result.schema !== schema) {
|
|
322
|
+
out.push({ ...tool, inputSchema: result.schema });
|
|
323
|
+
changed = true;
|
|
324
|
+
} else out.push(tool);
|
|
325
|
+
});
|
|
326
|
+
return changed ? out : tools;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const cache = new Map();
|
|
330
|
+
const CACHE_LIMIT = 256;
|
|
331
|
+
|
|
332
|
+
/** The draft 2020-12 `parametersJsonSchema` for a Claude tool declaration:
|
|
333
|
+
* `{ schema }`, or `{ pointer, reason }` (a JSON pointer into the tool's own
|
|
334
|
+
* input schema) when the schema is invalid under its dialect or for the
|
|
335
|
+
* provider. Never mutates `inputSchema`. */
|
|
336
|
+
export function claudeBridgeInputSchema(inputSchema) {
|
|
337
|
+
let key;
|
|
338
|
+
try {
|
|
339
|
+
key = JSON.stringify(inputSchema) ?? 'undefined';
|
|
340
|
+
} catch {
|
|
341
|
+
key = null;
|
|
342
|
+
}
|
|
343
|
+
let result = key === null ? undefined : cache.get(key);
|
|
344
|
+
if (!result) {
|
|
345
|
+
try {
|
|
346
|
+
result = { schema: buildSchema(inputSchema) };
|
|
347
|
+
} catch (error) {
|
|
348
|
+
if (!(error instanceof SchemaProblem)) throw error;
|
|
349
|
+
// Not valid as written: lower undeclared draft-07/04 constructs and
|
|
350
|
+
// fill the root type; only a schema still broken is excluded.
|
|
351
|
+
const repaired = repairedToolInputSchema(inputSchema, 'anthropic');
|
|
352
|
+
result =
|
|
353
|
+
repaired && !wireProblem(repaired, 'anthropic')
|
|
354
|
+
? { schema: repaired }
|
|
355
|
+
: { pointer: error.pointer, reason: error.message };
|
|
356
|
+
}
|
|
357
|
+
if (key !== null) {
|
|
358
|
+
if (cache.size >= CACHE_LIMIT) cache.clear();
|
|
359
|
+
cache.set(key, result);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return result.schema ? { schema: structuredClone(result.schema) } : result;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** Why `schema` is not a valid Gemini `parametersJsonSchema` (a JSON Schema
|
|
366
|
+
* 2020-12 schema with an object root), as `{ pointer, reason }` into the
|
|
367
|
+
* schema, or null when it is valid. Never mutates `schema`. */
|
|
368
|
+
export const geminiJsonSchemaProblem = (schema) => wireProblem(schema, 'gemini');
|
|
369
|
+
|
|
370
|
+
const warned = new Set();
|
|
371
|
+
|
|
372
|
+
/** An invalid tool is left out of the request and reported with its name,
|
|
373
|
+
* index, pointer and reason: to `onToolExcluded({ name, index, pointer,
|
|
374
|
+
* reason, message })` when given (the agent loop records it for the session),
|
|
375
|
+
* otherwise once per distinct problem on console.warn. `source` prefixes the
|
|
376
|
+
* console message (which route and kind of tool). */
|
|
377
|
+
export function reportInvalidTool(
|
|
378
|
+
toolName,
|
|
379
|
+
index,
|
|
380
|
+
{ pointer, reason },
|
|
381
|
+
onToolExcluded,
|
|
382
|
+
source = '[antigravity] Claude tool'
|
|
383
|
+
) {
|
|
384
|
+
const at = pointer || '/';
|
|
385
|
+
const message = `${source} "${toolName}" (tools[${index}]) excluded: invalid input schema at "${at}": ${reason}`;
|
|
386
|
+
if (typeof onToolExcluded === 'function') {
|
|
387
|
+
return onToolExcluded({ name: toolName, index, pointer: at, reason, message });
|
|
388
|
+
}
|
|
389
|
+
if (warned.has(message)) return undefined;
|
|
390
|
+
warned.add(message);
|
|
391
|
+
return console.warn(message);
|
|
392
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Anthropic Messages usage reports input EXCLUDING cache read/write. A gateway
|
|
2
|
+
// provider whose ledger convention is inclusive input (OpenCode Go, Command
|
|
3
|
+
// Code, OpenRouter, DeepSeek — registry inputExcludesCache:false) reports its
|
|
4
|
+
// Messages route in that inclusive form, so every wire of one provider counts
|
|
5
|
+
// prompt volume the same way.
|
|
6
|
+
import { currentUsageContext } from '../../../../shared/llm/usage-context.mjs';
|
|
7
|
+
|
|
8
|
+
// Usage objects already converted to the inclusive convention; a converted
|
|
9
|
+
// object passing through another normalization (nested send) stays as is,
|
|
10
|
+
// and one source object always converts to the same object, so an abandoned
|
|
11
|
+
// attempt and the error that later carries it stay one record.
|
|
12
|
+
const inclusiveUsage = new WeakSet();
|
|
13
|
+
const convertedUsage = new WeakMap();
|
|
14
|
+
|
|
15
|
+
export function toInclusiveUsage(usage) {
|
|
16
|
+
if (!usage || inclusiveUsage.has(usage)) return usage;
|
|
17
|
+
if (convertedUsage.has(usage)) return convertedUsage.get(usage);
|
|
18
|
+
const input = Number(usage.inputTokens) || 0;
|
|
19
|
+
const cached = Number(usage.cachedTokens) || 0;
|
|
20
|
+
const cacheWrite = Number(usage.cacheWriteTokens) || 0;
|
|
21
|
+
const inclusiveInput = input + cached + cacheWrite;
|
|
22
|
+
const converted = {
|
|
23
|
+
...usage,
|
|
24
|
+
inputTokens: inclusiveInput,
|
|
25
|
+
promptTokens: Math.max(Number(usage.promptTokens) || 0, inclusiveInput),
|
|
26
|
+
};
|
|
27
|
+
inclusiveUsage.add(converted);
|
|
28
|
+
convertedUsage.set(usage, converted);
|
|
29
|
+
return converted;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function toInclusiveUsageError(error) {
|
|
33
|
+
if (error && typeof error === 'object') {
|
|
34
|
+
if (error.usage) error.usage = toInclusiveUsage(error.usage);
|
|
35
|
+
if (error.partialUsage) error.partialUsage = toInclusiveUsage(error.partialUsage);
|
|
36
|
+
}
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Run one Messages-wire send of an inclusive-input provider: the success
|
|
42
|
+
* usage, a failure's usage/partial usage and every abandoned attempt the
|
|
43
|
+
* inner Anthropic transport notes are all reported inclusive.
|
|
44
|
+
*/
|
|
45
|
+
export async function withInclusiveUsage(send) {
|
|
46
|
+
const identity = currentUsageContext();
|
|
47
|
+
if (identity) identity.normalizeAbandonedUsage = toInclusiveUsage;
|
|
48
|
+
try {
|
|
49
|
+
const result = await send();
|
|
50
|
+
return result?.usage ? { ...result, usage: toInclusiveUsage(result.usage) } : result;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
throw toInclusiveUsageError(error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// A fetch bound to one gateway origin: anything outside `origin` is refused
|
|
2
|
+
// before the credential leaves the process, and redirects are never followed
|
|
3
|
+
// (any 3xx is an error), so a gateway credential can only reach its gateway.
|
|
4
|
+
export function originBoundFetch(origin, fetchImpl, label) {
|
|
5
|
+
return async (input, init) => {
|
|
6
|
+
const url = new URL(String(input?.url ?? input));
|
|
7
|
+
if (url.origin !== origin) {
|
|
8
|
+
throw new Error(`[${label}] refusing to send the API key to ${url.host}`);
|
|
9
|
+
}
|
|
10
|
+
const res = await (fetchImpl || globalThis.fetch)(input, { ...init, redirect: 'manual' });
|
|
11
|
+
if (res.status >= 300 && res.status < 400) {
|
|
12
|
+
throw new Error(`[${label}] refusing to follow a redirect from ${url.host}`);
|
|
13
|
+
}
|
|
14
|
+
return res;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Shared request-body compression for provider POSTs (Anthropic gzip, Codex
|
|
2
|
+
// zstd). Policy in one place:
|
|
3
|
+
// - bodies below REQ_COMPRESSION_MIN_BYTES are never compressed (CPU + header
|
|
4
|
+
// cost outweighs the upload saving);
|
|
5
|
+
// - a request that already carries Content-Encoding is never double-encoded;
|
|
6
|
+
// - a compression failure fails open to the plain body;
|
|
7
|
+
// - a 400/415 on a compressed request is drained and the SAME request is
|
|
8
|
+
// resent once uncompressed; compression latches off process-wide only when
|
|
9
|
+
// that plain resend succeeds (the encoding was the cause). If the resend
|
|
10
|
+
// fails too, nothing latches and the resend's response is returned.
|
|
11
|
+
import { promisify } from 'node:util';
|
|
12
|
+
import { gzip } from 'node:zlib';
|
|
13
|
+
|
|
14
|
+
export const REQ_COMPRESSION_MIN_BYTES = 8 * 1024;
|
|
15
|
+
|
|
16
|
+
export function createCompressionLatch(envVar) {
|
|
17
|
+
let latched = false;
|
|
18
|
+
return {
|
|
19
|
+
disabled: () => latched || process.env[envVar] === '0',
|
|
20
|
+
latchOff: () => {
|
|
21
|
+
latched = true;
|
|
22
|
+
},
|
|
23
|
+
reset: () => {
|
|
24
|
+
latched = false;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// One latch for every api.anthropic.com /v1/messages path (OAuth + API key).
|
|
30
|
+
export const anthropicGzipLatch = createCompressionLatch('MIXDOG_ANTHROPIC_REQ_GZIP');
|
|
31
|
+
// Compress on the libuv threadpool so large turn bodies never block the main thread.
|
|
32
|
+
export const gzipAsync = promisify(gzip);
|
|
33
|
+
|
|
34
|
+
export const hasContentEncoding = (headers) => new Headers(headers || {}).has('content-encoding');
|
|
35
|
+
|
|
36
|
+
export function withContentEncoding(headers, encoding) {
|
|
37
|
+
if (headers instanceof Headers || Array.isArray(headers)) {
|
|
38
|
+
const next = new Headers(headers);
|
|
39
|
+
next.delete('content-length');
|
|
40
|
+
next.set('Content-Encoding', encoding);
|
|
41
|
+
return next;
|
|
42
|
+
}
|
|
43
|
+
const rest = Object.fromEntries(
|
|
44
|
+
Object.entries(headers || {}).filter(([name]) => name.toLowerCase() !== 'content-length')
|
|
45
|
+
);
|
|
46
|
+
return { ...rest, 'Content-Encoding': encoding };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Fail open: any compression error yields the plain body.
|
|
50
|
+
export async function compressBody(raw, compress, encoding) {
|
|
51
|
+
try {
|
|
52
|
+
return { bytes: await compress(raw), encoding };
|
|
53
|
+
} catch {
|
|
54
|
+
return { bytes: raw, encoding: null };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const isEncodingRejection = (response) => response.status === 400 || response.status === 415;
|
|
59
|
+
|
|
60
|
+
export async function resendIfEncodingRejected({ response, encoded, resend, latch }) {
|
|
61
|
+
if (!encoded || !isEncodingRejection(response)) return response;
|
|
62
|
+
try {
|
|
63
|
+
await response.arrayBuffer();
|
|
64
|
+
} catch {
|
|
65
|
+
/* drain best-effort */
|
|
66
|
+
}
|
|
67
|
+
const retry = await resend();
|
|
68
|
+
if (retry.ok) latch.latchOff();
|
|
69
|
+
return retry;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Send `raw` compressed when eligible, with the rejection resend above.
|
|
74
|
+
* `send(bytes, headers)` performs one HTTP request.
|
|
75
|
+
*/
|
|
76
|
+
export async function sendWithCompression({ raw, headers, encoding, compress, latch, send }) {
|
|
77
|
+
const plain = () => send(raw, headers);
|
|
78
|
+
if (latch.disabled() || raw.length < REQ_COMPRESSION_MIN_BYTES || hasContentEncoding(headers)) return plain();
|
|
79
|
+
const packed = await compressBody(raw, compress, encoding);
|
|
80
|
+
if (!packed.encoding) return plain();
|
|
81
|
+
const response = await send(packed.bytes, withContentEncoding(headers, encoding));
|
|
82
|
+
return resendIfEncodingRejected({ response, encoded: true, resend: plain, latch });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const sendGzipCompressed = ({ compress = gzipAsync, ...rest }) =>
|
|
86
|
+
sendWithCompression({ ...rest, encoding: 'gzip', compress, latch: anthropicGzipLatch });
|
|
@@ -23,6 +23,17 @@ export function incompleteReasonFromEvent(event) {
|
|
|
23
23
|
return String(reasonObj?.reason || event?.response?.status || 'incomplete');
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
// A function/custom/tool_search call item the server cut off (status
|
|
27
|
+
// 'incomplete'): its arguments or input are truncated, so it is never a call
|
|
28
|
+
// to run or replay. The stream keeps it tracked as a tool still in flight, so
|
|
29
|
+
// the terminal frame reads as a pending-tool cutoff.
|
|
30
|
+
export function isIncompleteToolItem(item) {
|
|
31
|
+
return (
|
|
32
|
+
item?.status === 'incomplete' &&
|
|
33
|
+
(item.type === 'function_call' || item.type === 'custom_tool_call' || item.type === 'tool_search_call')
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
26
37
|
export function isMaxOutputIncompleteReason(reason) {
|
|
27
38
|
return /^(?:max_output_tokens|max_tokens|length|output_token_limit)$/i.test(String(reason || '').trim());
|
|
28
39
|
}
|
|
@@ -19,6 +19,14 @@ export function round(value, digits = 4) {
|
|
|
19
19
|
return Math.round(n * scale) / scale;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
// Provider-reported USD cost. null/empty/non-finite/negative is "not
|
|
23
|
+
// reported" (undefined), never a reported $0.
|
|
24
|
+
export function reportedCostUsd(value) {
|
|
25
|
+
if (value == null || (typeof value === 'string' && value.trim() === '')) return undefined;
|
|
26
|
+
const n = Number(value);
|
|
27
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
22
30
|
export function cleanString(value) {
|
|
23
31
|
const s = typeof value === 'string' ? value.trim() : '';
|
|
24
32
|
return s || null;
|