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
@@ -2,6 +2,13 @@ import { createHash } from 'node:crypto';
2
2
  import { AsyncLocalStorage } from 'node:async_hooks';
3
3
  import { PRIORITY_RANK, normalizePriority, resourceAdmission } from '../../../shared/resource-admission.mjs';
4
4
  import { accountProviderSend } from '../../../shared/llm/usage-accounting.mjs';
5
+ import { sanitizeSurrogates } from '../../../shared/llm/well-formed.mjs';
6
+ import { providerAvailable, providerUnavailableError } from './provider-availability.mjs';
7
+ import {
8
+ finalizeProviderRequestTools,
9
+ isFinalizedProviderRequestTools,
10
+ providerNativeToolPrefixCount,
11
+ } from '../runtime-core/provider-request-tools.mjs';
5
12
 
6
13
  // Normal provider traffic is not concurrency-gated. Independent sessions and
7
14
  // accounts start immediately; a finite limit exists only when an operator
@@ -257,7 +264,9 @@ export class ProviderAdmissionScheduler {
257
264
  running.parentAbort = () => {
258
265
  try {
259
266
  controller.abort(item.signal.reason);
260
- } catch {}
267
+ } catch {
268
+ // the controller may already be aborted
269
+ }
261
270
  };
262
271
  item.signal.addEventListener('abort', running.parentAbort, { once: true });
263
272
  }
@@ -294,7 +303,9 @@ export class ProviderAdmissionScheduler {
294
303
  if (running.parentAbort && running.parentSignal) {
295
304
  try {
296
305
  running.parentSignal.removeEventListener('abort', running.parentAbort);
297
- } catch {}
306
+ } catch {
307
+ // the abort listener may already be gone
308
+ }
298
309
  }
299
310
  this.running.delete(running);
300
311
  lane.active -= 1;
@@ -305,6 +316,32 @@ export class ProviderAdmissionScheduler {
305
316
  if (this._canDeleteLane(lane)) this._deleteLane(key, lane);
306
317
  }
307
318
 
319
+ /**
320
+ * Why a request that must not wait (a cache warm) cannot start on lane
321
+ * `key` now, or null: the lane's rate-limit cooldown, or a lane throttled
322
+ * after a 429 that would queue it.
323
+ */
324
+ immediateBlock(key) {
325
+ if (this.closedReason) return 'provider scheduler closed';
326
+ const lane = this.lanes.get(String(key || ''));
327
+ if (!lane) return null;
328
+ if (lane.adaptive && lane.cooldownUntil > this.now()) return 'rate-limit cooldown';
329
+ if (lane.queue.length > 0 || lane.active >= lane.limit) return 'account throttled';
330
+ return null;
331
+ }
332
+
333
+ /** Record a rate limit a request outside `run` (a cache warm) received on
334
+ * lane `key`, into the same cooldown state (and broadcast) as a send's. */
335
+ recordRateLimit(key, error) {
336
+ const laneKey = String(key || '');
337
+ if (!laneKey || this.closedReason) return false;
338
+ const lane = this.lanes.get(laneKey) || createAdmissionLane(laneKey, this.concurrency);
339
+ this.lanes.set(laneKey, lane);
340
+ const recorded = this._recordFailure(laneKey, lane, error);
341
+ if (this._canDeleteLane(lane)) this._deleteLane(laneKey, lane);
342
+ return recorded;
343
+ }
344
+
308
345
  snapshot() {
309
346
  const now = this.now();
310
347
  return {
@@ -421,7 +458,9 @@ export class ProviderAdmissionScheduler {
421
458
  if (item.onAbort && item.signal) {
422
459
  try {
423
460
  item.signal.removeEventListener('abort', item.onAbort);
424
- } catch {}
461
+ } catch {
462
+ // the abort listener may already be gone
463
+ }
425
464
  item.onAbort = null;
426
465
  }
427
466
  }
@@ -446,7 +485,9 @@ export class ProviderAdmissionScheduler {
446
485
  for (const running of this.running) {
447
486
  try {
448
487
  running.controller.abort(this.closedReason);
449
- } catch {}
488
+ } catch {
489
+ // the controller may already be aborted
490
+ }
450
491
  }
451
492
  }
452
493
  }
@@ -469,7 +510,7 @@ function digest(value) {
469
510
  .digest('hex');
470
511
  }
471
512
 
