mixdog 1.2.1 → 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/gate-local.mjs +19 -3
- package/scripts/model-catalog-audit.mjs +1 -15
- 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/agents/reviewer/AGENT.md +3 -3
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +6 -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/repl/slash-commands.mjs +16 -1
- package/src/rules/agent/AGENT.md +5 -5
- package/src/rules/lead/LEAD.md +5 -5
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +36 -7
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
- package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
- 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 +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +75 -10
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
- 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 +80 -18
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
- package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
- 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/mimo-oauth.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
- 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 +123 -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 +27 -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-chat-stream.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
- 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 +64 -23
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
- 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-state.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
- 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 +43 -15
- 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 +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
- 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-retry-policy.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
- 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-send-attempts/attempt-context.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
- 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-terminal.mjs +18 -11
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
- 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 +720 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
- package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
- 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/config-helpers.mjs +3 -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/goal-reminder.mjs +0 -18
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
- 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 +5 -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 +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
- 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 +7 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
- 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 +57 -21
- 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/pending-message-entry.mjs +5 -10
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
- 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/turn-interruption.mjs +18 -7
- 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 +168 -29
- 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/save-worker.mjs +6 -3
- 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/write-guards.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -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/session/transcript-restore/restore.mjs +20 -1
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
- 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 +65 -50
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
- 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 +2 -2
- 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/office/shared/values.mjs +0 -5
- package/src/runtime/shared/background-tasks.mjs +92 -14
- 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 +31 -0
- package/src/runtime/shared/error-presentation.mjs +159 -19
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-betas.mjs +4 -3
- package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
- package/src/runtime/shared/llm/model-catalog.mjs +53 -40
- package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
- 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/llm/usage-rollup.mjs +0 -1
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/model-display.mjs +13 -0
- package/src/runtime/shared/provider-api-key.mjs +2 -0
- package/src/runtime/shared/quota-resume-store.mjs +11 -0
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-baseline-store.mjs +960 -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-format.mjs +4 -4
- package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
- package/src/runtime/shared/task-notification-envelope.mjs +2 -2
- 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 +670 -274
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
- package/src/runtime/shared/turn-snapshot.mjs +986 -690
- package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
- 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 -24
- 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/shared/worktrees/test-support.mjs +19 -4
- 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 +19 -5
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +12 -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 +14 -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 +73 -8
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +46 -14
- package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
- package/src/session-runtime/mcp-glue.mjs +3 -0
- package/src/session-runtime/mcp-oauth-login.mjs +174 -0
- package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
- package/src/session-runtime/model-route/set-route.mjs +85 -17
- package/src/session-runtime/model-route/web-search-route.mjs +1 -1
- package/src/session-runtime/native-web-search/routes.mjs +22 -3
- 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/provider-models/model-meta.mjs +12 -3
- package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
- package/src/session-runtime/quick-web-search-models.mjs +13 -38
- package/src/session-runtime/resource-extension-sync.mjs +4 -0
- package/src/session-runtime/resource-mcp-api.mjs +98 -2
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/runtime-review-api.mjs +21 -2
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
- 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/send-flow.mjs +22 -4
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -2
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
- 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/settings-compaction-api.mjs +1 -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-drain-policy.mjs +8 -0
- 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 +74 -0
- package/src/standalone/daemon.mjs +64 -8
- 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 +14 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +1 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
- package/src/standalone/session-service/agent-tree.mjs +12 -0
- package/src/standalone/session-service/quota-resume.mjs +8 -0
- package/src/standalone/session-service/retention/busy.mjs +15 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service-api.mjs +11 -1
- package/src/standalone/session-service.mjs +1 -0
- 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/app-view.jsx +1 -0
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +6 -0
- package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
- package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
- package/src/tui/app/extension-pickers.mjs +2 -1
- package/src/tui/app/model-options.mjs +11 -16
- 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 +20 -5
- package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
- 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/StatusLine.jsx +2 -0
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +5 -2
- package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
- package/src/tui/dist/index.mjs +3221 -1500
- package/src/tui/session/context-state.mjs +4 -2
- package/src/tui/session/quota-resume.mjs +46 -14
- package/src/tui/session/session-api/commands.mjs +43 -24
- package/src/tui/session/session-api/controls.mjs +2 -2
- package/src/tui/session/session-api/extensions.mjs +22 -0
- package/src/tui/session/session-api/integrations.mjs +16 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +7 -2
- package/src/tui/session/session-api/routes.mjs +71 -7
- package/src/tui/session/session-api/settings.mjs +11 -14
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/session-flow/drain.mjs +7 -1
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
- 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 +46 -16
- package/src/tui/statusline-ansi-bridge.mjs +1 -1
- package/src/ui/statusline-agents.mjs +15 -4
- package/src/ui/statusline.mjs +7 -3
- package/src/ui/streaming-markdown-heal.mjs +34 -3
- package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
- package/src/workflows/default/WORKFLOW.md +3 -1
- package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
- package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { providerNativeToolPrefixCount } from '../../runtime-core/provider-request-tools.mjs';
|
|
2
|
-
import { actionInputContract } from './action-input-contract.mjs';
|
|
2
|
+
import { actionInputContract, actionInputUnionFor } from './action-input-contract.mjs';
|
|
3
3
|
import { isNativeServerToolBlockType } from './anthropic-native-blocks.mjs';
|
|
4
4
|
import { isAnthropicThinkingBlock, sanitizeAnthropicReplayBlocks } from './anthropic-replay-blocks.mjs';
|
|
5
5
|
import { sanitizeAnthropicContentPairs, foldUserTextIntoToolResultTail } from '../../session/context-utils.mjs';
|
|
@@ -7,24 +7,76 @@ import { normalizeContentForAnthropic } from '../media-normalization.mjs';
|
|
|
7
7
|
import { createProviderReplay, providerReplayItems } from './provider-replay.mjs';
|
|
8
8
|
import { anthropicFallbackProviderMetadata, parseAnthropicFallbackBlock } from '../anthropic-server-fallback.mjs';
|
|
9
9
|
import { mergeFlatSchemaProperty } from './flat-schema-merge.mjs';
|
|
10
|
+
import { reportedCostUsd } from './usage-primitives.mjs';
|
|
11
|
+
import { reportInvalidTool, wireInputSchema } from './claude-bridge-schema.mjs';
|
|
12
|
+
import { normalizeServerToolUse } from './anthropic-server-tool-usage.mjs';
|
|
10
13
|
export const ANTHROPIC_CACHE_TTL_STABLE = { type: 'ephemeral', ttl: '1h' };
|
|
11
14
|
const ANTHROPIC_CACHE_TTL_VOLATILE = { type: 'ephemeral' };
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
// Anthropic allows at most 4 cache_control breakpoints across the whole
|
|
17
|
+
// serialized request (tools + system + messages).
|
|
18
|
+
export const ANTHROPIC_MAX_CACHE_BREAKPOINTS = 4;
|
|
19
|
+
|
|
20
|
+
// A block can carry a breakpoint unless it is thinking/redacted_thinking or an
|
|
21
|
+
// empty text block (both are rejected by the API).
|
|
22
|
+
function isCacheEligibleBlock(block) {
|
|
23
|
+
if (!block || typeof block !== 'object') return false;
|
|
24
|
+
if (block.type === 'thinking' || block.type === 'redacted_thinking') return false;
|
|
25
|
+
if (block.type === 'text') return typeof block.text === 'string' && block.text.trim() !== '';
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function lastEligibleBlockIndex(content) {
|
|
30
|
+
if (typeof content === 'string') return content.trim() ? 0 : -1;
|
|
31
|
+
if (!Array.isArray(content)) return -1;
|
|
32
|
+
for (let i = content.length - 1; i >= 0; i--) if (isCacheEligibleBlock(content[i])) return i;
|
|
33
|
+
return -1;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Count cache_control markers on a block / block list (incl. tool_result content). */
|
|
37
|
+
export function countAnthropicCacheControls(value) {
|
|
38
|
+
if (Array.isArray(value)) return value.reduce((sum, item) => sum + countAnthropicCacheControls(item), 0);
|
|
39
|
+
if (!value || typeof value !== 'object') return 0;
|
|
40
|
+
return (value.cache_control ? 1 : 0) + (Array.isArray(value.content) ? countAnthropicCacheControls(value.content) : 0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function stripCacheControl(block, budget) {
|
|
44
|
+
if (!block || typeof block !== 'object' || budget.n <= 0) return block;
|
|
45
|
+
let next = block;
|
|
46
|
+
if (block.cache_control) {
|
|
47
|
+
budget.n--;
|
|
48
|
+
const { cache_control: _dropped, ...rest } = block;
|
|
49
|
+
next = rest;
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(next.content) && budget.n > 0) {
|
|
52
|
+
const content = next.content.map((child) => stripCacheControl(child, budget));
|
|
53
|
+
if (content.some((child, i) => child !== next.content[i])) next = { ...next, content };
|
|
54
|
+
}
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Drop the `excess` oldest message markers (the newest breakpoints are the
|
|
59
|
+
// valuable ones: they cover the longest prefix).
|
|
60
|
+
function stripOldestMessageCacheControls(messages, excess) {
|
|
61
|
+
const budget = { n: excess };
|
|
62
|
+
for (const message of messages) {
|
|
63
|
+
if (budget.n <= 0) break;
|
|
64
|
+
if (!Array.isArray(message?.content)) continue;
|
|
65
|
+
const content = message.content.map((block) => stripCacheControl(block, budget));
|
|
66
|
+
if (content.some((block, i) => block !== message.content[i])) message.content = content;
|
|
23
67
|
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function appendAnthropicCacheControl(content, ttl = ANTHROPIC_CACHE_TTL_VOLATILE, blockIndex = null) {
|
|
71
|
+
const index = blockIndex ?? lastEligibleBlockIndex(content);
|
|
24
72
|
if (typeof content === 'string') {
|
|
25
|
-
return [
|
|
73
|
+
return index < 0 ? content : [{ type: 'text', text: content, cache_control: ttl }];
|
|
26
74
|
}
|
|
27
|
-
return content;
|
|
75
|
+
if (!Array.isArray(content) || index < 0 || !isCacheEligibleBlock(content[index])) return content;
|
|
76
|
+
if (content[index].cache_control) return content;
|
|
77
|
+
const next = [...content];
|
|
78
|
+
next[index] = { ...content[index], cache_control: ttl };
|
|
79
|
+
return next;
|
|
28
80
|
}
|
|
29
81
|
|
|
30
82
|
export function resolveAnthropicCacheTtls(opts) {
|
|
@@ -64,15 +116,41 @@ export function resolveAnthropicCacheTtls(opts) {
|
|
|
64
116
|
// live tail on every request. ANTHROPIC_MSG_SLOTS=0 disables message caching;
|
|
65
117
|
// any positive value enables that one marker when the system layout leaves a
|
|
66
118
|
// slot. messageTtl === null turns the tail off.
|
|
67
|
-
|
|
68
|
-
|
|
119
|
+
//
|
|
120
|
+
// The 4-breakpoint limit is request-wide: `tools` (native-tool markers) count
|
|
121
|
+
// next to the system blocks as reserved slots; markers already preserved in
|
|
122
|
+
// message content are enforced by applyAnthropicCacheMarkers via
|
|
123
|
+
// `reservedSlots`.
|
|
124
|
+
export function resolveAnthropicMessageCacheSlots(systemBlocks, ttls, { tools = [] } = {}) {
|
|
125
|
+
// Tool markers take their slots first; system markers beyond the remainder
|
|
126
|
+
// are dropped earliest-first (the last system marker covers the longest
|
|
127
|
+
// prefix). The freshly built system blocks are edited in place.
|
|
128
|
+
// Tool markers alone are capped first: beyond the request-wide limit the
|
|
129
|
+
// earliest are dropped (the last covers the longest tool prefix). Tool
|
|
130
|
+
// objects may be shared with the caller, so the array slot is replaced by a
|
|
131
|
+
// marker-free copy instead of mutating the object.
|
|
132
|
+
let toolExcess = countAnthropicCacheControls(tools) - ANTHROPIC_MAX_CACHE_BREAKPOINTS;
|
|
133
|
+
for (let i = 0; toolExcess > 0 && i < tools.length; i++) {
|
|
134
|
+
if (!tools[i]?.cache_control) continue;
|
|
135
|
+
const { cache_control: _dropped, ...rest } = tools[i];
|
|
136
|
+
tools[i] = rest;
|
|
137
|
+
toolExcess--;
|
|
138
|
+
}
|
|
139
|
+
const toolSlots = countAnthropicCacheControls(tools);
|
|
140
|
+
let systemExcess = countAnthropicCacheControls(systemBlocks) + toolSlots - ANTHROPIC_MAX_CACHE_BREAKPOINTS;
|
|
141
|
+
for (const block of systemBlocks) {
|
|
142
|
+
if (systemExcess <= 0) break;
|
|
143
|
+
if (block?.cache_control) {
|
|
144
|
+
delete block.cache_control;
|
|
145
|
+
systemExcess--;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const reservedSlots = countAnthropicCacheControls(systemBlocks) + toolSlots;
|
|
69
149
|
const slotsCap = Number.parseInt(process.env.ANTHROPIC_MSG_SLOTS, 10);
|
|
70
|
-
const hasFreeSlot =
|
|
150
|
+
const hasFreeSlot = reservedSlots < ANTHROPIC_MAX_CACHE_BREAKPOINTS;
|
|
71
151
|
const capAllowsMessage = Number.isFinite(slotsCap) && slotsCap >= 0 ? slotsCap > 0 : true;
|
|
72
152
|
const messageSlots = ttls.messages && hasFreeSlot && capAllowsMessage ? 1 : 0;
|
|
73
|
-
|
|
74
|
-
// first, then messageSlots.
|
|
75
|
-
return { messageTtl: messageSlots > 0 ? ttls.messages : null, messageSlots };
|
|
153
|
+
return { messageTtl: messageSlots > 0 ? ttls.messages : null, messageSlots, reservedSlots };
|
|
76
154
|
}
|
|
77
155
|
|
|
78
156
|
// Single lowering of orchestrator messages to the Anthropic wire shape. The
|
|
@@ -150,7 +228,10 @@ function splitErrorToolResultContent(content) {
|
|
|
150
228
|
// Native tool_search providers whose stored references this lowering replays.
|
|
151
229
|
const ANTHROPIC_NATIVE_PROVIDERS = new Set(['anthropic', 'anthropic-oauth']);
|
|
152
230
|
|
|
153
|
-
|
|
231
|
+
// `provider`: the engine's provider name. A gateway on a native Messages
|
|
232
|
+
// route (wire-route.mjs) also replays the references it tagged itself.
|
|
233
|
+
export function toAnthropicMessages(messages, availableTools, provider = '') {
|
|
234
|
+
const ownProvider = String(provider || '').toLowerCase();
|
|
154
235
|
const availableNames = anthropicToolNameSet(availableTools);
|
|
155
236
|
const result = [];
|
|
156
237
|
for (let idx = 0; idx < messages.length; idx++) {
|
|
@@ -195,7 +276,8 @@ export function toAnthropicMessages(messages, availableTools) {
|
|
|
195
276
|
const native = m.nativeToolSearch;
|
|
196
277
|
const nativeProvider = String(native?.provider || '').toLowerCase();
|
|
197
278
|
const references =
|
|
198
|
-
(!nativeProvider || ANTHROPIC_NATIVE_PROVIDERS.has(nativeProvider)) &&
|
|
279
|
+
(!nativeProvider || ANTHROPIC_NATIVE_PROVIDERS.has(nativeProvider) || nativeProvider === ownProvider) &&
|
|
280
|
+
Array.isArray(native?.toolReferences)
|
|
199
281
|
? native.toolReferences.map((name) => String(name || '').trim()).filter(Boolean)
|
|
200
282
|
: [];
|
|
201
283
|
// Keep only references this request can actually back with a
|
|
@@ -305,11 +387,15 @@ export function normalizeAnthropicNonStreamingResponse(message, fallbackModel =
|
|
|
305
387
|
const input = Number(usage.input_tokens) || 0;
|
|
306
388
|
const cacheRead = Number(usage.cache_read_input_tokens) || 0;
|
|
307
389
|
const cacheWrite = Number(usage.cache_creation_input_tokens) || 0;
|
|
390
|
+
const costUsd = reportedCostUsd(usage.cost);
|
|
391
|
+
const serverToolUse = normalizeServerToolUse(usage);
|
|
308
392
|
return {
|
|
309
393
|
content: text,
|
|
310
394
|
model: fallbackEvents.at(-1)?.fallbackModel || message?.model || fallbackModel,
|
|
311
395
|
toolCalls: toolCalls.length ? toolCalls : undefined,
|
|
312
396
|
stopReason: message?.stop_reason || null,
|
|
397
|
+
...(message?.stop_details != null ? { stopDetails: message.stop_details } : {}),
|
|
398
|
+
...(message?.stop_sequence != null ? { stopSequence: message.stop_sequence } : {}),
|
|
313
399
|
hasThinkingContent: modelEmittedThinking,
|
|
314
400
|
contentBlockTypes: blocks.map((block) => block?.type).filter(Boolean),
|
|
315
401
|
thinkingBlocks: thinkingBlocks.length ? thinkingBlocks : undefined,
|
|
@@ -325,6 +411,8 @@ export function normalizeAnthropicNonStreamingResponse(message, fallbackModel =
|
|
|
325
411
|
? { cacheWrite1hTokens: Number(usage.cache_creation.ephemeral_1h_input_tokens) }
|
|
326
412
|
: {}),
|
|
327
413
|
promptTokens: input + cacheRead + cacheWrite,
|
|
414
|
+
...(costUsd !== undefined ? { costUsd } : {}),
|
|
415
|
+
...(serverToolUse ? { serverToolUse } : {}),
|
|
328
416
|
raw: usage,
|
|
329
417
|
},
|
|
330
418
|
};
|
|
@@ -399,16 +487,42 @@ export function sanitizeAnthropicInputSchema(schema, toolName, logTag) {
|
|
|
399
487
|
};
|
|
400
488
|
}
|
|
401
489
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
490
|
+
// The Messages `input_schema` of a tool: the flattened schema, lowered to
|
|
491
|
+
// 2020-12 with an object root when it is not valid as written ({ schema }), or
|
|
492
|
+
// { pointer, reason } when it is broken even then.
|
|
493
|
+
function anthropicInputSchema(tool, logTag) {
|
|
494
|
+
// First-party Anthropic accepts nested per-action input alternatives;
|
|
495
|
+
// gateways on the same wire keep the advertised flat schema.
|
|
496
|
+
const flattened = sanitizeAnthropicInputSchema(
|
|
497
|
+
ANTHROPIC_NATIVE_PROVIDERS.has(logTag) ? actionInputUnionFor(tool.inputSchema) : tool.inputSchema,
|
|
498
|
+
tool.name,
|
|
499
|
+
logTag
|
|
500
|
+
);
|
|
501
|
+
return wireInputSchema(flattened, 'anthropic');
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/** The `{ name, pointer, reason }` for which the Messages wire leaves `tool`
|
|
505
|
+
* out of a request, or null when it is sent. Reports nothing. */
|
|
506
|
+
export function anthropicToolExclusion(tool, logTag = 'anthropic') {
|
|
507
|
+
const result = anthropicInputSchema(tool, logTag);
|
|
508
|
+
return result.schema ? null : { name: tool.name, pointer: result.pointer || '/', reason: result.reason };
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// A Messages endpoint rejects the whole request for one invalid input_schema,
|
|
512
|
+
// so a tool broken even after lowering is reported and left out.
|
|
513
|
+
function toAnthropicTools(tools, logTag, onToolExcluded) {
|
|
514
|
+
const out = [];
|
|
515
|
+
tools.forEach((tool, index) => {
|
|
516
|
+
const result = anthropicInputSchema(tool, logTag);
|
|
517
|
+
if (!result.schema) {
|
|
518
|
+
reportInvalidTool(tool.name, index, result, onToolExcluded, `[${logTag}] tool`);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
const entry = { name: tool.name, description: tool.description, input_schema: result.schema };
|
|
522
|
+
if (tool.deferLoading === true || tool.defer_loading === true) entry.defer_loading = true;
|
|
523
|
+
out.push(entry);
|
|
411
524
|
});
|
|
525
|
+
return out;
|
|
412
526
|
}
|
|
413
527
|
|
|
414
528
|
// Map the orchestrator-level opts.toolChoice into Anthropic's tool_choice.
|
|
@@ -423,8 +537,43 @@ function toAnthropicTools(tools, logTag) {
|
|
|
423
537
|
// effort/thinking active on reasoning models — activating it would convert a
|
|
424
538
|
// previously-harmless no-op into a hard 400 on exactly that turn. Attached
|
|
425
539
|
// only when the request actually carries tools.
|
|
426
|
-
|
|
427
|
-
|
|
540
|
+
//
|
|
541
|
+
// Mapping: 'auto'→auto, 'required'/'any'→any, {name}|{type:'tool',name}→tool,
|
|
542
|
+
// 'none'→none. Forced any/tool is rejected by the API while extended/adaptive
|
|
543
|
+
// thinking is on: with `thinking` set it falls back to auto (default) or throws
|
|
544
|
+
// (`onThinkingConflict: 'error'`). `disableParallelToolUse` adds
|
|
545
|
+
// disable_parallel_tool_use (not valid with none) unless the endpoint declares
|
|
546
|
+
// `supportsDisableParallelToolUse: false` (gateway capability).
|
|
547
|
+
export function toAnthropicToolChoice(
|
|
548
|
+
toolChoice,
|
|
549
|
+
{ thinking = false, disableParallelToolUse = false, supportsDisableParallelToolUse = true, onThinkingConflict = 'fallback' } = {}
|
|
550
|
+
) {
|
|
551
|
+
let choice;
|
|
552
|
+
if (toolChoice === 'none') choice = { type: 'none' };
|
|
553
|
+
else if (toolChoice === 'auto') choice = { type: 'auto' };
|
|
554
|
+
else if (toolChoice === 'required' || toolChoice === 'any') choice = { type: 'any' };
|
|
555
|
+
else if (toolChoice && typeof toolChoice === 'object') {
|
|
556
|
+
const name = typeof toolChoice.name === 'string' ? toolChoice.name : toolChoice.function?.name;
|
|
557
|
+
if (toolChoice.type === 'none') choice = { type: 'none' };
|
|
558
|
+
else if (toolChoice.type === 'auto') choice = { type: 'auto' };
|
|
559
|
+
else if (toolChoice.type === 'any') choice = { type: 'any' };
|
|
560
|
+
else if (typeof name === 'string' && name) choice = { type: 'tool', name };
|
|
561
|
+
}
|
|
562
|
+
if (choice && (choice.type === 'any' || choice.type === 'tool') && thinking) {
|
|
563
|
+
if (onThinkingConflict === 'error') {
|
|
564
|
+
throw new Error(`Anthropic tool_choice "${choice.type}" is not allowed while extended thinking is enabled`);
|
|
565
|
+
}
|
|
566
|
+
choice = undefined;
|
|
567
|
+
}
|
|
568
|
+
if (disableParallelToolUse === true && supportsDisableParallelToolUse !== false && choice?.type !== 'none') {
|
|
569
|
+
choice = { ...(choice || { type: 'auto' }), disable_parallel_tool_use: true };
|
|
570
|
+
}
|
|
571
|
+
return choice;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/** True when the request body enables extended/adaptive thinking. */
|
|
575
|
+
export function anthropicThinkingActive(body) {
|
|
576
|
+
return body?.thinking?.type === 'enabled' || body?.thinking?.type === 'adaptive';
|
|
428
577
|
}
|
|
429
578
|
|
|
430
579
|
export function deferredAnthropicTools(activeTools, messages, opts, provider) {
|
|
@@ -470,14 +619,14 @@ export function requestAnthropicTools(tools, messages, opts, provider) {
|
|
|
470
619
|
const nativePrefixCount = providerNativeToolPrefixCount(activeTools, opts.providerNativeToolPrefixCount);
|
|
471
620
|
return [
|
|
472
621
|
...activeTools.slice(0, nativePrefixCount),
|
|
473
|
-
...toAnthropicTools(activeTools.slice(nativePrefixCount), provider),
|
|
622
|
+
...toAnthropicTools(activeTools.slice(nativePrefixCount), provider, opts.onToolExcluded),
|
|
474
623
|
];
|
|
475
624
|
}
|
|
476
625
|
const deferredTools = deferredAnthropicTools(activeTools, messages, opts, provider);
|
|
477
626
|
const nativeTools = Array.isArray(opts?.nativeTools)
|
|
478
627
|
? opts.nativeTools.filter((tool) => tool && typeof tool === 'object')
|
|
479
628
|
: [];
|
|
480
|
-
return [...nativeTools, ...toAnthropicTools([...activeTools, ...deferredTools], provider)];
|
|
629
|
+
return [...nativeTools, ...toAnthropicTools([...activeTools, ...deferredTools], provider, opts?.onToolExcluded)];
|
|
481
630
|
}
|
|
482
631
|
|
|
483
632
|
// Applies cache_control markers to the FINAL, already-sanitized Anthropic
|
|
@@ -493,20 +642,75 @@ export function requestAnthropicTools(tools, messages, opts, provider) {
|
|
|
493
642
|
// messageTtl === null disables the tail. BP3 (tier3) rides a system block,
|
|
494
643
|
// so it is not marked here. ANTHROPIC_MSG_SLOTS=0 is honoured upstream by
|
|
495
644
|
// passing messageTtl = null.
|
|
645
|
+
// `sharedPrefix` (see sharedCachePrefixBoundary) moves the breakpoint off the
|
|
646
|
+
// tail onto a shared prefix's last block, or drops it (`false`).
|
|
496
647
|
export function applyAnthropicCacheMarkers(
|
|
497
648
|
sanitizedMessages,
|
|
498
|
-
{ messageTtl = ANTHROPIC_CACHE_TTL_VOLATILE, messageSlots = 1 } = {}
|
|
649
|
+
{ messageTtl = ANTHROPIC_CACHE_TTL_VOLATILE, messageSlots = 1, reservedSlots = 0 } = {},
|
|
650
|
+
sharedPrefix = null
|
|
499
651
|
) {
|
|
500
652
|
if (!Array.isArray(sanitizedMessages) || sanitizedMessages.length === 0) {
|
|
501
653
|
return sanitizedMessages;
|
|
502
654
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
655
|
+
// Request-wide 4-breakpoint limit: slots held by system/tools are reserved;
|
|
656
|
+
// markers preserved inside message content may only use what is left.
|
|
657
|
+
const budget = Math.max(0, ANTHROPIC_MAX_CACHE_BREAKPOINTS - (Number(reservedSlots) || 0));
|
|
658
|
+
const present = countAnthropicCacheControls(sanitizedMessages);
|
|
659
|
+
if (present > budget) stripOldestMessageCacheControls(sanitizedMessages, present - budget);
|
|
660
|
+
const free = budget - Math.min(present, budget);
|
|
661
|
+
if (messageTtl === null || !(Number(messageSlots) > 0) || sharedPrefix === false || free <= 0) {
|
|
662
|
+
return sanitizedMessages;
|
|
510
663
|
}
|
|
664
|
+
if (sharedPrefix) {
|
|
665
|
+
const message = sanitizedMessages[sharedPrefix.index];
|
|
666
|
+
if (message && contentBlockKey(message.content, sharedPrefix.blockIndex) === sharedPrefix.blockKey) {
|
|
667
|
+
message.content = appendAnthropicCacheControl(message.content, messageTtl, sharedPrefix.blockIndex);
|
|
668
|
+
}
|
|
669
|
+
return sanitizedMessages;
|
|
670
|
+
}
|
|
671
|
+
const index = lastMarkableMessageIndex(sanitizedMessages);
|
|
672
|
+
if (index < 0) return sanitizedMessages;
|
|
673
|
+
const message = sanitizedMessages[index];
|
|
674
|
+
message.content = appendAnthropicCacheControl(message.content, messageTtl);
|
|
511
675
|
return sanitizedMessages;
|
|
512
676
|
}
|
|
677
|
+
|
|
678
|
+
// The breakpoint goes on the last message that has an eligible block: a
|
|
679
|
+
// trailing effort control (empty system message) or a thinking-only tail has
|
|
680
|
+
// nothing to mark. -1 when no message does.
|
|
681
|
+
function lastMarkableMessageIndex(messages) {
|
|
682
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
683
|
+
if (lastEligibleBlockIndex(messages[index].content) >= 0) return index;
|
|
684
|
+
}
|
|
685
|
+
return -1;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
function contentBlockKey(content, blockIndex) {
|
|
689
|
+
const block = Array.isArray(content) ? content[blockIndex] : content;
|
|
690
|
+
return block === undefined ? undefined : JSON.stringify(block);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* Where a cache-sharing fork (a /btw side question) keeps its message
|
|
695
|
+
* breakpoint. The fork re-sends an earlier request's messages unchanged and
|
|
696
|
+
* appends a short suffix; `opts.sharedCachePrefixCount` is the number of
|
|
697
|
+
* leading messages that make up that shared prefix (a plain number, so it
|
|
698
|
+
* survives model-proxy serialization). The breakpoint stays on the block the earlier request
|
|
699
|
+
* marked (the prefix's own lowered tail), so the fork reads that cache entry
|
|
700
|
+
* and writes none for its suffix. `lowerPrefix(messages)` lowers a message
|
|
701
|
+
* list exactly as the request does. Null for an ordinary request (tail
|
|
702
|
+
* breakpoint); false when the prefix is not part of this request.
|
|
703
|
+
*/
|
|
704
|
+
export function sharedCachePrefixBoundary(messages, opts, lowerPrefix) {
|
|
705
|
+
const count = opts?.sharedCachePrefixCount;
|
|
706
|
+
if (!count) return null;
|
|
707
|
+
if (!Number.isInteger(count) || count < 0 || count > messages.length) return false;
|
|
708
|
+
const prefix = lowerPrefix(messages.slice(0, count));
|
|
709
|
+
if (!prefix.length) return false;
|
|
710
|
+
const index = lastMarkableMessageIndex(prefix);
|
|
711
|
+
if (index < 0) return false;
|
|
712
|
+
const content = prefix[index].content;
|
|
713
|
+
const blockIndex = lastEligibleBlockIndex(content);
|
|
714
|
+
const blockKey = contentBlockKey(content, blockIndex);
|
|
715
|
+
return blockKey === undefined ? false : { index, blockIndex, blockKey };
|
|
716
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Normalized Anthropic server-tool usage counters (`usage.server_tool_use`):
|
|
2
|
+
// the number of server-side web searches / web fetches the turn ran. Returns
|
|
3
|
+
// undefined when the usage reports none, so ordinary turns carry no field.
|
|
4
|
+
const COUNTERS = [
|
|
5
|
+
['web_search_requests', 'webSearchRequests'],
|
|
6
|
+
['web_fetch_requests', 'webFetchRequests'],
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
export function normalizeServerToolUse(raw) {
|
|
10
|
+
const source = raw && typeof raw === 'object' ? raw.server_tool_use : null;
|
|
11
|
+
if (!source || typeof source !== 'object') return undefined;
|
|
12
|
+
const out = {};
|
|
13
|
+
for (const [wire, key] of COUNTERS) {
|
|
14
|
+
const n = Number(source[wire]);
|
|
15
|
+
if (Number.isFinite(n) && n >= 0) out[key] = n;
|
|
16
|
+
}
|
|
17
|
+
return Object.keys(out).length ? out : undefined;
|
|
18
|
+
}
|
|
@@ -2,13 +2,34 @@
|
|
|
2
2
|
const SYSTEM_CACHE_TIERS = new Set(['tier3', 'env']);
|
|
3
3
|
const systemCacheTier = (cacheTier) => (SYSTEM_CACHE_TIERS.has(cacheTier) ? cacheTier : 'system');
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
function pushSystemEntry(items, entry, tier) {
|
|
6
|
+
if (entry == null) return;
|
|
7
|
+
if (typeof entry === 'string') {
|
|
8
|
+
const text = entry.trim();
|
|
9
|
+
if (text) items.push({ text, tier });
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(entry)) {
|
|
13
|
+
for (const part of entry) pushSystemEntry(items, part, tier);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (typeof entry === 'object') {
|
|
17
|
+
const entryTier = entry.cacheTier === undefined ? tier : systemCacheTier(entry.cacheTier);
|
|
18
|
+
if (entry.type === 'text' && typeof entry.text === 'string') return pushSystemEntry(items, entry.text, entryTier);
|
|
19
|
+
if (entry.type === undefined && 'content' in entry) return pushSystemEntry(items, entry.content, entryTier);
|
|
11
20
|
}
|
|
21
|
+
throw new TypeError('Anthropic system instructions must be a string, text blocks, or system messages of those');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Non-empty system instructions as `{ text, tier }` block items. Accepts a
|
|
26
|
+
* string, a text-block array (`{ type: 'text', text }`), or an array of system
|
|
27
|
+
* messages whose `content` is either. Null/undefined yields none; any other
|
|
28
|
+
* shape throws rather than silently dropping structured instructions.
|
|
29
|
+
*/
|
|
30
|
+
export function systemBlockItems(system) {
|
|
31
|
+
const items = [];
|
|
32
|
+
pushSystemEntry(items, system, 'system');
|
|
12
33
|
return items;
|
|
13
34
|
}
|
|
14
35
|
/** cacheTier:'env' (volatile session/project environment) is never marked —
|