mixdog 1.3.4 → 1.4.0
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/LICENSES/oh-my-pi-MIT.txt +23 -0
- package/NOTICE.md +17 -2
- package/README.md +11 -0
- package/package.json +3 -11
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/embed-google-oauth-client.mjs +49 -0
- package/scripts/gate-local.mjs +4 -2
- package/scripts/lib/test-spawn-ledger.mjs +46 -1
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +10 -1
- package/scripts/test.mjs +12 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +25 -1
- package/src/defaults/skills/browser-use/SKILL.md +77 -17
- package/src/defaults/skills/code-tidy/SKILL.md +142 -270
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
- package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
- package/src/defaults/skills/computer-use/SKILL.md +33 -9
- package/src/defaults/skills/setup/SKILL.md +29 -2
- package/src/defaults/skills/setup/references/actions.md +117 -28
- package/src/defaults/skills/setup/references/surfaces.md +77 -35
- package/src/defaults/skills/setup-guide/SKILL.md +3 -3
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/keychain-cjs.cjs +359 -29
- package/src/lib/rules-builder.cjs +10 -8
- package/src/rules/agent/AGENT.md +6 -6
- package/src/rules/agent-mode/AGENT_MODE.md +10 -2
- package/src/rules/agent-mode/MIXY.md +12 -0
- package/src/rules/lead/LEAD.md +18 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +193 -0
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- package/src/runtime/agent/orchestrator/config.mjs +34 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +177 -73
- package/src/runtime/agent/orchestrator/mcp/client.mjs +25 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +31 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +16 -3
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +42 -7
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +21 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +23 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +230 -137
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +64 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +18 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +160 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +52 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +22 -6
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +15 -4
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +142 -104
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +10 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -217
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -6
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +409 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-families.mjs +187 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-identity.mjs +342 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-models.mjs +541 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-protobuf.mjs +305 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-request.mjs +558 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-schema.mjs +880 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-session.mjs +190 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-tool-args.mjs +351 -0
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +560 -0
- package/src/runtime/agent/orchestrator/providers/devin.mjs +491 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/gemini-output-limit.mjs +46 -0
- package/src/runtime/agent/orchestrator/providers/gemini-reasoning-relay.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +7 -11
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +61 -22
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +71 -4
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +25 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +96 -5
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +23 -5
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +19 -1
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +39 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/provider-availability.mjs +19 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/registry.mjs +43 -3
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/wire-protobuf-codec.mjs +368 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/reaction-tool-defs.mjs +133 -0
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +23 -5
- package/src/runtime/agent/orchestrator/runtime-core/tool-profile.mjs +35 -10
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +57 -10
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +9 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +0 -3
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +10 -4
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +148 -25
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +47 -9
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +51 -3
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +14 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +23 -5
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
- package/src/runtime/agent/orchestrator/session/message-ids.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/message-reactions.mjs +89 -0
- package/src/runtime/agent/orchestrator/session/message-reactions.test-support.mjs +75 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +0 -2
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +47 -11
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +20 -2
- package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
- package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-header-cache.mjs +85 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +133 -18
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-batch.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +25 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
- package/src/runtime/browser-bridge/action-schema.mjs +13 -2
- package/src/runtime/browser-bridge/client.mjs +73 -8
- package/src/runtime/browser-bridge/input-fields.mjs +8 -9
- package/src/runtime/browser-bridge/mail-links.mjs +107 -0
- package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
- package/src/runtime/channels/lib/config.mjs +6 -61
- package/src/runtime/channels/lib/crash-log.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
- package/src/runtime/channels/lib/event-queue.mjs +3 -18
- package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
- package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
- package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
- package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
- package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
- package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
- package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
- package/src/runtime/channels/lib/schedule-errors.mjs +51 -0
- package/src/runtime/channels/lib/scheduler.mjs +135 -154
- package/src/runtime/channels/lib/schedules-db.mjs +83 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +14 -2
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
- package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
- package/src/runtime/channels/lib/worker-main.mjs +19 -34
- package/src/runtime/computer-bridge/action-schema.mjs +42 -1
- package/src/runtime/computer-bridge/actions.mjs +9 -1
- package/src/runtime/computer-bridge/client.mjs +180 -8
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
- package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
- package/src/runtime/connectors/gmail-app-password.mjs +172 -39
- package/src/runtime/connectors/google-mcp.mjs +10 -12
- package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
- package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
- package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
- package/src/runtime/office/com/com-adapter.mjs +17 -1
- package/src/runtime/office/com/office-com-host.ps1 +51 -1
- package/src/runtime/office/pdf/cfb-fixture.mjs +328 -0
- package/src/runtime/office/pdf/cfb-protection.mjs +311 -0
- package/src/runtime/office/pdf/document-preview.mjs +326 -8
- package/src/runtime/office/pdf/ooxml-crypto.mjs +469 -0
- package/src/runtime/office/pdf/ooxml-key-worker.mjs +14 -0
- package/src/runtime/office/portable/portable-soffice.mjs +45 -5
- package/src/runtime/session-search/session-search-db.mjs +73 -9
- package/src/runtime/session-search/session-search-ingest.mjs +110 -20
- package/src/runtime/shared/abort-race.mjs +89 -0
- package/src/runtime/shared/agent-avatar.d.mts +0 -1
- package/src/runtime/shared/agent-kind.mjs +4 -3
- package/src/runtime/shared/bot-hops.mjs +62 -2
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +51 -35
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +33 -2
- package/src/runtime/shared/connector-catalog.mjs +166 -8
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -14
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/developer-options.mjs +32 -1
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/file-permissions.d.mts +0 -8
- package/src/runtime/shared/file-permissions.mjs +0 -11
- package/src/runtime/shared/git-direct.test-support.mjs +19 -0
- package/src/runtime/shared/google-oauth-client.generated.json +4 -0
- package/src/runtime/shared/google-oauth-client.mjs +34 -9
- package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
- package/src/runtime/shared/heartbeat-interval.mjs +19 -0
- package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
- package/src/runtime/shared/llm/anthropic-betas.mjs +7 -0
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +12 -0
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +1 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/llm/well-formed.mjs +66 -0
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/orchestration.d.mts +2 -0
- package/src/runtime/shared/pg-schema-db.mjs +27 -16
- package/src/runtime/shared/profile-config.cjs +1 -1
- package/src/runtime/shared/prompt-origin.d.mts +4 -0
- package/src/runtime/shared/prompt-origin.mjs +21 -0
- package/src/runtime/shared/provider-accounts.mjs +231 -59
- package/src/runtime/shared/provider-api-key.mjs +19 -8
- package/src/runtime/shared/provider-display-name.mjs +29 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
- package/src/runtime/shared/routine-trigger.d.mts +2 -0
- package/src/runtime/shared/routine-trigger.mjs +52 -0
- package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
- package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
- package/src/runtime/shared/session-activity-signal.mjs +34 -1
- package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
- package/src/runtime/shared/session-sidebar-host.mjs +7 -3
- package/src/runtime/shared/session-turn-prelude.mjs +18 -0
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +1 -14
- package/src/runtime/shared/transcript-metadata.mjs +38 -0
- package/src/runtime/shared/user-data-guard.mjs +30 -2
- package/src/runtime/shared/worktrees/activity-gate.mjs +12 -5
- package/src/runtime/shared/worktrees/test-support.mjs +9 -4
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +27 -8
- package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
- package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
- package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
- package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
- package/src/session-runtime/agent-home-delivery.mjs +486 -179
- package/src/session-runtime/agent-room-delivery.mjs +28 -1
- package/src/session-runtime/agent-task-sessions.mjs +561 -199
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/begin.mjs +3 -2
- package/src/session-runtime/boot/infrastructure.mjs +4 -0
- package/src/session-runtime/boot/providers.mjs +3 -0
- package/src/session-runtime/boot/tools.mjs +8 -1
- package/src/session-runtime/bot-chain.mjs +32 -0
- package/src/session-runtime/bot-status.mjs +7 -4
- package/src/session-runtime/channel-config-api.mjs +63 -17
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +45 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +72 -5
- package/src/session-runtime/internal-tool-executor.mjs +4 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
- package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
- package/src/session-runtime/lifecycle/teardown.mjs +23 -5
- package/src/session-runtime/mcp-glue/server-catalog.mjs +61 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +927 -0
- package/src/session-runtime/model-route/route-tuning.mjs +10 -6
- package/src/session-runtime/notification-bus.mjs +31 -117
- package/src/session-runtime/notification-completion-queue.mjs +54 -0
- package/src/session-runtime/notification-listeners.mjs +76 -0
- package/src/session-runtime/owned-automation-run.mjs +35 -13
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/provider-auth/login.mjs +7 -0
- package/src/session-runtime/provider-models/row-hydration.mjs +13 -2
- package/src/session-runtime/resource-mcp-api.mjs +143 -224
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
- package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
- package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
- package/src/session-runtime/resource-mcp-servers.mjs +78 -0
- package/src/session-runtime/resource-mcp-store.mjs +49 -0
- package/src/session-runtime/routine-home-turn.mjs +33 -6
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/schedule-session-run.mjs +7 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +8 -12
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
- package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
- package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
- package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
- package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +73 -31
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/channel-worker.mjs +1 -1
- package/src/session-runtime/services/provider-admin.mjs +128 -25
- package/src/session-runtime/services/schedule-access.mjs +14 -0
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/services/usage-dashboard-model.mjs +1 -0
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +8 -4
- package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
- package/src/session-runtime/settings-compaction-api.mjs +2 -40
- package/src/session-runtime/settings-system-api.mjs +28 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +187 -29
- package/src/session-runtime/setup-tool/extended-actions.mjs +33 -2
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +68 -6
- package/src/session-runtime/setup-tool/tool-defs.mjs +92 -6
- package/src/session-runtime/task-session-route.mjs +99 -0
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +21 -4
- package/src/session-runtime/tool-policy/surface-helpers.mjs +2 -3
- package/src/session-runtime/tool-surface.mjs +4 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +98 -21
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -1
- package/src/session-runtime/workspace/transitions.mjs +10 -2
- package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
- package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
- package/src/standalone/channel-transport/client-registry.mjs +24 -163
- package/src/standalone/channel-transport.mjs +1 -1
- package/src/standalone/daemon-channels-loader.mjs +10 -8
- package/src/standalone/daemon-session-control/list-page.mjs +72 -0
- package/src/standalone/daemon-session-control/request.mjs +51 -0
- package/src/standalone/daemon-session-control/room-host.mjs +57 -0
- package/src/standalone/daemon-session-control/route-control.mjs +48 -0
- package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
- package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
- package/src/standalone/daemon-session-control.mjs +161 -157
- package/src/standalone/daemon.mjs +33 -2
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +10 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +6 -2
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/quota-resume.mjs +3 -0
- package/src/standalone/session-service/retention/busy.mjs +65 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
- package/src/standalone/session-service/session-calls/session-turns.mjs +6 -0
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-service.mjs +13 -0
- package/src/standalone/session-tool-output.mjs +21 -10
- package/src/tui/app/model-options.mjs +4 -27
- package/src/tui/dist/index.mjs +81 -65
- package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/notice-surface.mjs +23 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/integrations.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +8 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
- package/src/tui/session/session-api/routes-write.mjs +5 -1
- package/src/tui/session/session-api/routes.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +30 -2
- package/src/tui/session/session-flow/auto-clear.mjs +4 -33
- package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
- package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
- package/src/tui/session/session-flow/drain-retry.mjs +35 -0
- package/src/tui/session/session-flow/drain.mjs +118 -149
- package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
- package/src/tui/session/tool-approval-delegation.mjs +64 -0
- package/src/tui/session/tool-approval-request.mjs +39 -0
- package/src/tui/session/tool-approval-settle.mjs +62 -0
- package/src/tui/session/tool-approval.mjs +69 -115
- package/src/tui/session/tui-steering-persist.mjs +8 -1
- package/src/tui/session/turn-stream.mjs +36 -3
- package/src/tui/session/turn.mjs +23 -2
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
- package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
- package/scripts/code-graph-description-contract.mjs +0 -188
- package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
|
@@ -2,6 +2,13 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
3
|
import { PRIORITY_RANK, normalizePriority, resourceAdmission } from '../../../shared/resource-admission.mjs';
|
|
4
4
|
import { accountProviderSend } from '../../../shared/llm/usage-accounting.mjs';
|
|
5
|
+
import { sanitizeSurrogates } from '../../../shared/llm/well-formed.mjs';
|
|
6
|
+
import { providerAvailable, providerUnavailableError } from './provider-availability.mjs';
|
|
7
|
+
import {
|
|
8
|
+
finalizeProviderRequestTools,
|
|
9
|
+
isFinalizedProviderRequestTools,
|
|
10
|
+
providerNativeToolPrefixCount,
|
|
11
|
+
} from '../runtime-core/provider-request-tools.mjs';
|
|
5
12
|
|
|
6
13
|
// Normal provider traffic is not concurrency-gated. Independent sessions and
|
|
7
14
|
// accounts start immediately; a finite limit exists only when an operator
|
|
@@ -257,7 +264,9 @@ export class ProviderAdmissionScheduler {
|
|
|
257
264
|
running.parentAbort = () => {
|
|
258
265
|
try {
|
|
259
266
|
controller.abort(item.signal.reason);
|
|
260
|
-
} catch {
|
|
267
|
+
} catch {
|
|
268
|
+
// the controller may already be aborted
|
|
269
|
+
}
|
|
261
270
|
};
|
|
262
271
|
item.signal.addEventListener('abort', running.parentAbort, { once: true });
|
|
263
272
|
}
|
|
@@ -294,7 +303,9 @@ export class ProviderAdmissionScheduler {
|
|
|
294
303
|
if (running.parentAbort && running.parentSignal) {
|
|
295
304
|
try {
|
|
296
305
|
running.parentSignal.removeEventListener('abort', running.parentAbort);
|
|
297
|
-
} catch {
|
|
306
|
+
} catch {
|
|
307
|
+
// the abort listener may already be gone
|
|
308
|
+
}
|
|
298
309
|
}
|
|
299
310
|
this.running.delete(running);
|
|
300
311
|
lane.active -= 1;
|
|
@@ -305,6 +316,32 @@ export class ProviderAdmissionScheduler {
|
|
|
305
316
|
if (this._canDeleteLane(lane)) this._deleteLane(key, lane);
|
|
306
317
|
}
|
|
307
318
|
|
|
319
|
+
/**
|
|
320
|
+
* Why a request that must not wait (a cache warm) cannot start on lane
|
|
321
|
+
* `key` now, or null: the lane's rate-limit cooldown, or a lane throttled
|
|
322
|
+
* after a 429 that would queue it.
|
|
323
|
+
*/
|
|
324
|
+
immediateBlock(key) {
|
|
325
|
+
if (this.closedReason) return 'provider scheduler closed';
|
|
326
|
+
const lane = this.lanes.get(String(key || ''));
|
|
327
|
+
if (!lane) return null;
|
|
328
|
+
if (lane.adaptive && lane.cooldownUntil > this.now()) return 'rate-limit cooldown';
|
|
329
|
+
if (lane.queue.length > 0 || lane.active >= lane.limit) return 'account throttled';
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** Record a rate limit a request outside `run` (a cache warm) received on
|
|
334
|
+
* lane `key`, into the same cooldown state (and broadcast) as a send's. */
|
|
335
|
+
recordRateLimit(key, error) {
|
|
336
|
+
const laneKey = String(key || '');
|
|
337
|
+
if (!laneKey || this.closedReason) return false;
|
|
338
|
+
const lane = this.lanes.get(laneKey) || createAdmissionLane(laneKey, this.concurrency);
|
|
339
|
+
this.lanes.set(laneKey, lane);
|
|
340
|
+
const recorded = this._recordFailure(laneKey, lane, error);
|
|
341
|
+
if (this._canDeleteLane(lane)) this._deleteLane(laneKey, lane);
|
|
342
|
+
return recorded;
|
|
343
|
+
}
|
|
344
|
+
|
|
308
345
|
snapshot() {
|
|
309
346
|
const now = this.now();
|
|
310
347
|
return {
|
|
@@ -421,7 +458,9 @@ export class ProviderAdmissionScheduler {
|
|
|
421
458
|
if (item.onAbort && item.signal) {
|
|
422
459
|
try {
|
|
423
460
|
item.signal.removeEventListener('abort', item.onAbort);
|
|
424
|
-
} catch {
|
|
461
|
+
} catch {
|
|
462
|
+
// the abort listener may already be gone
|
|
463
|
+
}
|
|
425
464
|
item.onAbort = null;
|
|
426
465
|
}
|
|
427
466
|
}
|
|
@@ -446,7 +485,9 @@ export class ProviderAdmissionScheduler {
|
|
|
446
485
|
for (const running of this.running) {
|
|
447
486
|
try {
|
|
448
487
|
running.controller.abort(this.closedReason);
|
|
449
|
-
} catch {
|
|
488
|
+
} catch {
|
|
489
|
+
// the controller may already be aborted
|
|
490
|
+
}
|
|
450
491
|
}
|
|
451
492
|
}
|
|
452
493
|
}
|
|
@@ -469,7 +510,7 @@ function digest(value) {
|
|
|
469
510
|
.digest('hex');
|
|
470
511
|
}
|
|
471
512
|
|
|
472
|
-
function providerAdmissionKey(providerName, provider) {
|
|
513
|
+
export function providerAdmissionKey(providerName, provider) {
|
|
473
514
|
const name = String(providerName || provider?.name || 'provider');
|
|
474
515
|
const stableAnthropicOAuthPath =
|
|
475
516
|
name.toLowerCase() === 'anthropic-oauth'
|
|
@@ -518,7 +559,18 @@ export function wrapProviderAdmission(provider, providerName, scheduler = provid
|
|
|
518
559
|
if (!provider || typeof provider.send !== 'function' || provider[WRAPPED]) return provider;
|
|
519
560
|
const originalSend = provider.send;
|
|
520
561
|
Object.defineProperty(provider, WRAPPED, { value: true });
|
|
521
|
-
provider.send = function admittedProviderSend(
|
|
562
|
+
provider.send = function admittedProviderSend(rawMessages, model, rawTools, sendOpts) {
|
|
563
|
+
// Every registered provider (and its account-pool / proxy / custom variants)
|
|
564
|
+
// is wrapped here, so this is the one point all model requests pass before
|
|
565
|
+
// serialization. A lone surrogate would make the API reject the body on
|
|
566
|
+
// every send; only the outgoing request is rewritten, never the transcript.
|
|
567
|
+
const messages = sanitizeSurrogates(rawMessages);
|
|
568
|
+
let tools = sanitizeSurrogates(rawTools);
|
|
569
|
+
// A finalized tool list is recognised by identity; its sanitized copy must
|
|
570
|
+
// stay finalized with the same native prefix (the model proxy reads both).
|
|
571
|
+
if (tools !== rawTools && isFinalizedProviderRequestTools(rawTools)) {
|
|
572
|
+
tools = finalizeProviderRequestTools(tools, providerNativeToolPrefixCount(rawTools));
|
|
573
|
+
}
|
|
522
574
|
const opts = sendOpts || {};
|
|
523
575
|
const signal = opts.signal || null;
|
|
524
576
|
const key = providerAdmissionKey(providerName, this);
|
|
@@ -530,12 +582,17 @@ export function wrapProviderAdmission(provider, providerName, scheduler = provid
|
|
|
530
582
|
scheduler.run(
|
|
531
583
|
key,
|
|
532
584
|
(admissionSignal, admissionMetrics) => {
|
|
585
|
+
// The Developer option may have been switched off after lookup or
|
|
586
|
+
// while this request waited: the gate is rechecked right before send.
|
|
587
|
+
if (!providerAvailable(providerName)) throw providerUnavailableError(providerName);
|
|
533
588
|
// Admission is the common request-clock boundary for WS/SSE/HTTP.
|
|
534
589
|
// Queue wait therefore cannot consume first-byte or agent-watchdog
|
|
535
590
|
// time. Provider-local retry remains the sole retry owner.
|
|
536
591
|
try {
|
|
537
592
|
opts.onStageChange?.('requesting');
|
|
538
|
-
} catch {
|
|
593
|
+
} catch {
|
|
594
|
+
// the stage observer is advisory
|
|
595
|
+
}
|
|
539
596
|
const admittedOpts = {
|
|
540
597
|
...opts,
|
|
541
598
|
signal: admissionSignal,
|
|
@@ -18,13 +18,17 @@ import { applyAnthropicEffortToBody, shouldIncludeEffortBeta } from './anthropic
|
|
|
18
18
|
import { isCustomProviderName, resolveCustomReasoning } from './custom-reasoning.mjs';
|
|
19
19
|
import {
|
|
20
20
|
anthropicThinkingActive,
|
|
21
|
+
anthropicTurnScopedReminders,
|
|
21
22
|
appendAnthropicTailReminder,
|
|
23
|
+
appendAnthropicTurnReminder,
|
|
22
24
|
applyAnthropicCacheMarkers,
|
|
23
25
|
clampAnthropicThinkingBudget as clampThinkingBudgetTokens,
|
|
26
|
+
hasAnthropicTurnScopedMessages,
|
|
24
27
|
resolveAnthropicCacheTtls as resolveCacheTtls,
|
|
25
28
|
resolveAnthropicMessageCacheSlots,
|
|
26
29
|
sharedCachePrefixBoundary,
|
|
27
30
|
toAnthropicToolChoice,
|
|
31
|
+
withAnthropicTurnReminders,
|
|
28
32
|
} from './lib/anthropic-request-utils.mjs';
|
|
29
33
|
import { splitTailReminder } from './lib/tail-reminder-split.mjs';
|
|
30
34
|
import {
|
|
@@ -97,12 +101,17 @@ export async function buildAnthropicApiRequest({
|
|
|
97
101
|
// are applied to the FINAL sanitized array by invariant, so block
|
|
98
102
|
// drops / inserts / reorders performed by the sanitizer can never move
|
|
99
103
|
// or delete a marked block. NEVER sanitize again after this.
|
|
100
|
-
|
|
101
|
-
|
|
104
|
+
// Turn-scoped tail reminders (tail-reminder-split.mjs): stored reminders are
|
|
105
|
+
// re-sent before their assistant turns, the current one ends the request.
|
|
106
|
+
const turnScoped = anthropicTurnScopedReminders(name, useModel, config);
|
|
107
|
+
const lowerHistory = (history, projection) => {
|
|
108
|
+
const lowered = lowerAnthropicEffortHistory(
|
|
102
109
|
history.filter((m) => m.role !== 'system'),
|
|
103
110
|
(segment) => toAnthropicMessages(segment, requestTools, name),
|
|
104
111
|
projection
|
|
105
112
|
);
|
|
113
|
+
return turnScoped ? withAnthropicTurnReminders(lowered) : lowered;
|
|
114
|
+
};
|
|
106
115
|
const anthropicMessages = applyAnthropicCacheMarkers(
|
|
107
116
|
lowerHistory(chatMsgs, effortProjection),
|
|
108
117
|
messageCacheSlots,
|
|
@@ -115,9 +124,12 @@ export async function buildAnthropicApiRequest({
|
|
|
115
124
|
model: useModel,
|
|
116
125
|
max_tokens: maxTokens,
|
|
117
126
|
system: systemBlocks.length ? systemBlocks : undefined,
|
|
118
|
-
messages: await prepareAnthropicImages(
|
|
119
|
-
|
|
120
|
-
|
|
127
|
+
messages: await prepareAnthropicImages(
|
|
128
|
+
turnScoped
|
|
129
|
+
? appendAnthropicTurnReminder(anthropicMessages, reminder)
|
|
130
|
+
: appendAnthropicTailReminder(anthropicMessages, reminder),
|
|
131
|
+
{ signal: opts.signal }
|
|
132
|
+
),
|
|
121
133
|
};
|
|
122
134
|
// Server-side fallback and fast mode are decided from Claude model ids:
|
|
123
135
|
// first-party knowledge, never applied to a custom endpoint.
|
|
@@ -255,6 +267,7 @@ function requestHeadersFor(
|
|
|
255
267
|
effort: isCustom ? Boolean(params.output_config?.effort) : shouldIncludeEffortBeta(capabilityModel, opts),
|
|
256
268
|
serverFallback: params.fallbacks === 'default',
|
|
257
269
|
thinkingDisplayUpdates: params.thinking?.display === 'updates',
|
|
270
|
+
turnScopedSystem: hasAnthropicTurnScopedMessages(params.messages),
|
|
258
271
|
}),
|
|
259
272
|
...(effortProjection ? [EFFORT_CONFIGURATION_BETA] : []),
|
|
260
273
|
].filter(Boolean);
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// anthropic-cache-warm.mjs — the cache-warm mode both Anthropic providers
|
|
2
|
+
// expose as `sendCacheWarm` (session/cache-warm.mjs): one POST of the
|
|
3
|
+
// request the provider's own builder produces, no retry, fallback, re-send,
|
|
4
|
+
// wait or account rotation, and the stream cut at the first content block
|
|
5
|
+
// once the usage (cache read / write) has been reported. Right before the
|
|
6
|
+
// POST the account gate (cache-warm-admission.mjs) may skip it; a refusal is
|
|
7
|
+
// fed into the shared rate-limit and roster state. The request is bounded by
|
|
8
|
+
// the providers' own watchdogs: the first-byte timeout until the usage
|
|
9
|
+
// arrives, then the SSE idle timeout between events. Usage is handed to
|
|
10
|
+
// `onUsage` as it arrives, so a warm that fails or is aborted after the
|
|
11
|
+
// provider accepted it is still accounted. Every exit cancels the stream and
|
|
12
|
+
// aborts the transport.
|
|
13
|
+
import { PROVIDER_FIRST_BYTE_TIMEOUT_MS, PROVIDER_SSE_IDLE_TIMEOUT_MS } from '../stall-policy.mjs';
|
|
14
|
+
import { updateTurnUsage } from './anthropic-sse-turn/turn-state.mjs';
|
|
15
|
+
import { _anthropicSseError } from './anthropic-sse.mjs';
|
|
16
|
+
import { anthropicQuotaError } from './anthropic-oauth-request/initial-status.mjs';
|
|
17
|
+
import { cacheWarmAccountBlock, cacheWarmBlockedError, recordCacheWarmRefusal } from './cache-warm-admission.mjs';
|
|
18
|
+
import { scrubOAuthSecrets } from './lib/oauth-token-utils.mjs';
|
|
19
|
+
|
|
20
|
+
const SSE_LABELS = Object.freeze({ display: 'Anthropic cache warm' });
|
|
21
|
+
|
|
22
|
+
function usageSnapshot(usage) {
|
|
23
|
+
const { raw: _raw, ...rest } = usage;
|
|
24
|
+
return { ...rest };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// An abort deadline: `arm(ms)` (re)starts it; it fires `controller.abort`.
|
|
28
|
+
function watchdog(controller) {
|
|
29
|
+
let timer = null;
|
|
30
|
+
return {
|
|
31
|
+
arm(ms, what) {
|
|
32
|
+
if (timer) clearTimeout(timer);
|
|
33
|
+
timer = setTimeout(() => controller.abort(new Error(`cache warm ${what} timed out after ${ms}ms`)), ms);
|
|
34
|
+
timer.unref?.();
|
|
35
|
+
},
|
|
36
|
+
clear() {
|
|
37
|
+
if (timer) clearTimeout(timer);
|
|
38
|
+
timer = null;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Read a warm's SSE stream until usage is known and the first content block
|
|
45
|
+
* starts, or the message ends. Resolves the usage; a stream error rejects
|
|
46
|
+
* with `error.usage` set to what was reported before it. `onChunk` hears
|
|
47
|
+
* every chunk (the idle watchdog). The stream is cancelled on every exit.
|
|
48
|
+
*/
|
|
49
|
+
export async function readCacheWarmStream(response, { onUsage = () => {}, onChunk = () => {} } = {}) {
|
|
50
|
+
const usage = { inputTokens: 0, outputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, raw: null };
|
|
51
|
+
let reported = false;
|
|
52
|
+
const report = (raw) => {
|
|
53
|
+
if (!raw || typeof raw !== 'object') return;
|
|
54
|
+
updateTurnUsage(usage, raw);
|
|
55
|
+
reported = true;
|
|
56
|
+
onUsage(usageSnapshot(usage));
|
|
57
|
+
};
|
|
58
|
+
const reader = response.body.getReader();
|
|
59
|
+
const decoder = new TextDecoder();
|
|
60
|
+
let buffer = '';
|
|
61
|
+
try {
|
|
62
|
+
for (;;) {
|
|
63
|
+
const { value, done } = await reader.read();
|
|
64
|
+
if (done) break;
|
|
65
|
+
buffer += decoder.decode(value, { stream: true });
|
|
66
|
+
let cut = buffer.indexOf('\n\n');
|
|
67
|
+
while (cut >= 0) {
|
|
68
|
+
const frame = buffer.slice(0, cut);
|
|
69
|
+
buffer = buffer.slice(cut + 2);
|
|
70
|
+
cut = buffer.indexOf('\n\n');
|
|
71
|
+
const data = frame
|
|
72
|
+
.split('\n')
|
|
73
|
+
.filter((line) => line.startsWith('data:'))
|
|
74
|
+
.map((line) => line.slice(5).trimStart())
|
|
75
|
+
.join('\n');
|
|
76
|
+
if (!data) continue;
|
|
77
|
+
let event;
|
|
78
|
+
try {
|
|
79
|
+
event = JSON.parse(data);
|
|
80
|
+
} catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (event?.type === 'error' || event?.error) throw _anthropicSseError(event, SSE_LABELS);
|
|
84
|
+
if (event.type === 'message_start') report(event.message?.usage);
|
|
85
|
+
else if (event.type === 'message_delta') report(event.usage);
|
|
86
|
+
else if (event.type === 'content_block_start' && reported) {
|
|
87
|
+
// The prefix was read (and the cache refreshed) before any content:
|
|
88
|
+
// nothing generated after this point is needed.
|
|
89
|
+
return usageSnapshot(usage);
|
|
90
|
+
} else if (event.type === 'message_stop') return usageSnapshot(usage);
|
|
91
|
+
}
|
|
92
|
+
onChunk(reported);
|
|
93
|
+
}
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (error && typeof error === 'object' && error.usage === undefined) {
|
|
96
|
+
error.usage = reported ? usageSnapshot(usage) : null;
|
|
97
|
+
}
|
|
98
|
+
throw error;
|
|
99
|
+
} finally {
|
|
100
|
+
await reader.cancel().catch(() => {});
|
|
101
|
+
}
|
|
102
|
+
return usageSnapshot(usage);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* One warm on account instance `instance` (roster account `accountId`, empty
|
|
107
|
+
* for a provider without a roster) of `providerName`: the account gate, then
|
|
108
|
+
* `post(signal)` (the provider's single POST of its built body), then the
|
|
109
|
+
* stream. A refusal reaches the shared rate-limit and roster state; the
|
|
110
|
+
* transport is aborted on every exit.
|
|
111
|
+
*/
|
|
112
|
+
export async function sendAnthropicCacheWarm({
|
|
113
|
+
providerName,
|
|
114
|
+
instance,
|
|
115
|
+
accountId = '',
|
|
116
|
+
model,
|
|
117
|
+
opts = {},
|
|
118
|
+
post,
|
|
119
|
+
onUsage,
|
|
120
|
+
}) {
|
|
121
|
+
const blocked = cacheWarmAccountBlock(providerName, instance, {
|
|
122
|
+
accountId,
|
|
123
|
+
model,
|
|
124
|
+
sessionId: opts.session?.id || opts.sessionId || '',
|
|
125
|
+
});
|
|
126
|
+
if (blocked) throw cacheWarmBlockedError(blocked);
|
|
127
|
+
const controller = new AbortController();
|
|
128
|
+
const callerSignal = opts.signal;
|
|
129
|
+
const onCallerAbort = () => controller.abort(callerSignal.reason);
|
|
130
|
+
if (callerSignal?.aborted) controller.abort(callerSignal.reason);
|
|
131
|
+
else callerSignal?.addEventListener?.('abort', onCallerAbort, { once: true });
|
|
132
|
+
const deadline = watchdog(controller);
|
|
133
|
+
deadline.arm(PROVIDER_FIRST_BYTE_TIMEOUT_MS, 'first byte');
|
|
134
|
+
try {
|
|
135
|
+
const response = await post(controller.signal);
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
const bodyText = await response.text().catch(() => '');
|
|
138
|
+
throw anthropicQuotaError(response.status, response.headers, bodyText);
|
|
139
|
+
}
|
|
140
|
+
return await readCacheWarmStream(response, {
|
|
141
|
+
onUsage,
|
|
142
|
+
onChunk: (reported) => {
|
|
143
|
+
if (reported) deadline.arm(PROVIDER_SSE_IDLE_TIMEOUT_MS, 'stream');
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
} catch (error) {
|
|
147
|
+
// The warm's own error is what the caller needs; a failure to persist the
|
|
148
|
+
// refusal (quota / roster state) is reported, scrubbed, like the other
|
|
149
|
+
// credential and account-state write failures of the Anthropic providers.
|
|
150
|
+
await recordCacheWarmRefusal(providerName, instance, error, {
|
|
151
|
+
accountId,
|
|
152
|
+
model,
|
|
153
|
+
aborted: Boolean(callerSignal?.aborted),
|
|
154
|
+
}).catch((recordError) => {
|
|
155
|
+
process.stderr.write(
|
|
156
|
+
`[anthropic-cache-warm] refusal record failed: ${scrubOAuthSecrets(recordError?.message || String(recordError))}\n`
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
throw error;
|
|
160
|
+
} finally {
|
|
161
|
+
callerSignal?.removeEventListener?.('abort', onCallerAbort);
|
|
162
|
+
deadline.clear();
|
|
163
|
+
controller.abort(new Error('cache warm finished'));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -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.311';
|
|
14
14
|
export const CLAUDE_CLI_NPM_PACKAGE = '@anthropic-ai/claude-code';
|
|
15
15
|
|
|
16
16
|
const CACHE_SCHEMA_VERSION = 1;
|
|
@@ -15,6 +15,7 @@ import { boundProviderAuthPath } from '../../../shared/provider-auth-binding.mjs
|
|
|
15
15
|
import { resolvePluginData } from '../../../shared/plugin-paths.mjs';
|
|
16
16
|
import { modelProxyClientMode, serverModelCredentialsDisabledError } from '../../../shared/model-proxy-mode.mjs';
|
|
17
17
|
import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
|
|
18
|
+
import { TIMEOUT_PHASE } from '../../../shared/provider-timeout-phase.mjs';
|
|
18
19
|
import { claudeCliUserAgent, resolveCliVersion } from './anthropic-oauth-client-version.mjs';
|
|
19
20
|
import {
|
|
20
21
|
accountIdentityFields,
|
|
@@ -375,7 +376,9 @@ async function _refreshOAuthCredentialsUnlocked(creds) {
|
|
|
375
376
|
return refreshed;
|
|
376
377
|
} catch (err) {
|
|
377
378
|
if (err?.name === 'AbortError') {
|
|
378
|
-
throw new Error('Anthropic OAuth token refresh timed out after 30000ms')
|
|
379
|
+
throw Object.assign(new Error('Anthropic OAuth token refresh timed out after 30000ms'), {
|
|
380
|
+
timeoutPhase: TIMEOUT_PHASE.AUTH,
|
|
381
|
+
});
|
|
379
382
|
}
|
|
380
383
|
throw err;
|
|
381
384
|
} finally {
|
|
@@ -12,7 +12,9 @@ import { sendGzipCompressed } from '../lib/request-compression.mjs';
|
|
|
12
12
|
const API_URL = 'https://api.anthropic.com/v1/messages';
|
|
13
13
|
export { ANTHROPIC_VERSION };
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
// `plain`: exactly one uncompressed POST (a cache warm), so no compression
|
|
16
|
+
// rejection resend can follow.
|
|
17
|
+
export async function postMessages({ accessToken, requestBody, betaHeaders, signal, compress, plain = false }) {
|
|
16
18
|
const headers = {
|
|
17
19
|
Authorization: `Bearer ${accessToken}`,
|
|
18
20
|
'anthropic-version': ANTHROPIC_VERSION,
|
|
@@ -22,17 +24,15 @@ export async function postMessages({ accessToken, requestBody, betaHeaders, sign
|
|
|
22
24
|
'x-app': 'cli',
|
|
23
25
|
'Content-Type': 'application/json',
|
|
24
26
|
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}),
|
|
37
|
-
});
|
|
27
|
+
const raw = Buffer.from(JSON.stringify(requestBody));
|
|
28
|
+
const send = (body, sendHeaders) =>
|
|
29
|
+
fetch(API_URL, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: sendHeaders,
|
|
32
|
+
body,
|
|
33
|
+
signal,
|
|
34
|
+
dispatcher: getLlmDispatcher(),
|
|
35
|
+
});
|
|
36
|
+
if (plain) return send(raw, headers);
|
|
37
|
+
return sendGzipCompressed({ raw, headers, compress, send });
|
|
38
38
|
}
|