472
- function providerAdmissionKey(providerName, provider) {
513
+ export function providerAdmissionKey(providerName, provider) {
473
514
  const name = String(providerName || provider?.name || 'provider');
474
515
  const stableAnthropicOAuthPath =
475
516
  name.toLowerCase() === 'anthropic-oauth'
@@ -518,7 +559,18 @@ export function wrapProviderAdmission(provider, providerName, scheduler = provid
518
559
  if (!provider || typeof provider.send !== 'function' || provider[WRAPPED]) return provider;
519
560
  const originalSend = provider.send;
520
561
  Object.defineProperty(provider, WRAPPED, { value: true });
521
- provider.send = function admittedProviderSend(messages, model, tools, sendOpts) {
562
+ provider.send = function admittedProviderSend(rawMessages, model, rawTools, sendOpts) {
563
+ // Every registered provider (and its account-pool / proxy / custom variants)
564
+ // is wrapped here, so this is the one point all model requests pass before
565
+ // serialization. A lone surrogate would make the API reject the body on
566
+ // every send; only the outgoing request is rewritten, never the transcript.
567
+ const messages = sanitizeSurrogates(rawMessages);
568
+ let tools = sanitizeSurrogates(rawTools);
569
+ // A finalized tool list is recognised by identity; its sanitized copy must
570
+ // stay finalized with the same native prefix (the model proxy reads both).
571
+ if (tools !== rawTools && isFinalizedProviderRequestTools(rawTools)) {
572
+ tools = finalizeProviderRequestTools(tools, providerNativeToolPrefixCount(rawTools));
573
+ }
522
574
  const opts = sendOpts || {};
523
575
  const signal = opts.signal || null;
524
576
  const key = providerAdmissionKey(providerName, this);
@@ -530,12 +582,17 @@ export function wrapProviderAdmission(provider, providerName, scheduler = provid
530
582
  scheduler.run(
531
583
  key,
532
584
  (admissionSignal, admissionMetrics) => {
585
+ // The Developer option may have been switched off after lookup or
586
+ // while this request waited: the gate is rechecked right before send.
587
+ if (!providerAvailable(providerName)) throw providerUnavailableError(providerName);
533
588
  // Admission is the common request-clock boundary for WS/SSE/HTTP.
534
589
  // Queue wait therefore cannot consume first-byte or agent-watchdog
535
590
  // time. Provider-local retry remains the sole retry owner.
536
591
  try {
537
592
  opts.onStageChange?.('requesting');
538
- } catch {}
593
+ } catch {
594
+ // the stage observer is advisory
595
+ }
539
596
  const admittedOpts = {
540
597
  ...opts,
541
598
  signal: admissionSignal,
@@ -18,13 +18,17 @@ import { applyAnthropicEffortToBody, shouldIncludeEffortBeta } from './anthropic
18
18
  import { isCustomProviderName, resolveCustomReasoning } from './custom-reasoning.mjs';
19
19
  import {
20
20
  anthropicThinkingActive,
21
+ anthropicTurnScopedReminders,
21
22
  appendAnthropicTailReminder,
23
+ appendAnthropicTurnReminder,
22
24
  applyAnthropicCacheMarkers,
23
25
  clampAnthropicThinkingBudget as clampThinkingBudgetTokens,
26
+ hasAnthropicTurnScopedMessages,
24
27
  resolveAnthropicCacheTtls as resolveCacheTtls,
25
28
  resolveAnthropicMessageCacheSlots,
26
29
  sharedCachePrefixBoundary,
27
30
  toAnthropicToolChoice,
31
+ withAnthropicTurnReminders,
28
32
  } from './lib/anthropic-request-utils.mjs';
29
33
  import { splitTailReminder } from './lib/tail-reminder-split.mjs';
30
34
  import {
@@ -97,12 +101,17 @@ export async function buildAnthropicApiRequest({
97
101
  // are applied to the FINAL sanitized array by invariant, so block
98
102
  // drops / inserts / reorders performed by the sanitizer can never move
99
103
  // or delete a marked block. NEVER sanitize again after this.
100
- const lowerHistory = (history, projection) =>
101
- lowerAnthropicEffortHistory(
104
+ // Turn-scoped tail reminders (tail-reminder-split.mjs): stored reminders are
105
+ // re-sent before their assistant turns, the current one ends the request.
106
+ const turnScoped = anthropicTurnScopedReminders(name, useModel, config);
107
+ const lowerHistory = (history, projection) => {
108
+ const lowered = lowerAnthropicEffortHistory(
102
109
  history.filter((m) => m.role !== 'system'),
103
110
  (segment) => toAnthropicMessages(segment, requestTools, name),
104
111
  projection
105
112
  );
113
+ return turnScoped ? withAnthropicTurnReminders(lowered) : lowered;
114
+ };
106
115
  const anthropicMessages = applyAnthropicCacheMarkers(
107
116
  lowerHistory(chatMsgs, effortProjection),
108
117
  messageCacheSlots,
@@ -115,9 +124,12 @@ export async function buildAnthropicApiRequest({
115
124
  model: useModel,
116
125
  max_tokens: maxTokens,
117
126
  system: systemBlocks.length ? systemBlocks : undefined,
118
- messages: await prepareAnthropicImages(appendAnthropicTailReminder(anthropicMessages, reminder), {
119
- signal: opts.signal,
120
- }),
127
+ messages: await prepareAnthropicImages(
128
+ turnScoped
129
+ ? appendAnthropicTurnReminder(anthropicMessages, reminder)
130
+ : appendAnthropicTailReminder(anthropicMessages, reminder),
131
+ { signal: opts.signal }
132
+ ),
121
133
  };
122
134
  // Server-side fallback and fast mode are decided from Claude model ids:
123
135
  // first-party knowledge, never applied to a custom endpoint.
@@ -255,6 +267,7 @@ function requestHeadersFor(
255
267
  effort: isCustom ? Boolean(params.output_config?.effort) : shouldIncludeEffortBeta(capabilityModel, opts),
256
268
  serverFallback: params.fallbacks === 'default',
257
269
  thinkingDisplayUpdates: params.thinking?.display === 'updates',
270
+ turnScopedSystem: hasAnthropicTurnScopedMessages(params.messages),
258
271
  }),
259
272
  ...(effortProjection ? [EFFORT_CONFIGURATION_BETA] : []),
260
273
  ].filter(Boolean);
@@ -0,0 +1,165 @@
1
+ // anthropic-cache-warm.mjs — the cache-warm mode both Anthropic providers
2
+ // expose as `sendCacheWarm` (session/cache-warm.mjs): one POST of the
3
+ // request the provider's own builder produces, no retry, fallback, re-send,
4
+ // wait or account rotation, and the stream cut at the first content block
5
+ // once the usage (cache read / write) has been reported. Right before the
6
+ // POST the account gate (cache-warm-admission.mjs) may skip it; a refusal is
7
+ // fed into the shared rate-limit and roster state. The request is bounded by
8
+ // the providers' own watchdogs: the first-byte timeout until the usage
9
+ // arrives, then the SSE idle timeout between events. Usage is handed to
10
+ // `onUsage` as it arrives, so a warm that fails or is aborted after the
11
+ // provider accepted it is still accounted. Every exit cancels the stream and
12
+ // aborts the transport.
13
+ import { PROVIDER_FIRST_BYTE_TIMEOUT_MS, PROVIDER_SSE_IDLE_TIMEOUT_MS } from '../stall-policy.mjs';
14
+ import { updateTurnUsage } from './anthropic-sse-turn/turn-state.mjs';
15
+ import { _anthropicSseError } from './anthropic-sse.mjs';
16
+ import { anthropicQuotaError } from './anthropic-oauth-request/initial-status.mjs';
17
+ import { cacheWarmAccountBlock, cacheWarmBlockedError, recordCacheWarmRefusal } from './cache-warm-admission.mjs';
18
+ import { scrubOAuthSecrets } from './lib/oauth-token-utils.mjs';
19
+
20
+ const SSE_LABELS = Object.freeze({ display: 'Anthropic cache warm' });
21
+
22
+ function usageSnapshot(usage) {
23
+ const { raw: _raw, ...rest } = usage;
24
+ return { ...rest };
25
+ }
26
+
27
+ // An abort deadline: `arm(ms)` (re)starts it; it fires `controller.abort`.
28
+ function watchdog(controller) {
29
+ let timer = null;
30
+ return {
31
+ arm(ms, what) {
32
+ if (timer) clearTimeout(timer);
33
+ timer = setTimeout(() => controller.abort(new Error(`cache warm ${what} timed out after ${ms}ms`)), ms);
34
+ timer.unref?.();
35
+ },
36
+ clear() {
37
+ if (timer) clearTimeout(timer);
38
+ timer = null;
39
+ },
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Read a warm's SSE stream until usage is known and the first content block
45
+ * starts, or the message ends. Resolves the usage; a stream error rejects
46
+ * with `error.usage` set to what was reported before it. `onChunk` hears
47
+ * every chunk (the idle watchdog). The stream is cancelled on every exit.
48
+ */
49
+ export async function readCacheWarmStream(response, { onUsage = () => {}, onChunk = () => {} } = {}) {
50
+ const usage = { inputTokens: 0, outputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, raw: null };
51
+ let reported = false;
52
+ const report = (raw) => {
53
+ if (!raw || typeof raw !== 'object') return;
54
+ updateTurnUsage(usage, raw);
55
+ reported = true;
56
+ onUsage(usageSnapshot(usage));
57
+ };
58
+ const reader = response.body.getReader();
59
+ const decoder = new TextDecoder();
60
+ let buffer = '';
61
+ try {
62
+ for (;;) {
63
+ const { value, done } = await reader.read();
64
+ if (done) break;
65
+ buffer += decoder.decode(value, { stream: true });
66
+ let cut = buffer.indexOf('\n\n');
67
+ while (cut >= 0) {
68
+ const frame = buffer.slice(0, cut);
69
+ buffer = buffer.slice(cut + 2);
70
+ cut = buffer.indexOf('\n\n');
71
+ const data = frame
72
+ .split('\n')
73
+ .filter((line) => line.startsWith('data:'))
74
+ .map((line) => line.slice(5).trimStart())
75
+ .join('\n');
76
+ if (!data) continue;
77
+ let event;
78
+ try {
79
+ event = JSON.parse(data);
80
+ } catch {
81
+ continue;
82
+ }
83
+ if (event?.type === 'error' || event?.error) throw _anthropicSseError(event, SSE_LABELS);
84
+ if (event.type === 'message_start') report(event.message?.usage);
85
+ else if (event.type === 'message_delta') report(event.usage);
86
+ else if (event.type === 'content_block_start' && reported) {
87
+ // The prefix was read (and the cache refreshed) before any content:
88
+ // nothing generated after this point is needed.
89
+ return usageSnapshot(usage);
90
+ } else if (event.type === 'message_stop') return usageSnapshot(usage);
91
+ }
92
+ onChunk(reported);
93
+ }
94
+ } catch (error) {
95
+ if (error && typeof error === 'object' && error.usage === undefined) {
96
+ error.usage = reported ? usageSnapshot(usage) : null;
97
+ }
98
+ throw error;
99
+ } finally {
100
+ await reader.cancel().catch(() => {});
101
+ }
102
+ return usageSnapshot(usage);
103
+ }
104
+
105
+ /**
106
+ * One warm on account instance `instance` (roster account `accountId`, empty
107
+ * for a provider without a roster) of `providerName`: the account gate, then
108
+ * `post(signal)` (the provider's single POST of its built body), then the
109
+ * stream. A refusal reaches the shared rate-limit and roster state; the
110
+ * transport is aborted on every exit.
111
+ */
112
+ export async function sendAnthropicCacheWarm({
113
+ providerName,
114
+ instance,
115
+ accountId = '',
116
+ model,
117
+ opts = {},
118
+ post,
119
+ onUsage,
120
+ }) {
121
+ const blocked = cacheWarmAccountBlock(providerName, instance, {
122
+ accountId,
123
+ model,
124
+ sessionId: opts.session?.id || opts.sessionId || '',
125
+ });
126
+ if (blocked) throw cacheWarmBlockedError(blocked);
127
+ const controller = new AbortController();
128
+ const callerSignal = opts.signal;
129
+ const onCallerAbort = () => controller.abort(callerSignal.reason);
130
+ if (callerSignal?.aborted) controller.abort(callerSignal.reason);
131
+ else callerSignal?.addEventListener?.('abort', onCallerAbort, { once: true });
132
+ const deadline = watchdog(controller);
133
+ deadline.arm(PROVIDER_FIRST_BYTE_TIMEOUT_MS, 'first byte');
134
+ try {
135
+ const response = await post(controller.signal);
136
+ if (!response.ok) {
137
+ const bodyText = await response.text().catch(() => '');
138
+ throw anthropicQuotaError(response.status, response.headers, bodyText);
139
+ }
140
+ return await readCacheWarmStream(response, {
141
+ onUsage,
142
+ onChunk: (reported) => {
143
+ if (reported) deadline.arm(PROVIDER_SSE_IDLE_TIMEOUT_MS, 'stream');
144
+ },
145
+ });
146
+ } catch (error) {
147
+ // The warm's own error is what the caller needs; a failure to persist the
148
+ // refusal (quota / roster state) is reported, scrubbed, like the other
149
+ // credential and account-state write failures of the Anthropic providers.
150
+ await recordCacheWarmRefusal(providerName, instance, error, {
151
+ accountId,
152
+ model,
153
+ aborted: Boolean(callerSignal?.aborted),
154
+ }).catch((recordError) => {
155
+ process.stderr.write(
156
+ `[anthropic-cache-warm] refusal record failed: ${scrubOAuthSecrets(recordError?.message || String(recordError))}\n`
157
+ );
158
+ });
159
+ throw error;
160
+ } finally {
161
+ callerSignal?.removeEventListener?.('abort', onCallerAbort);
162
+ deadline.clear();
163
+ controller.abort(new Error('cache warm finished'));
164
+ }
165
+ }
@@ -10,7 +10,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
10
10
  // source release just to advance the user-agent version.
11
11
  // Claude Opus 5.5 requires 2.1.280 or newer. The release workflow raises this
12
12
  // to the published CLI version (scripts/sync-client-version-floors.mjs).
13
- export const DEFAULT_CLI_VERSION = '2.1.309';
13
+ export const DEFAULT_CLI_VERSION = '2.1.311';
14
14
  export const CLAUDE_CLI_NPM_PACKAGE = '@anthropic-ai/claude-code';
15
15
 
16
16
  const CACHE_SCHEMA_VERSION = 1;
@@ -15,6 +15,7 @@ import { boundProviderAuthPath } from '../../../shared/provider-auth-binding.mjs
15
15
  import { resolvePluginData } from '../../../shared/plugin-paths.mjs';
16
16
  import { modelProxyClientMode, serverModelCredentialsDisabledError } from '../../../shared/model-proxy-mode.mjs';
17
17
  import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
18
+ import { TIMEOUT_PHASE } from '../../../shared/provider-timeout-phase.mjs';
18
19
  import { claudeCliUserAgent, resolveCliVersion } from './anthropic-oauth-client-version.mjs';
19
20
  import {
20
21
  accountIdentityFields,
@@ -375,7 +376,9 @@ async function _refreshOAuthCredentialsUnlocked(creds) {
375
376
  return refreshed;
376
377
  } catch (err) {
377
378
  if (err?.name === 'AbortError') {
378
- throw new Error('Anthropic OAuth token refresh timed out after 30000ms');
379
+ throw Object.assign(new Error('Anthropic OAuth token refresh timed out after 30000ms'), {
380
+ timeoutPhase: TIMEOUT_PHASE.AUTH,
381
+ });
379
382
  }
380
383
  throw err;
381
384
  } finally {
@@ -12,7 +12,9 @@ import { sendGzipCompressed } from '../lib/request-compression.mjs';
12
12
  const API_URL = 'https://api.anthropic.com/v1/messages';
13
13
  export { ANTHROPIC_VERSION };
14
14
 
15
- export async function postMessages({ accessToken, requestBody, betaHeaders, signal, compress }) {
15
+ // `plain`: exactly one uncompressed POST (a cache warm), so no compression
16
+ // rejection resend can follow.
17
+ export async function postMessages({ accessToken, requestBody, betaHeaders, signal, compress, plain = false }) {
16
18
  const headers = {
17
19
  Authorization: `Bearer ${accessToken}`,
18
20
  'anthropic-version': ANTHROPIC_VERSION,
@@ -22,17 +24,15 @@ export async function postMessages({ accessToken, requestBody, betaHeaders, sign
22
24
  'x-app': 'cli',
23
25
  'Content-Type': 'application/json',
24
26
  };
25
- return sendGzipCompressed({
26
- raw: Buffer.from(JSON.stringify(requestBody)),
27
- headers,
28
- compress,
29
- send: (body, sendHeaders) =>
30
- fetch(API_URL, {
31
- method: 'POST',
32
- headers: sendHeaders,
33
- body,
34
- signal,
35
- dispatcher: getLlmDispatcher(),
36
- }),
37
- });
27
+ const raw = Buffer.from(JSON.stringify(requestBody));
28
+ const send = (body, sendHeaders) =>
29
+ fetch(API_URL, {
30
+ method: 'POST',
31
+ headers: sendHeaders,
32
+ body,
33
+ signal,
34
+ dispatcher: getLlmDispatcher(),
35
+ });
36
+ if (plain) return send(raw, headers);
37
+ return sendGzipCompressed({ raw, headers, compress, send });
38
38
  }