mixdog 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/LICENSES/oh-my-pi-MIT.txt +23 -0
  2. package/NOTICE.md +17 -2
  3. package/README.md +11 -0
  4. package/package.json +3 -11
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/embed-google-oauth-client.mjs +49 -0
  7. package/scripts/gate-local.mjs +4 -2
  8. package/scripts/lib/test-spawn-ledger.mjs +46 -1
  9. package/scripts/native-release-status.mjs +2 -2
  10. package/scripts/recall-history-cases.json +1 -1
  11. package/scripts/suite-health.mjs +10 -1
  12. package/scripts/test.mjs +12 -11
  13. package/src/agents/reviewer/AGENT.md +7 -11
  14. package/src/agents/reviewer/agent.json +1 -1
  15. package/src/defaults/shipped-history.json +25 -1
  16. package/src/defaults/skills/browser-use/SKILL.md +77 -17
  17. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  18. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  19. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  20. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  21. package/src/defaults/skills/computer-use/SKILL.md +33 -9
  22. package/src/defaults/skills/setup/SKILL.md +29 -2
  23. package/src/defaults/skills/setup/references/actions.md +117 -28
  24. package/src/defaults/skills/setup/references/surfaces.md +77 -35
  25. package/src/defaults/skills/setup-guide/SKILL.md +3 -3
  26. package/src/defaults/skills/visualize/SKILL.md +2 -1
  27. package/src/lib/keychain-cjs.cjs +359 -29
  28. package/src/lib/rules-builder.cjs +10 -8
  29. package/src/rules/agent/AGENT.md +6 -6
  30. package/src/rules/agent-mode/AGENT_MODE.md +10 -2
  31. package/src/rules/agent-mode/MIXY.md +12 -0
  32. package/src/rules/lead/LEAD.md +18 -20
  33. package/src/rules/shared/05-tool-calls.md +5 -6
  34. package/src/rules/shared/10-tool-workflow.md +2 -0
  35. package/src/rules/shared/60-verification.md +7 -5
  36. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  37. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +193 -0
  38. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  39. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  40. package/src/runtime/agent/orchestrator/config.mjs +34 -0
  41. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  42. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
  43. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
  44. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  45. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +177 -73
  46. package/src/runtime/agent/orchestrator/mcp/client.mjs +25 -2
  47. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +31 -2
  48. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +16 -3
  49. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +42 -7
  50. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +21 -2
  51. package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +23 -0
  52. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +11 -1
  53. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +230 -137
  54. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +64 -7
  55. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +18 -5
  56. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  59. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  60. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +160 -69
  61. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
  63. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  64. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +52 -8
  65. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +10 -1
  66. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +22 -6
  67. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +15 -4
  68. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +17 -2
  69. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +142 -104
  70. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  71. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +10 -4
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -217
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -6
  76. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +409 -0
  77. package/src/runtime/agent/orchestrator/providers/devin-wire-families.mjs +187 -0
  78. package/src/runtime/agent/orchestrator/providers/devin-wire-identity.mjs +342 -0
  79. package/src/runtime/agent/orchestrator/providers/devin-wire-models.mjs +541 -0
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-protobuf.mjs +305 -0
  81. package/src/runtime/agent/orchestrator/providers/devin-wire-request.mjs +558 -0
  82. package/src/runtime/agent/orchestrator/providers/devin-wire-schema.mjs +880 -0
  83. package/src/runtime/agent/orchestrator/providers/devin-wire-session.mjs +190 -0
  84. package/src/runtime/agent/orchestrator/providers/devin-wire-tool-args.mjs +351 -0
  85. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +560 -0
  86. package/src/runtime/agent/orchestrator/providers/devin.mjs +491 -0
  87. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -0
  88. package/src/runtime/agent/orchestrator/providers/gemini-output-limit.mjs +46 -0
  89. package/src/runtime/agent/orchestrator/providers/gemini-reasoning-relay.mjs +30 -0
  90. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +7 -11
  91. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +61 -22
  92. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -0
  93. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +71 -4
  94. package/src/runtime/agent/orchestrator/providers/gemini.mjs +25 -2
  95. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +96 -5
  97. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  98. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +23 -5
  99. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  100. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  101. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  102. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  103. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +19 -1
  104. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +39 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
  107. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +6 -1
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  109. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  113. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +1 -0
  114. package/src/runtime/agent/orchestrator/providers/provider-availability.mjs +19 -0
  115. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  116. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  117. package/src/runtime/agent/orchestrator/providers/registry.mjs +43 -3
  118. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  119. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  120. package/src/runtime/agent/orchestrator/providers/wire-protobuf-codec.mjs +368 -0
  121. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
  122. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  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 +1 -1
  127. package/src/runtime/agent/orchestrator/runtime-core/reaction-tool-defs.mjs +133 -0
  128. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  131. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  132. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +23 -5
  133. package/src/runtime/agent/orchestrator/runtime-core/tool-profile.mjs +35 -10
  134. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +57 -10
  135. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +9 -6
  136. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -1
  137. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +18 -0
  138. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +0 -3
  139. package/src/runtime/agent/orchestrator/session/agent-room.mjs +10 -4
  140. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
  141. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +148 -25
  142. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  143. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  144. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +8 -0
  145. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +47 -9
  146. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +6 -2
  147. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  148. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +14 -2
  149. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
  151. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
  152. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +11 -2
  153. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -1
  154. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +51 -3
  155. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
  156. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -2
  157. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  158. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +14 -4
  159. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
  162. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  163. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +23 -5
  164. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +60 -0
  165. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  166. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  167. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +2 -0
  168. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +14 -0
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -1
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  172. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  173. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
  174. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  175. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  176. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
  177. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
  178. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  179. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
  180. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  181. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +13 -0
  182. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
  183. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  184. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
  185. package/src/runtime/agent/orchestrator/session/message-ids.mjs +5 -3
  186. package/src/runtime/agent/orchestrator/session/message-reactions.mjs +89 -0
  187. package/src/runtime/agent/orchestrator/session/message-reactions.test-support.mjs +75 -0
  188. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
  189. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
  191. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +0 -2
  192. package/src/runtime/agent/orchestrator/session/routine-result.mjs +47 -11
  193. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +20 -2
  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-persistence-events.mjs +29 -0
  203. package/src/runtime/agent/orchestrator/session/store-agent-worker-header-cache.mjs +85 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +133 -18
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
  207. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
  208. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  209. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +11 -5
  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/tool-batch/state.mjs +4 -0
  214. package/src/runtime/agent/orchestrator/session/tool-batch.mjs +5 -0
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +25 -2
  216. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  217. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  218. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  219. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  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.mjs +25 -5
  225. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
  226. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  227. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  228. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  229. package/src/runtime/browser-bridge/client.mjs +73 -8
  230. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  231. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  232. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  233. package/src/runtime/channels/lib/config.mjs +6 -61
  234. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  235. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  236. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  237. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  238. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  239. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  240. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  241. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  242. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  243. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  244. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  245. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  246. package/src/runtime/channels/lib/schedule-errors.mjs +51 -0
  247. package/src/runtime/channels/lib/scheduler.mjs +135 -154
  248. package/src/runtime/channels/lib/schedules-db.mjs +83 -11
  249. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  250. package/src/runtime/channels/lib/tool-dispatch.mjs +14 -2
  251. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  252. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  253. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  254. package/src/runtime/channels/lib/worker-main.mjs +19 -34
  255. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  256. package/src/runtime/computer-bridge/actions.mjs +9 -1
  257. package/src/runtime/computer-bridge/client.mjs +180 -8
  258. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  259. package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
  260. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  261. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  262. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  263. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  264. package/src/runtime/connectors/google-mcp.mjs +10 -12
  265. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  266. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  267. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  268. package/src/runtime/office/com/com-adapter.mjs +17 -1
  269. package/src/runtime/office/com/office-com-host.ps1 +51 -1
  270. package/src/runtime/office/pdf/cfb-fixture.mjs +328 -0
  271. package/src/runtime/office/pdf/cfb-protection.mjs +311 -0
  272. package/src/runtime/office/pdf/document-preview.mjs +326 -8
  273. package/src/runtime/office/pdf/ooxml-crypto.mjs +469 -0
  274. package/src/runtime/office/pdf/ooxml-key-worker.mjs +14 -0
  275. package/src/runtime/office/portable/portable-soffice.mjs +45 -5
  276. package/src/runtime/session-search/session-search-db.mjs +73 -9
  277. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  278. package/src/runtime/shared/abort-race.mjs +89 -0
  279. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  280. package/src/runtime/shared/agent-kind.mjs +4 -3
  281. package/src/runtime/shared/bot-hops.mjs +62 -2
  282. package/src/runtime/shared/bounded-download.mjs +8 -3
  283. package/src/runtime/shared/config.mjs +51 -35
  284. package/src/runtime/shared/connector-accounts.mjs +20 -10
  285. package/src/runtime/shared/connector-catalog.d.mts +33 -2
  286. package/src/runtime/shared/connector-catalog.mjs +166 -8
  287. package/src/runtime/shared/connector-triggers.mjs +22 -19
  288. package/src/runtime/shared/defaults-separation.mjs +2 -14
  289. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  290. package/src/runtime/shared/developer-options.mjs +32 -1
  291. package/src/runtime/shared/err-text.mjs +24 -15
  292. package/src/runtime/shared/file-permissions.d.mts +0 -8
  293. package/src/runtime/shared/file-permissions.mjs +0 -11
  294. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  295. package/src/runtime/shared/google-oauth-client.generated.json +4 -0
  296. package/src/runtime/shared/google-oauth-client.mjs +34 -9
  297. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  298. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  299. package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
  300. package/src/runtime/shared/llm/anthropic-betas.mjs +7 -0
  301. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +12 -0
  302. package/src/runtime/shared/llm/provider-catalog-registry.mjs +1 -0
  303. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  304. package/src/runtime/shared/llm/well-formed.mjs +66 -0
  305. package/src/runtime/shared/mixy-presence.mjs +22 -0
  306. package/src/runtime/shared/orchestration.d.mts +2 -0
  307. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  308. package/src/runtime/shared/profile-config.cjs +1 -1
  309. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  310. package/src/runtime/shared/prompt-origin.mjs +21 -0
  311. package/src/runtime/shared/provider-accounts.mjs +231 -59
  312. package/src/runtime/shared/provider-api-key.mjs +19 -8
  313. package/src/runtime/shared/provider-display-name.mjs +29 -0
  314. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  315. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  316. package/src/runtime/shared/routine-trigger.mjs +52 -0
  317. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  318. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  319. package/src/runtime/shared/session-activity-signal.mjs +34 -1
  320. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  321. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  322. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  323. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  324. package/src/runtime/shared/tool-result-summary.mjs +1 -14
  325. package/src/runtime/shared/transcript-metadata.mjs +38 -0
  326. package/src/runtime/shared/user-data-guard.mjs +30 -2
  327. package/src/runtime/shared/worktrees/activity-gate.mjs +12 -5
  328. package/src/runtime/shared/worktrees/test-support.mjs +9 -4
  329. package/src/runtime/terminal-bridge/client.mjs +10 -1
  330. package/src/runtime/visualize-bridge/client.mjs +27 -8
  331. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  332. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  333. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  334. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  335. package/src/session-runtime/agent-home-delivery.mjs +486 -179
  336. package/src/session-runtime/agent-room-delivery.mjs +28 -1
  337. package/src/session-runtime/agent-task-sessions.mjs +561 -199
  338. package/src/session-runtime/boot/apis.mjs +9 -0
  339. package/src/session-runtime/boot/begin.mjs +3 -2
  340. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  341. package/src/session-runtime/boot/providers.mjs +3 -0
  342. package/src/session-runtime/boot/tools.mjs +8 -1
  343. package/src/session-runtime/bot-chain.mjs +32 -0
  344. package/src/session-runtime/bot-status.mjs +7 -4
  345. package/src/session-runtime/channel-config-api.mjs +63 -17
  346. package/src/session-runtime/config-lifecycle.mjs +6 -0
  347. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  348. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
  349. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
  350. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +45 -0
  351. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +72 -5
  352. package/src/session-runtime/internal-tool-executor.mjs +4 -0
  353. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  354. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
  355. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  356. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  357. package/src/session-runtime/mcp-glue/server-catalog.mjs +61 -3
  358. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  359. package/src/session-runtime/mixy-heartbeat.mjs +927 -0
  360. package/src/session-runtime/model-route/route-tuning.mjs +10 -6
  361. package/src/session-runtime/notification-bus.mjs +31 -117
  362. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  363. package/src/session-runtime/notification-listeners.mjs +76 -0
  364. package/src/session-runtime/owned-automation-run.mjs +35 -13
  365. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  366. package/src/session-runtime/provider-auth/login.mjs +7 -0
  367. package/src/session-runtime/provider-models/row-hydration.mjs +13 -2
  368. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  369. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  370. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  371. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  372. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  373. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  374. package/src/session-runtime/routine-home-turn.mjs +33 -6
  375. package/src/session-runtime/routine-owner.mjs +40 -9
  376. package/src/session-runtime/schedule-session-run.mjs +7 -3
  377. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  378. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +8 -12
  379. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
  380. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  381. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  382. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  383. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  384. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  385. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  386. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  387. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  388. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  389. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  390. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  391. package/src/session-runtime/services/channel-admin.mjs +73 -31
  392. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  393. package/src/session-runtime/services/channel-worker.mjs +1 -1
  394. package/src/session-runtime/services/provider-admin.mjs +128 -25
  395. package/src/session-runtime/services/schedule-access.mjs +14 -0
  396. package/src/session-runtime/services/seeds.mjs +0 -28
  397. package/src/session-runtime/services/usage-dashboard-model.mjs +1 -0
  398. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  399. package/src/session-runtime/session-create/session-options.mjs +8 -4
  400. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  401. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  402. package/src/session-runtime/settings-system-api.mjs +28 -1
  403. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  404. package/src/session-runtime/setup-tool/executor.mjs +187 -29
  405. package/src/session-runtime/setup-tool/extended-actions.mjs +33 -2
  406. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  407. package/src/session-runtime/setup-tool/settings-contract.mjs +68 -6
  408. package/src/session-runtime/setup-tool/tool-defs.mjs +92 -6
  409. package/src/session-runtime/task-session-route.mjs +99 -0
  410. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  411. package/src/session-runtime/tool-policy/policy-stage.mjs +21 -4
  412. package/src/session-runtime/tool-policy/surface-helpers.mjs +2 -3
  413. package/src/session-runtime/tool-surface.mjs +4 -0
  414. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  415. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +98 -21
  416. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  417. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -1
  418. package/src/session-runtime/workspace/transitions.mjs +10 -2
  419. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  420. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  421. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  422. package/src/standalone/channel-transport.mjs +1 -1
  423. package/src/standalone/daemon-channels-loader.mjs +10 -8
  424. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  425. package/src/standalone/daemon-session-control/request.mjs +51 -0
  426. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  427. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  428. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  429. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  430. package/src/standalone/daemon-session-control.mjs +161 -157
  431. package/src/standalone/daemon.mjs +33 -2
  432. package/src/standalone/session-client.mjs +7 -3
  433. package/src/standalone/session-protocol.mjs +10 -0
  434. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +6 -2
  435. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  436. package/src/standalone/session-service/quota-resume.mjs +3 -0
  437. package/src/standalone/session-service/retention/busy.mjs +65 -1
  438. package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
  439. package/src/standalone/session-service/session-calls/session-turns.mjs +6 -0
  440. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  441. package/src/standalone/session-service.mjs +13 -0
  442. package/src/standalone/session-tool-output.mjs +21 -10
  443. package/src/tui/app/model-options.mjs +4 -27
  444. package/src/tui/dist/index.mjs +81 -65
  445. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  446. package/src/tui/session/initial-state.mjs +3 -0
  447. package/src/tui/session/notice-surface.mjs +23 -1
  448. package/src/tui/session/queue-helpers.mjs +3 -42
  449. package/src/tui/session/session-api/integrations.mjs +1 -0
  450. package/src/tui/session/session-api/lifecycle.mjs +8 -0
  451. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  452. package/src/tui/session/session-api/routes-write.mjs +5 -1
  453. package/src/tui/session/session-api/routes.mjs +1 -0
  454. package/src/tui/session/session-api/settings.mjs +30 -2
  455. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  456. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  457. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  458. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  459. package/src/tui/session/session-flow/drain.mjs +118 -149
  460. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  461. package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
  462. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  463. package/src/tui/session/tool-approval-request.mjs +39 -0
  464. package/src/tui/session/tool-approval-settle.mjs +62 -0
  465. package/src/tui/session/tool-approval.mjs +69 -115
  466. package/src/tui/session/tui-steering-persist.mjs +8 -1
  467. package/src/tui/session/turn-stream.mjs +36 -3
  468. package/src/tui/session/turn.mjs +23 -2
  469. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  470. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  471. package/scripts/code-graph-description-contract.mjs +0 -188
  472. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -24,6 +24,7 @@ import { TIMEOUT_PHASE, isFirstByteTimeout } from '../../../shared/provider-time
