mixdog 1.2.2 → 1.2.3
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/provider-pingpong-live.mjs +509 -0
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/defaults/shipped-history.json +5 -0
- 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 +7 -4
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +5 -5
- package/src/rules/lead/LEAD.md +5 -5
- 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/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +29 -10
- 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 +6 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +58 -7
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +114 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +37 -5
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -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 +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +25 -8
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +87 -5
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +355 -37
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +93 -47
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +55 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +26 -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 +246 -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 +388 -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/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 +48 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- 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 +33 -1
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +121 -61
- 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 +37 -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-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -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 +151 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +42 -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 +172 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +53 -5
- 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 +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- 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 +25 -4
- 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 +71 -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 +44 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
- 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 -35
- 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 +11 -3
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +147 -8
- package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +5 -0
- 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 +157 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -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 +183 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- 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 +14 -3
- 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 +176 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
- 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/eager-dispatch/admission.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -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 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +63 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -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 +15 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +16 -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 +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +15 -3
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- 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-reader.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
- 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 +77 -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.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- 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/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/computer-bridge/action-schema.mjs +44 -21
- package/src/runtime/github/tool.mjs +92 -2
- 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/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +31 -26
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +108 -3
- 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/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
- 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 +98 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +30 -0
- 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/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +182 -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 +6 -0
- 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-effort.mjs +6 -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/provider-api-key.mjs +2 -0
- 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 +114 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
- package/src/runtime/shared/tool-card-model/card-header.mjs +6 -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-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +8 -1
- package/src/runtime/shared/tool-surface.mjs +18 -3
- package/src/runtime/shared/tool-work-units.mjs +40 -4
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer.mjs +10 -2
- package/src/runtime/shared/turn-changes.mjs +268 -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 +857 -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/carry.mjs +531 -0
- package/src/runtime/shared/worktrees/contract.mjs +34 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
- package/src/runtime/shared/worktrees/git-head.mjs +205 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
- package/src/runtime/shared/worktrees/manager.mjs +156 -8
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/terminal-bridge/client.mjs +44 -11
- 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 +13 -5
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +0 -1
- package/src/session-runtime/boot/tools.mjs +4 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
- package/src/session-runtime/internal-tool-executor.mjs +6 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
- package/src/session-runtime/lifecycle/teardown.mjs +72 -7
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- package/src/session-runtime/model-route/set-route.mjs +2 -2
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +10 -1
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/runtime-review-api.mjs +8 -2
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- 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.mjs +73 -7
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
- package/src/session-runtime/services/agent-tool.mjs +3 -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 +81 -15
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-turn-api.mjs +14 -5
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
- package/src/session-runtime/setup-tool/executor.mjs +36 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-surface.mjs +5 -1
- 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 +22 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +25 -9
- package/src/session-runtime/usage-stats-api.mjs +43 -11
- package/src/session-runtime/workspace/project-branches.mjs +7 -5
- package/src/session-runtime/workspace/transition-steps.mjs +129 -31
- package/src/session-runtime/workspace/transitions.mjs +190 -15
- package/src/standalone/daemon-agent-control.mjs +9 -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 +51 -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 +2 -0
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +61 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +70 -19
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +7 -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 +1 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- 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/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- 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 +13 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +19 -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/question-panel-model.mjs +156 -0
- package/src/tui/dist/index.mjs +2413 -1465
- package/src/tui/session/context-state.mjs +4 -2
- package/src/tui/session/session-api/commands.mjs +10 -0
- package/src/tui/session/session-api/controls.mjs +2 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +2 -1
- package/src/tui/session/session-api/settings.mjs +6 -0
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/tool-approval.mjs +10 -7
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/turn-stream.mjs +174 -31
- package/src/tui/session/turn.mjs +12 -5
- package/src/workflows/default/WORKFLOW.md +3 -1
|
@@ -338,6 +338,24 @@ export function degradeMediaParts(parts) {
|
|
|
338
338
|
return changed ? next : parts;
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
+
// The text of a document whose source is not base64 bytes: a text source is
|
|
342
|
+
// its data, a content source its text blocks. A url / file-id source has no
|
|
343
|
+
// bytes to read, so the request is rejected rather than silently dropped.
|
|
344
|
+
function documentSourceText(part) {
|
|
345
|
+
const source = part.source;
|
|
346
|
+
let text = null;
|
|
347
|
+
if (part.type === 'document' && source?.type === 'text' && typeof source.data === 'string') text = source.data;
|
|
348
|
+
else if (part.type === 'document' && source?.type === 'content') {
|
|
349
|
+
text = contentToText(source.content, '');
|
|
350
|
+
}
|
|
351
|
+
if (text === null) {
|
|
352
|
+
const kind = part.type === 'document' ? `${source?.type || 'unknown'} source` : 'format';
|
|
353
|
+
throw new TypeError(`This provider accepts no document blocks and cannot read a document with a ${kind}.`);
|
|
354
|
+
}
|
|
355
|
+
const title = typeof part.title === 'string' && part.title ? part.title : '';
|
|
356
|
+
return title ? `--- ${title} ---\n${text}` : text;
|
|
357
|
+
}
|
|
358
|
+
|
|
341
359
|
function replacePdfParts(content, texts) {
|
|
342
360
|
if (Array.isArray(content)) {
|
|
343
361
|
let changed = false;
|
|
@@ -368,8 +386,12 @@ function replacePdfParts(content, texts) {
|
|
|
368
386
|
* read error or a pdf.js environment failure propagates and nothing is cached.
|
|
369
387
|
*/
|
|
370
388
|
export async function preparePdfTextForProvider(messages, provider) {
|
|
371
|
-
|
|
389
|
+
// A provider that declares `nativeDocuments === false` takes no document
|
|
390
|
+
// block of any kind: every document variant becomes text (or is rejected).
|
|
391
|
+
const noDocuments = provider?.nativeDocuments === false;
|
|
392
|
+
if ((providerTakesNativePdf(provider) && !noDocuments) || !Array.isArray(messages)) return messages;
|
|
372
393
|
const found = [];
|
|
394
|
+
const texts = new Map();
|
|
373
395
|
for (const message of messages) {
|
|
374
396
|
for (const part of walkContentParts(message?.content)) {
|
|
375
397
|
if (part.type !== 'file' && part.type !== 'document') continue;
|
|
@@ -381,11 +403,12 @@ export async function preparePdfTextForProvider(messages, provider) {
|
|
|
381
403
|
continue;
|
|
382
404
|
}
|
|
383
405
|
if (file && fileKind(file) === 'pdf') found.push({ part, file });
|
|
406
|
+
else if (noDocuments && (file || part.type === 'document')) texts.set(part, file ? textFormOfFilePart(part) : documentSourceText(part));
|
|
384
407
|
}
|
|
385
408
|
}
|
|
386
|
-
if (!found.length) return messages;
|
|
409
|
+
if (!found.length && !texts.size) return messages;
|
|
387
410
|
const extracted = await Promise.all(found.map(({ file }) => pdfTextFor(file)));
|
|
388
|
-
|
|
411
|
+
found.forEach(({ part, file }, i) => texts.set(part, `--- ${fileLabel(file)} ---\n${extracted[i]}`));
|
|
389
412
|
return messages.map((message) => {
|
|
390
413
|
// A message whose content is one bare part becomes a one-part array.
|
|
391
414
|
if (texts.has(message?.content)) return { ...message, content: [{ type: 'text', text: texts.get(message.content) }] };
|
|
@@ -882,6 +905,11 @@ function normalizeAnthropicPart(part) {
|
|
|
882
905
|
} else {
|
|
883
906
|
out = { type: 'text', text: fileFallbackText(file, kind) };
|
|
884
907
|
}
|
|
908
|
+
// Citation settings and the model-only context belong to the document block.
|
|
909
|
+
if (out.type === 'document') {
|
|
910
|
+
if (part.citations) out.citations = part.citations;
|
|
911
|
+
if (part.context) out.context = part.context;
|
|
912
|
+
}
|
|
885
913
|
if (part.cache_control) out.cache_control = part.cache_control;
|
|
886
914
|
return out;
|
|
887
915
|
}
|
|
@@ -941,7 +969,12 @@ function normalizeAnthropicPart(part) {
|
|
|
941
969
|
// `nativePdf: false` marks a provider that takes a PDF as text: its PDFs were
|
|
942
970
|
// converted by preparePdfTextForProvider, so a PDF part reaching these
|
|
943
971
|
// normalizers is an error rather than a file block the provider cannot read.
|
|
944
|
-
|
|
972
|
+
//
|
|
973
|
+
// `cacheControl: true` is a capability the caller grants to a gateway that
|
|
974
|
+
// accepts Anthropic-style cache directives on text blocks (OpenRouter): text
|
|
975
|
+
// parts keep their `cache_control`, and multipart system content stays an
|
|
976
|
+
// array instead of being flattened. Off by default.
|
|
977
|
+
export function normalizeContentForOpenAIChat(content, { role = 'user', nativePdf = true, cacheControl = false } = {}) {
|
|
945
978
|
const parts = contentParts(content);
|
|
946
979
|
if (!parts) return content;
|
|
947
980
|
const out = [];
|
|
@@ -968,22 +1001,29 @@ export function normalizeContentForOpenAIChat(content, { role = 'user', nativePd
|
|
|
968
1001
|
}
|
|
969
1002
|
const fileUri = imageFileUriFromPart(part);
|
|
970
1003
|
if (fileUri) {
|
|
971
|
-
out.push({ type: 'image_url', image_url: { url: fileUri.fileUri } });
|
|
1004
|
+
out.push({ type: 'image_url', image_url: { url: fileUri.fileUri, ...imageDetailField(part) } });
|
|
972
1005
|
continue;
|
|
973
1006
|
}
|
|
974
1007
|
const url = imageUrlFromPart(part);
|
|
975
1008
|
if (url) {
|
|
976
|
-
out.push({ type: 'image_url', image_url: { url } });
|
|
1009
|
+
out.push({ type: 'image_url', image_url: { url, ...imageDetailField(part) } });
|
|
977
1010
|
continue;
|
|
978
1011
|
}
|
|
979
1012
|
const text = jsonFallbackFromPart(part, nativePdf);
|
|
980
|
-
if (text)
|
|
1013
|
+
if (text) {
|
|
1014
|
+
const cache = cacheControl && part?.cache_control ? { cache_control: part.cache_control } : {};
|
|
1015
|
+
out.push({ type: 'text', text, ...cache });
|
|
1016
|
+
}
|
|
981
1017
|
} catch (error) {
|
|
982
1018
|
const unavailable = unavailableAttachmentText(part, error);
|
|
983
1019
|
if (unavailable === null) throw error;
|
|
984
1020
|
out.push({ type: 'text', text: unavailable });
|
|
985
1021
|
}
|
|
986
1022
|
}
|
|
1023
|
+
if (cacheControl && role === 'system') {
|
|
1024
|
+
const blocks = out.filter((part) => part.type === 'text' && part.text);
|
|
1025
|
+
if (blocks.length > 1 || blocks.some((part) => part.cache_control)) return blocks;
|
|
1026
|
+
}
|
|
987
1027
|
if (role !== 'user')
|
|
988
1028
|
return out
|
|
989
1029
|
.map((part) => part.text || '')
|
|
@@ -992,6 +1032,15 @@ export function normalizeContentForOpenAIChat(content, { role = 'user', nativePd
|
|
|
992
1032
|
return out.length ? out : contentToText(content, '');
|
|
993
1033
|
}
|
|
994
1034
|
|
|
1035
|
+
const RESPONSES_IMAGE_DETAILS = new Set(['low', 'high', 'auto', 'original']);
|
|
1036
|
+
|
|
1037
|
+
// A caller-supplied image detail rides through; an unknown value is left out.
|
|
1038
|
+
function imageDetailField(part) {
|
|
1039
|
+
const raw = part.detail ?? part.image_url?.detail ?? part.source?.detail;
|
|
1040
|
+
const detail = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
|
|
1041
|
+
return RESPONSES_IMAGE_DETAILS.has(detail) ? { detail } : {};
|
|
1042
|
+
}
|
|
1043
|
+
|
|
995
1044
|
export function normalizeContentForOpenAIResponses(content, { role = 'user', nativePdf = true } = {}) {
|
|
996
1045
|
const textType = role === 'assistant' ? 'output_text' : 'input_text';
|
|
997
1046
|
if (typeof content === 'string') return content ? [{ type: textType, text: content }] : [];
|
|
@@ -1020,17 +1069,17 @@ export function normalizeContentForOpenAIResponses(content, { role = 'user', nat
|
|
|
1020
1069
|
}
|
|
1021
1070
|
const fileId = imageFileIdFromPart(part);
|
|
1022
1071
|
if (fileId) {
|
|
1023
|
-
out.push({ type: 'input_image', file_id: fileId });
|
|
1072
|
+
out.push({ type: 'input_image', file_id: fileId, ...imageDetailField(part) });
|
|
1024
1073
|
continue;
|
|
1025
1074
|
}
|
|
1026
1075
|
const fileUri = imageFileUriFromPart(part);
|
|
1027
1076
|
if (fileUri) {
|
|
1028
|
-
out.push({ type: 'input_image', image_url: fileUri.fileUri });
|
|
1077
|
+
out.push({ type: 'input_image', image_url: fileUri.fileUri, ...imageDetailField(part) });
|
|
1029
1078
|
continue;
|
|
1030
1079
|
}
|
|
1031
1080
|
const url = imageUrlFromPart(part);
|
|
1032
1081
|
if (url) {
|
|
1033
|
-
out.push({ type: 'input_image', image_url: url });
|
|
1082
|
+
out.push({ type: 'input_image', image_url: url, ...imageDetailField(part) });
|
|
1034
1083
|
continue;
|
|
1035
1084
|
}
|
|
1036
1085
|
const text = jsonFallbackFromPart(part, nativePdf);
|
|
@@ -1044,6 +1093,58 @@ export function normalizeContentForOpenAIResponses(content, { role = 'user', nat
|
|
|
1044
1093
|
return out;
|
|
1045
1094
|
}
|
|
1046
1095
|
|
|
1096
|
+
// Image types the Gemini API documents; an extension outside this map yields
|
|
1097
|
+
// no MIME type at all (FileData.mimeType is optional) instead of a guess.
|
|
1098
|
+
const GEMINI_IMAGE_EXTENSION_MIME = {
|
|
1099
|
+
png: 'image/png',
|
|
1100
|
+
jpg: 'image/jpeg',
|
|
1101
|
+
jpeg: 'image/jpeg',
|
|
1102
|
+
webp: 'image/webp',
|
|
1103
|
+
heic: 'image/heic',
|
|
1104
|
+
heif: 'image/heif',
|
|
1105
|
+
};
|
|
1106
|
+
|
|
1107
|
+
function mimeFromImageUrl(url) {
|
|
1108
|
+
let pathname = '';
|
|
1109
|
+
try {
|
|
1110
|
+
pathname = new URL(url).pathname;
|
|
1111
|
+
} catch {
|
|
1112
|
+
return undefined;
|
|
1113
|
+
}
|
|
1114
|
+
const ext = /\.([a-z0-9]+)$/i.exec(pathname)?.[1]?.toLowerCase();
|
|
1115
|
+
return ext ? GEMINI_IMAGE_EXTENSION_MIME[ext] : undefined;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
function trimmedMime(value) {
|
|
1119
|
+
const mime = typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
1120
|
+
return mime || undefined;
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
// Part-level metadata the Gemini API accepts beside inlineData/fileData.
|
|
1124
|
+
/** Supported Gemini part metadata (mediaResolution, videoMetadata) a caller put on `part`, camelCased. */
|
|
1125
|
+
export function geminiPartMetadata(part) {
|
|
1126
|
+
const out = {};
|
|
1127
|
+
if (!part || typeof part !== 'object') return out;
|
|
1128
|
+
const mediaResolution = part.mediaResolution ?? part.media_resolution;
|
|
1129
|
+
if (mediaResolution !== undefined && mediaResolution !== null) out.mediaResolution = mediaResolution;
|
|
1130
|
+
const videoMetadata = part.videoMetadata ?? part.video_metadata;
|
|
1131
|
+
if (videoMetadata !== undefined && videoMetadata !== null) out.videoMetadata = videoMetadata;
|
|
1132
|
+
return out;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
// FileData for an external URI: the MIME type comes from the part's own
|
|
1136
|
+
// declaration, else the URL's extension, else it is omitted.
|
|
1137
|
+
function geminiFileDataInfo(part, url) {
|
|
1138
|
+
const fileData = part?.fileData || part?.file_data;
|
|
1139
|
+
const declared = fileData
|
|
1140
|
+
? fileData.mimeType || fileData.mime_type || fileData.mediaType || fileData.media_type
|
|
1141
|
+
: part?.mime_type || part?.mimeType || part?.media_type || part?.mediaType;
|
|
1142
|
+
const fileUri = fileData?.fileUri || fileData?.file_uri || (part?.type === 'image' && part.uri) || url;
|
|
1143
|
+
if (typeof fileUri !== 'string' || !fileUri) return null;
|
|
1144
|
+
const mimeType = trimmedMime(declared) || trimmedMime(part?.image_url?.mime_type) || mimeFromImageUrl(fileUri);
|
|
1145
|
+
return { fileUri, ...(mimeType ? { mimeType } : {}) };
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1047
1148
|
export function normalizeContentForGeminiParts(content) {
|
|
1048
1149
|
if (typeof content === 'string') return content ? [{ text: content }] : [];
|
|
1049
1150
|
const parts = contentParts(content);
|
|
@@ -1054,21 +1155,21 @@ export function normalizeContentForGeminiParts(content) {
|
|
|
1054
1155
|
const out = [];
|
|
1055
1156
|
for (const part of parts) {
|
|
1056
1157
|
try {
|
|
1158
|
+
const meta = geminiPartMetadata(part);
|
|
1057
1159
|
const file = fileInfo(part);
|
|
1058
1160
|
if (file) {
|
|
1059
1161
|
const kind = fileKind(file);
|
|
1060
|
-
if (kind === 'pdf') out.push({ inlineData: { mimeType: 'application/pdf', data: file.data } });
|
|
1162
|
+
if (kind === 'pdf') out.push({ inlineData: { mimeType: 'application/pdf', data: file.data }, ...meta });
|
|
1061
1163
|
else out.push({ text: fileFallbackText(file, kind) });
|
|
1062
1164
|
continue;
|
|
1063
1165
|
}
|
|
1064
1166
|
const inlineInfo = geminiInlineInfo(part);
|
|
1065
1167
|
if (inlineInfo) {
|
|
1066
|
-
out.push({ inlineData: { mimeType: inlineInfo.mimeType, data: inlineInfo.data } });
|
|
1168
|
+
out.push({ inlineData: { mimeType: inlineInfo.mimeType, data: inlineInfo.data }, ...meta });
|
|
1067
1169
|
continue;
|
|
1068
1170
|
}
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
out.push({ fileData: { mimeType: fileUri.mimeType, fileUri: fileUri.fileUri } });
|
|
1171
|
+
if (imageFileUriFromPart(part)) {
|
|
1172
|
+
out.push({ fileData: geminiFileDataInfo(part), ...meta });
|
|
1072
1173
|
continue;
|
|
1073
1174
|
}
|
|
1074
1175
|
const fileId = imageFileIdFromPart(part);
|
|
@@ -1078,17 +1179,17 @@ export function normalizeContentForGeminiParts(content) {
|
|
|
1078
1179
|
}
|
|
1079
1180
|
const info = imageInfo(part);
|
|
1080
1181
|
if (info) {
|
|
1081
|
-
out.push({ inlineData: { mimeType: info.mimeType, data: info.data } });
|
|
1182
|
+
out.push({ inlineData: { mimeType: info.mimeType, data: info.data }, ...meta });
|
|
1082
1183
|
continue;
|
|
1083
1184
|
}
|
|
1084
1185
|
const url = imageUrlFromPart(part);
|
|
1085
1186
|
const dataUrlInfo = imageInfoFromDataUrl(url);
|
|
1086
1187
|
if (dataUrlInfo) {
|
|
1087
|
-
out.push({ inlineData: { mimeType: dataUrlInfo.mimeType, data: dataUrlInfo.data } });
|
|
1188
|
+
out.push({ inlineData: { mimeType: dataUrlInfo.mimeType, data: dataUrlInfo.data }, ...meta });
|
|
1088
1189
|
continue;
|
|
1089
1190
|
}
|
|
1090
1191
|
if (url && !url.startsWith('data:')) {
|
|
1091
|
-
out.push({ fileData:
|
|
1192
|
+
out.push({ fileData: geminiFileDataInfo(part, url), ...meta });
|
|
1092
1193
|
continue;
|
|
1093
1194
|
}
|
|
1094
1195
|
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),
|
|
@@ -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;
|
|
@@ -93,6 +93,7 @@ export function inlineModelProxyAttachments(messages, { maxBytes = MODEL_PROXY_I
|
|
|
93
93
|
export class ModelProxyProvider {
|
|
94
94
|
#channel;
|
|
95
95
|
#modelInfo = new Map();
|
|
96
|
+
#noWireRoute = new Set();
|
|
96
97
|
|
|
97
98
|
constructor(name, config = {}, channel = getModelProxyChannel()) {
|
|
98
99
|
this.name = name;
|
|
@@ -109,7 +110,7 @@ export class ModelProxyProvider {
|
|
|
109
110
|
async send(messages, model, tools, sendOpts) {
|
|
110
111
|
const { options, callbacks } = splitModelProxySendOptions(sendOpts);
|
|
111
112
|
const finalized = isFinalizedProviderRequestTools(tools);
|
|
112
|
-
|
|
113
|
+
const result = await this.#call(
|
|
113
114
|
'send',
|
|
114
115
|
{
|
|
115
116
|
model: model ?? null,
|
|
@@ -121,6 +122,22 @@ export class ModelProxyProvider {
|
|
|
121
122
|
},
|
|
122
123
|
{ signal: sendOpts?.signal || null, callbacks }
|
|
123
124
|
);
|
|
125
|
+
// The PC rerouted the wire (a clear "unsupported" refusal) and reports the
|
|
126
|
+
// route it used: the daemon's own session adopts it, so the next proxied
|
|
127
|
+
// turn starts on the new wire instead of repeating the refusal.
|
|
128
|
+
const rerouted = result?.wireReroute;
|
|
129
|
+
const session = sendOpts?.session;
|
|
130
|
+
if (
|
|
131
|
+
rerouted?.source === 'reroute' &&
|
|
132
|
+
session?.wireRoute &&
|
|
133
|
+
session.wireRoute.provider === this.name &&
|
|
134
|
+
session.wireRoute.model === (model ?? null) &&
|
|
135
|
+
rerouted.provider === this.name &&
|
|
136
|
+
rerouted.model === session.wireRoute.model
|
|
137
|
+
) {
|
|
138
|
+
session.wireRoute = rerouted;
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
124
141
|
}
|
|
125
142
|
|
|
126
143
|
#adoptCatalog(catalog) {
|
|
@@ -145,6 +162,21 @@ export class ModelProxyProvider {
|
|
|
145
162
|
getCachedModelInfo(model) {
|
|
146
163
|
return this.#modelInfo.get(String(model ?? '')) ?? null;
|
|
147
164
|
}
|
|
165
|
+
|
|
166
|
+
/** The PC adapter's wire route for `model` (its config and roster decide);
|
|
167
|
+
* null for a single-wire adapter, which is remembered so every later turn
|
|
168
|
+
* skips the round trip. */
|
|
169
|
+
async resolveWireRoute(model, ctx = {}) {
|
|
170
|
+
const key = String(model ?? '');
|
|
171
|
+
if (this.#noWireRoute.has(key)) return null;
|
|
172
|
+
const route = await this.#call('resolveWireRoute', {
|
|
173
|
+
model: model ?? null,
|
|
174
|
+
context: { agent: ctx.agent === true, legacy: ctx.legacy === true },
|
|
175
|
+
});
|
|
176
|
+
if (route && typeof route === 'object') return route;
|
|
177
|
+
this.#noWireRoute.add(key);
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
148
180
|
}
|
|
149
181
|
|
|
150
182
|
/** A proxy instance whose class carries the PC adapter's usage convention. */
|
|
@@ -252,6 +252,8 @@ function cursorOAuthState() {
|
|
|
252
252
|
return resolveProbeState(paths, (docs) =>
|
|
253
253
|
docs.some((own) => {
|
|
254
254
|
if (!own?.access_token) return false;
|
|
255
|
+
// Cursor permanently rejected the refresh token: signed out until a new login.
|
|
256
|
+
if (own.reauth_required === true) return false;
|
|
255
257
|
const expiresAt = Number(own.expires_at) || 0;
|
|
256
258
|
return expiresAt === 0 || expiresAt > Date.now() || Boolean(own.refresh_token);
|
|
257
259
|
})
|
|
@@ -101,6 +101,8 @@ function _codexMetadataBase({ poolKey, cacheKey, sendOpts, handshake = false } =
|
|
|
101
101
|
sendOpts?.codexSessionId ||
|
|
102
102
|
sendOpts?.session?.codexWireSessionId ||
|
|
103
103
|
sendOpts?.session?.codexSessionId ||
|
|
104
|
+
// A forked transport scope keeps its session's wire identity.
|
|
105
|
+
(sendOpts?.transportScope ? sendOpts?.sessionId : '') ||
|
|
104
106
|
poolKey ||
|
|
105
107
|
cacheKey
|
|
106
108
|
) || 'mixdog-session';
|