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
|
@@ -24,6 +24,8 @@ import {
|
|
|
24
24
|
} from './retry-classifier.mjs';
|
|
25
25
|
import { _classifyMidstreamError, _midstreamSleepWithAbort, stampAnthropicStreamOutcome } from './anthropic-sse.mjs';
|
|
26
26
|
import { notifyCurrentAnthropicRateLimit } from './admission-scheduler.mjs';
|
|
27
|
+
import { applyAnthropicErrorContract } from './anthropic-error-contract.mjs';
|
|
28
|
+
import { isAnthropicOverloadError } from './anthropic-overload-fallback.mjs';
|
|
27
29
|
import { noteAbandonedUsage } from '../../../shared/llm/usage-context.mjs';
|
|
28
30
|
|
|
29
31
|
export function createAnthropicMidState(attemptIndex) {
|
|
@@ -88,6 +90,8 @@ export function assertAnthropicStreamNotEmpty(midState, result, label) {
|
|
|
88
90
|
* @param {{ recoverNonStreaming: Function, issueNonStreamingFallback: Function, requireTransportRecoveryBudget: Function }} deps.recovery
|
|
89
91
|
* @param {Function|null} [deps.onStageChange] receives the display-only 'reconnecting' stage per retry
|
|
90
92
|
* @param {boolean} [deps.retry529] false for a background call: an overload mid-stream is not retried
|
|
93
|
+
* @param {ReturnType<typeof import('./anthropic-overload-fallback.mjs').createAnthropicOverloadTracker>|null} [deps.overload]
|
|
94
|
+
* the send's shared overload counter (SSE overloads feed it)
|
|
91
95
|
*/
|
|
92
96
|
export function createAnthropicMidstreamRecovery({
|
|
93
97
|
label,
|
|
@@ -101,6 +105,7 @@ export function createAnthropicMidstreamRecovery({
|
|
|
101
105
|
recovery,
|
|
102
106
|
onStageChange = null,
|
|
103
107
|
retry529 = true,
|
|
108
|
+
overload = null,
|
|
104
109
|
}) {
|
|
105
110
|
const log = (line) => {
|
|
106
111
|
try {
|
|
@@ -128,7 +133,7 @@ export function createAnthropicMidstreamRecovery({
|
|
|
128
133
|
firstAttemptClassifier = classifier;
|
|
129
134
|
abortStream(controller, err);
|
|
130
135
|
log(message);
|
|
131
|
-
const waitMs = delayMs ?? midstreamBackoffFor(attemptIndex + 1);
|
|
136
|
+
const waitMs = delayMs ?? midstreamBackoffFor(attemptIndex + 1, undefined, err);
|
|
132
137
|
emitProviderRetryStage(onStageChange, {
|
|
133
138
|
attempt: attemptIndex + 1,
|
|
134
139
|
maxAttempts: maxRetries,
|
|
@@ -192,6 +197,16 @@ export function createAnthropicMidstreamRecovery({
|
|
|
192
197
|
abortStream(controller, err);
|
|
193
198
|
throw err;
|
|
194
199
|
}
|
|
200
|
+
// An SSE overload counts toward the same limit as a request-loop 529; at
|
|
201
|
+
// the limit the configured fallback model takes over (the provider's
|
|
202
|
+
// send loop catches the trigger around this whole recovery).
|
|
203
|
+
if (overload && isAnthropicOverloadError(err)) {
|
|
204
|
+
const trigger = overload.noteStreamOverload(err);
|
|
205
|
+
if (trigger) {
|
|
206
|
+
abortStream(controller, err);
|
|
207
|
+
throw trigger;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
195
210
|
const canRetry = attemptIndex < maxRetries;
|
|
196
211
|
const attemptLabel = `${attemptIndex + 1}/${maxRetries}`;
|
|
197
212
|
// Empty/dropped stream (no message_start): safe to retry once —
|
|
@@ -270,10 +285,9 @@ export function createAnthropicMidstreamRecovery({
|
|
|
270
285
|
const status = Number(err?.httpStatus || err?.status || 0);
|
|
271
286
|
let retryDelayMs = null;
|
|
272
287
|
if (status === 429) {
|
|
273
|
-
if (!err.headers && response?.headers) err.headers = response.headers;
|
|
274
288
|
if (!err.response && response) err.response = { status, headers: response.headers };
|
|
289
|
+
applyAnthropicErrorContract(err, { status, headers: response?.headers });
|
|
275
290
|
retryDelayMs = retryAfterMsFromError(err);
|
|
276
|
-
if (retryDelayMs != null) err.retryAfterMs = retryDelayMs;
|
|
277
291
|
notifyCurrentAnthropicRateLimit(err);
|
|
278
292
|
}
|
|
279
293
|
try {
|
|
@@ -283,7 +297,7 @@ export function createAnthropicMidstreamRecovery({
|
|
|
283
297
|
log(`abort on stream error failed: ${abortErr?.message ?? String(abortErr)}`);
|
|
284
298
|
}
|
|
285
299
|
log(`mid-stream recovered: retry ${attemptLabel} (cause: ${classifier})`);
|
|
286
|
-
const waitMs = retryDelayMs ?? midstreamBackoffFor(attemptIndex + 1);
|
|
300
|
+
const waitMs = retryDelayMs ?? midstreamBackoffFor(attemptIndex + 1, undefined, err);
|
|
287
301
|
emitProviderRetryStage(onStageChange, {
|
|
288
302
|
attempt: attemptIndex + 1,
|
|
289
303
|
maxAttempts: maxRetries,
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
import { enrichModels } from './model-catalog.mjs';
|
|
9
9
|
import { sanitizeModelList } from './model-list-sanitize.mjs';
|
|
10
10
|
import { makeModelCache } from './model-cache.mjs';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
effortValuesForModel,
|
|
13
|
+
setModelEffortCapabilities,
|
|
14
|
+
thinkingTypesFromCapabilities,
|
|
15
|
+
} from './anthropic-effort.mjs';
|
|
16
|
+
import { getModelMetadataSync } from './model-catalog.mjs';
|
|
12
17
|
|
|
13
18
|
// Disk-backed cache so repeated process starts (cron, tool calls) don't
|
|
14
19
|
// hammer /v1/models. 24h TTL matches the upstream client cadence.
|
|
@@ -85,6 +90,7 @@ export function _normalizeAnthropicModel(raw) {
|
|
|
85
90
|
const tier = modelTier(dated, versioned);
|
|
86
91
|
const releaseDate = dated ? id.match(/-(\d{4})(\d{2})(\d{2})$/) : null;
|
|
87
92
|
const effortValues = effortValuesForModel(raw?.capabilities, id);
|
|
93
|
+
const thinkingTypes = thinkingTypesFromCapabilities(raw?.capabilities);
|
|
88
94
|
return {
|
|
89
95
|
id,
|
|
90
96
|
display: raw?.display_name || _prettyName(id, family),
|
|
@@ -98,6 +104,7 @@ export function _normalizeAnthropicModel(raw) {
|
|
|
98
104
|
releaseDate: releaseDate ? `${releaseDate[1]}-${releaseDate[2]}-${releaseDate[3]}` : null,
|
|
99
105
|
supportsReasoning: effortValues.length > 0 || _capabilitySupported(raw?.capabilities?.thinking),
|
|
100
106
|
reasoningOptions: effortValues.length ? [{ type: 'effort', values: effortValues }] : [],
|
|
107
|
+
...(thinkingTypes ? { thinkingTypes } : {}),
|
|
101
108
|
};
|
|
102
109
|
}
|
|
103
110
|
|
|
@@ -115,7 +122,12 @@ export function _prettyName(id, family) {
|
|
|
115
122
|
return `${base} ${v[1]}${minor}`;
|
|
116
123
|
}
|
|
117
124
|
|
|
125
|
+
// Context window for a roster row that reports none: the shared model catalog
|
|
126
|
+
// (cached roster / LiteLLM / models.dev) first, else the pre-catalog family
|
|
127
|
+
// windows.
|
|
118
128
|
export function _defaultContextForModel(id) {
|
|
129
|
+
const declared = Number(getModelMetadataSync(id, 'anthropic')?.contextWindow);
|
|
130
|
+
if (Number.isFinite(declared) && declared > 0) return declared;
|
|
119
131
|
const text = String(id || '');
|
|
120
132
|
const version = text.match(/^claude-[a-z]+-(\d+)(?:-(\d+))?/i);
|
|
121
133
|
if (Number(version?.[1] || 0) >= 5) return 1000000;
|
|
@@ -10,7 +10,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
|
|
|
10
10
|
// source release just to advance the user-agent version.
|
|
11
11
|
// Claude Opus 5.5 requires 2.1.280 or newer. The release workflow raises this
|
|
12
12
|
// to the published CLI version (scripts/sync-client-version-floors.mjs).
|
|
13
|
-
export const DEFAULT_CLI_VERSION = '2.1.
|
|
13
|
+
export const DEFAULT_CLI_VERSION = '2.1.301';
|
|
14
14
|
export const CLAUDE_CLI_NPM_PACKAGE = '@anthropic-ai/claude-code';
|
|
15
15
|
|
|
16
16
|
const CACHE_SCHEMA_VERSION = 1;
|
|
@@ -21,8 +21,16 @@ export function createMidState(attemptIndex) {
|
|
|
21
21
|
* @param {ReturnType<import('./anthropic-oauth-recovery.mjs').createAnthropicOAuthRecovery>} deps.recovery
|
|
22
22
|
* @param {Function|null} [deps.onStageChange]
|
|
23
23
|
* @param {boolean} [deps.retry529]
|
|
24
|
+
* @param {object|null} [deps.overload] the send's shared overload counter
|
|
24
25
|
*/
|
|
25
|
-
export function createMidstreamRecovery({
|
|
26
|
+
export function createMidstreamRecovery({
|
|
27
|
+
maxRetries,
|
|
28
|
+
totalSignal,
|
|
29
|
+
recovery,
|
|
30
|
+
onStageChange = null,
|
|
31
|
+
retry529 = true,
|
|
32
|
+
overload = null,
|
|
33
|
+
}) {
|
|
26
34
|
return createAnthropicMidstreamRecovery({
|
|
27
35
|
label: 'anthropic-oauth',
|
|
28
36
|
outcomeProvider: 'anthropic-oauth',
|
|
@@ -33,5 +41,6 @@ export function createMidstreamRecovery({ maxRetries, totalSignal, recovery, onS
|
|
|
33
41
|
recovery,
|
|
34
42
|
onStageChange,
|
|
35
43
|
retry529,
|
|
44
|
+
overload,
|
|
36
45
|
});
|
|
37
46
|
}
|
|
@@ -8,7 +8,10 @@ import { PROVIDER_NONSTREAM_TOTAL_TIMEOUT_MS, createTimeoutSignal } from '../sta
|
|
|
8
8
|
import { AnthropicFallbackTriggeredError, markProviderRecoveryExhausted } from './retry-classifier.mjs';
|
|
9
9
|
import { cloneAnthropicEffortBody } from './effort-configuration.mjs';
|
|
10
10
|
import { normalizeAnthropicNonStreamingResponse } from './lib/anthropic-request-utils.mjs';
|
|
11
|
+
import { capForNonStreaming } from './anthropic-max-tokens-recovery.mjs';
|
|
11
12
|
import { createAnthropicRecoveryGuards } from './anthropic-recovery-guards.mjs';
|
|
13
|
+
import { applyAnthropicErrorContract } from './anthropic-error-contract.mjs';
|
|
14
|
+
import { isRefreshableAuthRejection } from './anthropic-oauth-request/initial-status.mjs';
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* @param {object} deps
|
|
@@ -70,7 +73,7 @@ export function createAnthropicOAuthRecovery({
|
|
|
70
73
|
const requestFallback = async (accessToken) => {
|
|
71
74
|
const result = await requestWithRetry(
|
|
72
75
|
accessToken,
|
|
73
|
-
cloneAnthropicEffortBody(body, { stream: false }),
|
|
76
|
+
capForNonStreaming(cloneAnthropicEffortBody(body, { stream: false })),
|
|
74
77
|
lifetime.signal
|
|
75
78
|
);
|
|
76
79
|
fallback = result;
|
|
@@ -89,19 +92,30 @@ export function createAnthropicOAuthRecovery({
|
|
|
89
92
|
};
|
|
90
93
|
try {
|
|
91
94
|
fallback = await requestFallback(auth.creds.accessToken);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
95
|
+
// Same refresh rule as the streaming request: every 401 and only the
|
|
96
|
+
// exact revoked-token 403 are refreshed and replayed once; an ordinary
|
|
97
|
+
// 403 stays terminal. A rejected body is drained once and reused below.
|
|
98
|
+
let rejectedBody = null;
|
|
99
|
+
if (fallback.response.status === 401 || fallback.response.status === 403) {
|
|
100
|
+
rejectedBody = await fallback.response.text().catch(() => '');
|
|
101
|
+
if (isRefreshableAuthRejection(fallback.response.status, rejectedBody)) {
|
|
102
|
+
const rejectedStatus = fallback.response.status;
|
|
103
|
+
releaseFallback('Anthropic OAuth non-streaming fallback refreshing auth');
|
|
104
|
+
auth.creds = await provider.ensureAuth({ forceRefresh: true, reason: String(rejectedStatus) });
|
|
105
|
+
fallback = await requestFallback(auth.creds.accessToken);
|
|
106
|
+
rejectedBody = null;
|
|
107
|
+
}
|
|
96
108
|
}
|
|
97
109
|
if (!fallback.response.ok) {
|
|
98
|
-
const text = await fallback.response.text().catch(() => '');
|
|
110
|
+
const text = rejectedBody ?? (await fallback.response.text().catch(() => ''));
|
|
99
111
|
const fallbackError = new Error(
|
|
100
112
|
`Anthropic OAuth API ${fallback.response.status}: ${provider.scrubTokens(text).slice(0, 200)}`
|
|
101
113
|
);
|
|
102
|
-
fallbackError
|
|
103
|
-
|
|
104
|
-
|
|
114
|
+
throw applyAnthropicErrorContract(fallbackError, {
|
|
115
|
+
status: fallback.response.status,
|
|
116
|
+
headers: fallback.response.headers,
|
|
117
|
+
bodyText: provider.scrubTokens(text),
|
|
118
|
+
});
|
|
105
119
|
}
|
|
106
120
|
const message = await fallback.response.json();
|
|
107
121
|
return normalizeAnthropicNonStreamingResponse(message, useModel);
|
|
@@ -2,9 +2,23 @@
|
|
|
2
2
|
// sampled: a 429 becomes a typed quota error and a transient status a
|
|
3
3
|
// retryable error; both drain the response and release its abort wiring so
|
|
4
4
|
// re-issuing the POST is safe.
|
|
5
|
-
import { noteFastModeCapacityError } from '../anthropic-fast-mode.mjs';
|
|
5
|
+
import { fastModeDowngraded, noteFastModeCapacityError } from '../anthropic-fast-mode.mjs';
|
|
6
|
+
import { applyAnthropicErrorContract, retryAfterMsFromHeaders } from '../anthropic-error-contract.mjs';
|
|
6
7
|
import { headerValue } from '../retry-classification.mjs';
|
|
7
|
-
import { classifyError
|
|
8
|
+
import { classifyError } from '../retry-classifier.mjs';
|
|
9
|
+
|
|
10
|
+
// Anthropic's exact official revoked-token 403 body; any other 403 is an
|
|
11
|
+
// ordinary permission/policy refusal and stays terminal.
|
|
12
|
+
const REVOKED_TOKEN_MARKER = 'OAuth token has been revoked';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* True when a rejected initial response is one a forced credential refresh can
|
|
16
|
+
* fix: every 401, and only the exact revoked-token 403 signature. Shared by
|
|
17
|
+
* the streaming request and the non-streaming fallback.
|
|
18
|
+
*/
|
|
19
|
+
export function isRefreshableAuthRejection(status, bodyText) {
|
|
20
|
+
return status === 401 || (status === 403 && String(bodyText ?? '').includes(REVOKED_TOKEN_MARKER));
|
|
21
|
+
}
|
|
8
22
|
|
|
9
23
|
// A subscription-window refusal carries these unified quota headers. A 429
|
|
10
24
|
// without them is an entitlement/routing refusal or a capacity blip — the
|
|
@@ -31,16 +45,13 @@ function formatRetryAfter(ms) {
|
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
export function anthropicQuotaError(status, headers, bodyText = '') {
|
|
34
|
-
const retryAfterMs =
|
|
48
|
+
const retryAfterMs = retryAfterMsFromHeaders(headers);
|
|
35
49
|
const retryAfter = formatRetryAfter(retryAfterMs);
|
|
36
50
|
const detail = bodyText ? `: ${String(bodyText).slice(0, 200)}` : '';
|
|
37
51
|
const retry = retryAfter ? ` retryAfter=${retryAfter}` : '';
|
|
38
52
|
const quota = hasQuotaHeaders(headers);
|
|
39
53
|
const err = new Error(`Anthropic OAuth API ${status} ${quota ? 'quota/rate limit' : 'request rejected'}${retry}${detail}`);
|
|
40
54
|
err.name = quota ? 'ProviderQuotaError' : 'ProviderRequestRejectedError';
|
|
41
|
-
err.code = quota ? 'PROVIDER_QUOTA' : 'PROVIDER_REQUEST_REJECTED';
|
|
42
|
-
err.httpStatus = status;
|
|
43
|
-
err.status = status;
|
|
44
55
|
err.headers = headers;
|
|
45
56
|
err.response = { status, headers };
|
|
46
57
|
err.retryAfterMs = retryAfterMs;
|
|
@@ -50,7 +61,7 @@ export function anthropicQuotaError(status, headers, bodyText = '') {
|
|
|
50
61
|
// SSE parsing can expose text or a tool call. It is therefore safe for the
|
|
51
62
|
// request-local withRetry loop. Mid-stream paths stamp unsafeToRetry when
|
|
52
63
|
// output/tool exposure actually occurs.
|
|
53
|
-
return err;
|
|
64
|
+
return applyAnthropicErrorContract(err, { status, headers, bodyText });
|
|
54
65
|
}
|
|
55
66
|
|
|
56
67
|
export async function judgeInitialStatus(result, requestBody, { provider, cleanupCancelHandler }) {
|
|
@@ -71,26 +82,41 @@ export async function judgeInitialStatus(result, requestBody, { provider, cleanu
|
|
|
71
82
|
// in-loop; a drained or unavailable fast pool says nothing about
|
|
72
83
|
// standard-speed capacity, so `speed` is dropped and the error is
|
|
73
84
|
// flagged for a single standard-speed replay by the caller.
|
|
74
|
-
const
|
|
75
|
-
{ httpStatus: status, headers: result?.response?.headers, message: quotaText },
|
|
76
|
-
{ fast: requestBody?.speed === 'fast' }
|
|
77
|
-
);
|
|
78
|
-
const fastDowngraded = fastDecision === 'downgrade' || fastDecision === 'disabled';
|
|
79
|
-
if (fastDowngraded) delete requestBody.speed;
|
|
85
|
+
const fastDowngraded = dropFastSpeed(requestBody, status, result?.response?.headers, quotaText);
|
|
80
86
|
throw Object.assign(anthropicQuotaError(status, result?.response?.headers, provider.scrubTokens(quotaText)), {
|
|
81
87
|
initialResponseError: true,
|
|
82
88
|
fastDowngraded,
|
|
83
89
|
});
|
|
84
90
|
}
|
|
91
|
+
let overloadText = '';
|
|
92
|
+
try {
|
|
93
|
+
overloadText = await result.response.text();
|
|
94
|
+
} catch {}
|
|
95
|
+
release();
|
|
96
|
+
// A drained fast pool (529) is replayed at standard speed within the same
|
|
97
|
+
// attempt, exactly like a fast-pool 429, instead of waiting out its window.
|
|
98
|
+
const fastDowngraded = dropFastSpeed(requestBody, status, result?.response?.headers, overloadText);
|
|
85
99
|
const err = new Error(`Anthropic OAuth API ${status}`);
|
|
86
|
-
err.httpStatus = status;
|
|
87
|
-
err.status = status;
|
|
88
100
|
err.headers = result?.response?.headers;
|
|
89
101
|
err.response = { status, headers: result?.response?.headers };
|
|
90
102
|
err.initialResponseError = true;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
err.fastDowngraded = fastDowngraded;
|
|
104
|
+
throw applyAnthropicErrorContract(err, {
|
|
105
|
+
status,
|
|
106
|
+
headers: result?.response?.headers,
|
|
107
|
+
bodyText: provider.scrubTokens(overloadText),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Records a fast-pool capacity refusal; on an explicit downgrade/disable the
|
|
112
|
+
// request drops `speed` and the caller replays once at standard speed. Any
|
|
113
|
+
// other verdict ('ignored', 'retry-fast') leaves the request untouched.
|
|
114
|
+
function dropFastSpeed(requestBody, status, headers, text) {
|
|
115
|
+
const decision = noteFastModeCapacityError(
|
|
116
|
+
{ httpStatus: status, headers, message: text },
|
|
117
|
+
{ fast: requestBody?.speed === 'fast' }
|
|
118
|
+
);
|
|
119
|
+
if (!fastModeDowngraded(decision)) return false;
|
|
120
|
+
delete requestBody.speed;
|
|
121
|
+
return true;
|
|
96
122
|
}
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
import { traceAgentFetch } from '../agent-trace.mjs';
|
|
12
12
|
import { createAbortController } from '../../../shared/abort-controller.mjs';
|
|
13
13
|
import { notifyCurrentAnthropicRateLimit } from './admission-scheduler.mjs';
|
|
14
|
-
import { noteFastModeCapacityError } from './anthropic-fast-mode.mjs';
|
|
15
14
|
import { noteRequestServiceTier } from '../../../shared/llm/usage-context.mjs';
|
|
16
15
|
import {
|
|
17
16
|
ANTHROPIC_RETRY_BACKOFF_MS,
|
|
@@ -21,6 +20,7 @@ import {
|
|
|
21
20
|
emitProviderRetryStage,
|
|
22
21
|
withRetry,
|
|
23
22
|
} from './retry-classifier.mjs';
|
|
23
|
+
import { ANTHROPIC_MAX_CONSECUTIVE_529 } from './retry-backoff.mjs';
|
|
24
24
|
import { postMessages } from './anthropic-oauth-request/gzip-post.mjs';
|
|
25
25
|
import { removeAbortListener, wireRequestAbort } from './anthropic-oauth-request/abort-wiring.mjs';
|
|
26
26
|
import { judgeInitialStatus } from './anthropic-oauth-request/initial-status.mjs';
|
|
@@ -38,6 +38,7 @@ export { anthropicQuotaError } from './anthropic-oauth-request/initial-status.mj
|
|
|
38
38
|
* @param {AbortSignal|null} deps.totalSignal session-lifetime pass-through
|
|
39
39
|
* @param {(requestBody: object) => string} deps.betaHeadersFor
|
|
40
40
|
* @param {((stage: string) => void)|null} deps.onStageChange
|
|
41
|
+
* @param {{ state: { consecutive529Errors: number } }|null} [deps.overload] the send's shared overload counter
|
|
41
42
|
*/
|
|
42
43
|
export function createAnthropicOAuthRequest({
|
|
43
44
|
provider,
|
|
@@ -48,8 +49,10 @@ export function createAnthropicOAuthRequest({
|
|
|
48
49
|
totalSignal,
|
|
49
50
|
betaHeadersFor,
|
|
50
51
|
onStageChange,
|
|
52
|
+
overload = null,
|
|
51
53
|
}) {
|
|
52
54
|
const requestTimeoutMs = anthropicRequestTimeoutMs();
|
|
55
|
+
const isEnterprise = String(provider?.credentials?.subscriptionType || '').toLowerCase() === 'enterprise';
|
|
53
56
|
const cleanupCancelHandler = (handler) => removeAbortListener(totalSignal, handler);
|
|
54
57
|
|
|
55
58
|
const doRequest = async (accessToken, requestSignal = null, requestBody = body) => {
|
|
@@ -100,7 +103,7 @@ export function createAnthropicOAuthRequest({
|
|
|
100
103
|
try {
|
|
101
104
|
await judgeInitialStatus(result, requestBody, { provider, cleanupCancelHandler });
|
|
102
105
|
} catch (err) {
|
|
103
|
-
// Fast-pool 429 before any byte was sampled: `speed` is already
|
|
106
|
+
// Fast-pool 429/529 before any byte was sampled: `speed` is already
|
|
104
107
|
// dropped, so replay once at standard speed within this attempt.
|
|
105
108
|
if (err?.fastDowngraded !== true) throw err;
|
|
106
109
|
const replay = await doRequestImpl(accessToken, attemptSignal, requestBody);
|
|
@@ -118,23 +121,25 @@ export function createAnthropicOAuthRequest({
|
|
|
118
121
|
// Max/Pro OAuth sessions use subscription quota windows. Claude
|
|
119
122
|
// Code fails their 429s immediately rather than waiting through
|
|
120
123
|
// the API-key/PAYG retry budget (which may carry hours-long
|
|
121
|
-
// Retry-After values).
|
|
122
|
-
|
|
124
|
+
// Retry-After values). Enterprise bills PAYG-style, so its 429s
|
|
125
|
+
// are retried like an API key's.
|
|
126
|
+
retry429: isEnterprise,
|
|
123
127
|
retry529: opts.retry529,
|
|
124
128
|
perAttemptTimeoutMs: requestTimeoutMs,
|
|
125
129
|
perAttemptLabel: 'Anthropic OAuth initial response',
|
|
126
130
|
provider: 'anthropic',
|
|
131
|
+
// This transport honors the positive x-should-retry override.
|
|
132
|
+
honorShouldRetryTrue: true,
|
|
127
133
|
model: useModel,
|
|
128
134
|
fallbackModel: opts._fallbackTriggered ? undefined : opts.fallbackModel,
|
|
135
|
+
// One overload counter for the send: SSE overloads count toward the
|
|
136
|
+
// same limit as request-loop 529s.
|
|
137
|
+
overloadState: overload?.state,
|
|
138
|
+
overloadFallbackAfter: ANTHROPIC_MAX_CONSECUTIVE_529,
|
|
129
139
|
onRetry: ({ attempt, maxAttempts, lastErr, delayMs, delayReason }) => {
|
|
130
140
|
emitProviderRetryStage(onStageChange, { attempt: attempt + 1, maxAttempts, lastErr, delayMs });
|
|
131
141
|
const status = Number(lastErr?.httpStatus || lastErr?.status || lastErr?.response?.status || 0) || null;
|
|
132
142
|
if (status === 429) notifyCurrentAnthropicRateLimit(lastErr);
|
|
133
|
-
// Fast capacity exhausted: drop `speed` so the replay runs at
|
|
134
|
-
// standard speed instead of re-hitting the drained pool.
|
|
135
|
-
if (requestBody?.speed === 'fast' && noteFastModeCapacityError(lastErr, { fast: true }) !== 'retry-fast') {
|
|
136
|
-
delete requestBody.speed;
|
|
137
|
-
}
|
|
138
143
|
const reason = status || lastErr?.code || lastErr?.message || 'network error';
|
|
139
144
|
const suffix = delayReason ? ` (${delayReason})` : '';
|
|
140
145
|
try {
|