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
|
@@ -132,103 +132,12 @@ export function createAntigravityRequest({
|
|
|
132
132
|
firstByte = ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
|
|
133
133
|
afterToolResult = false,
|
|
134
134
|
}) {
|
|
135
|
-
const log = (attempt, lastErr, delayMs) =>
|
|
136
|
-
|
|
137
|
-
const firstByteLimited = isFirstByteTimeout(lastErr) && firstByte.retries != null;
|
|
138
|
-
emitProviderRetryStage(opts.onStageChange, {
|
|
139
|
-
attempt: attempt + 1,
|
|
140
|
-
maxAttempts: firstByteLimited
|
|
141
|
-
? Math.min(ANTIGRAVITY_RETRY.maxAttempts, firstByte.retries + 1)
|
|
142
|
-
: ANTIGRAVITY_RETRY.maxAttempts,
|
|
143
|
-
lastErr,
|
|
144
|
-
delayMs,
|
|
145
|
-
});
|
|
146
|
-
process.stderr.write(`[antigravity] retry ${attempt + 1} after ${lastErr?.message || 'transient error'}\n`);
|
|
147
|
-
};
|
|
148
|
-
// Stamps what the attempt tells the user: how many attempts ran and, for a
|
|
149
|
-
// first-byte timeout, how long the model was given in total. A timeout past
|
|
150
|
-
// the first-byte retry budget ends the ladder here. A caller's cancellation
|
|
151
|
-
// reason may be shared by other requests and is never stamped.
|
|
152
|
-
const noteFailure = (err, { attemptSignal, windowMs, send }) => {
|
|
153
|
-
if (!err || typeof err !== 'object' || attemptSignal?.aborted) return err;
|
|
154
|
-
send.attempts += 1;
|
|
155
|
-
err.attempts = send.attempts;
|
|
156
|
-
if (!isFirstByteTimeout(err)) return err;
|
|
157
|
-
send.firstByteTimeouts += 1;
|
|
158
|
-
send.firstByteWaitedMs += windowMs;
|
|
159
|
-
err.waitedMs = send.firstByteWaitedMs;
|
|
160
|
-
err.providerLabel = 'Antigravity';
|
|
161
|
-
if (firstByte.retries != null && send.firstByteTimeouts > firstByte.retries) {
|
|
162
|
-
markProviderRecoveryExhausted(err, { owner: 'antigravity-first-byte', attempts: send.attempts, terminal: true });
|
|
163
|
-
}
|
|
164
|
-
return err;
|
|
165
|
-
};
|
|
135
|
+
const log = (attempt, lastErr, delayMs) =>
|
|
136
|
+
logAntigravityRetry(opts.onStageChange, firstByte, attempt, lastErr, delayMs);
|
|
166
137
|
const attemptOnce = (send) =>
|
|
167
138
|
withRetry(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
opts.onStageChange?.('requesting');
|
|
171
|
-
} catch {
|
|
172
|
-
/* heartbeat */
|
|
173
|
-
}
|
|
174
|
-
const windowMs = firstByteWindowMs(firstByte, send.firstByteTimeouts);
|
|
175
|
-
try {
|
|
176
|
-
const firstByteTimer = createTimeoutSignal(attemptSignal, windowMs, 'Antigravity first byte');
|
|
177
|
-
let res;
|
|
178
|
-
try {
|
|
179
|
-
const response = fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
|
|
180
|
-
method: 'POST',
|
|
181
|
-
headers,
|
|
182
|
-
body,
|
|
183
|
-
signal: firstByteTimer.signal,
|
|
184
|
-
dispatcher: getLlmDispatcher(),
|
|
185
|
-
});
|
|
186
|
-
// The request is on the wire and its headers are pending: the
|
|
187
|
-
// gateway sends them only with the first chunk, so this wait is
|
|
188
|
-
// the model's queueing and thinking time.
|
|
189
|
-
try {
|
|
190
|
-
opts.onStageChange?.(MODEL_THINKING_STAGE);
|
|
191
|
-
} catch {
|
|
192
|
-
/* heartbeat */
|
|
193
|
-
}
|
|
194
|
-
res = await response;
|
|
195
|
-
} catch (err) {
|
|
196
|
-
// Fetch surfaces AbortError; rethrow the timer/parent
|
|
197
|
-
// reason so same-host retry sees EPROVIDERTIMEOUT and
|
|
198
|
-
// a caller cancel stays a cancel.
|
|
199
|
-
if (firstByteTimer.signal.aborted && firstByteTimer.signal.reason instanceof Error) {
|
|
200
|
-
const reason = firstByteTimer.signal.reason;
|
|
201
|
-
if (!attemptSignal?.aborted) reason.timeoutPhase = TIMEOUT_PHASE.HEADERS;
|
|
202
|
-
throw reason;
|
|
203
|
-
}
|
|
204
|
-
throw err;
|
|
205
|
-
} finally {
|
|
206
|
-
firstByteTimer.cleanup();
|
|
207
|
-
}
|
|
208
|
-
// Headers arrived: the connection is live even while the model
|
|
209
|
-
// has not produced its first chunk.
|
|
210
|
-
try {
|
|
211
|
-
opts.onStreamDelta?.('transport');
|
|
212
|
-
} catch {}
|
|
213
|
-
if (!res.ok) {
|
|
214
|
-
const text = await res.text().catch(() => '');
|
|
215
|
-
const failure = antigravityError(res, text, endpoint);
|
|
216
|
-
// Capacity is paced by the local schedule below; the generic loop
|
|
217
|
-
// would sleep whatever wait the server names.
|
|
218
|
-
if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
|
|
219
|
-
throw failure;
|
|
220
|
-
}
|
|
221
|
-
try {
|
|
222
|
-
opts.onStageChange?.('streaming');
|
|
223
|
-
} catch {
|
|
224
|
-
/* heartbeat */
|
|
225
|
-
}
|
|
226
|
-
collector.beginAttempt();
|
|
227
|
-
return await collector.consume(res, attemptSignal, { firstByteTimeoutMs: windowMs });
|
|
228
|
-
} catch (err) {
|
|
229
|
-
throw noteFailure(err, { attemptSignal, windowMs, send });
|
|
230
|
-
}
|
|
231
|
-
},
|
|
139
|
+
({ signal: attemptSignal }) =>
|
|
140
|
+
streamAttempt({ fetchFn, endpoint, headers, body, opts, collector, firstByte, send, attemptSignal }),
|
|
232
141
|
{
|
|
233
142
|
...ANTIGRAVITY_RETRY,
|
|
234
143
|
finalOnExhaust: true,
|
|
@@ -261,16 +170,128 @@ export function createAntigravityRequest({
|
|
|
261
170
|
streamAttempt += 1;
|
|
262
171
|
await sleepWithAbort(reask.waitMs, signal, sleepFn, 'Antigravity retry wait aborted');
|
|
263
172
|
} catch (err) {
|
|
264
|
-
const waitMs =
|
|
265
|
-
if (waitMs == null) {
|
|
266
|
-
if (isCapacityFailure(err)) {
|
|
267
|
-
markProviderRecoveryExhausted(err, { owner: 'antigravity-capacity', attempts: tried });
|
|
268
|
-
}
|
|
269
|
-
throw err;
|
|
270
|
-
}
|
|
173
|
+
const waitMs = scheduledRetryWaitMs(err, state, tried);
|
|
271
174
|
log(tried, err, waitMs);
|
|
272
175
|
await sleepWithAbort(waitMs, signal, sleepFn, 'Antigravity retry wait aborted');
|
|
273
176
|
}
|
|
274
177
|
}
|
|
275
178
|
};
|
|
276
179
|
}
|
|
180
|
+
|
|
181
|
+
// The retry status and log line of one scheduled retry. A first-byte timeout
|
|
182
|
+
// runs on its own, shorter retry budget.
|
|
183
|
+
function logAntigravityRetry(onStageChange, firstByte, attempt, lastErr, delayMs) {
|
|
184
|
+
const firstByteLimited = isFirstByteTimeout(lastErr) && firstByte.retries != null;
|
|
185
|
+
emitProviderRetryStage(onStageChange, {
|
|
186
|
+
attempt: attempt + 1,
|
|
187
|
+
maxAttempts: firstByteLimited
|
|
188
|
+
? Math.min(ANTIGRAVITY_RETRY.maxAttempts, firstByte.retries + 1)
|
|
189
|
+
: ANTIGRAVITY_RETRY.maxAttempts,
|
|
190
|
+
lastErr,
|
|
191
|
+
delayMs,
|
|
192
|
+
providerLabel: 'Antigravity',
|
|
193
|
+
});
|
|
194
|
+
process.stderr.write(`[antigravity] retry ${attempt + 1} after ${lastErr?.message || 'transient error'}\n`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// The local wait before re-sending a failed request (429 / capacity schedule);
|
|
198
|
+
// a failure the schedule does not retry is rethrown, a capacity one marked
|
|
199
|
+
// exhausted after `tried` sends.
|
|
200
|
+
function scheduledRetryWaitMs(err, state, tried) {
|
|
201
|
+
const waitMs = antigravity429WaitMs(err, state);
|
|
202
|
+
if (waitMs == null) {
|
|
203
|
+
if (isCapacityFailure(err)) {
|
|
204
|
+
markProviderRecoveryExhausted(err, { owner: 'antigravity-capacity', attempts: tried });
|
|
205
|
+
}
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
return waitMs;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// One POST under the first-byte window: headers pending is the model's
|
|
212
|
+
// thinking time, a non-OK body becomes the typed error, and a live stream is
|
|
213
|
+
// handed to the collector for this attempt.
|
|
214
|
+
async function streamAttempt({ fetchFn, endpoint, headers, body, opts, collector, firstByte, send, attemptSignal }) {
|
|
215
|
+
try {
|
|
216
|
+
opts.onStageChange?.('requesting');
|
|
217
|
+
} catch {
|
|
218
|
+
/* heartbeat */
|
|
219
|
+
}
|
|
220
|
+
const windowMs = firstByteWindowMs(firstByte, send.firstByteTimeouts);
|
|
221
|
+
try {
|
|
222
|
+
const firstByteTimer = createTimeoutSignal(attemptSignal, windowMs, 'Antigravity first byte');
|
|
223
|
+
let res;
|
|
224
|
+
try {
|
|
225
|
+
const response = fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
|
|
226
|
+
method: 'POST',
|
|
227
|
+
headers,
|
|
228
|
+
body,
|
|
229
|
+
signal: firstByteTimer.signal,
|
|
230
|
+
dispatcher: getLlmDispatcher(),
|
|
231
|
+
});
|
|
232
|
+
// The request is on the wire and its headers are pending: the
|
|
233
|
+
// gateway sends them only with the first chunk, so this wait is
|
|
234
|
+
// the model's queueing and thinking time.
|
|
235
|
+
try {
|
|
236
|
+
opts.onStageChange?.(MODEL_THINKING_STAGE);
|
|
237
|
+
} catch {
|
|
238
|
+
/* heartbeat */
|
|
239
|
+
}
|
|
240
|
+
res = await response;
|
|
241
|
+
} catch (err) {
|
|
242
|
+
// Fetch surfaces AbortError; rethrow the timer/parent
|
|
243
|
+
// reason so same-host retry sees EPROVIDERTIMEOUT and
|
|
244
|
+
// a caller cancel stays a cancel.
|
|
245
|
+
if (firstByteTimer.signal.aborted && firstByteTimer.signal.reason instanceof Error) {
|
|
246
|
+
const reason = firstByteTimer.signal.reason;
|
|
247
|
+
if (!attemptSignal?.aborted) reason.timeoutPhase = TIMEOUT_PHASE.HEADERS;
|
|
248
|
+
throw reason;
|
|
249
|
+
}
|
|
250
|
+
throw err;
|
|
251
|
+
} finally {
|
|
252
|
+
firstByteTimer.cleanup();
|
|
253
|
+
}
|
|
254
|
+
// Headers arrived: the connection is live even while the model
|
|
255
|
+
// has not produced its first chunk.
|
|
256
|
+
try {
|
|
257
|
+
opts.onStreamDelta?.('transport');
|
|
258
|
+
} catch {
|
|
259
|
+
// the stream-delta observer is advisory
|
|
260
|
+
}
|
|
261
|
+
if (!res.ok) {
|
|
262
|
+
const text = await res.text().catch(() => '');
|
|
263
|
+
const failure = antigravityError(res, text, endpoint);
|
|
264
|
+
// Capacity is paced by the local schedule; the generic loop
|
|
265
|
+
// would sleep whatever wait the server names.
|
|
266
|
+
if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
|
|
267
|
+
throw failure;
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
opts.onStageChange?.('streaming');
|
|
271
|
+
} catch {
|
|
272
|
+
/* heartbeat */
|
|
273
|
+
}
|
|
274
|
+
collector.beginAttempt();
|
|
275
|
+
return await collector.consume(res, attemptSignal, { firstByteTimeoutMs: windowMs });
|
|
276
|
+
} catch (err) {
|
|
277
|
+
throw noteAttemptFailure(err, { attemptSignal, windowMs, send, firstByte });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Stamps what the attempt tells the user: how many attempts ran and, for a
|
|
282
|
+
// first-byte timeout, how long the model was given in total. A timeout past
|
|
283
|
+
// the first-byte retry budget ends the ladder here. A caller's cancellation
|
|
284
|
+
// reason may be shared by other requests and is never stamped.
|
|
285
|
+
function noteAttemptFailure(err, { attemptSignal, windowMs, send, firstByte }) {
|
|
286
|
+
if (!err || typeof err !== 'object' || attemptSignal?.aborted) return err;
|
|
287
|
+
send.attempts += 1;
|
|
288
|
+
err.attempts = send.attempts;
|
|
289
|
+
if (!isFirstByteTimeout(err)) return err;
|
|
290
|
+
send.firstByteTimeouts += 1;
|
|
291
|
+
send.firstByteWaitedMs += windowMs;
|
|
292
|
+
err.waitedMs = send.firstByteWaitedMs;
|
|
293
|
+
if (firstByte.retries != null && send.firstByteTimeouts > firstByte.retries) {
|
|
294
|
+
markProviderRecoveryExhausted(err, { owner: 'antigravity-first-byte', attempts: send.attempts, terminal: true });
|
|
295
|
+
}
|
|
296
|
+
return err;
|
|
297
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// cache-warm-admission.mjs — the account gate of a cache warm
|
|
2
|
+
// (anthropic-cache-warm.mjs). A warm never waits, queues, rotates accounts or
|
|
3
|
+
// retries: right before its POST it reads the state a normal send consults
|
|
4
|
+
// for the account it goes to — the Developer option, the account's admission
|
|
5
|
+
// lane (rate-limit cooldown, a lane throttled after a 429), the account
|
|
6
|
+
// roster's blocks and quota windows, and the session's quota-resume pause —
|
|
7
|
+
// and is skipped when any of them holds or when no fresh quota reading says
|
|
8
|
+
// the account has room. A warm's own refusal is recorded like a send's: a 429
|
|
9
|
+
// in the lane cooldown, and the roster's verdict through the account pool.
|
|
10
|
+
import {
|
|
11
|
+
ACCOUNT_PROVIDERS,
|
|
12
|
+
providerAccountExhausted,
|
|
13
|
+
quotaReadingFresh,
|
|
14
|
+
readProviderAccountPool,
|
|
15
|
+
staleQuotaWindows,
|
|
16
|
+
} from '../../../shared/provider-accounts.mjs';
|
|
17
|
+
import { quotaResumeEntry } from '../../../shared/quota-resume-store.mjs';
|
|
18
|
+
import { recordAccountRefusal } from './account-pool.mjs';
|
|
19
|
+
import { providerAdmissionKey, providerAdmissionScheduler } from './admission-scheduler.mjs';
|
|
20
|
+
import { readCachedOAuthUsageSnapshot } from './oauth-usage.mjs';
|
|
21
|
+
import { providerAvailable } from './provider-availability.mjs';
|
|
22
|
+
|
|
23
|
+
function readingBlock(providerName, windows, checkedAt, now, exhausted) {
|
|
24
|
+
if (!Array.isArray(windows) || !quotaReadingFresh(checkedAt, now)) return 'no fresh quota reading';
|
|
25
|
+
if (staleQuotaWindows(providerName, windows)) return 'no fresh quota reading';
|
|
26
|
+
return exhausted ? 'account blocked or quota exhausted' : null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function rosterBlock(providerName, accountId, model, now) {
|
|
30
|
+
if (!ACCOUNT_PROVIDERS.includes(providerName)) return null;
|
|
31
|
+
const pool = readProviderAccountPool(providerName);
|
|
32
|
+
const useCredits = pool.useCredits === true;
|
|
33
|
+
if (!pool.accounts.length) {
|
|
34
|
+
if (useCredits) return null;
|
|
35
|
+
const stored = readCachedOAuthUsageSnapshot({ provider: providerName, model: '' });
|
|
36
|
+
const row = stored ? { usage: { windows: stored.quotaWindows, checkedAt: stored.cachedAt } } : null;
|
|
37
|
+
return readingBlock(
|
|
38
|
+
providerName,
|
|
39
|
+
stored?.quotaWindows,
|
|
40
|
+
stored?.cachedAt,
|
|
41
|
+
now,
|
|
42
|
+
row && providerAccountExhausted(row, now, model)
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
if (!accountId) return 'account holding the cache unknown';
|
|
46
|
+
const row = pool.accounts.find((entry) => entry.id === accountId);
|
|
47
|
+
if (!row) return 'account not connected';
|
|
48
|
+
const exhausted = providerAccountExhausted(row, now, model, { useCredits });
|
|
49
|
+
if (useCredits) return exhausted ? 'account blocked' : null;
|
|
50
|
+
return readingBlock(providerName, row.usage?.windows, row.usage?.checkedAt, now, exhausted);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Why a warm on `instance` (account `accountId` of `providerName`; no id for
|
|
55
|
+
* a provider without an account roster) may not be sent now, or null. The
|
|
56
|
+
* instance's admission lane — the one its ordinary sends are admitted on —
|
|
57
|
+
* cooling down or throttled blocks it. Never waits.
|
|
58
|
+
*/
|
|
59
|
+
export function cacheWarmAccountBlock(
|
|
60
|
+
providerName,
|
|
61
|
+
instance,
|
|
62
|
+
{ accountId = '', model = '', sessionId = '', scheduler = providerAdmissionScheduler, now = Date.now() } = {}
|
|
63
|
+
) {
|
|
64
|
+
if (!providerAvailable(providerName)) return 'provider disabled';
|
|
65
|
+
const lane = scheduler.immediateBlock(providerAdmissionKey(providerName, instance));
|
|
66
|
+
if (lane) return lane;
|
|
67
|
+
if (sessionId && quotaResumeEntry(sessionId)) return 'session paused until its quota resets';
|
|
68
|
+
return rosterBlock(providerName, accountId, model, now);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** The error a skipped warm rejects with (nothing was sent or billed). */
|
|
72
|
+
export function cacheWarmBlockedError(reason) {
|
|
73
|
+
return Object.assign(new Error(`cache warm skipped: ${reason}`), { code: 'ECACHEWARMBLOCKED', usage: null });
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Feed a warm's refusal into the shared state a send's would reach (the
|
|
77
|
+
* lane keeps 429s only; the roster judges every refusal as the pool's send
|
|
78
|
+
* does). A warm the caller aborted is no refusal. */
|
|
79
|
+
export async function recordCacheWarmRefusal(
|
|
80
|
+
providerName,
|
|
81
|
+
instance,
|
|
82
|
+
error,
|
|
83
|
+
{ accountId = '', model = '', aborted = false, scheduler = providerAdmissionScheduler } = {}
|
|
84
|
+
) {
|
|
85
|
+
if (aborted || error?.code === 'ECACHEWARMBLOCKED') return;
|
|
86
|
+
scheduler.recordRateLimit(providerAdmissionKey(providerName, instance), error);
|
|
87
|
+
if (accountId && ACCOUNT_PROVIDERS.includes(providerName)) {
|
|
88
|
+
await recordAccountRefusal(providerName, accountId, model, error, instance);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// A pasted key or pasted callback JSON completes the same login by hand. The
|
|
4
4
|
// first sign-in on a machine adopts an existing Command Code CLI login instead.
|
|
5
5
|
import { createServer } from 'node:http';
|
|
6
|
+
import { listenOn } from './lib/listen-on.mjs';
|
|
6
7
|
import { randomBytes } from 'node:crypto';
|
|
7
8
|
import { readFileSync } from 'node:fs';
|
|
8
9
|
import { homedir } from 'node:os';
|
|
@@ -95,16 +96,6 @@ function readLocalAuth(path) {
|
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
|
|
98
|
-
function listenOn(server, port, host) {
|
|
99
|
-
return new Promise((resolve, reject) => {
|
|
100
|
-
server.once('error', reject);
|
|
101
|
-
server.listen(port, host, () => {
|
|
102
|
-
server.off('error', reject);
|
|
103
|
-
resolve();
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
99
|
function readBody(req) {
|
|
109
100
|
return new Promise((resolve, reject) => {
|
|
110
101
|
const chunks = [];
|
|
@@ -5,6 +5,7 @@ import http2 from 'node:http2';
|
|
|
5
5
|
import { MAX_CONNECT_FRAME_BYTES, createCursorByteQueue } from './cursor-wire-guards.mjs';
|
|
6
6
|
import { cursorClientVersion, warmCursorClientVersion } from './cursor-client-version.mjs';
|
|
7
7
|
import { retryAfterMsFromError } from './retry-classifier.mjs';
|
|
8
|
+
import { providerTimeoutError } from '../stall-policy.mjs';
|
|
8
9
|
|
|
9
10
|
export { warmCursorClientVersion };
|
|
10
11
|
|
|
@@ -153,7 +154,9 @@ export function openCursorStream({ accessToken, path = RUN_PATH, url = API_URL }
|
|
|
153
154
|
if (closed || session.closed || session.destroyed) return;
|
|
154
155
|
try {
|
|
155
156
|
session.ping(() => {});
|
|
156
|
-
} catch {
|
|
157
|
+
} catch {
|
|
158
|
+
// the session may have closed since the check above
|
|
159
|
+
}
|
|
157
160
|
}, H2_PING_INTERVAL_MS);
|
|
158
161
|
ping.unref?.();
|
|
159
162
|
|
|
@@ -175,20 +178,28 @@ export function openCursorStream({ accessToken, path = RUN_PATH, url = API_URL }
|
|
|
175
178
|
closeError = error || (status >= 400 ? httpStatusError(status, responseHeaders) : null);
|
|
176
179
|
try {
|
|
177
180
|
request.close();
|
|
178
|
-
} catch {
|
|
181
|
+
} catch {
|
|
182
|
+
// the request stream may already be closed
|
|
183
|
+
}
|
|
179
184
|
try {
|
|
180
185
|
session.close();
|
|
181
|
-
} catch {
|
|
186
|
+
} catch {
|
|
187
|
+
// the session may already be closed
|
|
188
|
+
}
|
|
182
189
|
closeHandler?.(closeError);
|
|
183
190
|
};
|
|
184
191
|
const close = (error = null) => {
|
|
185
192
|
if (closed) return;
|
|
186
193
|
try {
|
|
187
194
|
request.close(http2.constants.NGHTTP2_CANCEL);
|
|
188
|
-
} catch {
|
|
195
|
+
} catch {
|
|
196
|
+
// the request stream may already be closed
|
|
197
|
+
}
|
|
189
198
|
try {
|
|
190
199
|
session.destroy();
|
|
191
|
-
} catch {
|
|
200
|
+
} catch {
|
|
201
|
+
// the session may already be destroyed
|
|
202
|
+
}
|
|
192
203
|
finish(error);
|
|
193
204
|
};
|
|
194
205
|
|
|
@@ -243,17 +254,21 @@ export async function callCursorUnary({ accessToken, path, body, url = API_URL,
|
|
|
243
254
|
let status = 0;
|
|
244
255
|
let responseHeaders = null;
|
|
245
256
|
let settled = false;
|
|
246
|
-
const timeout = setTimeout(() => finish(
|
|
257
|
+
const timeout = setTimeout(() => finish(providerTimeoutError('Cursor request', timeoutMs)), timeoutMs);
|
|
247
258
|
const finish = (error = null) => {
|
|
248
259
|
if (settled) return;
|
|
249
260
|
settled = true;
|
|
250
261
|
clearTimeout(timeout);
|
|
251
262
|
try {
|
|
252
263
|
request.close();
|
|
253
|
-
} catch {
|
|
264
|
+
} catch {
|
|
265
|
+
// the request stream may already be closed
|
|
266
|
+
}
|
|
254
267
|
try {
|
|
255
268
|
session.close();
|
|
256
|
-
} catch {
|
|
269
|
+
} catch {
|
|
270
|
+
// the session may already be closed
|
|
271
|
+
}
|
|
257
272
|
if (error) reject(error);
|
|
258
273
|
else if (status >= 400) reject(httpStatusError(status, responseHeaders));
|
|
259
274
|
else resolve(Buffer.concat(chunks));
|
|
@@ -322,7 +337,8 @@ export function parseEndStream(bytes) {
|
|
|
322
337
|
if (!payload?.error) return null;
|
|
323
338
|
const connectCode = String(payload.error.code || 'error').toLowerCase();
|
|
324
339
|
const detail = String(payload.error.message || 'request failed');
|
|
325
|
-
const tooLarge =
|
|
340
|
+
const tooLarge =
|
|
341
|
+
connectCode === 'resource_exhausted' && !THROTTLE_CUE_RE.test(detail) && REQUEST_TOO_LARGE_RE.test(detail);
|
|
326
342
|
const retryAfter =
|
|
327
343
|
payload.error.retryAfter ??
|
|
328
344
|
payload.error.retry_after ??
|
|
@@ -132,7 +132,9 @@ async function* responseSseEvents(response, signal) {
|
|
|
132
132
|
if (signal) {
|
|
133
133
|
try {
|
|
134
134
|
signal.removeEventListener('abort', onAbort);
|
|
135
|
-
} catch {
|
|
135
|
+
} catch {
|
|
136
|
+
// the abort listener may already be gone
|
|
137
|
+
}
|
|
136
138
|
}
|
|
137
139
|
if (aborted) await reader.cancel().catch(() => {});
|
|
138
140
|
}
|
|
@@ -480,16 +482,10 @@ function selectParameterizedCursorVariant(group, requested, sendOpts = {}) {
|
|
|
480
482
|
availableVariants[0] ||
|
|
481
483
|
null;
|
|
482
484
|
const parameters = { ...(defaultVariant?.parameters || {}), ...aliasParameters };
|
|
485
|
+
const defaultContext = parameters.context;
|
|
483
486
|
const routeParameters =
|
|
484
487
|
sendOpts.modelParameters && typeof sendOpts.modelParameters === 'object' ? sendOpts.modelParameters : {};
|
|
485
|
-
// The window picked the mode above: a stored `context` no variant of that
|
|
486
|
-
// mode offers (a 256k left beside a raised 500K window) is a stale value and
|
|
487
|
-
// yields to the mode's own; one the mode offers stays the user's choice.
|
|
488
|
-
const staleContext =
|
|
489
|
-
Object.hasOwn(routeParameters, 'context') &&
|
|
490
|
-
!availableVariants.some((variant) => String(variant.parameters?.context ?? '') === String(routeParameters.context));
|
|
491
488
|
for (const definition of group.definitions) {
|
|
492
|
-
if (staleContext && definition.id === 'context') continue;
|
|
493
489
|
if (Object.hasOwn(routeParameters, definition.id)) {
|
|
494
490
|
parameters[definition.id] = String(routeParameters[definition.id]);
|
|
495
491
|
}
|
|
@@ -508,9 +504,18 @@ function selectParameterizedCursorVariant(group, requested, sendOpts = {}) {
|
|
|
508
504
|
) {
|
|
509
505
|
parameters.fast = sendOpts.fast === true ? 'true' : 'false';
|
|
510
506
|
}
|
|
511
|
-
const
|
|
512
|
-
Object.entries(parameters).every(([id, value]) => String(variant.parameters?.[id] ?? '') === String(value))
|
|
513
|
-
);
|
|
507
|
+
const matches = (variant) =>
|
|
508
|
+
Object.entries(parameters).every(([id, value]) => String(variant.parameters?.[id] ?? '') === String(value));
|
|
509
|
+
let selected = availableVariants.find(matches);
|
|
510
|
+
// Keep a supported explicit context. A persisted context can exist in this
|
|
511
|
+
// mode but conflict with its requested effort/fast/other options. In that
|
|
512
|
+
// case try only the mode's default context, preserving every other choice
|
|
513
|
+
// and still rejecting the request unless the full combination is offered.
|
|
514
|
+
if (!selected && Object.hasOwn(routeParameters, 'context')) {
|
|
515
|
+
if (defaultContext === undefined) delete parameters.context;
|
|
516
|
+
else parameters.context = defaultContext;
|
|
517
|
+
selected = availableVariants.find(matches);
|
|
518
|
+
}
|
|
514
519
|
if (!selected && availableVariants.length) {
|
|
515
520
|
throw new Error(`Cursor model ${group.id} does not offer the selected parameter combination`);
|
|
516
521
|
}
|
|
@@ -649,7 +654,9 @@ class CursorProviderBase {
|
|
|
649
654
|
let emittedToolCall = false;
|
|
650
655
|
try {
|
|
651
656
|
sendOpts.onStageChange?.('requesting');
|
|
652
|
-
} catch {
|
|
657
|
+
} catch {
|
|
658
|
+
// the stage observer is advisory
|
|
659
|
+
}
|
|
653
660
|
try {
|
|
654
661
|
const response = await runtime.handleChatCompletion(body, accessToken, {
|
|
655
662
|
onStageChange: sendOpts.onStageChange,
|
|
@@ -664,10 +671,15 @@ class CursorProviderBase {
|
|
|
664
671
|
});
|
|
665
672
|
try {
|
|
666
673
|
sendOpts.onStageChange?.('streaming');
|
|
667
|
-
} catch {
|
|
674
|
+
} catch {
|
|
675
|
+
// the stage observer is advisory
|
|
676
|
+
}
|
|
668
677
|
return await consumeCompatChatCompletionStream(responseSseEvents(response, signal), {
|
|
669
678
|
signal,
|
|
670
679
|
label: this.name,
|
|
680
|
+
// The wrapper below always exists; the stream joins the session's
|
|
681
|
+
// logical request only when the caller reports progress into it.
|
|
682
|
+
sessionId: typeof sendOpts.onStreamDelta === 'function' ? sendOpts.sessionId : null,
|
|
671
683
|
onStreamDelta: (delta) => {
|
|
672
684
|
sendOpts.onStreamDelta?.(delta);
|
|
673
685
|
},
|
|
@@ -193,7 +193,7 @@ function connectError(
|
|
|
193
193
|
const error = new DevinWireError(text, {
|
|
194
194
|
code: finalCode,
|
|
195
195
|
// A reworded throttle reports its throttle status, not the carrier's.
|
|
196
|
-
status: tooLarge ? 413 :
|
|
196
|
+
status: tooLarge ? 413 : reworded ? mappedStatus : status || mappedStatus,
|
|
197
197
|
retryable: tooLarge ? false : retryable,
|
|
198
198
|
connectCode: code,
|
|
199
199
|
detail: [detail, detailsSummary].filter(Boolean).join(' '),
|
|
@@ -405,6 +405,9 @@ export class DevinOAuthProvider {
|
|
|
405
405
|
signal,
|
|
406
406
|
label: this.name,
|
|
407
407
|
providerName: this.name,
|
|
408
|
+
// The wrapper below always exists; the stream joins the session's
|
|
409
|
+
// logical request only when the caller reports progress into it.
|
|
410
|
+
sessionId: typeof sendOpts.onStreamDelta === 'function' ? sendOpts.sessionId : null,
|
|
408
411
|
onStreamDelta: (delta) => {
|
|
409
412
|
if (!streaming) {
|
|
410
413
|
streaming = true;
|