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
|
@@ -5,8 +5,21 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { SchemaType } from '@google/generative-ai';
|
|
7
7
|
import { traceHash, stableTraceStringify } from './trace-utils.mjs';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
normalizeContentForGeminiParts,
|
|
10
|
+
splitToolContentForGemini,
|
|
11
|
+
geminiPartMetadata,
|
|
12
|
+
} from './media-normalization.mjs';
|
|
9
13
|
import { providerReplayItems } from './lib/provider-replay.mjs';
|
|
14
|
+
import {
|
|
15
|
+
claudeBridgeInputSchema,
|
|
16
|
+
escapePointer,
|
|
17
|
+
geminiJsonSchemaProblem,
|
|
18
|
+
repairedToolInputSchema,
|
|
19
|
+
reportInvalidTool,
|
|
20
|
+
} from './lib/claude-bridge-schema.mjs';
|
|
21
|
+
import { actionInputUnionFor } from './lib/action-input-contract.mjs';
|
|
22
|
+
import { isGeminiFamilyModel } from './gemini-family.mjs';
|
|
10
23
|
import { ensureGeminiToolCallSignatures } from './gemini-history-signatures.mjs';
|
|
11
24
|
|
|
12
25
|
// Bounds on persisted provider metadata replayed back into the prompt.
|
|
@@ -20,14 +33,22 @@ function explicitGeminiMediaPart(part) {
|
|
|
20
33
|
if (typeof inline?.data === 'string' && inline.data) {
|
|
21
34
|
const mimeType = inline.mimeType || inline.mime_type || inline.mediaType || inline.media_type;
|
|
22
35
|
if (typeof mimeType === 'string' && mimeType) {
|
|
23
|
-
return { inlineData: { mimeType, data: inline.data } };
|
|
36
|
+
return { inlineData: { mimeType, data: inline.data }, ...geminiPartMetadata(part) };
|
|
24
37
|
}
|
|
25
38
|
}
|
|
39
|
+
// An explicit fileData part keeps exactly the MIME type it declared; with
|
|
40
|
+
// none, the shared normalizer resolves it from the URI or omits it.
|
|
26
41
|
const file = part.fileData || part.file_data;
|
|
27
42
|
const fileUri = file?.fileUri || file?.file_uri;
|
|
28
43
|
const mimeType = file?.mimeType || file?.mime_type || file?.mediaType || file?.media_type;
|
|
29
|
-
if (typeof fileUri === 'string' && fileUri
|
|
30
|
-
|
|
44
|
+
if (typeof fileUri === 'string' && fileUri) {
|
|
45
|
+
const info = { fileUri };
|
|
46
|
+
if (typeof mimeType === 'string' && mimeType) info.mimeType = mimeType;
|
|
47
|
+
else {
|
|
48
|
+
const resolved = normalizeContentForGeminiParts([part])[0]?.fileData?.mimeType;
|
|
49
|
+
if (resolved) info.mimeType = resolved;
|
|
50
|
+
}
|
|
51
|
+
return { fileData: info, ...geminiPartMetadata(part) };
|
|
31
52
|
}
|
|
32
53
|
return null;
|
|
33
54
|
}
|
|
@@ -506,34 +527,256 @@ function pruneTypeSpecificKeywords(result, rawType) {
|
|
|
506
527
|
function needsJsonParameters(schema) {
|
|
507
528
|
if (typeof schema === 'boolean') return true;
|
|
508
529
|
if (!schema || typeof schema !== 'object') return false;
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
530
|
+
return !legacyRepresentable(schema, true);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
const LEGACY_JSON_TYPES = new Set(['string', 'number', 'integer', 'boolean', 'array', 'object']);
|
|
534
|
+
// Annotation-only keywords: dropping them never widens the accepted arguments.
|
|
535
|
+
const ANNOTATION_KEYS = new Set(['$schema', '$id', '$comment', 'examples']);
|
|
536
|
+
const NON_CONSTRAINT_KEYS = new Set([...ANNOTATION_KEYS, 'description', 'title', 'default', 'example']);
|
|
537
|
+
|
|
538
|
+
/** True when the legacy OpenAPI Schema subset expresses `input` exactly:
|
|
539
|
+
* convertSchema would neither drop a constraint nor invent a replacement. */
|
|
540
|
+
function legacyRepresentable(input, root = false) {
|
|
541
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) return false;
|
|
542
|
+
const flat = flattenAllOf(input);
|
|
543
|
+
if (flat.conflict) return false;
|
|
544
|
+
const schema = flat.schema;
|
|
545
|
+
const keys = Object.keys(schema);
|
|
546
|
+
if (!keys.some((key) => !NON_CONSTRAINT_KEYS.has(key))) return false;
|
|
547
|
+
for (const key of keys) {
|
|
548
|
+
if (GEMINI_SCHEMA_FIELDS.has(key) || ANNOTATION_KEYS.has(key)) continue;
|
|
549
|
+
// additionalProperties:true is the default; anything else is a constraint.
|
|
550
|
+
if (key === 'additionalProperties' && schema[key] === true) continue;
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
if (schema.oneOf !== undefined || schema.not !== undefined) return false;
|
|
554
|
+
|
|
555
|
+
const declared = [].concat(schema.type ?? []);
|
|
556
|
+
const nonNull = declared.filter((type) => type !== 'null');
|
|
557
|
+
if (declared.length && !nonNull.length) return false;
|
|
558
|
+
if (nonNull.length > 1 || nonNull.some((type) => !LEGACY_JSON_TYPES.has(type))) return false;
|
|
559
|
+
let type = nonNull[0];
|
|
560
|
+
if (!type && (schema.properties || schema.required)) type = 'object';
|
|
561
|
+
if (!type && schema.items) type = 'array';
|
|
562
|
+
|
|
563
|
+
if (schema.enum !== undefined && (!Array.isArray(schema.enum) || schema.enum.some((v) => typeof v !== 'string'))) {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
if (schema.const !== undefined && typeof schema.const !== 'string') return false;
|
|
567
|
+
if (['integer', 'number', 'boolean'].includes(type) && (schema.enum !== undefined || schema.const !== undefined)) {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
if (!type && [...ALL_TYPE_SPECIFIC_KEYWORDS].some((key) => schema[key] !== undefined)) return false;
|
|
571
|
+
|
|
572
|
+
const lower = rawBound(schema, 'lower');
|
|
573
|
+
const upper = rawBound(schema, 'upper');
|
|
574
|
+
if ((lower?.exclusive || upper?.exclusive) && type !== 'integer') return false;
|
|
575
|
+
if (lower && upper && lower.value > upper.value) return false;
|
|
576
|
+
for (const [minKey, maxKey] of [
|
|
577
|
+
['minLength', 'maxLength'],
|
|
578
|
+
['minItems', 'maxItems'],
|
|
579
|
+
['minProperties', 'maxProperties'],
|
|
580
|
+
]) {
|
|
581
|
+
if (Number.isFinite(schema[minKey]) && Number.isFinite(schema[maxKey]) && schema[minKey] > schema[maxKey]) {
|
|
582
|
+
return false;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
if (type === 'array') {
|
|
587
|
+
if (!schema.items || typeof schema.items !== 'object' || Array.isArray(schema.items)) return false;
|
|
588
|
+
if (!legacyRepresentable(schema.items)) return false;
|
|
589
|
+
}
|
|
590
|
+
if (type === 'object') {
|
|
591
|
+
const props = schema.properties;
|
|
592
|
+
if (props !== undefined && (!props || typeof props !== 'object' || Array.isArray(props))) return false;
|
|
593
|
+
const names = Object.keys(props || {});
|
|
594
|
+
// A free-form object has no legacy form (empty `properties` is rejected);
|
|
595
|
+
// only the root of a no-argument tool may be empty.
|
|
596
|
+
if (!names.length && !root && !Array.isArray(schema.anyOf)) return false;
|
|
597
|
+
if (schema.required !== undefined) {
|
|
598
|
+
if (!Array.isArray(schema.required)) return false;
|
|
599
|
+
if (schema.required.some((name) => typeof name !== 'string' || !names.includes(name))) return false;
|
|
600
|
+
}
|
|
601
|
+
if (!names.every((name) => legacyRepresentable(props[name]))) return false;
|
|
602
|
+
}
|
|
603
|
+
if (schema.anyOf !== undefined) {
|
|
604
|
+
if (!Array.isArray(schema.anyOf) || !schema.anyOf.every((branch) => legacyRepresentable(branch))) return false;
|
|
605
|
+
}
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Keywords the Gemini endpoints reject or ignore on parametersJsonSchema:
|
|
610
|
+
// vendor extensions (`x-*`) and annotation-only keywords. None of them
|
|
611
|
+
// constrains the accepted arguments, so dropping them keeps the semantics.
|
|
612
|
+
const NON_STANDARD_SCHEMA_KEYS = new Set(['$schema', '$comment', 'deprecated', 'examples']);
|
|
613
|
+
const isNonStandardSchemaKey = (key) => NON_STANDARD_SCHEMA_KEYS.has(key) || key.startsWith('x-');
|
|
614
|
+
// Keys whose value maps names to subschemas (names are data, never stripped),
|
|
615
|
+
// a single subschema, or a list of subschemas.
|
|
616
|
+
const JSON_SCHEMA_MAP_KEYS = ['properties', 'patternProperties', '$defs', 'definitions', 'dependentSchemas'];
|
|
617
|
+
const JSON_SCHEMA_NODE_KEYS = [
|
|
618
|
+
'items',
|
|
619
|
+
'additionalItems',
|
|
620
|
+
'additionalProperties',
|
|
621
|
+
'unevaluatedItems',
|
|
622
|
+
'unevaluatedProperties',
|
|
623
|
+
'contains',
|
|
624
|
+
'propertyNames',
|
|
625
|
+
'not',
|
|
626
|
+
'if',
|
|
627
|
+
'then',
|
|
628
|
+
'else',
|
|
629
|
+
];
|
|
630
|
+
const JSON_SCHEMA_LIST_KEYS = ['prefixItems', 'allOf', 'anyOf', 'oneOf'];
|
|
631
|
+
|
|
632
|
+
function stripNonStandardSchemaKeys(schema) {
|
|
633
|
+
if (Array.isArray(schema)) return schema.map(stripNonStandardSchemaKeys);
|
|
634
|
+
if (!schema || typeof schema !== 'object') return schema;
|
|
635
|
+
const out = {};
|
|
636
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
637
|
+
if (isNonStandardSchemaKey(key)) continue;
|
|
638
|
+
if (JSON_SCHEMA_MAP_KEYS.includes(key) && value && typeof value === 'object' && !Array.isArray(value)) {
|
|
639
|
+
const children = {};
|
|
640
|
+
for (const [name, child] of Object.entries(value)) {
|
|
641
|
+
defineSchemaProperty(children, name, stripNonStandardSchemaKeys(child));
|
|
642
|
+
}
|
|
643
|
+
out[key] = children;
|
|
644
|
+
} else if (JSON_SCHEMA_NODE_KEYS.includes(key) || JSON_SCHEMA_LIST_KEYS.includes(key)) {
|
|
645
|
+
out[key] = stripNonStandardSchemaKeys(value);
|
|
646
|
+
} else {
|
|
647
|
+
out[key] = value;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return out;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
const LEGACY_SCHEMA_TYPES = new Set(Object.values(SchemaType));
|
|
654
|
+
|
|
655
|
+
/** Why a legacy `parameters` Schema (the OpenAPI subset convertSchema targets)
|
|
656
|
+
* is rejected by Gemini, as `{ pointer, reason }`, or null when it is valid:
|
|
657
|
+
* an OBJECT root (or none), known types, an `items` schema on every ARRAY,
|
|
658
|
+
* string enums, and `required` names that exist in `properties`. */
|
|
659
|
+
function legacyParametersProblem(node, pointer = '', root = true) {
|
|
660
|
+
const bad = (reason, at = pointer) => ({ pointer: at, reason });
|
|
661
|
+
if (!node || typeof node !== 'object' || Array.isArray(node)) return bad('a Gemini Schema must be an object');
|
|
662
|
+
const { type, properties, required, items, anyOf } = node;
|
|
663
|
+
if (type !== undefined && !LEGACY_SCHEMA_TYPES.has(type))
|
|
664
|
+
return bad(`unsupported type ${JSON.stringify(type)}`, `${pointer}/type`);
|
|
665
|
+
if (root && type !== undefined && type !== SchemaType.OBJECT)
|
|
666
|
+
return bad('the input schema root must have type "object"', `${pointer}/type`);
|
|
667
|
+
if (node.enum !== undefined && (!Array.isArray(node.enum) || node.enum.some((value) => typeof value !== 'string'))) {
|
|
668
|
+
return bad('enum must be an array of strings', `${pointer}/enum`);
|
|
669
|
+
}
|
|
670
|
+
if (type === SchemaType.ARRAY && (!items || typeof items !== 'object' || Array.isArray(items))) {
|
|
671
|
+
return bad('an array schema needs an "items" schema', `${pointer}/items`);
|
|
672
|
+
}
|
|
673
|
+
// A node without its own `properties` (an anyOf branch narrowing the
|
|
674
|
+
// parent's required keys) has nothing to check `required` against.
|
|
675
|
+
if (required !== undefined) {
|
|
676
|
+
const names = properties && typeof properties === 'object' ? Object.keys(properties) : null;
|
|
677
|
+
if (!Array.isArray(required) || (names && required.some((name) => !names.includes(name)))) {
|
|
678
|
+
return bad('required must list properties declared in "properties"', `${pointer}/required`);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
516
681
|
const children = [
|
|
517
|
-
...Object.
|
|
518
|
-
...(
|
|
519
|
-
...(
|
|
520
|
-
...(schema.anyOf || []),
|
|
521
|
-
...(schema.oneOf || []),
|
|
522
|
-
...(schema.allOf || []),
|
|
682
|
+
...Object.entries(properties || {}).map(([name, child]) => [child, `${pointer}/properties/${escapePointer(name)}`]),
|
|
683
|
+
...(items ? [[items, `${pointer}/items`]] : []),
|
|
684
|
+
...(Array.isArray(anyOf) ? anyOf.map((child, i) => [child, `${pointer}/anyOf/${i}`]) : []),
|
|
523
685
|
];
|
|
524
|
-
|
|
686
|
+
for (const [child, at] of children) {
|
|
687
|
+
const problem = legacyParametersProblem(child, at, false);
|
|
688
|
+
if (problem) return problem;
|
|
689
|
+
}
|
|
690
|
+
return null;
|
|
525
691
|
}
|
|
526
692
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
693
|
+
/** Why the declaration's schema (`parameters` or `parametersJsonSchema`) is
|
|
694
|
+
* rejected by Gemini, or null. A tool without a schema is sent as written. */
|
|
695
|
+
function geminiDeclarationProblem(declaration) {
|
|
696
|
+
if (declaration.parametersJsonSchema !== undefined) return geminiJsonSchemaProblem(declaration.parametersJsonSchema);
|
|
697
|
+
return declaration.parameters === undefined ? null : legacyParametersProblem(declaration.parameters);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// `claudeBridge: true` (Claude models behind Antigravity) always encodes the
|
|
701
|
+
// schema as `parametersJsonSchema`: the bridge hands it to Anthropic as a
|
|
702
|
+
// draft 2020-12 input_schema, and the legacy `parameters` projection
|
|
703
|
+
// (convertSchema) rewrites type arrays, numeric enums and nullable unions.
|
|
704
|
+
// A tool whose schema is invalid for Anthropic is left out and reported
|
|
705
|
+
// (`onToolExcluded`, default console.warn); the other tools are unaffected.
|
|
706
|
+
// Gemini routes validate each final declaration the same way; `validate:
|
|
707
|
+
// false` (an Antigravity model outside the Gemini family) converts without it.
|
|
708
|
+
export function toGeminiTools(tools, { claudeBridge = false, onToolExcluded, validate = true } = {}) {
|
|
709
|
+
const functionDeclarations = [];
|
|
710
|
+
tools.forEach((t, index) => {
|
|
711
|
+
const declaration = { name: t.name, description: t.description };
|
|
712
|
+
if (claudeBridge) {
|
|
713
|
+
// The bridge accepts nested per-action input alternatives.
|
|
714
|
+
const result = claudeBridgeInputSchema(actionInputUnionFor(t.inputSchema));
|
|
715
|
+
if (!result.schema) {
|
|
716
|
+
reportInvalidTool(t.name, index, result, onToolExcluded);
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
declaration.parametersJsonSchema = result.schema;
|
|
720
|
+
} else if (validate) {
|
|
721
|
+
const accepted = acceptedGeminiTool(t, index, onToolExcluded);
|
|
722
|
+
if (!accepted) return;
|
|
723
|
+
Object.assign(declaration, accepted.fields);
|
|
724
|
+
} else {
|
|
725
|
+
Object.assign(declaration, geminiSchemaFields(t.inputSchema));
|
|
726
|
+
}
|
|
727
|
+
functionDeclarations.push(declaration);
|
|
728
|
+
});
|
|
729
|
+
return { functionDeclarations };
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
function geminiSchemaFields(inputSchema) {
|
|
733
|
+
if (needsJsonParameters(inputSchema)) {
|
|
734
|
+
return { parametersJsonSchema: stripNonStandardSchemaKeys(structuredClone(inputSchema)) };
|
|
735
|
+
}
|
|
736
|
+
return { parameters: convertSchema(inputSchema) };
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// A Gemini endpoint rejects the whole request for one bad declaration. A
|
|
740
|
+
// declaration it would reject is first rebuilt from the lowered schema
|
|
741
|
+
// (draft-07/04 constructs); one still rejected is reported and left out.
|
|
742
|
+
// Returns { tool, fields } (the tool to send, its schema fields) or null.
|
|
743
|
+
function acceptedGeminiTool(tool, index, onToolExcluded) {
|
|
744
|
+
const fields = geminiSchemaFields(tool.inputSchema);
|
|
745
|
+
let problem = geminiDeclarationProblem(fields);
|
|
746
|
+
if (!problem) return { tool, fields };
|
|
747
|
+
const repaired = repairedToolInputSchema(tool.inputSchema, 'gemini');
|
|
748
|
+
if (repaired) {
|
|
749
|
+
const repairedFields = geminiSchemaFields(repaired);
|
|
750
|
+
problem = geminiDeclarationProblem(repairedFields);
|
|
751
|
+
if (!problem) return { tool: { ...tool, inputSchema: repaired }, fields: repairedFields };
|
|
752
|
+
}
|
|
753
|
+
reportInvalidTool(tool.name, index, problem, onToolExcluded, '[gemini] tool');
|
|
754
|
+
return null;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/** The tools whose schema a Gemini-family model behind an OpenAI-compatible
|
|
758
|
+
* route (OpenRouter, a gateway) accepts, in order: unchanged, or carrying
|
|
759
|
+
* the lowered schema when only that is accepted. The others are reported
|
|
760
|
+
* through `onToolExcluded`. */
|
|
761
|
+
export function geminiAcceptedTools(tools, onToolExcluded) {
|
|
762
|
+
let changed = false;
|
|
763
|
+
const out = [];
|
|
764
|
+
tools.forEach((tool, index) => {
|
|
765
|
+
const accepted = acceptedGeminiTool(tool, index, onToolExcluded);
|
|
766
|
+
if (accepted?.tool !== tool) changed = true;
|
|
767
|
+
if (accepted) out.push(accepted.tool);
|
|
768
|
+
});
|
|
769
|
+
return changed ? out : tools;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/** The `{ name, pointer, reason }` for which a Gemini route leaves `tool`
|
|
773
|
+
* out of its requests, or null when the tool is sent. Reports nothing. */
|
|
774
|
+
export function geminiToolExclusion(tool) {
|
|
775
|
+
let exclusion = null;
|
|
776
|
+
geminiAcceptedTools([tool], (found) => {
|
|
777
|
+
exclusion = found;
|
|
778
|
+
});
|
|
779
|
+
return exclusion;
|
|
537
780
|
}
|
|
538
781
|
|
|
539
782
|
export function toGeminiNativeTools(nativeTools) {
|
|
@@ -552,8 +795,10 @@ export function toGeminiNativeTools(nativeTools) {
|
|
|
552
795
|
|
|
553
796
|
// The request `tools` array: hosted tools first, then one function-declaration
|
|
554
797
|
// entry when function tools are present. Empty when neither is present.
|
|
555
|
-
export function toGeminiRequestTools(tools, nativeTools) {
|
|
556
|
-
const
|
|
798
|
+
export function toGeminiRequestTools(tools, nativeTools, options) {
|
|
799
|
+
const declarations = tools?.length ? toGeminiTools(tools, options) : null;
|
|
800
|
+
// Every function tool may have been left out as invalid for the provider.
|
|
801
|
+
const functionTools = declarations?.functionDeclarations.length ? [declarations] : [];
|
|
557
802
|
return [...toGeminiNativeTools(nativeTools), ...functionTools];
|
|
558
803
|
}
|
|
559
804
|
|
|
@@ -607,18 +852,66 @@ export function toGeminiToolConfig(toolChoice) {
|
|
|
607
852
|
// One tool result: its functionResponse part, plus any media it carried as
|
|
608
853
|
// ordinary content parts. The ids pair a call with its response (the Claude
|
|
609
854
|
// models behind Antigravity require them) and are harmless for Gemini.
|
|
610
|
-
function
|
|
611
|
-
|
|
612
|
-
|
|
855
|
+
// Multimodal function responses (FunctionResponse.parts) exist on Gemini 3+.
|
|
856
|
+
// Older Gemini ids and other families (Claude behind Antigravity) keep media
|
|
857
|
+
// as sibling parts of the response turn.
|
|
858
|
+
function supportsFunctionResponseParts(model) {
|
|
859
|
+
if (!isGeminiFamilyModel(model)) return false;
|
|
860
|
+
const major = /gemini-(\d+)/i.exec(String(model))?.[1];
|
|
861
|
+
return major === undefined || Number(major) >= 3;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// FunctionResponsePart carries only inlineData{mimeType,data}; anything else
|
|
865
|
+
// (fileData URIs, parts with mediaResolution/videoMetadata) stays a sibling.
|
|
866
|
+
const isNestableMedia = (part) =>
|
|
867
|
+
part?.inlineData && Object.keys(part).length === 1 && Object.keys(part.inlineData).length === 2;
|
|
868
|
+
|
|
869
|
+
// A failed result travels under `error`, the key Gemini's function-calling
|
|
870
|
+
// contract reserves for failures; a successful one keeps `result`.
|
|
871
|
+
const isFailedToolResult = (message) => message.toolKind === 'error' || message.isError === true;
|
|
872
|
+
|
|
873
|
+
// `callsByFinalId` maps a tool result's id to the functionCall the request
|
|
874
|
+
// replays for it. The response must name exactly the id that call carries:
|
|
875
|
+
// the id the transcript settled on (possibly renamed `-2`) can differ from the
|
|
876
|
+
// recorded part, and a recorded Gemini part may carry no id at all, in which
|
|
877
|
+
// case the response carries none either. An unmatched result keeps its own id.
|
|
878
|
+
function toGeminiToolResult(message, toolNameByCallId, nestMedia, callsByFinalId) {
|
|
879
|
+
const replayedCall = callsByFinalId?.get(message.toolCallId);
|
|
880
|
+
const functionName = replayedCall?.name || toolNameByCallId?.get(message.toolCallId) || message.toolCallId || '';
|
|
881
|
+
const { response: rawResponse, mediaParts } = splitGeminiToolContent(message.content);
|
|
882
|
+
const response = isFailedToolResult(message) && 'result' in rawResponse ? { error: rawResponse.result } : rawResponse;
|
|
613
883
|
const functionResponse = { name: functionName, response };
|
|
614
|
-
|
|
615
|
-
|
|
884
|
+
const responseId = replayedCall ? replayedCall.id : message.toolCallId;
|
|
885
|
+
if (typeof responseId === 'string' && responseId) functionResponse.id = responseId;
|
|
886
|
+
if (!nestMedia) return { functionResponsePart: { functionResponse }, mediaParts };
|
|
887
|
+
const nested = mediaParts.filter(isNestableMedia);
|
|
888
|
+
if (nested.length) functionResponse.parts = nested;
|
|
889
|
+
return {
|
|
890
|
+
functionResponsePart: { functionResponse },
|
|
891
|
+
mediaParts: mediaParts.filter((part) => !isNestableMedia(part)),
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// A replay recorded by a non-Gemini model (Claude behind Antigravity) carries
|
|
896
|
+
// signatures Gemini rejects: its replay envelope and the signed metadata
|
|
897
|
+
// derived from the same response must not reach a Gemini request.
|
|
898
|
+
function hasForeignReplay(message, model) {
|
|
899
|
+
const replay = message?.providerReplay;
|
|
900
|
+
if (replay?.provider !== 'gemini' && replay?.provider !== 'antigravity') return false;
|
|
901
|
+
const recorded = replay.requestContext?.model;
|
|
902
|
+
return (
|
|
903
|
+
typeof recorded === 'string' &&
|
|
904
|
+
recorded !== '' &&
|
|
905
|
+
(!isGeminiFamilyModel(recorded) || (replay.provider === 'gemini' && model && recorded !== model))
|
|
906
|
+
);
|
|
616
907
|
}
|
|
617
908
|
|
|
618
|
-
function toGeminiContent(message) {
|
|
909
|
+
function toGeminiContent(message, model) {
|
|
619
910
|
if (!message || message.role === 'system') return null;
|
|
911
|
+
const foreign = message.role === 'assistant' && hasForeignReplay(message, model);
|
|
912
|
+
if (foreign) message = { ...message, providerMetadata: undefined };
|
|
620
913
|
const orderedReplay =
|
|
621
|
-
message.role === 'assistant' ? providerReplayItems(message, ['gemini', 'antigravity']) : undefined;
|
|
914
|
+
message.role === 'assistant' && !foreign ? providerReplayItems(message, ['gemini', 'antigravity']) : undefined;
|
|
622
915
|
if (orderedReplay?.length) {
|
|
623
916
|
return { role: 'model', parts: orderedReplay };
|
|
624
917
|
}
|
|
@@ -641,6 +934,7 @@ function toGeminiContent(message) {
|
|
|
641
934
|
},
|
|
642
935
|
};
|
|
643
936
|
if (
|
|
937
|
+
!foreign &&
|
|
644
938
|
typeof tc.thoughtSignature === 'string' &&
|
|
645
939
|
tc.thoughtSignature &&
|
|
646
940
|
tc.thoughtSignature.length <= MAX_THOUGHT_SIGNATURE_CHARS
|
|
@@ -716,31 +1010,67 @@ export function toGeminiContents(messages, model = '', { repairToolSignatures =
|
|
|
716
1010
|
// Map synthetic toolCallId -> function name from prior assistant
|
|
717
1011
|
// tool_calls so each functionResponse part carries the real function name.
|
|
718
1012
|
const toolNameByCallId = new Map();
|
|
1013
|
+
// Final call id -> the functionCall the request replays for it. Replayed
|
|
1014
|
+
// assistant turns are the raw recorded parts, so a generated or renamed id
|
|
1015
|
+
// never appears on them. Claude/GPT-OSS routes need the pair to share the
|
|
1016
|
+
// final id, so it is stamped on the part; a Gemini part keeps exactly what
|
|
1017
|
+
// the server sent (possibly no id) and the response follows it.
|
|
1018
|
+
const callsByFinalId = new Map();
|
|
1019
|
+
const assistantContent = new Map();
|
|
1020
|
+
const stampFinalIds = !!model && !isGeminiFamilyModel(model);
|
|
719
1021
|
for (const m of messages) {
|
|
720
1022
|
if (m?.role === 'assistant' && Array.isArray(m.toolCalls)) {
|
|
721
1023
|
for (const tc of m.toolCalls) {
|
|
722
1024
|
if (tc?.id && tc?.name) toolNameByCallId.set(tc.id, tc.name);
|
|
723
1025
|
}
|
|
1026
|
+
const content = toGeminiContent(m, model);
|
|
1027
|
+
assistantContent.set(m, content);
|
|
1028
|
+
const replayed = (content?.parts || []).filter((part) => part?.functionCall);
|
|
1029
|
+
m.toolCalls.forEach((tc, index) => {
|
|
1030
|
+
if (!tc?.id) return;
|
|
1031
|
+
// Positional when the turn replays one call per tool call (the id may
|
|
1032
|
+
// be renamed, and a bridged call_tool keeps its wire name and id);
|
|
1033
|
+
// otherwise only a part already carrying the id can be matched.
|
|
1034
|
+
const part =
|
|
1035
|
+
replayed.length === m.toolCalls.length ? replayed[index] : replayed.find((p) => p.functionCall.id === tc.id);
|
|
1036
|
+
if (!part) return;
|
|
1037
|
+
if (stampFinalIds) part.functionCall.id = tc.id;
|
|
1038
|
+
callsByFinalId.set(tc.id, part.functionCall);
|
|
1039
|
+
});
|
|
724
1040
|
}
|
|
725
1041
|
}
|
|
726
1042
|
// Consecutive tool results share one user turn: every functionResponse part
|
|
727
1043
|
// first (one per call, in call order), then the media the results carried as
|
|
728
1044
|
// sibling inlineData/fileData parts.
|
|
729
1045
|
let toolTurn = null;
|
|
1046
|
+
let toolCallOrder = new Map();
|
|
1047
|
+
const nestMedia = supportsFunctionResponseParts(model);
|
|
730
1048
|
for (const message of messages) {
|
|
731
1049
|
if (message?.role === 'tool') {
|
|
732
|
-
const { functionResponsePart, mediaParts } = toGeminiToolResult(
|
|
1050
|
+
const { functionResponsePart, mediaParts } = toGeminiToolResult(
|
|
1051
|
+
message,
|
|
1052
|
+
toolNameByCallId,
|
|
1053
|
+
nestMedia,
|
|
1054
|
+
callsByFinalId
|
|
1055
|
+
);
|
|
733
1056
|
if (!toolTurn) {
|
|
734
|
-
toolTurn = { content: { role: 'user', parts: [] }, responseCount: 0 };
|
|
1057
|
+
toolTurn = { content: { role: 'user', parts: [] }, responseCount: 0, responseOrder: [] };
|
|
735
1058
|
contents.push(toolTurn.content);
|
|
736
1059
|
}
|
|
737
|
-
|
|
1060
|
+
// Completion order is not call order. Anonymous parallel calls to the
|
|
1061
|
+
// same function can only be correlated by their original position.
|
|
1062
|
+
const order = toolCallOrder.get(message.toolCallId) ?? Infinity;
|
|
1063
|
+
const next = toolTurn.responseOrder.findIndex((value) => value > order);
|
|
1064
|
+
const index = next < 0 ? toolTurn.responseCount : next;
|
|
1065
|
+
toolTurn.responseOrder.splice(index, 0, order);
|
|
1066
|
+
toolTurn.content.parts.splice(index, 0, functionResponsePart);
|
|
738
1067
|
toolTurn.responseCount += 1;
|
|
739
1068
|
toolTurn.content.parts.push(...mediaParts);
|
|
740
1069
|
continue;
|
|
741
1070
|
}
|
|
742
1071
|
toolTurn = null;
|
|
743
|
-
|
|
1072
|
+
toolCallOrder = new Map((message.toolCalls || []).map((call, index) => [call.id, index]));
|
|
1073
|
+
const content = assistantContent.has(message) ? assistantContent.get(message) : toGeminiContent(message, model);
|
|
744
1074
|
if (content) contents.push(content);
|
|
745
1075
|
}
|
|
746
1076
|
return repairToolSignatures ? ensureGeminiToolCallSignatures(contents, model) : contents;
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
normalizeGeminiSdkError,
|
|
14
14
|
} from './gemini-stream.mjs';
|
|
15
15
|
import { geminiFailureUsage } from './gemini-response.mjs';
|
|
16
|
-
import { geminiEndsWithFunctionResponse } from './gemini-retry-policy.mjs';
|
|
17
16
|
|
|
18
17
|
export function geminiTextLeakGuardFor({ tools, callbacks }) {
|
|
19
18
|
return createGeminiTextLeakGuard({
|
|
@@ -21,6 +20,7 @@ export function geminiTextLeakGuardFor({ tools, callbacks }) {
|
|
|
21
20
|
onTextDelta: callbacks.onTextDelta,
|
|
22
21
|
onToolCall: callbacks.onToolCall,
|
|
23
22
|
onStreamDelta: callbacks.onStreamDelta,
|
|
23
|
+
deferToolCalls: true,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -98,7 +98,6 @@ export async function streamGeminiSdkAttempt(genModel, stream, attemptSignal, on
|
|
|
98
98
|
onTextDelta: callbacks.onTextDelta,
|
|
99
99
|
textLeakGuard,
|
|
100
100
|
label: 'Gemini SDK streamGenerateContent',
|
|
101
|
-
acceptEmptyNoFinish: geminiEndsWithFunctionResponse(contents),
|
|
102
101
|
failureUsage: geminiFailureUsage(stream.opts, stream.cachedContent, stream.useModel),
|
|
103
102
|
cancelGeneration: (reason) => {
|
|
104
103
|
if (!controller.signal.aborted) controller.abort(reason);
|