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
|
@@ -25,10 +25,21 @@ function isObject(value) {
|
|
|
25
25
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
// A server-executed tool search (execution:'server', or call_id null) is
|
|
29
|
+
// answered by the server inside the same response. It is never a client call
|
|
30
|
+
// awaiting a client output, so the guard neither pairs nor synthesizes it.
|
|
31
|
+
function isServerToolSearch(item) {
|
|
32
|
+
return (
|
|
33
|
+
(item.type === 'tool_search_call' || item.type === 'tool_search_output') &&
|
|
34
|
+
(item.execution === 'server' || item.call_id === null)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
28
38
|
function responsesCallId(item) {
|
|
29
39
|
if (!isObject(item)) return null;
|
|
30
40
|
if (item.type !== 'function_call' && item.type !== 'custom_tool_call' && item.type !== 'tool_search_call')
|
|
31
41
|
return null;
|
|
42
|
+
if (isServerToolSearch(item)) return null;
|
|
32
43
|
const id = item.call_id || item.id || '';
|
|
33
44
|
return typeof id === 'string' && id ? id : null;
|
|
34
45
|
}
|
|
@@ -41,6 +52,7 @@ function responsesOutputId(item) {
|
|
|
41
52
|
item.type !== 'tool_search_output'
|
|
42
53
|
)
|
|
43
54
|
return null;
|
|
55
|
+
if (isServerToolSearch(item)) return null;
|
|
44
56
|
const id = item.call_id || item.id || '';
|
|
45
57
|
return typeof id === 'string' && id ? id : null;
|
|
46
58
|
}
|
|
@@ -50,7 +62,6 @@ function syntheticResponsesOutput(call) {
|
|
|
50
62
|
return {
|
|
51
63
|
type: 'custom_tool_call_output',
|
|
52
64
|
call_id: call.call_id || call.id || '',
|
|
53
|
-
...(typeof call.name === 'string' && call.name ? { name: call.name } : {}),
|
|
54
65
|
output: WIRE_PAIRING_STUB,
|
|
55
66
|
};
|
|
56
67
|
}
|
|
@@ -117,33 +128,50 @@ function chatResultId(message) {
|
|
|
117
128
|
}
|
|
118
129
|
|
|
119
130
|
/**
|
|
120
|
-
* Ensure every chat assistant `tool_calls` entry
|
|
121
|
-
* message
|
|
122
|
-
*
|
|
123
|
-
*
|
|
131
|
+
* Ensure every chat assistant `tool_calls` entry is answered by a tool
|
|
132
|
+
* message in the run immediately following that assistant message (OpenAI
|
|
133
|
+
* function calling / Meta chat contract), and that no tool message exists
|
|
134
|
+
* anywhere else. A result after an intervening user/assistant message, or one
|
|
135
|
+
* answering another occurrence of the same id, does not pair the call; the
|
|
136
|
+
* call gets a synthetic stub right after its assistant message and the
|
|
137
|
+
* misplaced tool message is DROPPED (Chat Completions rejects a tool message
|
|
138
|
+
* that does not follow its tool_calls block; a late result is not relocated).
|
|
139
|
+
* Within the run, results for ids the block did not call and repeated results
|
|
140
|
+
* for one id are dropped too. Returns the original array when already valid.
|
|
124
141
|
*/
|
|
125
142
|
export function ensureChatToolPairs(messages) {
|
|
126
143
|
if (!Array.isArray(messages) || messages.length === 0) return messages;
|
|
127
|
-
const resultIds = new Set();
|
|
128
|
-
for (const message of messages) {
|
|
129
|
-
const id = chatResultId(message);
|
|
130
|
-
if (id) resultIds.add(id);
|
|
131
|
-
}
|
|
132
|
-
let missing = 0;
|
|
133
|
-
for (const message of messages) {
|
|
134
|
-
for (const id of chatToolCallIds(message)) {
|
|
135
|
-
if (!resultIds.has(id)) missing += 1;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (missing === 0) return messages;
|
|
139
144
|
const out = [];
|
|
140
|
-
|
|
145
|
+
let changed = false;
|
|
146
|
+
for (let i = 0; i < messages.length; i += 1) {
|
|
147
|
+
const message = messages[i];
|
|
148
|
+
if (isObject(message) && message.role === 'tool') {
|
|
149
|
+
changed = true;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
141
152
|
out.push(message);
|
|
142
|
-
|
|
143
|
-
|
|
153
|
+
const callIds = chatToolCallIds(message);
|
|
154
|
+
if (!callIds.length) continue;
|
|
155
|
+
let end = i + 1;
|
|
156
|
+
while (end < messages.length && isObject(messages[end]) && messages[end].role === 'tool') end += 1;
|
|
157
|
+
const answered = new Set();
|
|
158
|
+
const kept = [];
|
|
159
|
+
for (const result of messages.slice(i + 1, end)) {
|
|
160
|
+
const id = chatResultId(result);
|
|
161
|
+
if (id && callIds.includes(id) && !answered.has(id)) {
|
|
162
|
+
answered.add(id);
|
|
163
|
+
kept.push(result);
|
|
164
|
+
} else {
|
|
165
|
+
changed = true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const id of callIds) {
|
|
169
|
+
if (answered.has(id)) continue;
|
|
170
|
+
changed = true;
|
|
144
171
|
out.push({ role: 'tool', tool_call_id: id, content: WIRE_PAIRING_STUB });
|
|
145
|
-
resultIds.add(id);
|
|
146
172
|
}
|
|
173
|
+
out.push(...kept);
|
|
174
|
+
i = end - 1;
|
|
147
175
|
}
|
|
148
|
-
return out;
|
|
176
|
+
return changed ? out : messages;
|
|
149
177
|
}
|
|
@@ -167,7 +167,11 @@ function officeTextForFile(file) {
|
|
|
167
167
|
});
|
|
168
168
|
if (file.ref) return memoized(officeTextMemo, `ref:${file.ref}\0${file.filename || ''}`, compute);
|
|
169
169
|
if (file.part && inlineOfficeText.has(file.part)) return inlineOfficeText.get(file.part);
|
|
170
|
-
const key = createHash('sha256')
|
|
170
|
+
const key = createHash('sha256')
|
|
171
|
+
.update(file.filename || '')
|
|
172
|
+
.update('\0')
|
|
173
|
+
.update(file.data)
|
|
174
|
+
.digest('hex');
|
|
171
175
|
const text = memoized(officeTextMemo, key, compute);
|
|
172
176
|
if (file.part) inlineOfficeText.set(file.part, text);
|
|
173
177
|
return text;
|
|
@@ -338,6 +342,24 @@ export function degradeMediaParts(parts) {
|
|
|
338
342
|
return changed ? next : parts;
|
|
339
343
|
}
|
|
340
344
|
|
|
345
|
+
// The text of a document whose source is not base64 bytes: a text source is
|
|
346
|
+
// its data, a content source its text blocks. A url / file-id source has no
|
|
347
|
+
// bytes to read, so the request is rejected rather than silently dropped.
|
|
348
|
+
function documentSourceText(part) {
|
|
349
|
+
const source = part.source;
|
|
350
|
+
let text = null;
|
|
351
|
+
if (part.type === 'document' && source?.type === 'text' && typeof source.data === 'string') text = source.data;
|
|
352
|
+
else if (part.type === 'document' && source?.type === 'content') {
|
|
353
|
+
text = contentToText(source.content, '');
|
|
354
|
+
}
|
|
355
|
+
if (text === null) {
|
|
356
|
+
const kind = part.type === 'document' ? `${source?.type || 'unknown'} source` : 'format';
|
|
357
|
+
throw new TypeError(`This provider accepts no document blocks and cannot read a document with a ${kind}.`);
|
|
358
|
+
}
|
|
359
|
+
const title = typeof part.title === 'string' && part.title ? part.title : '';
|
|
360
|
+
return title ? `--- ${title} ---\n${text}` : text;
|
|
361
|
+
}
|
|
362
|
+
|
|
341
363
|
function replacePdfParts(content, texts) {
|
|
342
364
|
if (Array.isArray(content)) {
|
|
343
365
|
let changed = false;
|
|
@@ -368,8 +390,12 @@ function replacePdfParts(content, texts) {
|
|
|
368
390
|
* read error or a pdf.js environment failure propagates and nothing is cached.
|
|
369
391
|
*/
|
|
370
392
|
export async function preparePdfTextForProvider(messages, provider) {
|
|
371
|
-
|
|
393
|
+
// A provider that declares `nativeDocuments === false` takes no document
|
|
394
|
+
// block of any kind: every document variant becomes text (or is rejected).
|
|
395
|
+
const noDocuments = provider?.nativeDocuments === false;
|
|
396
|
+
if ((providerTakesNativePdf(provider) && !noDocuments) || !Array.isArray(messages)) return messages;
|
|
372
397
|
const found = [];
|
|
398
|
+
const texts = new Map();
|
|
373
399
|
for (const message of messages) {
|
|
374
400
|
for (const part of walkContentParts(message?.content)) {
|
|
375
401
|
if (part.type !== 'file' && part.type !== 'document') continue;
|
|
@@ -381,14 +407,19 @@ export async function preparePdfTextForProvider(messages, provider) {
|
|
|
381
407
|
continue;
|
|
382
408
|
}
|
|
383
409
|
if (file && fileKind(file) === 'pdf') found.push({ part, file });
|
|
410
|
+
else if (noDocuments && (file || part.type === 'document'))
|
|
411
|
+
texts.set(part, file ? textFormOfFilePart(part) : documentSourceText(part));
|
|
384
412
|
}
|
|
385
413
|
}
|
|
386
|
-
if (!found.length) return messages;
|
|
414
|
+
if (!found.length && !texts.size) return messages;
|
|
387
415
|
const extracted = await Promise.all(found.map(({ file }) => pdfTextFor(file)));
|
|
388
|
-
|
|
416
|
+
found.forEach(({ part, file }, i) => {
|
|
417
|
+
texts.set(part, `--- ${fileLabel(file)} ---\n${extracted[i]}`);
|
|
418
|
+
});
|
|
389
419
|
return messages.map((message) => {
|
|
390
420
|
// A message whose content is one bare part becomes a one-part array.
|
|
391
|
-
if (texts.has(message?.content))
|
|
421
|
+
if (texts.has(message?.content))
|
|
422
|
+
return { ...message, content: [{ type: 'text', text: texts.get(message.content) }] };
|
|
392
423
|
const content = replacePdfParts(message?.content, texts);
|
|
393
424
|
return content === message?.content ? message : { ...message, content };
|
|
394
425
|
});
|
|
@@ -658,7 +689,10 @@ export function contentMediaBytes(content, { nativePdf = true } = {}) {
|
|
|
658
689
|
if (!part || typeof part !== 'object') continue;
|
|
659
690
|
if (isAttachmentReference(part)) {
|
|
660
691
|
if (part.type === 'image') bytes += Math.ceil((Number(part.sizeBytes) || 0) / 3) * 4;
|
|
661
|
-
else if (
|
|
692
|
+
else if (
|
|
693
|
+
part.type === 'file' &&
|
|
694
|
+
countsAsMedia(String(part.mimeType || part.mediaType || 'application/pdf'), '')
|
|
695
|
+
) {
|
|
662
696
|
bytes += Math.ceil((Number(part.sizeBytes) || 0) / 3) * 4;
|
|
663
697
|
}
|
|
664
698
|
continue;
|
|
@@ -882,6 +916,11 @@ function normalizeAnthropicPart(part) {
|
|
|
882
916
|
} else {
|
|
883
917
|
out = { type: 'text', text: fileFallbackText(file, kind) };
|
|
884
918
|
}
|
|
919
|
+
// Citation settings and the model-only context belong to the document block.
|
|
920
|
+
if (out.type === 'document') {
|
|
921
|
+
if (part.citations) out.citations = part.citations;
|
|
922
|
+
if (part.context) out.context = part.context;
|
|
923
|
+
}
|
|
885
924
|
if (part.cache_control) out.cache_control = part.cache_control;
|
|
886
925
|
return out;
|
|
887
926
|
}
|
|
@@ -941,7 +980,12 @@ function normalizeAnthropicPart(part) {
|
|
|
941
980
|
// `nativePdf: false` marks a provider that takes a PDF as text: its PDFs were
|
|
942
981
|
// converted by preparePdfTextForProvider, so a PDF part reaching these
|
|
943
982
|
// normalizers is an error rather than a file block the provider cannot read.
|
|
944
|
-
|
|
983
|
+
//
|
|
984
|
+
// `cacheControl: true` is a capability the caller grants to a gateway that
|
|
985
|
+
// accepts Anthropic-style cache directives on text blocks (OpenRouter): text
|
|
986
|
+
// parts keep their `cache_control`, and multipart system content stays an
|
|
987
|
+
// array instead of being flattened. Off by default.
|
|
988
|
+
export function normalizeContentForOpenAIChat(content, { role = 'user', nativePdf = true, cacheControl = false } = {}) {
|
|
945
989
|
const parts = contentParts(content);
|
|
946
990
|
if (!parts) return content;
|
|
947
991
|
const out = [];
|
|
@@ -968,22 +1012,29 @@ export function normalizeContentForOpenAIChat(content, { role = 'user', nativePd
|
|
|
968
1012
|
}
|
|
969
1013
|
const fileUri = imageFileUriFromPart(part);
|
|
970
1014
|
if (fileUri) {
|
|
971
|
-
out.push({ type: 'image_url', image_url: { url: fileUri.fileUri } });
|
|
1015
|
+
out.push({ type: 'image_url', image_url: { url: fileUri.fileUri, ...imageDetailField(part) } });
|
|
972
1016
|
continue;
|
|
973
1017
|
}
|
|
974
1018
|
const url = imageUrlFromPart(part);
|
|
975
1019
|
if (url) {
|
|
976
|
-
out.push({ type: 'image_url', image_url: { url } });
|
|
1020
|
+
out.push({ type: 'image_url', image_url: { url, ...imageDetailField(part) } });
|
|
977
1021
|
continue;
|
|
978
1022
|
}
|
|
979
1023
|
const text = jsonFallbackFromPart(part, nativePdf);
|
|
980
|
-
if (text)
|
|
1024
|
+
if (text) {
|
|
1025
|
+
const cache = cacheControl && part?.cache_control ? { cache_control: part.cache_control } : {};
|
|
1026
|
+
out.push({ type: 'text', text, ...cache });
|
|
1027
|
+
}
|
|
981
1028
|
} catch (error) {
|
|
982
1029
|
const unavailable = unavailableAttachmentText(part, error);
|
|
983
1030
|
if (unavailable === null) throw error;
|
|
984
1031
|
out.push({ type: 'text', text: unavailable });
|
|
985
1032
|
}
|
|
986
1033
|
}
|
|
1034
|
+
if (cacheControl && role === 'system') {
|
|
1035
|
+
const blocks = out.filter((part) => part.type === 'text' && part.text);
|
|
1036
|
+
if (blocks.length > 1 || blocks.some((part) => part.cache_control)) return blocks;
|
|
1037
|
+
}
|
|
987
1038
|
if (role !== 'user')
|
|
988
1039
|
return out
|
|
989
1040
|
.map((part) => part.text || '')
|
|
@@ -992,6 +1043,15 @@ export function normalizeContentForOpenAIChat(content, { role = 'user', nativePd
|
|
|
992
1043
|
return out.length ? out : contentToText(content, '');
|
|
993
1044
|
}
|
|
994
1045
|
|
|
1046
|
+
const RESPONSES_IMAGE_DETAILS = new Set(['low', 'high', 'auto', 'original']);
|
|
1047
|
+
|
|
1048
|
+
// A caller-supplied image detail rides through; an unknown value is left out.
|
|
1049
|
+
function imageDetailField(part) {
|
|
1050
|
+
const raw = part.detail ?? part.image_url?.detail ?? part.source?.detail;
|
|
1051
|
+
const detail = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
|
|
1052
|
+
return RESPONSES_IMAGE_DETAILS.has(detail) ? { detail } : {};
|
|
1053
|
+
}
|
|
1054
|
+
|
|
995
1055
|
export function normalizeContentForOpenAIResponses(content, { role = 'user', nativePdf = true } = {}) {
|
|
996
1056
|
const textType = role === 'assistant' ? 'output_text' : 'input_text';
|
|
997
1057
|
if (typeof content === 'string') return content ? [{ type: textType, text: content }] : [];
|
|
@@ -1020,17 +1080,17 @@ export function normalizeContentForOpenAIResponses(content, { role = 'user', nat
|
|
|
1020
1080
|
}
|
|
1021
1081
|
const fileId = imageFileIdFromPart(part);
|
|
1022
1082
|
if (fileId) {
|
|
1023
|
-
out.push({ type: 'input_image', file_id: fileId });
|
|
1083
|
+
out.push({ type: 'input_image', file_id: fileId, ...imageDetailField(part) });
|
|
1024
1084
|
continue;
|
|
1025
1085
|
}
|
|
1026
1086
|
const fileUri = imageFileUriFromPart(part);
|
|
1027
1087
|
if (fileUri) {
|
|
1028
|
-
out.push({ type: 'input_image', image_url: fileUri.fileUri });
|
|
1088
|
+
out.push({ type: 'input_image', image_url: fileUri.fileUri, ...imageDetailField(part) });
|
|
1029
1089
|
continue;
|
|
1030
1090
|
}
|
|
1031
1091
|
const url = imageUrlFromPart(part);
|
|
1032
1092
|
if (url) {
|
|
1033
|
-
out.push({ type: 'input_image', image_url: url });
|
|
1093
|
+
out.push({ type: 'input_image', image_url: url, ...imageDetailField(part) });
|
|
1034
1094
|
continue;
|
|
1035
1095
|
}
|
|
1036
1096
|
const text = jsonFallbackFromPart(part, nativePdf);
|
|
@@ -1044,6 +1104,58 @@ export function normalizeContentForOpenAIResponses(content, { role = 'user', nat
|
|
|
1044
1104
|
return out;
|
|
1045
1105
|
}
|
|
1046
1106
|
|
|
1107
|
+
// Image types the Gemini API documents; an extension outside this map yields
|
|
1108
|
+
// no MIME type at all (FileData.mimeType is optional) instead of a guess.
|
|
1109
|
+
const GEMINI_IMAGE_EXTENSION_MIME = {
|
|
1110
|
+
png: 'image/png',
|
|
1111
|
+
jpg: 'image/jpeg',
|
|
1112
|
+
jpeg: 'image/jpeg',
|
|
1113
|
+
webp: 'image/webp',
|
|
1114
|
+
heic: 'image/heic',
|
|
1115
|
+
heif: 'image/heif',
|
|
1116
|
+
};
|
|
1117
|
+
|
|
1118
|
+
function mimeFromImageUrl(url) {
|
|
1119
|
+
let pathname = '';
|
|
1120
|
+
try {
|
|
1121
|
+
pathname = new URL(url).pathname;
|
|
1122
|
+
} catch {
|
|
1123
|
+
return undefined;
|
|
1124
|
+
}
|
|
1125
|
+
const ext = /\.([a-z0-9]+)$/i.exec(pathname)?.[1]?.toLowerCase();
|
|
1126
|
+
return ext ? GEMINI_IMAGE_EXTENSION_MIME[ext] : undefined;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
function trimmedMime(value) {
|
|
1130
|
+
const mime = typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
1131
|
+
return mime || undefined;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
// Part-level metadata the Gemini API accepts beside inlineData/fileData.
|
|
1135
|
+
/** Supported Gemini part metadata (mediaResolution, videoMetadata) a caller put on `part`, camelCased. */
|
|
1136
|
+
export function geminiPartMetadata(part) {
|
|
1137
|
+
const out = {};
|
|
1138
|
+
if (!part || typeof part !== 'object') return out;
|
|
1139
|
+
const mediaResolution = part.mediaResolution ?? part.media_resolution;
|
|
1140
|
+
if (mediaResolution !== undefined && mediaResolution !== null) out.mediaResolution = mediaResolution;
|
|
1141
|
+
const videoMetadata = part.videoMetadata ?? part.video_metadata;
|
|
1142
|
+
if (videoMetadata !== undefined && videoMetadata !== null) out.videoMetadata = videoMetadata;
|
|
1143
|
+
return out;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
// FileData for an external URI: the MIME type comes from the part's own
|
|
1147
|
+
// declaration, else the URL's extension, else it is omitted.
|
|
1148
|
+
function geminiFileDataInfo(part, url) {
|
|
1149
|
+
const fileData = part?.fileData || part?.file_data;
|
|
1150
|
+
const declared = fileData
|
|
1151
|
+
? fileData.mimeType || fileData.mime_type || fileData.mediaType || fileData.media_type
|
|
1152
|
+
: part?.mime_type || part?.mimeType || part?.media_type || part?.mediaType;
|
|
1153
|
+
const fileUri = fileData?.fileUri || fileData?.file_uri || (part?.type === 'image' && part.uri) || url;
|
|
1154
|
+
if (typeof fileUri !== 'string' || !fileUri) return null;
|
|
1155
|
+
const mimeType = trimmedMime(declared) || trimmedMime(part?.image_url?.mime_type) || mimeFromImageUrl(fileUri);
|
|
1156
|
+
return { fileUri, ...(mimeType ? { mimeType } : {}) };
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1047
1159
|
export function normalizeContentForGeminiParts(content) {
|
|
1048
1160
|
if (typeof content === 'string') return content ? [{ text: content }] : [];
|
|
1049
1161
|
const parts = contentParts(content);
|
|
@@ -1054,21 +1166,21 @@ export function normalizeContentForGeminiParts(content) {
|
|
|
1054
1166
|
const out = [];
|
|
1055
1167
|
for (const part of parts) {
|
|
1056
1168
|
try {
|
|
1169
|
+
const meta = geminiPartMetadata(part);
|
|
1057
1170
|
const file = fileInfo(part);
|
|
1058
1171
|
if (file) {
|
|
1059
1172
|
const kind = fileKind(file);
|
|
1060
|
-
if (kind === 'pdf') out.push({ inlineData: { mimeType: 'application/pdf', data: file.data } });
|
|
1173
|
+
if (kind === 'pdf') out.push({ inlineData: { mimeType: 'application/pdf', data: file.data }, ...meta });
|
|
1061
1174
|
else out.push({ text: fileFallbackText(file, kind) });
|
|
1062
1175
|
continue;
|
|
1063
1176
|
}
|
|
1064
1177
|
const inlineInfo = geminiInlineInfo(part);
|
|
1065
1178
|
if (inlineInfo) {
|
|
1066
|
-
out.push({ inlineData: { mimeType: inlineInfo.mimeType, data: inlineInfo.data } });
|
|
1179
|
+
out.push({ inlineData: { mimeType: inlineInfo.mimeType, data: inlineInfo.data }, ...meta });
|
|
1067
1180
|
continue;
|
|
1068
1181
|
}
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
out.push({ fileData: { mimeType: fileUri.mimeType, fileUri: fileUri.fileUri } });
|
|
1182
|
+
if (imageFileUriFromPart(part)) {
|
|
1183
|
+
out.push({ fileData: geminiFileDataInfo(part), ...meta });
|
|
1072
1184
|
continue;
|
|
1073
1185
|
}
|
|
1074
1186
|
const fileId = imageFileIdFromPart(part);
|
|
@@ -1078,17 +1190,17 @@ export function normalizeContentForGeminiParts(content) {
|
|
|
1078
1190
|
}
|
|
1079
1191
|
const info = imageInfo(part);
|
|
1080
1192
|
if (info) {
|
|
1081
|
-
out.push({ inlineData: { mimeType: info.mimeType, data: info.data } });
|
|
1193
|
+
out.push({ inlineData: { mimeType: info.mimeType, data: info.data }, ...meta });
|
|
1082
1194
|
continue;
|
|
1083
1195
|
}
|
|
1084
1196
|
const url = imageUrlFromPart(part);
|
|
1085
1197
|
const dataUrlInfo = imageInfoFromDataUrl(url);
|
|
1086
1198
|
if (dataUrlInfo) {
|
|
1087
|
-
out.push({ inlineData: { mimeType: dataUrlInfo.mimeType, data: dataUrlInfo.data } });
|
|
1199
|
+
out.push({ inlineData: { mimeType: dataUrlInfo.mimeType, data: dataUrlInfo.data }, ...meta });
|
|
1088
1200
|
continue;
|
|
1089
1201
|
}
|
|
1090
1202
|
if (url && !url.startsWith('data:')) {
|
|
1091
|
-
out.push({ fileData:
|
|
1203
|
+
out.push({ fileData: geminiFileDataInfo(part, url), ...meta });
|
|
1092
1204
|
continue;
|
|
1093
1205
|
}
|
|
1094
1206
|
const text = jsonFallbackFromPart(part);
|
|
@@ -11,6 +11,7 @@ import { MIMO_SEED_MODELS, mimoSeedRow as seedRow } from '../../../shared/llm/pr
|
|
|
11
11
|
const MIMO_EFFORT_LEVELS = Object.freeze(['minimal', 'low', 'medium', 'high']);
|
|
12
12
|
const MIMO_DEFAULT_TEMPERATURE = 1.0;
|
|
13
13
|
const MIMO_DEFAULT_MAX_OUTPUT_TOKENS = 128_000;
|
|
14
|
+
const MIMO_MAX_OUTPUT_TOKENS = 131_072;
|
|
14
15
|
// Slow reasoning can stay silent for minutes: wait for the first byte as long
|
|
15
16
|
// as the agent stall watchdog allows, and tolerate long gaps between events.
|
|
16
17
|
export const MIMO_FIRST_BYTE_TIMEOUT_MS = Math.min(300_000, PROVIDER_MAX_BEFORE_WARN_MS);
|
|
@@ -79,12 +80,6 @@ function thinkingDisabled(thinking, effort) {
|
|
|
79
80
|
return thinking === false || mode === 'disabled' || mode === 'off' || mode === 'none' || effort === 'none';
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
function namedToolChoice(choice) {
|
|
83
|
-
if (!choice || typeof choice !== 'object') return null;
|
|
84
|
-
const name = choice.function?.name || choice.name;
|
|
85
|
-
return typeof name === 'string' && name ? name : null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
83
|
function applyMimoParams(params, { opts = {}, config = {}, modelInfo = null } = {}) {
|
|
89
84
|
const temperature = Number(opts.temperature);
|
|
90
85
|
params.temperature = Number.isFinite(temperature) && temperature >= 0 ? temperature : MIMO_DEFAULT_TEMPERATURE;
|
|
@@ -97,9 +92,12 @@ function applyMimoParams(params, { opts = {}, config = {}, modelInfo = null } =
|
|
|
97
92
|
if ((opts[key] ?? config?.[key]) != null && Number.isFinite(value) && value >= 0) params[wire] = value;
|
|
98
93
|
}
|
|
99
94
|
|
|
95
|
+
// MiMo's output limit is `max_completion_tokens` (visible + reasoning
|
|
96
|
+
// tokens, 1..131072); it documents no `max_tokens`.
|
|
100
97
|
const limit = Number(modelInfo?.outputTokens);
|
|
101
|
-
const requested = params.max_tokens || MIMO_DEFAULT_MAX_OUTPUT_TOKENS;
|
|
102
|
-
params.max_tokens
|
|
98
|
+
const requested = Math.min(params.max_tokens || MIMO_DEFAULT_MAX_OUTPUT_TOKENS, MIMO_MAX_OUTPUT_TOKENS);
|
|
99
|
+
delete params.max_tokens;
|
|
100
|
+
params.max_completion_tokens = Number.isFinite(limit) && limit > 0 ? Math.min(requested, limit) : requested;
|
|
103
101
|
|
|
104
102
|
const thinking = opts.thinking ?? config?.thinking;
|
|
105
103
|
const rawEffort = opts.effort ?? config?.reasoningEffort;
|
|
@@ -114,13 +112,11 @@ function applyMimoParams(params, { opts = {}, config = {}, modelInfo = null } =
|
|
|
114
112
|
if (level) params.reasoning_effort = level;
|
|
115
113
|
}
|
|
116
114
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
}
|
|
115
|
+
// MiMo documents `tool_choice: auto` only: any other value is dropped by the
|
|
116
|
+
// backend and the call behaves as auto. `none` is honored by sending no tools
|
|
117
|
+
// at all; `required` / a named tool cannot be forced, so nothing is sent.
|
|
118
|
+
if (params.tool_choice === 'none') delete params.tools;
|
|
119
|
+
delete params.tool_choice;
|
|
124
120
|
return params;
|
|
125
121
|
}
|
|
126
122
|
|
|
@@ -178,6 +174,8 @@ function refineMimoError(err) {
|
|
|
178
174
|
|
|
179
175
|
export const MIMO_CHAT_PROFILE = Object.freeze({
|
|
180
176
|
replaysReasoningContent: true,
|
|
177
|
+
// MiMo documents the `developer` role next to system.
|
|
178
|
+
developerRole: true,
|
|
181
179
|
firstByteTimeoutMs: MIMO_FIRST_BYTE_TIMEOUT_MS,
|
|
182
180
|
semanticIdleTimeoutMs: MIMO_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
183
181
|
resolveModelInfo: (provider, model) => provider.getCachedModelInfo(model) || seedRow(model),
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { noteErrorUsage } from './lib/note-error-usage.mjs';
|
|
10
10
|
import { fileMtimeMs, scrubOAuthSecrets } from './lib/oauth-token-utils.mjs';
|
|
11
11
|
import { OpenAICompatProvider, preloadOpenAICompatRuntime } from './openai-compat.mjs';
|
|
12
|
-
import { COMPAT_RETRY_POLICY } from './openai-compat-retry-profile.mjs';
|
|
12
|
+
import { COMPAT_RETRY_POLICY, compatFirstResponseBudget } from './openai-compat-retry-profile.mjs';
|
|
13
13
|
import { fetchCompatModelItems, listCompatModels } from './openai-compat-models.mjs';
|
|
14
14
|
import { makeModelCache } from './model-cache.mjs';
|
|
15
15
|
import {
|
|
@@ -152,6 +152,12 @@ export class MimoOAuthProvider {
|
|
|
152
152
|
return this.tokens;
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
// The inner client's chat profile sets a longer first-byte window; the
|
|
156
|
+
// budget needs no credentials, so it is read from the profile directly.
|
|
157
|
+
firstResponseBudget() {
|
|
158
|
+
return compatFirstResponseBudget(this.name, MIMO_CHAT_PROFILE);
|
|
159
|
+
}
|
|
160
|
+
|
|
155
161
|
_ensureInner() {
|
|
156
162
|
const { apiKey, baseUrl } = this.ensureAuth();
|
|
157
163
|
const key = `${baseUrl}:${apiKey}`;
|
|
@@ -5,7 +5,7 @@ export const MODEL_PROXY_OPERATIONS: Readonly<{
|
|
|
5
5
|
resolve: 'modelProxyResolve';
|
|
6
6
|
heartbeat: 'modelProxyHeartbeat';
|
|
7
7
|
}>;
|
|
8
|
-
export type ModelProxyMethod = 'send' | 'listModels' | 'refreshModels' | 'isAvailable' | 'providerConfig';
|
|
8
|
+
export type ModelProxyMethod = 'send' | 'listModels' | 'refreshModels' | 'isAvailable' | 'resolveWireRoute' | 'providerConfig';
|
|
9
9
|
export const MODEL_PROXY_METHODS: ReadonlyArray<ModelProxyMethod>;
|
|
10
10
|
export const MODEL_PROXY_HEARTBEAT_MS: number;
|
|
11
11
|
export const MODEL_PROXY_LEASE_MS: number;
|