mixdog 1.3.5 → 1.4.1
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/NOTICE.md +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +16 -5
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +37 -37
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +123 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -4
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +20 -2
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/app.mjs +4 -0
- package/src/defaults/shipped-history.json +22 -1
- package/src/defaults/skills/browser-use/SKILL.md +62 -12
- 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 +35 -9
- package/src/defaults/skills/setup/SKILL.md +22 -0
- package/src/defaults/skills/setup/references/actions.md +39 -5
- package/src/defaults/skills/setup/references/surfaces.md +11 -2
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/rules-builder.cjs +39 -20
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +11 -10
- package/src/rules/lead/LEAD.md +23 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/rules/shared/70-delivery.md +7 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- 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/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +17 -1
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- 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-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -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 +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
- 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/openai-ws-stream/event-switch.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
- 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 +38 -0
- 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/runtime-core/ask-user-tool-defs.mjs +49 -16
- 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 +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
- 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/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
- 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 +5 -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 +49 -21
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
- 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-execute.mjs +133 -90
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -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 +24 -14
- 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 +130 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
- 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-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- 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/transcript-restore/restore.mjs +79 -3
- 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/stall-policy.mjs +23 -0
- 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/invocation-plan.mjs +2 -2
- 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/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
- 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/scheduler.mjs +33 -147
- package/src/runtime/channels/lib/schedules-db.mjs +34 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/whisper-port.mjs +10 -1
- 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 +10 -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 +28 -2
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -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/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- 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/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- 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-owned-work.mjs +56 -0
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +2 -13
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +29 -0
- package/src/runtime/shared/connector-catalog.mjs +150 -0
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -17
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- 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/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- 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 +126 -0
- package/src/runtime/shared/llm/cost.mjs +5 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -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 +7 -1
- 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 +10 -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 +48 -1
- package/src/runtime/shared/session-scratch.mjs +37 -0
- 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-card-model/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +2 -15
- package/src/runtime/shared/tool-surface.mjs +3 -0
- package/src/runtime/shared/tool-work-units.mjs +2 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +15 -0
- package/src/runtime/shared/worktrees/manager.mjs +87 -38
- package/src/runtime/shared/worktrees/test-support.mjs +14 -13
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +29 -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 +489 -185
- package/src/session-runtime/agent-task-sessions.mjs +467 -229
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/apis.mjs +9 -0
- 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 +11 -2
- package/src/session-runtime/bot-status.mjs +12 -6
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +271 -25
- package/src/session-runtime/conversation-import/service.mjs +26 -5
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- 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 +55 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +153 -33
- package/src/session-runtime/model-route/set-route.mjs +11 -2
- 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 +2 -1
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -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/resource-recall-api.mjs +6 -1
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- 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 +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/provider-admin.mjs +2 -1
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +1 -0
- 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 +13 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +145 -22
- package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workspace/transitions.mjs +25 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
- 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 +142 -190
- package/src/standalone/daemon.mjs +26 -3
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- 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 +30 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/app/app-view/floating-panel.jsx +7 -4
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +9 -5
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/dist/index.mjs +133 -92
- 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 +7 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- 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 +17 -1
- 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 +16 -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 +19 -2
- package/src/tui/session/turn.mjs +1 -0
- package/src/ui/statusline-agents.mjs +1 -3
- 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
|
@@ -97,7 +97,7 @@ function _statusForAnthropicSseError(event, payload) {
|
|
|
97
97
|
return 0;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
function _anthropicSseError(event, labels) {
|
|
100
|
+
export function _anthropicSseError(event, labels) {
|
|
101
101
|
const payload = event?.error && typeof event.error === 'object' ? event.error : event;
|
|
102
102
|
const type = payload?.type || event?.type || 'error';
|
|
103
103
|
const message = payload?.message || 'Anthropic SSE error';
|
|
@@ -161,6 +161,12 @@ function applyAnthropicSseEvent(framedEvent, { turn, watchdogs, state, progress,
|
|
|
161
161
|
return false;
|
|
162
162
|
case 'message_delta':
|
|
163
163
|
return turn.onMessageDelta(event);
|
|
164
|
+
case 'ping':
|
|
165
|
+
// Anthropic bridges long generation gaps (adaptive thinking, a buffered
|
|
166
|
+
// tool input) with `ping` events. A distinct kind, not 'semantic': the
|
|
167
|
+
// agent watchdog decides how far a keepalive may extend liveness.
|
|
168
|
+
progress('keepalive');
|
|
169
|
+
return false;
|
|
164
170
|
case 'message_stop':
|
|
165
171
|
turn.onMessageStop();
|
|
166
172
|
// Anthropic streams can keep emitting `:ping` keepalive frames after
|
|
@@ -198,7 +204,9 @@ export async function parseSSEStream(
|
|
|
198
204
|
const progress = (kind) => {
|
|
199
205
|
try {
|
|
200
206
|
onStreamDelta?.(kind);
|
|
201
|
-
} catch {
|
|
207
|
+
} catch {
|
|
208
|
+
// the stream-delta observer is advisory
|
|
209
|
+
}
|
|
202
210
|
};
|
|
203
211
|
const turn = createAnthropicSseTurn({
|
|
204
212
|
state,
|
|
@@ -222,12 +230,7 @@ export async function parseSSEStream(
|
|
|
222
230
|
_captureMidstreamAbort(state, signal.reason);
|
|
223
231
|
return signal.reason instanceof Error ? signal.reason : new Error(`${labels.display} SSE stream aborted`);
|
|
224
232
|
};
|
|
225
|
-
const onAbort = () =>
|
|
226
|
-
try {
|
|
227
|
-
const _c = reader.cancel('SSE aborted');
|
|
228
|
-
if (_c && typeof _c.catch === 'function') _c.catch(() => {});
|
|
229
|
-
} catch {}
|
|
230
|
-
};
|
|
233
|
+
const onAbort = () => cancelReaderOnAbort(reader);
|
|
231
234
|
let buffer = '';
|
|
232
235
|
let currentEvent = '';
|
|
233
236
|
retainProviderSseStream(streamKey);
|
|
@@ -239,24 +242,12 @@ export async function parseSSEStream(
|
|
|
239
242
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
240
243
|
}
|
|
241
244
|
watchdogs.armFirstMessageTimer();
|
|
242
|
-
|
|
245
|
+
while (true) {
|
|
243
246
|
let chunk;
|
|
244
247
|
try {
|
|
245
248
|
chunk = await watchdogs.read();
|
|
246
249
|
} catch (err) {
|
|
247
|
-
|
|
248
|
-
if (stopped) {
|
|
249
|
-
// The caller's cancellation reason may be shared: never stamp this
|
|
250
|
-
// request's usage on it; the usage reported so far goes to this send.
|
|
251
|
-
if (signal?.aborted && state?.sawMessageStart) {
|
|
252
|
-
const reported = turn.reportedUsage();
|
|
253
|
-
noteAbandonedUsage(reported.usage, reported.model);
|
|
254
|
-
}
|
|
255
|
-
throw stopped;
|
|
256
|
-
}
|
|
257
|
-
// The connection dropped mid-body: carry what this turn completed so
|
|
258
|
-
// the loop can continue from finished tool calls instead of failing.
|
|
259
|
-
throw state?.sawMessageStart ? turn.attachTransportPartial(err) : err;
|
|
250
|
+
throw readFailureError(err, { watchdogs, signal, state, turn, abortedError });
|
|
260
251
|
}
|
|
261
252
|
const { done, value } = chunk;
|
|
262
253
|
if (done) break;
|
|
@@ -277,10 +268,7 @@ export async function parseSSEStream(
|
|
|
277
268
|
const framed = frameProviderSseChunk(region, { currentEvent, streamKey });
|
|
278
269
|
const framedChunk = typeof framed?.then === 'function' ? await framed : framed;
|
|
279
270
|
currentEvent = framedChunk.currentEvent;
|
|
280
|
-
|
|
281
|
-
if (framedEvent.error) continue;
|
|
282
|
-
if (applyAnthropicSseEvent(framedEvent, { turn, watchdogs, state, progress, labels })) break streamLoop;
|
|
283
|
-
}
|
|
271
|
+
if (applyAnthropicSseChunk(framedChunk.events, { turn, watchdogs, state, progress, labels })) break;
|
|
284
272
|
}
|
|
285
273
|
turn.flushLeak();
|
|
286
274
|
if (state?.sawMessageStart && !state?.sawCompleted) throw turn.truncatedError();
|
|
@@ -289,20 +277,69 @@ export async function parseSSEStream(
|
|
|
289
277
|
watchdogs.dispose();
|
|
290
278
|
try {
|
|
291
279
|
releaseProviderSseStream(streamKey);
|
|
292
|
-
} catch {
|
|
280
|
+
} catch {
|
|
281
|
+
// releasing the stream registration is bookkeeping only
|
|
282
|
+
}
|
|
293
283
|
if (signal) signal.removeEventListener('abort', onAbort);
|
|
294
284
|
// message_stop deliberately exits before EOF because Anthropic may keep
|
|
295
285
|
// sending pings. Cancel the reader so the successful response body and
|
|
296
286
|
// underlying keep-alive connection are not stranded.
|
|
297
287
|
try {
|
|
298
288
|
await reader.cancel('Anthropic SSE complete');
|
|
299
|
-
} catch {
|
|
289
|
+
} catch {
|
|
290
|
+
// the reader may already be closed after the stream ended
|
|
291
|
+
}
|
|
292
|
+
releaseReaderLock(reader, labels);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Caller cancellation of a live stream: cancel the reader without awaiting it.
|
|
297
|
+
function cancelReaderOnAbort(reader) {
|
|
298
|
+
try {
|
|
299
|
+
const _c = reader.cancel('SSE aborted');
|
|
300
|
+
if (_c && typeof _c.catch === 'function') _c.catch(() => {});
|
|
301
|
+
} catch {
|
|
302
|
+
// the reader may already be closed or released
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// The error a failed reader.read() ends the stream with: a watchdog stop or the
|
|
307
|
+
// caller's abort as-is, otherwise the transport failure carrying the partial
|
|
308
|
+
// turn once the message started.
|
|
309
|
+
function readFailureError(err, { watchdogs, signal, state, turn, abortedError }) {
|
|
310
|
+
const stopped = watchdogs.readFailure() ?? (signal?.aborted ? abortedError() : null);
|
|
311
|
+
if (stopped) {
|
|
312
|
+
// The caller's cancellation reason may be shared: never stamp this
|
|
313
|
+
// request's usage on it; the usage reported so far goes to this send.
|
|
314
|
+
if (signal?.aborted && state?.sawMessageStart) {
|
|
315
|
+
const reported = turn.reportedUsage();
|
|
316
|
+
noteAbandonedUsage(reported.usage, reported.model);
|
|
317
|
+
}
|
|
318
|
+
return stopped;
|
|
319
|
+
}
|
|
320
|
+
// The connection dropped mid-body: carry what this turn completed so
|
|
321
|
+
// the loop can continue from finished tool calls instead of failing.
|
|
322
|
+
return state?.sawMessageStart ? turn.attachTransportPartial(err) : err;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Fold one network chunk's framed records into the turn, in order. Returns true
|
|
326
|
+
// once a terminal record ends the stream; a framing error skips its record.
|
|
327
|
+
function applyAnthropicSseChunk(events, context) {
|
|
328
|
+
for (const framedEvent of events) {
|
|
329
|
+
if (framedEvent.error) continue;
|
|
330
|
+
if (applyAnthropicSseEvent(framedEvent, context)) return true;
|
|
331
|
+
}
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function releaseReaderLock(reader, labels) {
|
|
336
|
+
try {
|
|
337
|
+
reader.releaseLock();
|
|
338
|
+
} catch (err) {
|
|
300
339
|
try {
|
|
301
|
-
reader
|
|
302
|
-
} catch
|
|
303
|
-
|
|
304
|
-
process.stderr.write(`[${labels.tag}] reader releaseLock failed: ${err?.message ?? String(err)}\n`);
|
|
305
|
-
} catch {}
|
|
340
|
+
process.stderr.write(`[${labels.tag}] reader releaseLock failed: ${err?.message ?? String(err)}\n`);
|
|
341
|
+
} catch {
|
|
342
|
+
// stderr may be closed; the releaseLock failure is only reported
|
|
306
343
|
}
|
|
307
344
|
}
|
|
308
345
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { traceAgentUsage } from '../agent-trace.mjs';
|
|
13
13
|
import { reportedCostUsd } from './lib/usage-primitives.mjs';
|
|
14
|
-
import { latestAnthropicPrefix } from './lib/anthropic-prefix-trace.mjs';
|
|
14
|
+
import { anthropicPrefixSessionId, latestAnthropicPrefix } from './lib/anthropic-prefix-trace.mjs';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* @param {object} parseResult the assembled turn (streaming or normalized non-streaming)
|
|
@@ -48,7 +48,7 @@ export function buildAnthropicTurnResult(parseResult, { provider, useModel, opts
|
|
|
48
48
|
// Anthropic usage is additive at this inner transport
|
|
49
49
|
// boundary, even when OpenCode Go supplies the provider id.
|
|
50
50
|
inputTokensInclusive: false,
|
|
51
|
-
prefixBlocks: latestAnthropicPrefix(opts
|
|
51
|
+
prefixBlocks: latestAnthropicPrefix(anthropicPrefixSessionId(opts)),
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -2,10 +2,11 @@ import { reloadProviderApiKey, resolveProviderApiKey } from '../../../shared/pro
|
|
|
2
2
|
import { sanitizeToolPairs } from '../session/context-utils.mjs';
|
|
3
3
|
import { AnthropicFallbackTriggeredError } from './retry-classifier.mjs';
|
|
4
4
|
import {
|
|
5
|
-
announceAnthropicModelFallback,
|
|
6
5
|
createAnthropicOverloadTracker,
|
|
7
6
|
isTerminalOverloadModel,
|
|
7
|
+
takeAnthropicModelFallback,
|
|
8
8
|
} from './anthropic-overload-fallback.mjs';
|
|
9
|
+
import { removeAbortListener } from './anthropic-oauth-request/abort-wiring.mjs';
|
|
9
10
|
import { readStreamOutcome } from './lib/stream-outcome.mjs';
|
|
10
11
|
import { createPassthroughSignal } from '../stall-policy.mjs';
|
|
11
12
|
import { createAbortController } from '../../../shared/abort-controller.mjs';
|
|
@@ -18,6 +19,7 @@ import { ANTHROPIC_EFFORT_LEVELS, withEffortRejectionFallback } from './effort-r
|
|
|
18
19
|
import { armFirstByteWatchdog, createAnthropicApiTransport } from './anthropic-api-transport.mjs';
|
|
19
20
|
import { createAnthropicApiRecovery } from './anthropic-api-recovery.mjs';
|
|
20
21
|
import { buildAnthropicTurnResult } from './anthropic-turn-result.mjs';
|
|
22
|
+
import { sendAnthropicCacheWarm } from './anthropic-cache-warm.mjs';
|
|
21
23
|
import {
|
|
22
24
|
assertAnthropicStreamNotEmpty,
|
|
23
25
|
createAnthropicMidState,
|
|
@@ -38,6 +40,29 @@ import { streamCallbacks } from './lib/send-callbacks.mjs';
|
|
|
38
40
|
import { preparePdfTextForProvider } from './media-normalization.mjs';
|
|
39
41
|
export { _test, _toAnthropicMessagesForTest } from './anthropic-messages.mjs';
|
|
40
42
|
|
|
43
|
+
// One stream attempt's controller, aborted with the caller's reason when the
|
|
44
|
+
// send's signal aborts. An already-aborted send fails before the attempt.
|
|
45
|
+
function linkAttemptAbort(totalSignal) {
|
|
46
|
+
const streamController = createAbortController();
|
|
47
|
+
let cancelHandler = null;
|
|
48
|
+
|
|
49
|
+
if (totalSignal) {
|
|
50
|
+
if (totalSignal.aborted) {
|
|
51
|
+
const reason = totalSignal.reason;
|
|
52
|
+
throw reason instanceof Error ? reason : new Error('Anthropic request aborted');
|
|
53
|
+
}
|
|
54
|
+
cancelHandler = () => {
|
|
55
|
+
try {
|
|
56
|
+
streamController.abort(totalSignal.reason);
|
|
57
|
+
} catch {
|
|
58
|
+
// best-effort propagation of caller cancellation
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
totalSignal.addEventListener('abort', cancelHandler, { once: true });
|
|
62
|
+
}
|
|
63
|
+
return { streamController, cancelHandler };
|
|
64
|
+
}
|
|
65
|
+
|
|
41
66
|
export class AnthropicProvider {
|
|
42
67
|
// Takes a PDF as a native document block (decided by this adapter's wire protocol).
|
|
43
68
|
nativePdf = true;
|
|
@@ -143,6 +168,38 @@ export class AnthropicProvider {
|
|
|
143
168
|
throw err;
|
|
144
169
|
}
|
|
145
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Cache-warm mode (anthropic-cache-warm.mjs): the request `send` would
|
|
173
|
+
* build for these arguments, sent once on the retry-free client — no
|
|
174
|
+
* key reload, fallback model or re-send — and cut at the first content
|
|
175
|
+
* block. `onUsage` receives the reported usage as it arrives.
|
|
176
|
+
*/
|
|
177
|
+
async sendCacheWarm(messages, model, tools, opts = {}, { onUsage, accountId = '' } = {}) {
|
|
178
|
+
const prepared = await preparePdfTextForProvider(sanitizeToolPairs(messages), this);
|
|
179
|
+
const { params, requestHeaders } = await buildAnthropicApiRequest({
|
|
180
|
+
name: this.name,
|
|
181
|
+
config: this.config,
|
|
182
|
+
messages: prepared,
|
|
183
|
+
useModel: model,
|
|
184
|
+
tools,
|
|
185
|
+
opts,
|
|
186
|
+
fastModeLatched: this.fastModeBetaHeaderLatched,
|
|
187
|
+
modelInfo: isCustomProviderName(this.name) ? this.getCachedModelInfo?.(model) || null : null,
|
|
188
|
+
capabilityModel: this._capabilityModel(model),
|
|
189
|
+
});
|
|
190
|
+
return sendAnthropicCacheWarm({
|
|
191
|
+
providerName: this.name,
|
|
192
|
+
instance: this,
|
|
193
|
+
accountId,
|
|
194
|
+
model,
|
|
195
|
+
opts,
|
|
196
|
+
onUsage,
|
|
197
|
+
post: (signal) =>
|
|
198
|
+
this._currentClient()
|
|
199
|
+
.messages.create(params, { signal, ...(requestHeaders ? { headers: requestHeaders } : {}) })
|
|
200
|
+
.asResponse(),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
146
203
|
// The `anthropic` API-key provider and every custom `anthropic`-protocol
|
|
147
204
|
// provider (a subclass of this one) share this send path.
|
|
148
205
|
async _doSend(messages, model, tools, sendOpts) {
|
|
@@ -188,89 +245,20 @@ export class AnthropicProvider {
|
|
|
188
245
|
const totalTimeout = createPassthroughSignal(externalSignal);
|
|
189
246
|
const totalSignal = totalTimeout.signal;
|
|
190
247
|
|
|
191
|
-
const
|
|
192
|
-
if (!handler) return;
|
|
193
|
-
try {
|
|
194
|
-
totalSignal.removeEventListener('abort', handler);
|
|
195
|
-
} catch {}
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
// Request-loop 529s and SSE overload events share one counter; at the
|
|
199
|
-
// limit the configured fallback model takes over the whole send.
|
|
200
|
-
const overload = createAnthropicOverloadTracker({
|
|
201
|
-
model: useModel,
|
|
202
|
-
fallbackModel: opts._fallbackTriggered ? undefined : opts.fallbackModel,
|
|
203
|
-
terminalAtLimit: !isCustomProviderName(this.name) && isTerminalOverloadModel(useModel),
|
|
204
|
-
});
|
|
205
|
-
// The SDK calls and their initial-response retry policy
|
|
206
|
-
// (anthropic-api-transport.mjs).
|
|
207
|
-
const transport = createAnthropicApiTransport({
|
|
208
|
-
client: this._currentClient(),
|
|
209
|
-
label: this.name,
|
|
248
|
+
const { transport, buildTurnResult, recovery, midstream } = this._createSendRecovery({
|
|
210
249
|
opts,
|
|
211
250
|
useModel,
|
|
212
251
|
params,
|
|
213
252
|
requestHeaders,
|
|
214
253
|
totalSignal,
|
|
215
|
-
overload,
|
|
216
|
-
});
|
|
217
|
-
// Usage accounting + caller-visible projection, shared by the streaming
|
|
218
|
-
// success path and the non-streaming fallback (anthropic-turn-result.mjs).
|
|
219
|
-
const buildTurnResult = (parseResult) =>
|
|
220
|
-
buildAnthropicTurnResult(parseResult, { provider: this.name, useModel, opts });
|
|
221
|
-
// Non-streaming re-issue of a dead stream, behind the transport-recovery
|
|
222
|
-
// budget and the exposed-output retraction handshake
|
|
223
|
-
// (anthropic-api-recovery.mjs).
|
|
224
|
-
const recovery = createAnthropicApiRecovery({
|
|
225
|
-
label: this.name,
|
|
226
|
-
opts,
|
|
227
|
-
useModel,
|
|
228
|
-
params,
|
|
229
|
-
totalSignal,
|
|
230
|
-
transport,
|
|
231
|
-
buildTurnResult,
|
|
232
254
|
onStageChange,
|
|
233
255
|
onTextReset,
|
|
234
256
|
});
|
|
235
|
-
// Bounded mid-stream retries for transient stream loss; jittered backoff
|
|
236
|
-
// between attempts (anthropic-midstream-recovery.mjs, shared with
|
|
237
|
-
// anthropic-oauth).
|
|
238
|
-
const midstream = createAnthropicMidstreamRecovery({
|
|
239
|
-
label: this.name,
|
|
240
|
-
displayName: 'Anthropic',
|
|
241
|
-
outcomeProvider: 'anthropic',
|
|
242
|
-
midstreamOwner: `${this.name}-midstream`,
|
|
243
|
-
unreachableMessage: 'Anthropic mid-stream retry: unreachable',
|
|
244
|
-
// The transport's withRetry already exhausted the full request-level
|
|
245
|
-
// budget for a non-OK initial response, so it must not earn an
|
|
246
|
-
// additional SSE retry budget here.
|
|
247
|
-
initialResponseErrorTerminal: true,
|
|
248
|
-
maxRetries: ANTHROPIC_MAX_MIDSTREAM_RETRIES,
|
|
249
|
-
totalSignal,
|
|
250
|
-
recovery,
|
|
251
|
-
onStageChange,
|
|
252
|
-
retry529: opts.retry529 !== false,
|
|
253
|
-
overload,
|
|
254
|
-
});
|
|
255
257
|
|
|
256
258
|
let streamingFallbackTried = false;
|
|
257
259
|
try {
|
|
258
260
|
for (let attemptIndex = 0; attemptIndex <= ANTHROPIC_MAX_MIDSTREAM_RETRIES; attemptIndex++) {
|
|
259
|
-
const streamController =
|
|
260
|
-
let cancelHandler = null;
|
|
261
|
-
|
|
262
|
-
if (totalSignal) {
|
|
263
|
-
if (totalSignal.aborted) {
|
|
264
|
-
const reason = totalSignal.reason;
|
|
265
|
-
throw reason instanceof Error ? reason : new Error('Anthropic request aborted');
|
|
266
|
-
}
|
|
267
|
-
cancelHandler = () => {
|
|
268
|
-
try {
|
|
269
|
-
streamController.abort(totalSignal.reason);
|
|
270
|
-
} catch {}
|
|
271
|
-
};
|
|
272
|
-
totalSignal.addEventListener('abort', cancelHandler, { once: true });
|
|
273
|
-
}
|
|
261
|
+
const { streamController, cancelHandler } = linkAttemptAbort(totalSignal);
|
|
274
262
|
|
|
275
263
|
const midState = createAnthropicMidState(attemptIndex);
|
|
276
264
|
|
|
@@ -280,13 +268,17 @@ export class AnthropicProvider {
|
|
|
280
268
|
try {
|
|
281
269
|
try {
|
|
282
270
|
onStageChange?.('requesting');
|
|
283
|
-
} catch {
|
|
271
|
+
} catch {
|
|
272
|
+
// the stage observer is advisory
|
|
273
|
+
}
|
|
284
274
|
|
|
285
275
|
response = await transport.requestStreamingResponse();
|
|
286
276
|
|
|
287
277
|
try {
|
|
288
278
|
onStageChange?.('streaming');
|
|
289
|
-
} catch {
|
|
279
|
+
} catch {
|
|
280
|
+
// the stage observer is advisory
|
|
281
|
+
}
|
|
290
282
|
|
|
291
283
|
firstByte = armFirstByteWatchdog(streamController, midState);
|
|
292
284
|
|
|
@@ -307,7 +299,9 @@ export class AnthropicProvider {
|
|
|
307
299
|
);
|
|
308
300
|
try {
|
|
309
301
|
streamController.abort?.('Anthropic SSE complete');
|
|
310
|
-
} catch {
|
|
302
|
+
} catch {
|
|
303
|
+
// the stream is complete; the controller may already be aborted
|
|
304
|
+
}
|
|
311
305
|
|
|
312
306
|
firstByte.cleanup();
|
|
313
307
|
assertAnthropicStreamNotEmpty(midState, parseResult, 'Anthropic');
|
|
@@ -336,26 +330,80 @@ export class AnthropicProvider {
|
|
|
336
330
|
return decision.value;
|
|
337
331
|
} finally {
|
|
338
332
|
firstByte?.cleanup();
|
|
339
|
-
|
|
333
|
+
removeAbortListener(totalSignal, cancelHandler);
|
|
340
334
|
}
|
|
341
335
|
}
|
|
342
336
|
throw midstream.exhaustedError();
|
|
343
337
|
} catch (err) {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
// operation, not just the first request.
|
|
347
|
-
if (!(err instanceof AnthropicFallbackTriggeredError)) throw err;
|
|
348
|
-
process.stderr.write(`[${this.name}] ${err.message}\n`);
|
|
349
|
-
announceAnthropicModelFallback(onStageChange, useModel, err.fallbackModel);
|
|
350
|
-
return await this._doSend(messages, err.fallbackModel, tools, {
|
|
351
|
-
...opts,
|
|
352
|
-
fallbackModel: undefined,
|
|
353
|
-
_fallbackTriggered: true,
|
|
354
|
-
});
|
|
338
|
+
const fallbackOpts = takeAnthropicModelFallback(err, { tag: this.name, model: useModel, opts, onStageChange });
|
|
339
|
+
return await this._doSend(messages, err.fallbackModel, tools, fallbackOpts);
|
|
355
340
|
} finally {
|
|
356
341
|
totalTimeout.cleanup();
|
|
357
342
|
}
|
|
358
343
|
}
|
|
344
|
+
// The recovery pipeline of one send over its fixed request: the shared
|
|
345
|
+
// overload counter, the transport, the turn-result projection, the
|
|
346
|
+
// non-streaming recovery and the bounded mid-stream retries.
|
|
347
|
+
_createSendRecovery({ opts, useModel, params, requestHeaders, totalSignal, onStageChange, onTextReset }) {
|
|
348
|
+
// Request-loop 529s and SSE overload events share one counter; at the
|
|
349
|
+
// limit the configured fallback model takes over the whole send.
|
|
350
|
+
const overload = createAnthropicOverloadTracker({
|
|
351
|
+
model: useModel,
|
|
352
|
+
fallbackModel: opts._fallbackTriggered ? undefined : opts.fallbackModel,
|
|
353
|
+
terminalAtLimit: !isCustomProviderName(this.name) && isTerminalOverloadModel(useModel),
|
|
354
|
+
});
|
|
355
|
+
// The SDK calls and their initial-response retry policy
|
|
356
|
+
// (anthropic-api-transport.mjs).
|
|
357
|
+
const transport = createAnthropicApiTransport({
|
|
358
|
+
client: this._currentClient(),
|
|
359
|
+
label: this.name,
|
|
360
|
+
opts,
|
|
361
|
+
useModel,
|
|
362
|
+
params,
|
|
363
|
+
requestHeaders,
|
|
364
|
+
totalSignal,
|
|
365
|
+
overload,
|
|
366
|
+
});
|
|
367
|
+
// Usage accounting + caller-visible projection, shared by the streaming
|
|
368
|
+
// success path and the non-streaming fallback (anthropic-turn-result.mjs).
|
|
369
|
+
const buildTurnResult = (parseResult) =>
|
|
370
|
+
buildAnthropicTurnResult(parseResult, { provider: this.name, useModel, opts });
|
|
371
|
+
// Non-streaming re-issue of a dead stream, behind the transport-recovery
|
|
372
|
+
// budget and the exposed-output retraction handshake
|
|
373
|
+
// (anthropic-api-recovery.mjs).
|
|
374
|
+
const recovery = createAnthropicApiRecovery({
|
|
375
|
+
label: this.name,
|
|
376
|
+
opts,
|
|
377
|
+
useModel,
|
|
378
|
+
params,
|
|
379
|
+
totalSignal,
|
|
380
|
+
transport,
|
|
381
|
+
buildTurnResult,
|
|
382
|
+
onStageChange,
|
|
383
|
+
onTextReset,
|
|
384
|
+
});
|
|
385
|
+
// Bounded mid-stream retries for transient stream loss; jittered backoff
|
|
386
|
+
// between attempts (anthropic-midstream-recovery.mjs, shared with
|
|
387
|
+
// anthropic-oauth).
|
|
388
|
+
const midstream = createAnthropicMidstreamRecovery({
|
|
389
|
+
label: this.name,
|
|
390
|
+
displayName: 'Anthropic',
|
|
391
|
+
outcomeProvider: 'anthropic',
|
|
392
|
+
midstreamOwner: `${this.name}-midstream`,
|
|
393
|
+
unreachableMessage: 'Anthropic mid-stream retry: unreachable',
|
|
394
|
+
// The transport's withRetry already exhausted the full request-level
|
|
395
|
+
// budget for a non-OK initial response, so it must not earn an
|
|
396
|
+
// additional SSE retry budget here.
|
|
397
|
+
initialResponseErrorTerminal: true,
|
|
398
|
+
maxRetries: ANTHROPIC_MAX_MIDSTREAM_RETRIES,
|
|
399
|
+
totalSignal,
|
|
400
|
+
recovery,
|
|
401
|
+
onStageChange,
|
|
402
|
+
retry529: opts.retry529 !== false,
|
|
403
|
+
overload,
|
|
404
|
+
});
|
|
405
|
+
return { transport, buildTurnResult, recovery, midstream };
|
|
406
|
+
}
|
|
359
407
|
async listModels() {
|
|
360
408
|
const apiKey = resolveProviderApiKey(this.name, this.config);
|
|
361
409
|
if (!apiKey) return MODELS;
|