24
24
  import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
25
25
  import { _scrubTokens } from './antigravity-oauth-tokens.mjs';
26
26
  import { applyGeminiErrorContract } from './gemini-error-contract.mjs';
27
+ import { geminiInvalidStreamReask } from './gemini-retry-policy.mjs';
27
28
  import { DETERMINISTIC_KINDS, providerErrorKind } from './provider-error-kind.mjs';
28
29
 
29
30
  // Rate-limit reason: 503/529 are capacity by status; a
@@ -113,9 +114,10 @@ export function antigravityError(res, text, endpoint) {
113
114
  * @param {string} deps.body serialized request
114
115
  * @param {object} deps.opts send options (stage heartbeat)
115
116
  * @param {AbortSignal|null} deps.signal retry-loop signal (session pass-through)
116
- * @param {{ beginAttempt: Function, consume: Function }} deps.collector
117
+ * @param {{ beginAttempt: Function, consume: Function, failureUsage?: { model: string, normalize: Function } }} deps.collector
117
118
  * @param {{ timeoutMs: number, maxMs: number, retries: number|null }} [deps.firstByte]
118
119
  * first-byte window per attempt (antigravityFirstBytePolicy)
120
+ * @param {boolean} [deps.afterToolResult] the request ends with a tool result (an empty STOP is then a valid answer)
119
121
  * @returns {() => Promise<object>} one retried request that resolves the final payload
120
122
  */
121
123
  export function createAntigravityRequest({
@@ -128,104 +130,14 @@ export function createAntigravityRequest({
128
130
  collector,
129
131
  sleepFn,
130
132
  firstByte = ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
133
+ afterToolResult = false,
131
134
  }) {
132
- const log = (attempt, lastErr, delayMs) => {
133
- // A first-byte timeout runs on its own, shorter retry budget.
134
- const firstByteLimited = isFirstByteTimeout(lastErr) && firstByte.retries != null;
135
- emitProviderRetryStage(opts.onStageChange, {
136
- attempt: attempt + 1,
137
- maxAttempts: firstByteLimited
138
- ? Math.min(ANTIGRAVITY_RETRY.maxAttempts, firstByte.retries + 1)
139
- : ANTIGRAVITY_RETRY.maxAttempts,
140
- lastErr,
141
- delayMs,
142
- });
143
- process.stderr.write(`[antigravity] retry ${attempt + 1} after ${lastErr?.message || 'transient error'}\n`);
144
- };
145
- // Stamps what the attempt tells the user: how many attempts ran and, for a
146
- // first-byte timeout, how long the model was given in total. A timeout past
147
- // the first-byte retry budget ends the ladder here. A caller's cancellation
148
- // reason may be shared by other requests and is never stamped.
149
- const noteFailure = (err, { attemptSignal, windowMs, send }) => {
150
- if (!err || typeof err !== 'object' || attemptSignal?.aborted) return err;
151
- send.attempts += 1;
152
- err.attempts = send.attempts;
153
- if (!isFirstByteTimeout(err)) return err;
154
- send.firstByteTimeouts += 1;
155
- send.firstByteWaitedMs += windowMs;
156
- err.waitedMs = send.firstByteWaitedMs;
157
- err.providerLabel = 'Antigravity';
158
- if (firstByte.retries != null && send.firstByteTimeouts > firstByte.retries) {
159
- markProviderRecoveryExhausted(err, { owner: 'antigravity-first-byte', attempts: send.attempts, terminal: true });
160
- }
161
- return err;
162
- };
135
+ const log = (attempt, lastErr, delayMs) =>
136
+ logAntigravityRetry(opts.onStageChange, firstByte, attempt, lastErr, delayMs);
163
137
  const attemptOnce = (send) =>
164
138
  withRetry(
165
- async ({ signal: attemptSignal }) => {
166
- try {
167
- opts.onStageChange?.('requesting');
168
- } catch {
169
- /* heartbeat */
170
- }
171
- const windowMs = firstByteWindowMs(firstByte, send.firstByteTimeouts);
172
- try {
173
- const firstByteTimer = createTimeoutSignal(attemptSignal, windowMs, 'Antigravity first byte');
174
- let res;
175
- try {
176
- const response = fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
177
- method: 'POST',
178
- headers,
179
- body,
180
- signal: firstByteTimer.signal,
181
- dispatcher: getLlmDispatcher(),
182
- });
183
- // The request is on the wire and its headers are pending: the
184
- // gateway sends them only with the first chunk, so this wait is
185
- // the model's queueing and thinking time.
186
- try {
187
- opts.onStageChange?.(MODEL_THINKING_STAGE);
188
- } catch {
189
- /* heartbeat */
190
- }
191
- res = await response;
192
- } catch (err) {
193
- // Fetch surfaces AbortError; rethrow the timer/parent
194
- // reason so same-host retry sees EPROVIDERTIMEOUT and
195
- // a caller cancel stays a cancel.
196
- if (firstByteTimer.signal.aborted && firstByteTimer.signal.reason instanceof Error) {
197
- const reason = firstByteTimer.signal.reason;
198
- if (!attemptSignal?.aborted) reason.timeoutPhase = TIMEOUT_PHASE.HEADERS;
199
- throw reason;
200
- }
201
- throw err;
202
- } finally {
203
- firstByteTimer.cleanup();
204
- }
205
- // Headers arrived: the connection is live even while the model
206
- // has not produced its first chunk.
207
- try {
208
- opts.onStreamDelta?.('transport');
209
- } catch {}
210
- if (!res.ok) {
211
- const text = await res.text().catch(() => '');
212
- const failure = antigravityError(res, text, endpoint);
213
- // Capacity is paced by the local schedule below; the generic loop
214
- // would sleep whatever wait the server names.
215
- if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
216
- throw failure;
217
- }
218
- try {
219
- opts.onStageChange?.('streaming');
220
- } catch {
221
- /* heartbeat */
222
- }
223
- collector.beginAttempt();
224
- return await collector.consume(res, attemptSignal, { firstByteTimeoutMs: windowMs });
225
- } catch (err) {
226
- throw noteFailure(err, { attemptSignal, windowMs, send });
227
- }
228
- },
139
+ ({ signal: attemptSignal }) =>
140
+ streamAttempt({ fetchFn, endpoint, headers, body, opts, collector, firstByte, send, attemptSignal }),
229
141
  {
230
142
  ...ANTIGRAVITY_RETRY,
231
143
  finalOnExhaust: true,
@@ -240,20 +152,146 @@ export function createAntigravityRequest({
240
152
  return async () => {
241
153
  const state = { capacityRetries: 0, quickRetried: false };
242
154
  const send = { attempts: 0, firstByteTimeouts: 0, firstByteWaitedMs: 0 };
155
+ let streamAttempt = 0;
243
156
  for (let tried = 1; ; tried++) {
244
157
  try {
245
- return await attemptOnce(send);
158
+ const response = await attemptOnce(send);
159
+ // A finished but unusable answer (empty STOP, malformed call) gets
160
+ // the same bounded re-ask as the API-key transport. The dead
161
+ // attempt's thinking is retracted when the next attempt begins.
162
+ if (signal?.aborted) return response;
163
+ const reask = geminiInvalidStreamReask(response, collector.leakGuard, {
164
+ afterToolResult,
165
+ streamAttempt,
166
+ failureUsage: collector.failureUsage,
167
+ });
168
+ if (!reask) return response;
169
+ log(streamAttempt + 1, reask.unusable, reask.waitMs);
170
+ streamAttempt += 1;
171
+ await sleepWithAbort(reask.waitMs, signal, sleepFn, 'Antigravity retry wait aborted');
246
172
  } catch (err) {
247
- const waitMs = antigravity429WaitMs(err, state);
248
- if (waitMs == null) {
249
- if (isCapacityFailure(err)) {
250
- markProviderRecoveryExhausted(err, { owner: 'antigravity-capacity', attempts: tried });
251
- }
252
- throw err;
253
- }
173
+ const waitMs = scheduledRetryWaitMs(err, state, tried);
254
174
  log(tried, err, waitMs);
255
175
  await sleepWithAbort(waitMs, signal, sleepFn, 'Antigravity retry wait aborted');
256
176
  }
257
177
  }
258
178
  };
259
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
+ }
@@ -20,7 +20,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
20
20
  // version (gpt-6.1-sol requires >= 0.159.0, measured 2026-10-09), so the
21
21
  // release workflow raises this to the published CLI version on every release
22
22
  // (scripts/sync-client-version-floors.mjs).
23
- export const CODEX_CLIENT_VERSION_FLOOR = '0.163.0';
23
+ export const CODEX_CLIENT_VERSION_FLOOR = '0.164.0';
24
24
  export const CODEX_CLI_NPM_PACKAGE = '@openai/codex';
25
25
  const live = createNpmVersionSource(CODEX_CLI_NPM_PACKAGE, { persistKey: 'codex-cli' });
26
26
 
@@ -197,19 +197,25 @@ function usagePercent(value) {
197
197
  return Math.round(normalized * 10_000) / 10_000;
198
198
  }
199
199
 
200
+ // The models the Auto pool (`autoPercentUsed`) meters: Auto under both of its
201
+ // ids and the Composer family. Every other model draws on the API pool.
202
+ const AUTO_POOL_MODELS = Object.freeze(['auto', 'default', 'composer']);
203
+
200
204
  // The included-plan windows: per-lane progress percentages when the dashboard
201
- // reports them, else one dollar window over the included balance.
205
+ // reports them, else one dollar window over the included balance. Each lane
206
+ // gates only the models it meters.
202
207
  function includedUsageWindows(included, plan, includedBalance, resetAt) {
203
208
  const progressWindows = [
204
- ['Basic', included.autoPercentUsed],
205
- ['API', included.apiPercentUsed],
209
+ ['Basic', included.autoPercentUsed, { models: [...AUTO_POOL_MODELS] }],
210
+ ['API', included.apiPercentUsed, { except: [...AUTO_POOL_MODELS] }],
206
211
  ].filter(([, value]) => Number.isFinite(Number(value)));
207
212
  if (progressWindows.length) {
208
- return progressWindows.map(([label, value]) => ({
213
+ return progressWindows.map(([label, value, scope]) => ({
209
214
  label,
210
215
  source: 'cursor-dashboard',
211
216
  usedPct: usagePercent(value),
212
217
  ...(resetAt ? { resetAt } : {}),
218
+ ...scope,
213
219
  }));
214
220
  }
215
221
  if (!includedBalance) return [];
@@ -1,9 +1,10 @@
1
- function fields(entries) {
2
- return Object.fromEntries(entries.map(([name, no, type, options = {}]) => [no, { name, no, type, ...options }]));
3
- }
4
-
5
- const map = (key, value) => ({ map: [key, value] });
6
- const repeated = { repeated: true };
1
+ import {
2
+ concatBytes,
3
+ createProtobufCodec,
4
+ protobufFields as fields,
5
+ mapOf as map,
6
+ repeated,
7
+ } from './wire-protobuf-codec.mjs';
7
8
 
8
9
  // Only the fields read or written by the provider are described here.
9
10
  const SCHEMAS = {
@@ -639,149 +640,10 @@ const SCHEMAS = {
639
640
  JsonList: fields([['values', 1, 'JsonValue', repeated]]),
640
641
  };
641
642
 
642
- const textEncoder = new TextEncoder();
643
- // A protobuf string is data, not a text document with a disposable BOM.
644
- const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true });
645
-
646
- function concatBytes(parts) {
647
- const length = parts.reduce((sum, part) => sum + part.length, 0);
648
- const output = new Uint8Array(length);
649
- let offset = 0;
650
- for (const part of parts) {
651
- output.set(part, offset);
652
- offset += part.length;
653
- }
654
- return output;
655
- }
656
-
657
- function encodeVarint(value) {
658
- let current = BigInt(value ?? 0);
659
- if (current < 0) current = BigInt.asUintN(64, current);
660
- const bytes = [];
661
- do {
662
- let byte = Number(current & 0x7fn);
663
- current >>= 7n;
664
- if (current) byte |= 0x80;
665
- bytes.push(byte);
666
- } while (current);
667
- return Uint8Array.from(bytes);
668
- }
669
-
670
- function encodeTag(no, wireType) {
671
- return encodeVarint((BigInt(no) << 3n) | BigInt(wireType));
672
- }
673
-
674
- function isMessageType(type) {
675
- return Object.hasOwn(SCHEMAS, type);
676
- }
677
-
678
- function wireTypeFor(type) {
679
- if (type === 'double') return 1;
680
- if (['string', 'bytes', 'raw'].includes(type) || isMessageType(type)) return 2;
681
- return 0;
682
- }
683
-
684
- function scalarBytes(type, value) {
685
- if (type === 'string') return textEncoder.encode(String(value));
686
- if (type === 'bytes' || type === 'raw') return value instanceof Uint8Array ? value : new Uint8Array(value);
687
- if (type === 'double') {
688
- const buffer = new ArrayBuffer(8);
689
- new DataView(buffer).setFloat64(0, Number(value), true);
690
- return new Uint8Array(buffer);
691
- }
692
- if (type === 'bool') return encodeVarint(value ? 1 : 0);
693
- if (type === 'int' || type === 'uint') return encodeVarint(value);
694
- if (isMessageType(type)) return encodeMessage(type, value);
695
- throw new Error(`Unknown Cursor protobuf type: ${type}`);
696
- }
697
-
698
- function shouldWrite(type, value) {
699
- if (value == null) return false;
700
- if (type === 'string') return value !== '';
701
- return true;
702
- }
703
-
704
- function encodeField(no, type, value) {
705
- const wireType = wireTypeFor(type);
706
- const payload = scalarBytes(type, value);
707
- if (wireType === 2) return concatBytes([encodeTag(no, wireType), encodeVarint(payload.length), payload]);
708
- return concatBytes([encodeTag(no, wireType), payload]);
709
- }
710
-
711
- function encodeMapField(no, [keyType, valueType], value) {
712
- const parts = [];
713
- for (const [key, entryValue] of Object.entries(value || {})) {
714
- const entry = concatBytes([encodeField(1, keyType, key), encodeField(2, valueType, entryValue)]);
715
- parts.push(concatBytes([encodeTag(no, 2), encodeVarint(entry.length), entry]));
716
- }
717
- return parts;
718
- }
719
-
720
- export function encodeMessage(type, value = {}) {
721
- const schema = SCHEMAS[type];
722
- if (!schema) throw new Error(`Unknown Cursor protobuf message: ${type}`);
723
- const parts = [];
724
- for (const descriptor of Object.values(schema)) {
725
- const fieldValue = value[descriptor.name];
726
- if (descriptor.type?.map) {
727
- parts.push(...encodeMapField(descriptor.no, descriptor.type.map, fieldValue));
728
- continue;
729
- }
730
- let values = [fieldValue];
731
- if (descriptor.repeated) values = Array.isArray(fieldValue) ? fieldValue : [];
732
- for (const item of values) {
733
- // A oneof's explicit empty string is a value, not an absent field.
734
- if ((descriptor.presence && item != null) || shouldWrite(descriptor.type, item)) {
735
- parts.push(encodeField(descriptor.no, descriptor.type, item));
736
- }
737
- }
738
- }
739
- return concatBytes(parts);
740
- }
741
-
742
- class ProtoReader {
743
- constructor(bytes) {
744
- this.bytes = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
745
- this.offset = 0;
746
- }
747
-
748
- get done() {
749
- return this.offset >= this.bytes.length;
750
- }
751
-
752
- varint() {
753
- let value = 0n;
754
- let shift = 0n;
755
- while (!this.done) {
756
- const byte = this.bytes[this.offset++];
757
- value |= BigInt(byte & 0x7f) << shift;
758
- if ((byte & 0x80) === 0) return value;
759
- shift += 7n;
760
- if (shift > 70n) throw new Error('Invalid Cursor protobuf varint');
761
- }
762
- throw new Error('Truncated Cursor protobuf varint');
763
- }
764
-
765
- take(length) {
766
- const end = this.offset + length;
767
- if (end > this.bytes.length) throw new Error('Truncated Cursor protobuf field');
768
- const value = this.bytes.subarray(this.offset, end);
769
- this.offset = end;
770
- return value;
771
- }
643
+ const codec = createProtobufCodec(SCHEMAS, { label: 'Cursor protobuf' });
644
+ const { encodeField, ProtoReader } = codec;
772
645
 
773
- bytesValue() {
774
- return this.take(Number(this.varint()));
775
- }
776
-
777
- skip(wireType) {
778
- if (wireType === 0) this.varint();
779
- else if (wireType === 1) this.take(8);
780
- else if (wireType === 2) this.bytesValue();
781
- else if (wireType === 5) this.take(4);
782
- else throw new Error(`Unsupported Cursor protobuf wire type: ${wireType}`);
783
- }
784
- }
646
+ export const { encodeMessage, decodeMessage } = codec;
785
647
 
786
648
  export function rewriteConversationState(checkpoint, rootPromptMessagesJson, turns = []) {
787
649
  const preserved = [];
@@ -808,75 +670,6 @@ export function rewriteConversationState(checkpoint, rootPromptMessagesJson, tur
808
670
  return concatBytes([...preserved, ...replacement]);
809
671
  }
810
672
 
811
- function decodeScalar(reader, type, wireType) {
812
- if (type === 'string') return textDecoder.decode(reader.bytesValue());
813
- if (type === 'bytes' || type === 'raw') return new Uint8Array(reader.bytesValue());
814
- if (type === 'double') {
815
- if (wireType !== 1) throw new Error('Invalid Cursor protobuf double');
816
- const value = new DataView(reader.bytes.buffer, reader.bytes.byteOffset + reader.offset, 8).getFloat64(0, true);
817
- reader.offset += 8;
818
- return value;
819
- }
820
- if (type === 'bool') return reader.varint() !== 0n;
821
- if (type === 'int') return Number(BigInt.asIntN(64, reader.varint()));
822
- if (type === 'uint') return Number(reader.varint());
823
- if (isMessageType(type)) return decodeMessage(type, reader.bytesValue());
824
- throw new Error(`Unknown Cursor protobuf type: ${type}`);
825
- }
826
-
827
- function decodeMapEntry(bytes, [keyType, valueType]) {
828
- const reader = new ProtoReader(bytes);
829
- let key = '';
830
- let value = valueType === 'string' ? '' : undefined;
831
- while (!reader.done) {
832
- const tag = reader.varint();
833
- const no = Number(tag >> 3n);
834
- const wireType = Number(tag & 7n);
835
- if (no === 1) key = decodeScalar(reader, keyType, wireType);
836
- else if (no === 2) value = decodeScalar(reader, valueType, wireType);
837
- else reader.skip(wireType);
838
- }
839
- return [String(key), value];
840
- }
841
-
842
- export function decodeMessage(type, bytes) {
843
- const schema = SCHEMAS[type];
844
- if (!schema) throw new Error(`Unknown Cursor protobuf message: ${type}`);
845
- const reader = new ProtoReader(bytes);
846
- const output = {};
847
- while (!reader.done) {
848
- const tag = reader.varint();
849
- const no = Number(tag >> 3n);
850
- const wireType = Number(tag & 7n);
851
- const descriptor = schema[no];
852
- if (!descriptor) {
853
- const start = reader.offset;
854
- reader.skip(wireType);
855
- output.$unknown ||= [];
856
- output.$unknown.push({
857
- no,
858
- wireType,
859
- data: new Uint8Array(reader.bytes.subarray(start, reader.offset)),
860
- });
861
- continue;
862
- }
863
- if (descriptor.type?.map) {
864
- const [key, value] = decodeMapEntry(reader.bytesValue(), descriptor.type.map);
865
- output[descriptor.name] ||= {};
866
- output[descriptor.name][key] = value;
867
- continue;
868
- }
869
- const value = decodeScalar(reader, descriptor.type, wireType);
870
- if (descriptor.repeated) {
871
- output[descriptor.name] ||= [];
872
- output[descriptor.name].push(value);
873
- } else {
874
- output[descriptor.name] = value;
875
- }
876
- }
877
- return output;
878
- }
879
-
880
673
  function jsonToProtoValue(value) {
881
674
  if (value === null) return { nullValue: 0 };
882
675
  if (Array.isArray(value)) return { listValue: { values: value.map(jsonToProtoValue) } };