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
|
@@ -19,7 +19,7 @@ function cloneNativeBlock(block) {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export function createContentBlockStart({ turn, blocks, state, progress }) {
|
|
22
|
+
export function createContentBlockStart({ turn, blocks, state, progress, seedText }) {
|
|
23
23
|
const seedThinkingBlock = (index, block) => {
|
|
24
24
|
if (block.type === 'redacted_thinking') {
|
|
25
25
|
// Opaque redacted payload: real reasoning content, exposed as a block.
|
|
@@ -61,9 +61,16 @@ export function createContentBlockStart({ turn, blocks, state, progress }) {
|
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
if (block?.type === 'text') {
|
|
64
|
-
// Seed the ordered text slot
|
|
65
|
-
// `text`
|
|
66
|
-
|
|
64
|
+
// Seed the ordered text slot. An empty block still needs its slot (it
|
|
65
|
+
// separates thinking runs); a non-empty opening `text` is model output
|
|
66
|
+
// and is routed exactly like a text_delta so it reaches the returned and
|
|
67
|
+
// live content once.
|
|
68
|
+
const initialText = typeof block.text === 'string' ? block.text : '';
|
|
69
|
+
if (initialText) seedText(index, initialText);
|
|
70
|
+
else blocks.appendText(index, '');
|
|
71
|
+
if (Array.isArray(block.citations)) {
|
|
72
|
+
for (const citation of block.citations) blocks.appendCitation(index, citation);
|
|
73
|
+
}
|
|
67
74
|
}
|
|
68
75
|
if (NATIVE_SERVER_TOOL_CALL_BLOCK_TYPES.has(block?.type)) {
|
|
69
76
|
// Verbatim seed; `input` is completed from the streamed
|
package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs
CHANGED
|
@@ -26,6 +26,9 @@ export function createMessageEvents({ turn, blocks, state }) {
|
|
|
26
26
|
if (event.delta && (event.delta.stop_details != null || event.delta.category != null)) {
|
|
27
27
|
turn.stopDetails = stopDetailsFrom(event.delta);
|
|
28
28
|
}
|
|
29
|
+
if (event.delta?.stop_sequence != null) {
|
|
30
|
+
turn.stopSequence = event.delta.stop_sequence;
|
|
31
|
+
}
|
|
29
32
|
if (event.usage) updateTurnUsage(turn.usage, event.usage);
|
|
30
33
|
// A terminal stop_reason while ANY tool input is still streaming ends the
|
|
31
34
|
// turn truncated, immediately: the model declared it stopped sampling, so
|
|
@@ -21,18 +21,25 @@ export function createTurnEvents({
|
|
|
21
21
|
labels,
|
|
22
22
|
}) {
|
|
23
23
|
const { onMessageStart, onMessageDelta, onMessageStop } = createMessageEvents({ turn, blocks, state });
|
|
24
|
+
const onContentBlockDelta = createContentBlockDelta({
|
|
25
|
+
turn,
|
|
26
|
+
blocks,
|
|
27
|
+
state,
|
|
28
|
+
leak,
|
|
29
|
+
relayText,
|
|
30
|
+
progress,
|
|
31
|
+
relayProgressUpdates,
|
|
32
|
+
});
|
|
24
33
|
return {
|
|
25
34
|
onMessageStart,
|
|
26
|
-
onContentBlockStart: createContentBlockStart({
|
|
27
|
-
onContentBlockDelta: createContentBlockDelta({
|
|
35
|
+
onContentBlockStart: createContentBlockStart({
|
|
28
36
|
turn,
|
|
29
37
|
blocks,
|
|
30
38
|
state,
|
|
31
|
-
leak,
|
|
32
|
-
relayText,
|
|
33
39
|
progress,
|
|
34
|
-
|
|
40
|
+
seedText: onContentBlockDelta.seedText,
|
|
35
41
|
}),
|
|
42
|
+
onContentBlockDelta,
|
|
36
43
|
onContentBlockStop: createContentBlockStop({ turn, blocks, state, leak, progress, onToolCall, labels }),
|
|
37
44
|
onMessageDelta,
|
|
38
45
|
onMessageStop,
|
|
@@ -138,6 +138,7 @@ export function createTurnOutcome({ turn, blocks, state, labels = OAUTH_STREAM_L
|
|
|
138
138
|
usage: turn.usage,
|
|
139
139
|
stopReason: turn.stopReason,
|
|
140
140
|
stopDetails: turn.stopDetails,
|
|
141
|
+
...(turn.stopSequence != null ? { stopSequence: turn.stopSequence } : {}),
|
|
141
142
|
hasThinkingContent: turn.hasThinkingContent,
|
|
142
143
|
contentBlockTypes: Array.from(turn.contentBlockTypes),
|
|
143
144
|
// Ordered extended-thinking blocks (verbatim thinking text + signature)
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* module of the turn reads and writes this one object; nothing about the
|
|
6
6
|
* turn's progress is hidden in a closure.
|
|
7
7
|
*/
|
|
8
|
+
import { reportedCostUsd } from '../lib/usage-primitives.mjs';
|
|
9
|
+
import { normalizeServerToolUse } from '../lib/anthropic-server-tool-usage.mjs';
|
|
8
10
|
|
|
9
11
|
export function createAnthropicTurnState() {
|
|
10
12
|
return {
|
|
@@ -16,6 +18,9 @@ export function createAnthropicTurnState() {
|
|
|
16
18
|
usage: { inputTokens: 0, outputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, raw: null },
|
|
17
19
|
stopReason: null,
|
|
18
20
|
stopDetails: undefined,
|
|
21
|
+
// The custom stop sequence that ended the turn (message_delta
|
|
22
|
+
// delta.stop_sequence); stays undefined unless the API reports one.
|
|
23
|
+
stopSequence: undefined,
|
|
19
24
|
fallbackEvents: [],
|
|
20
25
|
// Set when a terminal frame (message_delta stop_reason / message_stop)
|
|
21
26
|
// arrived while tool input was still in flight — used only to word the
|
|
@@ -35,6 +40,15 @@ export function updateTurnUsage(usage, raw) {
|
|
|
35
40
|
if (raw.cache_creation?.ephemeral_1h_input_tokens != null) {
|
|
36
41
|
usage.cacheWrite1hTokens = raw.cache_creation.ephemeral_1h_input_tokens;
|
|
37
42
|
}
|
|
43
|
+
// A gateway's reported cost (OpenRouter puts `cost` on the final usage). It
|
|
44
|
+
// rides the turn usage itself, so a success, an abandoned attempt and a
|
|
45
|
+
// failure's partial usage all carry it to the provider-boundary ledger.
|
|
46
|
+
const costUsd = reportedCostUsd(raw.cost);
|
|
47
|
+
if (costUsd !== undefined) usage.costUsd = costUsd;
|
|
48
|
+
// Server-tool counters are cumulative in message_delta; a later report
|
|
49
|
+
// replaces the earlier one, an absent one preserves it.
|
|
50
|
+
const serverToolUse = normalizeServerToolUse(raw);
|
|
51
|
+
if (serverToolUse) usage.serverToolUse = serverToolUse;
|
|
38
52
|
usage.raw = { ...(usage.raw || {}), ...raw };
|
|
39
53
|
// Input excludes cache; all three slots contribute to prompt volume.
|
|
40
54
|
usage.promptTokens = usage.inputTokens + usage.cachedTokens + usage.cacheWriteTokens;
|
|
@@ -75,9 +75,11 @@ const ANTHROPIC_SSE_ERROR_TYPE_STATUS = new Map([
|
|
|
75
75
|
['authentication_error', 401],
|
|
76
76
|
['permission_error', 403],
|
|
77
77
|
['not_found_error', 404],
|
|
78
|
+
['conflict_error', 409],
|
|
78
79
|
['request_too_large', 413],
|
|
79
80
|
['rate_limit_error', 429],
|
|
80
81
|
['api_error', 500],
|
|
82
|
+
['timeout_error', 504],
|
|
81
83
|
['overloaded_error', 529],
|
|
82
84
|
]);
|
|
83
85
|
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* account for usage identically.
|
|
11
11
|
*/
|
|
12
12
|
import { traceAgentUsage } from '../agent-trace.mjs';
|
|
13
|
+
import { reportedCostUsd } from './lib/usage-primitives.mjs';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* @param {object} parseResult the assembled turn (streaming or normalized non-streaming)
|
|
@@ -26,6 +27,7 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
|
|
|
26
27
|
const output = parseResult.usage?.outputTokens || 0;
|
|
27
28
|
const promptTokens = parseResult.usage?.promptTokens ?? input + cacheRead + cacheWrite;
|
|
28
29
|
const liveModel = parseResult.model || useModel;
|
|
30
|
+
const costUsd = parseResult.usage?.costUsd ?? reportedCostUsd(usageRaw?.cost);
|
|
29
31
|
|
|
30
32
|
if (usageRaw || input || output || cacheRead || cacheWrite) {
|
|
31
33
|
traceAgentUsage({
|
|
@@ -53,6 +55,8 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
|
|
|
53
55
|
model: liveModel,
|
|
54
56
|
toolCalls: parseResult.toolCalls,
|
|
55
57
|
stopReason: parseResult.stopReason || null,
|
|
58
|
+
...(parseResult.stopDetails != null ? { stopDetails: parseResult.stopDetails } : {}),
|
|
59
|
+
...(parseResult.stopSequence != null ? { stopSequence: parseResult.stopSequence } : {}),
|
|
56
60
|
hasThinkingContent: !!parseResult.hasThinkingContent,
|
|
57
61
|
contentBlockTypes: Array.isArray(parseResult.contentBlockTypes) ? parseResult.contentBlockTypes : [],
|
|
58
62
|
// Round-trip adaptive-thinking blocks (verbatim thinking +
|
|
@@ -84,6 +88,11 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
|
|
|
84
88
|
cacheWriteTokens: cacheWrite,
|
|
85
89
|
...(parseResult.usage?.cacheWrite1hTokens ? { cacheWrite1hTokens: parseResult.usage.cacheWrite1hTokens } : {}),
|
|
86
90
|
promptTokens,
|
|
91
|
+
// A gateway-reported cost (OpenRouter `usage.cost`), when the turn has one.
|
|
92
|
+
...(costUsd !== undefined ? { costUsd } : {}),
|
|
93
|
+
...(parseResult.usage?.serverToolUse ? { serverToolUse: parseResult.usage.serverToolUse } : {}),
|
|
94
|
+
// Raw provider usage (incl. server_tool_use counters), as on the OAuth path.
|
|
95
|
+
...(usageRaw ? { raw: usageRaw } : {}),
|
|
87
96
|
},
|
|
88
97
|
};
|
|
89
98
|
}
|
|
@@ -83,6 +83,11 @@ export class AnthropicProvider {
|
|
|
83
83
|
maxRetries: 0,
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
|
+
// The model id capability lookups (output cap, thinking/effort shape) read;
|
|
87
|
+
// a gateway engine maps its routing slug to the Claude id it stands for.
|
|
88
|
+
_capabilityModel(model) {
|
|
89
|
+
return model;
|
|
90
|
+
}
|
|
86
91
|
reloadApiKey() {
|
|
87
92
|
try {
|
|
88
93
|
const newKey = reloadProviderApiKey(this.name, this.config);
|
|
@@ -149,6 +154,7 @@ export class AnthropicProvider {
|
|
|
149
154
|
fastModeLatched: this.fastModeBetaHeaderLatched,
|
|
150
155
|
// Custom providers carry per-model reasoning settings on their own rows.
|
|
151
156
|
modelInfo: isCustomProviderName(this.name) ? this.getCachedModelInfo?.(useModel) || null : null,
|
|
157
|
+
capabilityModel: this._capabilityModel(useModel),
|
|
152
158
|
});
|
|
153
159
|
this.fastModeBetaHeaderLatched = fastModeLatched;
|
|
154
160
|
|
|
@@ -15,6 +15,12 @@ export function isAntigravityClaude(model) {
|
|
|
15
15
|
return /^claude-/i.test(String(model || ''));
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
// Claude declarations are validated for the gateway's Anthropic bridge in
|
|
19
|
+
// toGeminiTools (claudeBridge: true); a tool with an invalid schema is left
|
|
20
|
+
// out of the request and reported through `onToolExcluded` / console.warn.
|
|
21
|
+
const claudeRequestTools = (tools, nativeTools, onToolExcluded) =>
|
|
22
|
+
toGeminiRequestTools(tools, nativeTools, { claudeBridge: true, onToolExcluded });
|
|
23
|
+
|
|
18
24
|
// Default function-calling mode when the caller sets no toolChoice. VALIDATED
|
|
19
25
|
// (schema-constrained function calls) is what the Antigravity client sends;
|
|
20
26
|
// MIXDOG_ANTIGRAVITY_FC_MODE=AUTO|ANY|VALIDATED overrides it for A/B runs.
|
|
@@ -35,14 +41,52 @@ function replayFamilyMatches(message, model) {
|
|
|
35
41
|
return isAntigravityClaude(recorded) === isAntigravityClaude(model);
|
|
36
42
|
}
|
|
37
43
|
|
|
44
|
+
// The stream records empty text parts around Claude tool calls; Cloud Code's
|
|
45
|
+
// Claude bridge rejects them on replay ("text.text: Field required").
|
|
46
|
+
const isEmptyPlainTextPart = (part) =>
|
|
47
|
+
part?.text === '' && part.thought !== true && typeof part.thoughtSignature !== 'string';
|
|
48
|
+
|
|
49
|
+
// Streamed Claude thinking arrives as many thought deltas with the signature
|
|
50
|
+
// on the closing (often empty) delta; the bridge turns every part into its own
|
|
51
|
+
// thinking block and rejects the unsigned ones ("thinking.signature: Field
|
|
52
|
+
// required"). Rejoin each run into one block that ends at its signature.
|
|
53
|
+
function coalesceClaudeThoughts(parts) {
|
|
54
|
+
const out = [];
|
|
55
|
+
let open = null;
|
|
56
|
+
for (const part of parts) {
|
|
57
|
+
if (part?.thought !== true) {
|
|
58
|
+
if (open) out.push(open);
|
|
59
|
+
open = null;
|
|
60
|
+
out.push(part);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
open = open
|
|
64
|
+
? { ...open, ...part, text: `${open.text}${typeof part.text === 'string' ? part.text : ''}` }
|
|
65
|
+
: { ...part, text: typeof part.text === 'string' ? part.text : '' };
|
|
66
|
+
if (typeof part.thoughtSignature === 'string') {
|
|
67
|
+
out.push(open);
|
|
68
|
+
open = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (open) out.push(open);
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
|
|
38
75
|
function signatureSafeMessages(messages, model) {
|
|
39
|
-
|
|
40
|
-
|
|
76
|
+
const claude = isAntigravityClaude(model);
|
|
77
|
+
return messages.flatMap((message) => {
|
|
78
|
+
if (message?.role !== 'assistant') return [message];
|
|
41
79
|
const ownParts = replayFamilyMatches(message, model) ? providerReplayItems(message, 'antigravity') : undefined;
|
|
42
80
|
// Repair tool signatures only after the complete history establishes
|
|
43
81
|
// the active turn, not while normalizing an isolated older message.
|
|
44
|
-
const
|
|
45
|
-
|
|
82
|
+
const sourceParts = ownParts || toGeminiContents([message], model, { repairToolSignatures: false })[0]?.parts;
|
|
83
|
+
const parts =
|
|
84
|
+
claude && sourceParts
|
|
85
|
+
? coalesceClaudeThoughts(sourceParts.filter((part) => !isEmptyPlainTextPart(part)))
|
|
86
|
+
: sourceParts;
|
|
87
|
+
// A turn that held only empty parts is omitted, not sent as parts:[].
|
|
88
|
+
if (sourceParts?.length && !parts.length) return [];
|
|
89
|
+
if (!parts?.length) return [message];
|
|
46
90
|
for (const part of parts) {
|
|
47
91
|
if (!part || typeof part !== 'object') continue;
|
|
48
92
|
if (part.thought === true || typeof part.thoughtSignature === 'string') {
|
|
@@ -52,7 +96,7 @@ function signatureSafeMessages(messages, model) {
|
|
|
52
96
|
if (!ownParts || !part.thoughtSignature) part.thoughtSignature = THOUGHT_SIGNATURE_SENTINEL;
|
|
53
97
|
}
|
|
54
98
|
}
|
|
55
|
-
return { ...message, providerReplay: createProviderReplay('antigravity', parts) };
|
|
99
|
+
return [{ ...message, providerReplay: createProviderReplay('antigravity', parts) }];
|
|
56
100
|
});
|
|
57
101
|
}
|
|
58
102
|
|
|
@@ -121,9 +165,16 @@ export function buildAntigravityRequest(messages, model, tools, opts = {}, proje
|
|
|
121
165
|
};
|
|
122
166
|
const request = { contents };
|
|
123
167
|
if (systemText) request.systemInstruction = { role: 'user', parts: [{ text: systemText }] };
|
|
124
|
-
const requestTools =
|
|
168
|
+
const requestTools = claude
|
|
169
|
+
? claudeRequestTools(tools, opts.nativeTools, opts.onToolExcluded)
|
|
170
|
+
: toGeminiRequestTools(tools, opts.nativeTools, {
|
|
171
|
+
onToolExcluded: opts.onToolExcluded,
|
|
172
|
+
// Other families (GPT-OSS) keep the plain conversion.
|
|
173
|
+
validate: isGeminiFamilyModel(model),
|
|
174
|
+
});
|
|
125
175
|
if (requestTools.length) request.tools = requestTools;
|
|
126
|
-
|
|
176
|
+
// Tool config only accompanies function declarations that were kept.
|
|
177
|
+
if (requestTools.some((entry) => entry.functionDeclarations?.length)) {
|
|
127
178
|
request.toolConfig = toGeminiToolConfig(opts.toolChoice) || {
|
|
128
179
|
functionCallingConfig: { mode: antigravityFunctionCallingMode() },
|
|
129
180
|
};
|
|
@@ -8,13 +8,20 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { traceAgentUsage } from '../agent-trace.mjs';
|
|
10
10
|
import { createProviderReplay } from './lib/provider-replay.mjs';
|
|
11
|
-
import {
|
|
12
|
-
|
|
11
|
+
import {
|
|
12
|
+
parseToolCalls,
|
|
13
|
+
emitGeminiToolCalls,
|
|
14
|
+
collectGeminiGroundingSources,
|
|
15
|
+
parseGeminiTextPartMetadata,
|
|
16
|
+
} from './gemini-schema.mjs';
|
|
17
|
+
import { geminiFinishErrorFields, geminiPolicyFinishCode } from './gemini-error-contract.mjs';
|
|
13
18
|
|
|
14
19
|
// Pure usageMetadata normalization shared by the success path and a failed
|
|
15
20
|
// stream's partialUsage.
|
|
16
21
|
export function normalizeAntigravityUsage(um) {
|
|
17
|
-
const inputTokens =
|
|
22
|
+
const inputTokens =
|
|
23
|
+
(um.promptTokenCount || um.prompt_token_count || 0) +
|
|
24
|
+
(um.toolUsePromptTokenCount || um.tool_use_prompt_token_count || 0);
|
|
18
25
|
const cachedTokens = um.cachedContentTokenCount || um.cached_content_token_count || 0;
|
|
19
26
|
const outputTokens =
|
|
20
27
|
(um.candidatesTokenCount || um.candidates_token_count || 0) +
|
|
@@ -28,7 +35,7 @@ export function normalizeAntigravityUsage(um) {
|
|
|
28
35
|
* @param {ReturnType<import('./antigravity-stream.mjs').createAntigravityStreamCollector>} deps.collector
|
|
29
36
|
* @param {string} deps.useModel wire model id
|
|
30
37
|
* @param {object} deps.opts send options (session/iteration/providerState)
|
|
31
|
-
* @param {Function|null} deps.onToolCall
|
|
38
|
+
* @param {Function|null} deps.onToolCall receives the turn's calls after a clean finish
|
|
32
39
|
*/
|
|
33
40
|
export function finalizeAntigravityTurn({ response, collector, useModel, opts, onToolCall }) {
|
|
34
41
|
const textLeakGuard = collector.leakGuard;
|
|
@@ -46,10 +53,8 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
|
|
|
46
53
|
// Thought signatures are only valid for the model family that minted
|
|
47
54
|
// them; the request builder consults this when the route changes.
|
|
48
55
|
if (providerReplay) providerReplay.requestContext = { model: useModel };
|
|
49
|
-
let nativeToolCalls;
|
|
50
|
-
if (
|
|
51
|
-
else if (collector.streamedNativeToolCalls.length) nativeToolCalls = collector.streamedNativeToolCalls;
|
|
52
|
-
if (!onToolCall && textLeakGuard?.enabled) nativeToolCalls = textLeakGuard.filterNativeToolCalls(nativeToolCalls);
|
|
56
|
+
let nativeToolCalls = parseToolCalls(responseParts);
|
|
57
|
+
if (textLeakGuard?.enabled) nativeToolCalls = textLeakGuard.filterNativeToolCalls(nativeToolCalls);
|
|
53
58
|
let toolCalls = nativeToolCalls;
|
|
54
59
|
if (leakedToolCalls.length) {
|
|
55
60
|
toolCalls = toolCalls?.length ? [...toolCalls, ...leakedToolCalls] : leakedToolCalls;
|
|
@@ -80,7 +85,17 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
|
|
|
80
85
|
});
|
|
81
86
|
}
|
|
82
87
|
|
|
83
|
-
|
|
88
|
+
// A MAX_TOKENS cut that still delivered whole native functionCall parts is
|
|
89
|
+
// a tool-use turn: the calls arrived intact, only trailing output was cut.
|
|
90
|
+
// Every other non-STOP finish fails the turn, and so does a cut whose text
|
|
91
|
+
// also leaked a call (that call may be as truncated as the text around it).
|
|
92
|
+
const completeNativeCalls =
|
|
93
|
+
normalizedFinish === 'MAX_TOKENS' &&
|
|
94
|
+
String(candidate?.finishReason || '').replace(/^FINISH_REASON_/, '') === 'MAX_TOKENS' &&
|
|
95
|
+
!leakedToolCalls.length &&
|
|
96
|
+
!!nativeToolCalls?.length &&
|
|
97
|
+
nativeToolCalls.every((call) => typeof call?.name === 'string' && call.name !== '');
|
|
98
|
+
if (finishReason && normalizedFinish !== 'STOP' && !completeNativeCalls) {
|
|
84
99
|
throw Object.assign(new Error(`Antigravity response incomplete: finishReason=${finishReason}`), {
|
|
85
100
|
name: 'ProviderIncompleteError',
|
|
86
101
|
code: geminiPolicyFinishCode(finishReason) || 'PROVIDER_INCOMPLETE',
|
|
@@ -93,10 +108,14 @@ export function finalizeAntigravityTurn({ response, collector, useModel, opts, o
|
|
|
93
108
|
model: useModel,
|
|
94
109
|
rawUsage: response.usageMetadata || null,
|
|
95
110
|
...(usage ? { partialUsage: usage, partialModel: useModel } : {}),
|
|
96
|
-
...(
|
|
111
|
+
...geminiFinishErrorFields(response),
|
|
97
112
|
});
|
|
98
113
|
}
|
|
99
114
|
|
|
115
|
+
// Terminal status first: a failed turn never runs its tool calls.
|
|
116
|
+
textLeakGuard?.releaseDeferredToolCalls();
|
|
117
|
+
emitGeminiToolCalls(nativeToolCalls, onToolCall);
|
|
118
|
+
|
|
100
119
|
return {
|
|
101
120
|
content,
|
|
102
121
|
model: useModel,
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* capacity (429/503/529, MODEL_CAPACITY_EXHAUSTED, "server busy"): retried on
|
|
6
6
|
* the SAME account and host with 1s → 2s → 4s (8s cap) ±10% jitter, three
|
|
7
|
-
* retries,
|
|
7
|
+
* retries, waiting at least the server's RetryInfo delay; advice that
|
|
8
|
+
* would push total waiting past 60s surfaces the error (with resetAt).
|
|
8
9
|
* Endpoint: the reference falls back to its next endpoint after a failure;
|
|
9
10
|
* generation here deliberately stays on the single daily host and never
|
|
10
11
|
* walks an endpoint list (a spent ladder surfaces to the account layer).
|
|
@@ -23,6 +24,8 @@ export const ANTIGRAVITY_CAPACITY_RETRIES = 3;
|
|
|
23
24
|
export const ANTIGRAVITY_CAPACITY_BASE_MS = 1000;
|
|
24
25
|
export const ANTIGRAVITY_CAPACITY_MAX_MS = 8000;
|
|
25
26
|
export const ANTIGRAVITY_CAPACITY_JITTER_RATIO = 0.1;
|
|
27
|
+
// Total time capacity retries may spend waiting on server-advised delays.
|
|
28
|
+
export const ANTIGRAVITY_CAPACITY_BUDGET_MS = 60_000;
|
|
26
29
|
export const ANTIGRAVITY_QUICK_RETRY_MS = 1000;
|
|
27
30
|
export const ANTIGRAVITY_QUICK_RETRY_MAX_ADVICE_MS = 60_000;
|
|
28
31
|
|
|
@@ -60,10 +63,20 @@ export function antigravity429WaitMs(err, state) {
|
|
|
60
63
|
if (DETERMINISTIC_KINDS.has(kind) || err.code === 'quota_exhausted' || err.quotaScope === 'day' || err.quotaScope === 'plan') {
|
|
61
64
|
return null;
|
|
62
65
|
}
|
|
63
|
-
// Capacity
|
|
66
|
+
// Capacity waits at least the advised RetryInfo delay (the local schedule
|
|
67
|
+
// is the floor). Total advised waiting stays within the retry budget; an
|
|
68
|
+
// advice that does not fit surfaces with its reset time rather than
|
|
69
|
+
// retrying early.
|
|
64
70
|
if (capacity) {
|
|
65
71
|
if (state.capacityRetries >= ANTIGRAVITY_CAPACITY_RETRIES) return null;
|
|
66
|
-
|
|
72
|
+
const spent = state.capacityWaitedMs ?? 0;
|
|
73
|
+
if (retryAfterMs != null && spent + retryAfterMs > ANTIGRAVITY_CAPACITY_BUDGET_MS) {
|
|
74
|
+
err.resetAt ??= Date.now() + retryAfterMs;
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const wait = Math.max(antigravityCapacityDelayMs(state.capacityRetries++), retryAfterMs ?? 0);
|
|
78
|
+
state.capacityWaitedMs = spent + wait;
|
|
79
|
+
return wait;
|
|
67
80
|
}
|
|
68
81
|
// An RPM hit gets one quick retry; advice up to a minute is honored in
|
|
69
82
|
// full, a longer wait surfaces so the account pool can rotate.
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* antigravity-stream.mjs — what one Antigravity SSE turn accumulates while it
|
|
3
3
|
* streams: the live text mirror a retirement notice is recognised from, the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* carry (emittedToolCall / unsafeToRetry / partial calls + partial replay).
|
|
4
|
+
* leak guard that recovers calls the model wrote as text (held back, like the
|
|
5
|
+
* native calls, until the turn finishes cleanly), and the first terminal
|
|
6
|
+
* finishReason. Nothing is dispatched while streaming.
|
|
8
7
|
*
|
|
9
8
|
* The transport (antigravity-transport.mjs) owns the socket and the retry
|
|
10
9
|
* policy; the projection (antigravity-response.mjs) reads this record after
|
|
11
10
|
* the turn settles.
|
|
12
11
|
*/
|
|
13
|
-
import { createProviderReplay } from './lib/provider-replay.mjs';
|
|
14
12
|
import { createGeminiTextLeakGuard, consumeGeminiRestStreamResponse } from './gemini-stream.mjs';
|
|
15
|
-
import { parseToolCalls, emitGeminiToolCalls } from './gemini-schema.mjs';
|
|
16
13
|
import { normalizeAntigravityUsage } from './antigravity-response.mjs';
|
|
17
14
|
|
|
18
15
|
// A retired wire id answers with one plain-text notice and no finishReason.
|
|
@@ -46,10 +43,6 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
|
|
|
46
43
|
// Streamed text is kept so a retirement notice can be told apart from
|
|
47
44
|
// a truncated stream when the gateway omits the finishReason.
|
|
48
45
|
let streamedText = '';
|
|
49
|
-
let streamedParts = [];
|
|
50
|
-
let streamedNativeToolCalls = [];
|
|
51
|
-
const seenNativeToolIds = new Set();
|
|
52
|
-
const emittedToolIds = new Set();
|
|
53
46
|
|
|
54
47
|
const relayText = onTextDelta
|
|
55
48
|
? (text) => {
|
|
@@ -57,15 +50,9 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
|
|
|
57
50
|
onTextDelta(text);
|
|
58
51
|
}
|
|
59
52
|
: null;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
// native calls and calls recovered from its text.
|
|
64
|
-
if (terminalFailure || emittedToolIds.has(call.id)) return;
|
|
65
|
-
emittedToolIds.add(call.id);
|
|
66
|
-
onToolCall(call);
|
|
67
|
-
}
|
|
68
|
-
: null;
|
|
53
|
+
// Tool calls (native and text-recovered) are never dispatched while the
|
|
54
|
+
// stream runs: the turn's terminal verdict decides, and
|
|
55
|
+
// finalizeAntigravityTurn releases them only after a clean finish.
|
|
69
56
|
const onChunk = (chunk) => {
|
|
70
57
|
const candidate = chunk?.candidates?.[0];
|
|
71
58
|
const finishReason =
|
|
@@ -74,37 +61,20 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
|
|
|
74
61
|
if (finishReason && String(finishReason).replace(/^FINISH_REASON_/, '') !== 'STOP') {
|
|
75
62
|
terminalFailure ||= finishReason;
|
|
76
63
|
}
|
|
77
|
-
if (!onToolCall) return;
|
|
78
|
-
const parts = candidate?.content?.parts ?? [];
|
|
79
|
-
streamedParts.push(...parts);
|
|
80
|
-
if (terminalFailure || !parts.some((part) => part?.functionCall)) return;
|
|
81
|
-
// Parse against the turn's parts so anonymous call IDs keep the
|
|
82
|
-
// same ordinal as final parsing, even across separate SSE chunks.
|
|
83
|
-
const fresh = (parseToolCalls(streamedParts) || []).filter((call) => {
|
|
84
|
-
if (seenNativeToolIds.has(call.id)) return false;
|
|
85
|
-
seenNativeToolIds.add(call.id);
|
|
86
|
-
return true;
|
|
87
|
-
});
|
|
88
|
-
const calls = textLeakGuard?.enabled ? textLeakGuard.filterNativeToolCalls(fresh) : fresh;
|
|
89
|
-
if (calls?.length) streamedNativeToolCalls.push(...calls);
|
|
90
|
-
emitGeminiToolCalls(calls, dispatchToolCall);
|
|
91
64
|
};
|
|
92
65
|
|
|
93
66
|
// Each attempt starts from an empty record: a replayed request must not
|
|
94
|
-
// inherit the dead attempt's text
|
|
67
|
+
// inherit the dead attempt's text or failure.
|
|
95
68
|
const beginAttempt = () => {
|
|
96
69
|
textLeakGuard = createGeminiTextLeakGuard({
|
|
97
70
|
knownToolNames: tools?.map((t) => t.name).filter(Boolean) ?? [],
|
|
98
71
|
onTextDelta: relayText,
|
|
99
|
-
onToolCall
|
|
72
|
+
onToolCall,
|
|
100
73
|
onStreamDelta,
|
|
74
|
+
deferToolCalls: true,
|
|
101
75
|
});
|
|
102
76
|
streamedText = '';
|
|
103
77
|
terminalFailure = null;
|
|
104
|
-
streamedParts = [];
|
|
105
|
-
streamedNativeToolCalls = [];
|
|
106
|
-
seenNativeToolIds.clear();
|
|
107
|
-
emittedToolIds.clear();
|
|
108
78
|
};
|
|
109
79
|
const releaseGuard = () => {
|
|
110
80
|
textLeakGuard = null;
|
|
@@ -125,22 +95,7 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
|
|
|
125
95
|
unwrapChunk: (chunk) => (chunk && typeof chunk === 'object' && chunk.response ? chunk.response : chunk),
|
|
126
96
|
});
|
|
127
97
|
} catch (streamErr) {
|
|
128
|
-
|
|
129
|
-
// Native calls now run before EOF. Preserve
|
|
130
|
-
// their history and prohibit resampling after
|
|
131
|
-
// a tool callback.
|
|
132
|
-
if (emittedToolIds.size) {
|
|
133
|
-
error.emittedToolCall = true;
|
|
134
|
-
error.unsafeToRetry = true;
|
|
135
|
-
const leaked = textLeakGuard.getLeakedToolCalls();
|
|
136
|
-
error.partialToolCalls = [...streamedNativeToolCalls, ...leaked];
|
|
137
|
-
const replay = createProviderReplay('antigravity', leaked.length ? [] : streamedParts);
|
|
138
|
-
if (replay) {
|
|
139
|
-
replay.requestContext = { model: useModel };
|
|
140
|
-
error.partialProviderReplay = replay;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
throw error;
|
|
98
|
+
throw retiredModelError(streamErr, streamedText, useModel) || streamErr;
|
|
144
99
|
}
|
|
145
100
|
};
|
|
146
101
|
|
|
@@ -155,11 +110,5 @@ export function createAntigravityStreamCollector({ tools, useModel, onToolCall,
|
|
|
155
110
|
get terminalFailure() {
|
|
156
111
|
return terminalFailure;
|
|
157
112
|
},
|
|
158
|
-
get streamedNativeToolCalls() {
|
|
159
|
-
return streamedNativeToolCalls;
|
|
160
|
-
},
|
|
161
|
-
get emittedToolCount() {
|
|
162
|
-
return emittedToolIds.size;
|
|
163
|
-
},
|
|
164
113
|
};
|
|
165
114
|
}
|
|
@@ -70,13 +70,19 @@ export function antigravityError(res, text, endpoint) {
|
|
|
70
70
|
// Account verification is terminal and actionable: surface the URL Google
|
|
71
71
|
// returns instead of a raw API body the user cannot act on.
|
|
72
72
|
// Google puts the link in the error details, not the message text.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
// Order: google.rpc.Help.links, metadata.validation_url, metadata.validation_link.
|
|
74
|
+
const detailEntries = Array.isArray(detail?.details) ? detail.details : [];
|
|
75
|
+
const helpUrl = detailEntries
|
|
76
|
+
.flatMap((entry) => (Array.isArray(entry?.links) ? entry.links : []))
|
|
77
|
+
.map((link) => link?.url)
|
|
78
|
+
.find((url) => typeof url === 'string' && url.length > 0);
|
|
79
|
+
const metadataUrl = (key) =>
|
|
80
|
+
detailEntries.find((entry) => entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.[key] === 'string' && entry.metadata[key])
|
|
81
|
+
?.metadata[key];
|
|
78
82
|
const validationUrl =
|
|
79
|
-
|
|
83
|
+
helpUrl ||
|
|
84
|
+
metadataUrl('validation_url') ||
|
|
85
|
+
metadataUrl('validation_link') ||
|
|
80
86
|
/https:\/\/\S*(?:accounts|console)\.google\.com\/\S+/.exec(message || '')?.[0] ||
|
|
81
87
|
'';
|
|
82
88
|
if (res.status === 403 && /VALIDATION_REQUIRED/i.test(text || '')) {
|
|
@@ -20,7 +20,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
|
|
|
20
20
|
// version (gpt-6.1-sol requires >= 0.159.0, measured 2026-10-09), so the
|
|
21
21
|
// release workflow raises this to the published CLI version on every release
|
|
22
22
|
// (scripts/sync-client-version-floors.mjs).
|
|
23
|
-
export const CODEX_CLIENT_VERSION_FLOOR = '0.
|
|
23
|
+
export const CODEX_CLIENT_VERSION_FLOOR = '0.163.0';
|
|
24
24
|
export const CODEX_CLI_NPM_PACKAGE = '@openai/codex';
|
|
25
25
|
const live = createNpmVersionSource(CODEX_CLI_NPM_PACKAGE, { persistKey: 'codex-cli' });
|
|
26
26
|
|