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.
Files changed (515) hide show
  1. package/NOTICE.md +2 -2
  2. package/README.md +2 -2
  3. package/package.json +2 -11
  4. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/gate-local.mjs +16 -5
  7. package/scripts/latest-guard.mjs +21 -9
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +37 -37
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +123 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/native-release-status.mjs +2 -2
  14. package/scripts/post-release-check.mjs +1 -6
  15. package/scripts/pptx-kit-index.mjs +17 -4
  16. package/scripts/recall-history-cases.json +1 -1
  17. package/scripts/suite-health.mjs +20 -2
  18. package/scripts/test-data-dir.mjs +10 -7
  19. package/scripts/test.mjs +7 -11
  20. package/src/agents/reviewer/AGENT.md +7 -11
  21. package/src/agents/reviewer/agent.json +1 -1
  22. package/src/app.mjs +4 -0
  23. package/src/defaults/shipped-history.json +22 -1
  24. package/src/defaults/skills/browser-use/SKILL.md +62 -12
  25. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  26. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  27. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  28. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  29. package/src/defaults/skills/computer-use/SKILL.md +35 -9
  30. package/src/defaults/skills/setup/SKILL.md +22 -0
  31. package/src/defaults/skills/setup/references/actions.md +39 -5
  32. package/src/defaults/skills/setup/references/surfaces.md +11 -2
  33. package/src/defaults/skills/visualize/SKILL.md +2 -1
  34. package/src/lib/rules-builder.cjs +39 -20
  35. package/src/output-styles/common.md +2 -2
  36. package/src/output-styles/simple.md +1 -1
  37. package/src/rules/agent/AGENT.md +11 -10
  38. package/src/rules/lead/LEAD.md +23 -20
  39. package/src/rules/shared/05-tool-calls.md +5 -6
  40. package/src/rules/shared/10-tool-workflow.md +4 -0
  41. package/src/rules/shared/45-destructive.md +0 -2
  42. package/src/rules/shared/50-execution.md +2 -0
  43. package/src/rules/shared/60-verification.md +7 -5
  44. package/src/rules/shared/70-delivery.md +7 -9
  45. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
  46. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  47. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  48. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  49. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  50. package/src/runtime/agent/orchestrator/config.mjs +17 -1
  51. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  52. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
  53. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
  54. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  55. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
  56. package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
  57. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
  58. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
  59. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
  60. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  63. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  66. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
  71. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  72. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
  73. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  74. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  75. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
  76. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  77. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  78. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  79. package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  82. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
  83. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  84. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  85. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  87. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  88. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  89. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  90. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  91. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  92. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  93. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  104. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  106. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  107. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  113. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
  117. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  118. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  119. package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
  120. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  121. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  122. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
  123. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  124. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  125. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  126. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
  127. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
  131. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  132. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  133. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
  134. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  136. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  137. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  138. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
  139. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  140. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  141. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  142. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
  143. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
  144. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  145. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  146. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
  147. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
  148. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
  149. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
  150. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  151. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
  152. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
  153. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
  154. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
  155. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  158. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
  159. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
  162. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  163. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  164. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
  165. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  166. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
  167. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  168. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  172. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  173. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  174. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
  175. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  176. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  177. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
  178. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
  179. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
  180. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  181. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
  182. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
  183. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
  185. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  187. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
  188. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
  189. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  191. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
  192. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  193. package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
  194. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  195. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  196. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  197. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  198. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  199. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  200. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  201. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  203. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
  209. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  210. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  211. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  213. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
  214. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  217. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  218. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  221. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  222. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  224. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  225. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
  226. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
  227. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  228. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
  229. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  231. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  232. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  233. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  234. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  235. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  236. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  237. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  238. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  239. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  240. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  241. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
  243. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  244. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  245. package/src/runtime/browser-bridge/client.mjs +73 -8
  246. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  247. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  248. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  249. package/src/runtime/channels/lib/config.mjs +6 -61
  250. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  251. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  252. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  253. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  254. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  255. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  256. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  257. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  258. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  259. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  260. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  261. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  262. package/src/runtime/channels/lib/scheduler.mjs +33 -147
  263. package/src/runtime/channels/lib/schedules-db.mjs +34 -11
  264. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  265. package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
  266. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  267. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  268. package/src/runtime/channels/lib/whisper-port.mjs +10 -1
  269. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  270. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  271. package/src/runtime/channels/lib/worker-main.mjs +10 -34
  272. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  273. package/src/runtime/computer-bridge/actions.mjs +9 -1
  274. package/src/runtime/computer-bridge/client.mjs +180 -8
  275. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  276. package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
  277. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  278. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  279. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  280. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  281. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  282. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  283. package/src/runtime/connectors/google-mcp.mjs +10 -12
  284. package/src/runtime/local-provider/server-process.mjs +2 -1
  285. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  286. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  287. package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
  288. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  289. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  290. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  291. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  292. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  293. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  294. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  295. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  296. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  297. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  298. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  299. package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
  300. package/src/runtime/office/quality/design-review.mjs +1 -5
  301. package/src/runtime/office/quality/document-brief.mjs +1 -5
  302. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  303. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  304. package/src/runtime/session-search/session-search-db.mjs +73 -9
  305. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  306. package/src/runtime/shared/abort-race.mjs +89 -0
  307. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  308. package/src/runtime/shared/agent-kind.mjs +4 -3
  309. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  310. package/src/runtime/shared/bounded-download.mjs +8 -3
  311. package/src/runtime/shared/config.mjs +2 -13
  312. package/src/runtime/shared/connector-accounts.mjs +20 -10
  313. package/src/runtime/shared/connector-catalog.d.mts +29 -0
  314. package/src/runtime/shared/connector-catalog.mjs +150 -0
  315. package/src/runtime/shared/connector-triggers.mjs +22 -19
  316. package/src/runtime/shared/defaults-separation.mjs +2 -17
  317. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  318. package/src/runtime/shared/err-text.mjs +24 -15
  319. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  320. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  321. package/src/runtime/shared/file-permissions.d.mts +0 -8
  322. package/src/runtime/shared/file-permissions.mjs +0 -11
  323. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  324. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  325. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  326. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  327. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  328. package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
  329. package/src/runtime/shared/llm/cost.mjs +5 -1
  330. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  331. package/src/runtime/shared/loopback-listener.mjs +25 -2
  332. package/src/runtime/shared/mixy-presence.mjs +22 -0
  333. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  334. package/src/runtime/shared/model-route-chain.mjs +22 -4
  335. package/src/runtime/shared/open-url.mjs +10 -0
  336. package/src/runtime/shared/orchestration.d.mts +2 -0
  337. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  338. package/src/runtime/shared/profile-config.cjs +1 -1
  339. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  340. package/src/runtime/shared/prompt-origin.mjs +21 -0
  341. package/src/runtime/shared/provider-accounts.mjs +7 -1
  342. package/src/runtime/shared/provider-display-name.mjs +29 -0
  343. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  344. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  345. package/src/runtime/shared/routine-trigger.mjs +10 -0
  346. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  347. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  348. package/src/runtime/shared/session-activity-signal.mjs +48 -1
  349. package/src/runtime/shared/session-scratch.mjs +37 -0
  350. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  351. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  352. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  353. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  354. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  355. package/src/runtime/shared/tool-result-summary.mjs +2 -15
  356. package/src/runtime/shared/tool-surface.mjs +3 -0
  357. package/src/runtime/shared/tool-work-units.mjs +2 -0
  358. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  359. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  360. package/src/runtime/shared/worktrees/git.mjs +15 -0
  361. package/src/runtime/shared/worktrees/manager.mjs +87 -38
  362. package/src/runtime/shared/worktrees/test-support.mjs +14 -13
  363. package/src/runtime/terminal-bridge/client.mjs +10 -1
  364. package/src/runtime/visualize-bridge/client.mjs +29 -8
  365. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  366. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  367. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  368. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  369. package/src/session-runtime/agent-home-delivery.mjs +489 -185
  370. package/src/session-runtime/agent-task-sessions.mjs +467 -229
  371. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  372. package/src/session-runtime/boot/apis.mjs +9 -0
  373. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  374. package/src/session-runtime/boot/providers.mjs +3 -0
  375. package/src/session-runtime/boot/tools.mjs +11 -2
  376. package/src/session-runtime/bot-status.mjs +12 -6
  377. package/src/session-runtime/bot-target.mjs +38 -0
  378. package/src/session-runtime/channel-config-api.mjs +6 -1
  379. package/src/session-runtime/config-lifecycle.mjs +6 -0
  380. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  381. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  382. package/src/session-runtime/conversation-import/discovery.mjs +271 -25
  383. package/src/session-runtime/conversation-import/service.mjs +26 -5
  384. package/src/session-runtime/handoff-attachments.mjs +82 -31
  385. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
  386. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
  387. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  388. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
  389. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  390. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  391. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
  392. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  393. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  394. package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
  395. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  396. package/src/session-runtime/mixy-heartbeat.mjs +153 -33
  397. package/src/session-runtime/model-route/set-route.mjs +11 -2
  398. package/src/session-runtime/notification-bus.mjs +31 -117
  399. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  400. package/src/session-runtime/notification-listeners.mjs +76 -0
  401. package/src/session-runtime/owned-automation-run.mjs +2 -1
  402. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  403. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  404. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  405. package/src/session-runtime/provider-models.mjs +4 -2
  406. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  407. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  408. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  409. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  410. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  411. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  412. package/src/session-runtime/resource-recall-api.mjs +6 -1
  413. package/src/session-runtime/routine-owner.mjs +40 -9
  414. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  415. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  416. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  417. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  418. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  419. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  420. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
  421. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  422. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  423. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  424. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  425. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  426. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  427. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  428. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  429. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  430. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  431. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  432. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  433. package/src/session-runtime/services/channel-admin.mjs +7 -13
  434. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  435. package/src/session-runtime/services/provider-admin.mjs +2 -1
  436. package/src/session-runtime/services/seeds.mjs +0 -28
  437. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  438. package/src/session-runtime/session-create/session-options.mjs +1 -0
  439. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  440. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  441. package/src/session-runtime/settings-system-api.mjs +13 -1
  442. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  443. package/src/session-runtime/setup-tool/executor.mjs +145 -22
  444. package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
  445. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  446. package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
  447. package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
  448. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  449. package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
  450. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  451. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  452. package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
  453. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  454. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  455. package/src/session-runtime/workspace/transitions.mjs +25 -0
  456. package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
  457. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  458. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  459. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  460. package/src/standalone/channel-transport.mjs +1 -1
  461. package/src/standalone/daemon-channels-loader.mjs +10 -8
  462. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  463. package/src/standalone/daemon-session-control/request.mjs +51 -0
  464. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  465. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  466. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  467. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  468. package/src/standalone/daemon-session-control.mjs +142 -190
  469. package/src/standalone/daemon.mjs +26 -3
  470. package/src/standalone/session-client.mjs +7 -3
  471. package/src/standalone/session-protocol.mjs +5 -0
  472. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  473. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  474. package/src/standalone/session-service/quota-resume.mjs +3 -0
  475. package/src/standalone/session-service/retention/busy.mjs +65 -1
  476. package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
  477. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  478. package/src/standalone/session-tool-output.mjs +15 -7
  479. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  480. package/src/tui/app/app-view/floating-panel.jsx +7 -4
  481. package/src/tui/app/model-options.mjs +3 -28
  482. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  483. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  484. package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
  485. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  486. package/src/tui/app/provider-setup-picker.mjs +9 -5
  487. package/src/tui/components/QuestionPanel.jsx +13 -4
  488. package/src/tui/dist/index.mjs +133 -92
  489. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  490. package/src/tui/session/initial-state.mjs +3 -0
  491. package/src/tui/session/notice-surface.mjs +7 -1
  492. package/src/tui/session/queue-helpers.mjs +3 -42
  493. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  494. package/src/tui/session/session-api/routes-write.mjs +5 -1
  495. package/src/tui/session/session-api/routes.mjs +1 -0
  496. package/src/tui/session/session-api/settings.mjs +17 -1
  497. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  498. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  499. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  500. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  501. package/src/tui/session/session-flow/drain.mjs +118 -149
  502. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  503. package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
  504. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  505. package/src/tui/session/tool-approval-request.mjs +39 -0
  506. package/src/tui/session/tool-approval-settle.mjs +62 -0
  507. package/src/tui/session/tool-approval.mjs +69 -115
  508. package/src/tui/session/tui-steering-persist.mjs +8 -1
  509. package/src/tui/session/turn-stream.mjs +19 -2
  510. package/src/tui/session/turn.mjs +1 -0
  511. package/src/ui/statusline-agents.mjs +1 -3
  512. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  513. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  514. package/scripts/code-graph-description-contract.mjs +0 -188
  515. 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
- // A first-byte timeout runs on its own, shorter retry budget.
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
- async ({ signal: attemptSignal }) => {
169
- try {
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 = antigravity429WaitMs(err, state);
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(new Error('Cursor request timed out')), timeoutMs);
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 = connectCode === 'resource_exhausted' && !THROTTLE_CUE_RE.test(detail) && REQUEST_TOO_LARGE_RE.test(detail);
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 selected = availableVariants.find((variant) =>
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 : (reworded ? mappedStatus : status || mappedStatus),
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;