mixdog 1.2.3 → 1.2.5

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 (469) hide show
  1. package/package.json +1 -1
  2. package/scripts/gate-local.mjs +6 -4
  3. package/scripts/lib/gate-scheduler.mjs +29 -11
  4. package/scripts/mobile-release.mjs +5 -4
  5. package/scripts/probe-provider-catalog.mjs +31 -0
  6. package/scripts/provider-pingpong-live.mjs +128 -38
  7. package/scripts/session-sweep.mjs +5 -25
  8. package/src/agents/maintainer/AGENT.md +1 -1
  9. package/src/agents/maintainer/agent.json +1 -1
  10. package/src/agents/reviewer/AGENT.md +2 -4
  11. package/src/agents/security/AGENT.md +1 -2
  12. package/src/agents/writer/AGENT.md +2 -3
  13. package/src/defaults/shipped-history.json +7 -1
  14. package/src/defaults/skills/image/SKILL.md +21 -23
  15. package/src/lib/keychain-cjs.cjs +13 -11
  16. package/src/output-styles/common.md +2 -1
  17. package/src/rules/agent/AGENT.md +7 -5
  18. package/src/rules/lead/LEAD.md +13 -13
  19. package/src/rules/shared/45-destructive.md +4 -0
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  21. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  22. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  23. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  24. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  25. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  26. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
  28. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  29. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  30. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
  31. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
  32. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  33. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  34. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
  35. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
  36. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
  37. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
  38. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
  39. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
  40. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  41. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  42. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  43. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  44. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  45. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
  46. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
  47. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
  48. package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
  49. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
  50. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
  51. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
  52. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
  53. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
  54. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
  55. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  56. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  57. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
  58. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
  59. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
  60. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
  61. package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
  62. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
  64. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
  65. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  66. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
  67. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
  68. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  69. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
  70. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
  71. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
  75. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
  76. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
  77. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
  78. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
  79. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  80. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
  81. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  82. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
  83. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
  84. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
  85. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
  86. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
  87. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
  88. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
  89. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
  90. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
  91. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
  92. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
  93. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
  94. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
  95. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
  96. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
  97. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
  98. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  99. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
  100. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  101. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  102. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  103. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
  104. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  105. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
  106. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
  107. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
  108. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  109. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  110. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  111. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  112. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  113. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
  114. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  115. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
  116. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  117. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
  118. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  119. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  120. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  121. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  123. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  124. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
  125. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
  126. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
  127. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  128. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  129. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  130. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
  131. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
  132. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
  133. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  134. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
  135. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
  136. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  137. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
  138. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
  139. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
  140. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  141. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  142. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
  143. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
  144. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  145. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
  146. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
  147. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  148. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  149. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  150. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  151. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
  152. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  153. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  154. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
  155. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
  157. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  158. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
  159. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  160. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
  161. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  162. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
  163. package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
  164. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
  165. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  167. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  169. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
  172. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  173. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  174. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  175. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
  176. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  177. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  178. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  179. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  181. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +160 -212
  182. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
  183. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  184. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  185. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
  186. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  187. package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
  188. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
  189. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
  190. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  191. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
  192. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  193. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  194. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  195. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  196. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  197. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
  198. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  199. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  200. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  201. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  202. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  203. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  204. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  205. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
  206. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  207. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  208. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  209. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  210. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  211. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  212. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  213. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  214. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  215. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  216. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  217. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  218. package/src/runtime/attachments/store.d.mts +9 -0
  219. package/src/runtime/attachments/store.mjs +80 -9
  220. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  221. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  222. package/src/runtime/computer-bridge/action-schema.mjs +178 -178
  223. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  224. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  225. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  226. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  227. package/src/runtime/github/tool.mjs +118 -17
  228. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  229. package/src/runtime/media/catalog.mjs +4 -4
  230. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  231. package/src/runtime/media/defaults.mjs +37 -0
  232. package/src/runtime/media/jobs.mjs +12 -2
  233. package/src/runtime/media/lanes.mjs +12 -0
  234. package/src/runtime/media/tool-defs.mjs +15 -4
  235. package/src/runtime/media/tool.mjs +41 -12
  236. package/src/runtime/media/upstream-error.mjs +72 -6
  237. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  238. package/src/runtime/memory/lib/pg/process.mjs +5 -7
  239. package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
  240. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  241. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  242. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  243. package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
  244. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  245. package/src/runtime/office/core/office-write-ledger.mjs +1 -5
  246. package/src/runtime/office/index.mjs +2 -3
  247. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  248. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  249. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  250. package/src/runtime/shared/atomic-file.d.mts +1 -1
  251. package/src/runtime/shared/background-tasks.mjs +6 -1
  252. package/src/runtime/shared/bounded-line-diff.mjs +11 -2
  253. package/src/runtime/shared/browser-launch.mjs +15 -0
  254. package/src/runtime/shared/err-text.mjs +42 -4
  255. package/src/runtime/shared/file-lock.mjs +6 -5
  256. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  257. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  258. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  259. package/src/runtime/shared/model-route-chain.mjs +48 -0
  260. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  261. package/src/runtime/shared/pid-liveness.mjs +12 -0
  262. package/src/runtime/shared/provider-api-key.mjs +6 -0
  263. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  264. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  265. package/src/runtime/shared/quiet-progress.mjs +101 -0
  266. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  267. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  268. package/src/runtime/shared/remote-intent.mjs +2 -42
  269. package/src/runtime/shared/slow-span.mjs +8 -1
  270. package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
  271. package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
  272. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  273. package/src/runtime/shared/tool-result-summary.mjs +16 -2
  274. package/src/runtime/shared/tool-status.mjs +3 -2
  275. package/src/runtime/shared/tool-surface.mjs +2 -3
  276. package/src/runtime/shared/tool-work-units.mjs +22 -15
  277. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  278. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  279. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  280. package/src/runtime/shared/transcript-writer.mjs +14 -4
  281. package/src/runtime/shared/turn-changes.mjs +2 -1
  282. package/src/runtime/shared/turn-snapshot.mjs +11 -3
  283. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  284. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  285. package/src/runtime/shared/worktrees/carry.mjs +6 -4
  286. package/src/runtime/shared/worktrees/contract.mjs +27 -1
  287. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  288. package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
  289. package/src/runtime/shared/worktrees/git-head.mjs +22 -13
  290. package/src/runtime/shared/worktrees/include.mjs +125 -7
  291. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  292. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  293. package/src/runtime/shared/worktrees/manager.mjs +378 -32
  294. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  295. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  296. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  297. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  298. package/src/runtime/terminal-bridge/client.mjs +14 -10
  299. package/src/session-runtime/boot/apis.mjs +7 -1
  300. package/src/session-runtime/boot/config.mjs +2 -0
  301. package/src/session-runtime/boot/facade.mjs +3 -0
  302. package/src/session-runtime/boot/session.mjs +3 -2
  303. package/src/session-runtime/boot/tools.mjs +3 -0
  304. package/src/session-runtime/conversation-import/service.mjs +1 -1
  305. package/src/session-runtime/goal-facade-api.mjs +2 -2
  306. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
  307. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
  308. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
  309. package/src/session-runtime/internal-tool-executor.mjs +2 -0
  310. package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
  311. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
  312. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
  313. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  314. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  315. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  316. package/src/session-runtime/lifecycle/teardown.mjs +7 -16
  317. package/src/session-runtime/media-api.mjs +8 -0
  318. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  319. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  320. package/src/session-runtime/model-route/set-route.mjs +114 -34
  321. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  322. package/src/session-runtime/model-route-api.mjs +4 -2
  323. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  324. package/src/session-runtime/native-web-search.mjs +9 -8
  325. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  326. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  327. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  328. package/src/session-runtime/provider-models.mjs +1 -0
  329. package/src/session-runtime/provider-usage.mjs +4 -0
  330. package/src/session-runtime/route-resolution.mjs +3 -1
  331. package/src/session-runtime/runtime-core.mjs +4 -0
  332. package/src/session-runtime/runtime-facade.mjs +6 -0
  333. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  334. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  335. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  336. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  337. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  338. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  339. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  340. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  341. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  342. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  343. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  344. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  345. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
  346. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  347. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  348. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  349. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  350. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  351. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  352. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  353. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  354. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  355. package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
  356. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  357. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  358. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  359. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  360. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  361. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  362. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  363. package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
  364. package/src/session-runtime/services/agent-tool.mjs +4 -0
  365. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  366. package/src/session-runtime/services/provider-admin.mjs +77 -0
  367. package/src/session-runtime/session-create/session-options.mjs +7 -5
  368. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  369. package/src/session-runtime/session-transcript.mjs +4 -5
  370. package/src/session-runtime/session-turn-api.mjs +3 -9
  371. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
  372. package/src/session-runtime/setup-tool/executor.mjs +23 -5
  373. package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
  374. package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
  375. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
  376. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  377. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  378. package/src/session-runtime/turn/side-question-ops.mjs +1 -4
  379. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
  380. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
  381. package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
  382. package/src/session-runtime/turn/turn-run.mjs +1 -36
  383. package/src/session-runtime/usage-stats-api.mjs +4 -1
  384. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  385. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  386. package/src/session-runtime/workspace/project-branches.mjs +28 -36
  387. package/src/session-runtime/workspace/transition-steps.mjs +96 -95
  388. package/src/session-runtime/workspace/transitions.mjs +248 -68
  389. package/src/standalone/channel-transport.mjs +3 -4
  390. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  391. package/src/standalone/daemon-pg-stop.mjs +1 -3
  392. package/src/standalone/daemon-session-control.mjs +88 -0
  393. package/src/standalone/daemon-stored-session-views.mjs +23 -3
  394. package/src/standalone/daemon.mjs +2 -0
  395. package/src/standalone/desktop-service-registry.mjs +32 -5
  396. package/src/standalone/local-session-runtime.mjs +11 -12
  397. package/src/standalone/session-protocol.mjs +7 -0
  398. package/src/standalone/session-runtime-inline-host.mjs +2 -0
  399. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  400. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  401. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  402. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  403. package/src/standalone/session-service/agent-tree.mjs +28 -2
  404. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  405. package/src/standalone/session-service/entries.mjs +1 -0
  406. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  407. package/src/standalone/session-service/quota-resume.mjs +28 -13
  408. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  409. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  410. package/src/standalone/session-tool-output.mjs +82 -0
  411. package/src/tui/app/app-view.jsx +2 -1
  412. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  413. package/src/tui/app/provider-setup-picker.mjs +15 -3
  414. package/src/tui/app/slash-commands.mjs +6 -0
  415. package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
  416. package/src/tui/components/Spinner.jsx +4 -0
  417. package/src/tui/components/SpinnerByline.jsx +21 -2
  418. package/src/tui/components/status-line/local-line.mjs +10 -2
  419. package/src/tui/dist/index.mjs +529 -270
  420. package/src/tui/session/active-tool-summary.mjs +1 -1
  421. package/src/tui/session/context-state.mjs +0 -3
  422. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  423. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  424. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  425. package/src/tui/session/quota-resume.mjs +140 -61
  426. package/src/tui/session/session-api/commands.mjs +4 -10
  427. package/src/tui/session/session-api/controls.mjs +12 -0
  428. package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
  429. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  430. package/src/tui/session/session-api/lifecycle.mjs +13 -11
  431. package/src/tui/session/session-api/media.mjs +2 -0
  432. package/src/tui/session/session-api/routes.mjs +81 -57
  433. package/src/tui/session/session-api/settings.mjs +3 -3
  434. package/src/tui/session/session-api/worktree.mjs +3 -2
  435. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  436. package/src/tui/session/session-flow/drain.mjs +6 -4
  437. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  438. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  439. package/src/tui/session/session-flow/queue.mjs +1 -1
  440. package/src/tui/session/tool-approval.mjs +17 -8
  441. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  442. package/src/tui/session/tui-steering-persist.mjs +3 -5
  443. package/src/tui/session/turn-quiet.mjs +53 -0
  444. package/src/tui/session/turn-stream.mjs +5 -1
  445. package/src/tui/session/turn.mjs +38 -31
  446. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  447. package/src/tui/spinner-meta.mjs +10 -0
  448. package/src/tui/spinner-verbs.mjs +3 -0
  449. package/src/ui/statusline.mjs +13 -3
  450. package/src/ui/streaming-markdown-heal.mjs +70 -18
  451. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  452. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  453. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  454. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
  455. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  456. package/src/session-runtime/turn/share-ops.mjs +0 -77
  457. package/src/tui/session/cross-surface-share.mjs +0 -406
  458. package/src/tui/session/live-share/delta.mjs +0 -153
  459. package/src/tui/session/live-share/mirror.mjs +0 -106
  460. package/src/tui/session/live-share/owner.mjs +0 -254
  461. package/src/tui/session/live-share/retry.mjs +0 -54
  462. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  463. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  464. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  465. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  466. package/src/tui/session/live-share/viewer.mjs +0 -99
  467. package/src/tui/session/live-share/wire.mjs +0 -44
  468. package/src/tui/session/live-share.mjs +0 -154
  469. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -12,27 +12,25 @@ dependencies:
12
12
 
13
13
  # Image generation and editing (media tool · Media Studio)
14
14
 
15
- Use `media` for still-image generation and editing. Read this guide before
16
- the first image-generation or editing call.
15
+ Use `media` for still-image generation and editing; read this guide before the first call.
17
16
 
18
- This file owns the judgement around one tool for still images: how a picture is asked for, checked, and saved. It is not tied to any deliverable — a deck, a document, or a page that needs a picture loads this skill and keeps only its own placement rules. The lane catalog (providers, models, controls, sign-in state) lives in the runtime and is read with `list`; nothing here names a lane or a model, so this file stays true when providers change.
17
+ This file owns the judgement around one tool for still images: how a picture is asked for, checked, and saved. Any deliverable that needs a picture loads it and keeps only its own placement rules. The lane catalog (providers, models, controls, sign-in state) lives in the runtime and is read with `list`, so this file stays true when providers change.
19
18
 
20
19
  ## 1. Which kind of job
21
20
  **Hard rule — generate or edit, decided first**:
22
- - *Generate* — the user wants a new image (product shot, hero, social card, illustration, icon, texture, concept) or a deliverable needs one. Images the user attaches only as style, mood, or composition guidance still make this a generate with references.
21
+ - *Generate* — the user wants a new image (product shot, hero, social card, illustration, icon, texture, concept) or a deliverable needs one. Images attached only as style, mood, or composition guidance still make this a generate with references.
23
22
  - *Edit* — the user wants an existing image kept and part of it changed: background swap, object removal, lighting or weather, text replacement, style transfer, compositing, cutout. The source image goes in `references` as the edit target; §3 edit brief applies.
24
- **Hard rule — not this tool**: extending a repository's own SVG, icon, or logo system; simple shapes, wireframes, and diagrams that are better drawn in SVG, HTML/CSS, or a chart library; charts, tables, and the user's own photographs, which a generated picture never replaces.
23
+ **Hard rule — not this tool**: a repository's own SVG, icon, or logo system; simple shapes, wireframes, and diagrams better drawn in SVG, HTML/CSS, or a chart library; charts, tables, and the user's own photographs.
25
24
  **Hard rule — no signed-in lane, no picture**: when `list` (or a failed `generate`) reports no image lane, continue without and say so; never substitute a placeholder, a stock-photo URL, or an emoji.
26
- **Default — one generation per job, one corrected retry**: a result that misses the brief is retried once with a single targeted change (§2 step 3); a second miss is reported as "not achieved", not a third attempt. Several candidates only when the user asks for choices.
27
-
25
+ **Default — one generation per job, one corrected retry**: a result that misses the brief is retried once with a single targeted change (§2 step 3); a second miss is reported as "not achieved".
28
26
  ## 2. Call order
29
- 1. `media action:'list' kind:'image'` once per session before the first generate: signed-in lanes, their models, and `remembered` — the lane/model a generate runs on when none is passed (the user's current Studio selection, else the last generation of this kind). Add `model:` for that model's controls (`aspectRatio` / `size`, `resolution`, `quality`, `maxReferences`).
30
- 2. `media action:'generate' kind:'image', prompt, path, + controls` — **lane and model are omitted by default** so the picture comes from what the user chose; controls only from the remembered model's list. Pass `lane`/`model` only when the job needs a capability that model lacks (reference count, exact in-image text, a listed resolution), chosen from `list`. The result reports the lane, model, `laneSource` (`requested` / `remembered` / `first`), and options actually used, and those go into the report.
31
- 3. **Hard rule — look before using**: open the file with `read` and check subject, style, composition, the exclusions, any in-image text, and — for an edit — every item in the preserve list. A miss is fixed by changing one variable in the prompt and restating every invariant; never rewrite the whole prompt, never use an unseen result.
27
+ 1. `media action:'list' kind:'image'` once per session before the first generate: signed-in lanes, their models, and `remembered` — the lane/model a generate runs on when none is passed (Studio selection, else last generation of this kind). Add `model:` for that model's controls (`aspectRatio` / `size`, `resolution`, `quality`, `background`, `maxReferences`).
28
+ 2. `media action:'generate' kind:'image', prompt, path, + controls` — **lane and model are omitted by default** (the user's remembered choice, else the signed-in ChatGPT lane); controls only from that model's list — one listing none gets none. **Hard rule — a named source is passed**: GPT / ChatGPT / Codex / OpenAI → the OpenAI lane; Grok, Gemini, Antigravity → theirs, from `list`; if it is not signed in, say so rather than swap. Otherwise pass `lane`/`model` only when the job needs a capability the model lacks (reference count, exact text, a listed resolution). The result reports lane, model, `laneSource` (`requested` / `remembered` / `first`), and options used.
29
+ 3. **Hard rule — look before using**: open the file with `read` and check subject, style, composition, the exclusions, any in-image text, and — for an edit — every item in the preserve list. A miss is fixed by changing one variable in the prompt and restating every invariant; never rewrite the whole prompt.
32
30
  4. The result is also a Studio asset (`assetId`); the file at `path` is the copy the work uses.
33
31
 
34
32
  ## 3. Prompt form
35
- **Hard rule — labeled lines, in priority order**: the model reads order as priority; scene first by default, subject first when identity or product fidelity dominates. Use only the lines that change pixels; add a short labeled line when it materially helps. Never wrap the prompt in JSON.
33
+ **Hard rule — labeled lines, in priority order**: the model reads order as priority; scene first by default, subject first when identity or product fidelity dominates. Use only the lines that change pixels. Never wrap the prompt in JSON.
36
34
  ```
37
35
  Use: photorealistic | product-mockup | ui-mockup | infographic | logo-brand | illustration | stylized-concept | historical-scene (edit: text-replace | identity-preserve | object-edit | lighting-weather | cutout | style-transfer | compositing | sketch-to-render)
38
36
  Asset: where it will be used — hero, OG card, figure, avatar, sprite, texture, cover
@@ -45,8 +43,8 @@ Text: "exact words" · script · font style · size · placement (onl
45
43
  Keep: invariants that must not change (edits; see the edit brief)
46
44
  Avoid: no logos, no watermarks; plus no text / no faces when the use calls for it
47
45
  ```
48
- **Default — specificity policy**: a detailed user prompt is normalized into this form and nothing is added; a generic one gets composition, intended use, and scene concreteness — never extra characters, props, brand names, palettes, story beats, or a left/right placement the layout does not call for.
49
- **Default — exclusions follow the use**: a field for copy (hero, cover, OG, background) excludes text, logos, watermarks, and faces unless asked; an illustration or a scene with people excludes only logos and watermarks; a portrait keeps its face. "No text" is not a universal default.
46
+ **Default — specificity policy**: a detailed user prompt is normalized into this form and nothing is added; a generic one gets composition, intended use, and scene concreteness — never extra characters, props, brands, palettes, story beats, or placement the layout does not call for.
47
+ **Default — exclusions follow the use**: a field for copy (hero, cover, OG, background) excludes text, logos, watermarks, and faces unless asked; an illustration or a scene with people excludes only logos and watermarks; a portrait keeps its face.
50
48
  **Hard rule — anti-patterns**:
51
49
  | Pattern | Why it fails | Instead |
52
50
  |---|---|---|
@@ -62,13 +60,13 @@ Change only: the specific modification
62
60
  Preserve exactly: named locks — face structure, pose, product silhouette, logo geometry, text spelling, framing, perspective, palette, lighting, shadows
63
61
  Do not add or remove: protected elements
64
62
  ```
65
- "Keep everything else the same" alone is weak: name the fragile properties, and repeat the same lock list on every retry. A removal is written as what replaces it ("show the continuous desk grain where the note was, matching lighting and perspective — no residue or outline"), never as "remove X" alone. A source carrying drawn markup (arrows, boxes, notes) is sent clean, with the markup translated into instructions — the model reproduces marks it sees.
63
+ "Keep everything else the same" alone is weak: name the fragile properties, and repeat the same lock list on every retry. A removal is written as what replaces it ("show the continuous desk grain where the note was, no residue or outline"), never as "remove X" alone. A source carrying drawn markup (arrows, boxes, notes) is sent clean, with the markup translated into instructions — the model reproduces marks it sees.
66
64
 
67
65
  ## 4. Text inside the image
68
66
  **Default — text only when wanted**: a field for copy gets no text; the deliverable or the page sets its own type over it.
69
67
  **Hard rule — when text is wanted, it is exact**: the words in quotes, the language and script, the font style, the approximate size, the placement, and "once, with no other readable text". Uncommon words are spelled letter by letter. Korean: write the prompt in English and quote only the Hangul string; start with short label-length strings.
70
68
  **Hard rule — copy that must be exact is composited, not generated**: packaging, UI, legal, or brand copy is generated as an empty reserved area (`no text` in that region) and set afterwards with a real font by the deliverable or an image tool.
71
- **Default — always inspect rendered text** (§2 step 3); garbled or substituted glyphs are common. One targeted text-only edit pass may follow; if spelling still drifts, stop and composite.
69
+ **Default — always inspect rendered text** (§2 step 3); garbled glyphs are common. One targeted text-only edit pass may follow; if spelling still drifts, stop and composite.
72
70
 
73
71
  ## 5. Reference images
74
72
  `references:` takes file paths; the model's `maxReferences` caps them. A reference is the user's own file or one this session generated — never a downloaded third-party image.
@@ -87,15 +85,15 @@ Do not add or remove: protected elements
87
85
  | icon, avatar, texture, tile | `1:1` |
88
86
  | a still for a video clip | the clip's aspect |
89
87
 
90
- The value must be one the model lists; when a model lists sizes instead of ratios, pick the closest size.
91
- **Default — resolution**: the highest the model lists for a hero, print, or full-bleed frame; the default for drafts, thumbnails, and icons. Use the `quality` setting only when the model lists it.
92
- **Default — cutouts**: models do not produce real alpha; generate on a stated solid background (`pure solid white #FFFFFF`, or black for reflective subjects; "no gradient, no floor, no shadow, no vignette") and remove it afterwards. Never ask for "transparent background" — it burns a fake checkerboard into the image.
88
+ Pass only a listed value (closest size when sizes are listed); a model listing none gets none, so put the ratio in the prompt's Composition line.
89
+ **Default — resolution**: the highest the model lists for a hero, print, or full-bleed frame; the default for drafts, thumbnails, and icons.
90
+ **Default — cutouts and transparency**: when the model lists `background`, pass `background: transparent` for cutouts, stickers, icons, logos, background removal, and edits of an image that must stay transparent (`auto` drops alpha on edits). Otherwise generate on a stated solid background (`pure solid white #FFFFFF`, or black for reflective subjects; "no gradient, no floor, no shadow, no vignette") and remove it afterwards; never put "transparent background" in the prompt — it burns a fake checkerboard into the image.
93
91
 
94
92
  ## 7. Saving, reporting, provenance
95
93
  **Hard rule — never overwrite**: an existing file gets a sibling (`hero-v2.png`, `photo-edited.png`) unless the user asked for replacement. Output goes beside the work that uses it or where the user named; nothing lives only in a temp folder.
96
- **Hard rule — the report names what was made**: final path, lane/model, options, and the final prompt (for an edit, the change and the locks).
97
- **Hard rule — generated media is declared where it lands**: the deliverable that places it records it as generated with lane/model and prompt (speaker notes, figure caption, alt text, or the message). A generated picture is never presented as a photograph of a real event, place, or person.
94
+ **Hard rule — the report names what was made**: final path, the lane/model that produced it (said to the user in plain words), options, and the final prompt (edit: the change and locks).
95
+ **Hard rule — generated media is declared where it lands**: the deliverable that places it records it as generated with lane/model and prompt (notes, caption, alt text, or message). A generated picture is never presented as a photograph of a real event, place, or person.
98
96
  ## 8. Failure and cost
99
- - A `generate` error carries `lanes` (what is signed in for images) or `available` (models); choose from it and call again, or continue without.
100
- - Generation costs the user credits or quota on that provider: one call per job, no speculative variants, no regeneration "to see another option" unless asked.
101
- - When a retry is needed, first try re-editing only the residual region with the same locks rather than enlarging the prompt.
97
+ - A `generate` error carries `lanes` (what is signed in for images) or `available` (models); choose from it and call again, or continue without. `MEDIA_USAGE_LIMIT`: limit reached — tell the user the reset time. `MEDIA_PARTIAL_ONLY`: no final image, nothing saved.
98
+ - Generation costs the user credits or quota: one call per job, no speculative variants or "another option" regenerations unless asked.
99
+ - On a retry, re-edit only the residual region with the same locks rather than enlarging the prompt.
@@ -353,7 +353,9 @@ function secretToolCheck(r) {
353
353
  }
354
354
  if (r.error) {
355
355
  keychainDebug('secret-tool failed to start', r.error.message);
356
- throw new Error('[keychain] secret-tool could not be started — check that libsecret-tools is installed and a Secret Service is running');
356
+ throw new Error(
357
+ '[keychain] secret-tool could not be started — check that libsecret-tools is installed and a Secret Service is running'
358
+ );
357
359
  }
358
360
  return r;
359
361
  }
@@ -495,7 +497,10 @@ function onKeychainRecovered(listener) {
495
497
  // secret-tool cannot fix itself and is not retried.
496
498
  function _scheduleLinuxBackgroundRetry() {
497
499
  if (_linuxBgTimer || _keychainStatus.state === 'missing' || _gdbusMissing) return;
498
- const delay = Math.min(LINUX_PREWARM_RETRY_MS * 2, LINUX_PREWARM_RETRY_MS + _linuxBgAttempt * (LINUX_PREWARM_RETRY_MS / 2));
500
+ const delay = Math.min(
501
+ LINUX_PREWARM_RETRY_MS * 2,
502
+ LINUX_PREWARM_RETRY_MS + _linuxBgAttempt * (LINUX_PREWARM_RETRY_MS / 2)
503
+ );
499
504
  _linuxBgAttempt++;
500
505
  _linuxBgTimer = setTimeout(async () => {
501
506
  _linuxBgTimer = null;
@@ -592,14 +597,10 @@ const LINUX_UNREACHABLE_MESSAGE =
592
597
  '[keychain] the keyring is not reachable — make sure it is running, then use Unlock keyring / Retry';
593
598
  function _noteKeychainFailure(error) {
594
599
  const message = String(error?.message || error);
595
- const state =
596
- error?.code === 'KEYRING_UNREACHABLE'
597
- ? 'unreachable'
598
- : /not installed/.test(message)
599
- ? 'missing'
600
- : /locked|timed out/.test(message)
601
- ? 'locked'
602
- : 'error';
600
+ let state = 'error';
601
+ if (error?.code === 'KEYRING_UNREACHABLE') state = 'unreachable';
602
+ else if (/not installed/.test(message)) state = 'missing';
603
+ else if (/locked|timed out/.test(message)) state = 'locked';
603
604
  _keychainStatus = { state, message };
604
605
  }
605
606
 
@@ -718,7 +719,8 @@ async function _prewarmLinuxOnce() {
718
719
  for (const account of accounts) {
719
720
  const value = await linuxGetAsync(account, remaining());
720
721
  if (value !== null) values.push([account, value]);
721
- } if (_cacheEpoch !== epoch) return;
722
+ }
723
+ if (_cacheEpoch !== epoch) return;
722
724
  // Replace, not merge: values the keyring now holds overwrite the cache and
723
725
  // cached accounts the keyring no longer has are dropped, so external CLI /
724
726
  // other-process add, replace and delete are picked up. A same-process
@@ -15,6 +15,7 @@ partial: true
15
15
  - Distinguish facts, inference, and uncertainty; keep exact literals and
16
16
  material risks. Caveats only when they change the reader's next step.
17
17
  - Never pad: no tangents, unsolicited offers, raw dumps, or process recaps.
18
- Explicit depth requests win; depth applies to substantive answers only.
18
+ Explicit depth requests win; depth applies to substantive answers, not the
19
+ one-line pre-tool briefing.
19
20
  - At every depth keep decision-relevant failures, security warnings, and
20
21
  destructive-action confirmations; quote needed error text exactly.
@@ -6,8 +6,10 @@
6
6
  unapproved destructive action, or a blocker.
7
7
  - Communicate in English. Call tools immediately, with no preamble or
8
8
  progress text.
9
- - Reporting: report once, when done, per your role's output contract;
10
- otherwise done, partial, or blocked with the outcome, then only applicable
11
- items: changed files with key symbols, checks run (passes in one line,
12
- failures with decisive error text), material risks or blockers. No raw
13
- logs, narration, or restated brief. Lead owns the independent review.
9
+ - Reporting: send one final message, then stop; never ask whether to
10
+ continue. Start with `Status: done|partial|blocked`, then:
11
+ Result: the answer or outcome, mapped to the brief's done-when.
12
+ Evidence: path+symbol and checks run (failures: decisive error only).
13
+ Open: risks, gaps, or the blocker. Omit empty fields; no logs, narration,
14
+ or restated brief. Role contracts only add fields.
15
+ Lead owns the independent review.
@@ -4,10 +4,12 @@
4
4
  - The user's latest explicit request overrides any internal rule; drive it to
5
5
  completion.
6
6
  - The user sees your text, and tool calls only as activity cards, never your
7
- thinking. Before the first tool call, state in one line what you are about
8
- to do; afterwards bring the user only material findings, direction or scope
9
- changes, unapproved destructive actions, blockers or meaningful delays —
10
- never per-call narration or plan repeats.
7
+ thinking. Before your first tool call, briefly state what you are about to
8
+ do. While working, give short updates at key moments: when you find
9
+ something, change direction, or make progress without an update for a
10
+ while. Otherwise bring the user only material findings, direction or scope
11
+ changes, unapproved destructive actions, blockers or meaningful delays — never per-call
12
+ narration or plan repeats.
11
13
  - Mid-task: a replacement supersedes, an addition folds in, a status question
12
14
  gets a brief answer while work continues.
13
15
  - Context is managed automatically: never stop or propose stopping because of
@@ -15,15 +17,13 @@
15
17
  - Be a grounded, candid, and attentive collaborator: natural and respectful,
16
18
  without flattery, forced humor, mimicry, or stereotyping.
17
19
  <!-- tools: agent -->
18
- - Briefing an agent: it sees only the brief, never this conversation. The
19
- brief is written in English whatever language the user writes in, and
20
- holds only the task in the user's terms and its use; owned scope and
21
- exclusions; changes located by path plus symbol or quoted line, not line
22
- numbers; completion criteria; any return need beyond the role. No
23
- background, rediscoverable detail, or known rules; large evidence by path.
24
- A fresh or respawned agent gets the whole brief; a
25
- continuing agent gets only what changed. Never assign the same work twice;
26
- interrupt only to cancel.
20
+ - Briefing an agent: it starts blank and sees only the brief. Write it in
21
+ English, self-contained: goal and its use; owned scope and non-goals;
22
+ targets by path plus symbol or quoted line; done-when as an observable,
23
+ checkable end state; any return need beyond the role. Pass only what
24
+ cannot be rediscovered; large evidence by path. A fresh agent gets the
25
+ whole brief, a continuing one only what changed. Never assign the same
26
+ work twice.
27
27
  <!-- tools: agent -->
28
28
  - Receiving an agent's report: it arrives as a `<task-notification>` block, a
29
29
  runtime message rather than the user speaking. Do not wait for it in-turn —
@@ -3,6 +3,10 @@
3
3
  - Commit, push, release, deployment and any irreversible action only on the
4
4
  user's explicit request. Validate exact targets first: never roots, `~` or
5
5
  unresolved variables/globs.
6
+ - Never stash, reset, checkout, restore or clean the working tree, or delete
7
+ files you did not create: it may hold other agents' or the user's
8
+ uncommitted work. Use a separate worktree or copy for before/after
9
+ comparisons.
6
10
  - Back up only when changes risk irreversible loss, not for routine code edits;
7
11
  keep backups unless the user requests removal. Report what is recoverable.
8
12
  - Temp workspaces come from a unique-directory allocator, never by clearing
@@ -30,6 +30,7 @@ function maintenanceRouteToPreset(routeOrName, agent) {
30
30
  type: 'agent',
31
31
  provider,
32
32
  model,
33
+ ...(routeOrName.fallbacks?.length ? { fallbacks: routeOrName.fallbacks } : {}),
33
34
  tools: 'full',
34
35
  };
35
36
  const effort = String(routeOrName.effort || '').trim();
@@ -11,6 +11,7 @@ import { appendAgentTrace } from '../agent-trace-io.mjs';
11
11
  import { getHiddenAgent } from '../internal-agents.mjs';
12
12
  import { envNonNegativeInt, envPresent } from '../../../shared/env.mjs';
13
13
  import {
14
+ PROVIDER_FIRST_BYTE_TIMEOUT_MS,
14
15
  PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
15
16
  PROVIDER_WS_SEMANTIC_IDLE_TIMEOUT_MS,
16
17
  STALL_TICK_MS,
@@ -45,7 +46,7 @@ export class AgentStallAbortError extends Error {
45
46
  }
46
47
  }
47
48
 
48
- function isAgentProgressWatchdogAbortError(err) {
49
+ export function isAgentProgressWatchdogAbortError(err) {
49
50
  const msg = err?.message;
50
51
  return typeof msg === 'string' && WATCHDOG_ABORT_RE.test(msg);
51
52
  }
@@ -203,14 +204,34 @@ function resolveExplicitMs(value, fallback) {
203
204
  return fallback;
204
205
  }
205
206
 
207
+ // One deadline floored one watchdog tick above the provider's own budget for
208
+ // that phase (none when the provider names none); 0 stays disabled.
209
+ function aboveProviderBudget(requestedMs, providerBudgetMs) {
210
+ if (!(requestedMs > 0) || !(providerBudgetMs > 0)) return requestedMs;
211
+ return Math.max(requestedMs, providerBudgetMs + STALL_TICK_MS);
212
+ }
213
+
214
+ // `providerFirstByteTimeoutMs` is how long the session's provider itself may
215
+ // wait for response headers, and `providerFirstOutputTimeoutMs` for its first
216
+ // output (headers plus first chunk), its own retries included
217
+ // (providerFirstResponseBudget). Provider retries keep the request clock
218
+ // running, so each first-response deadline sits one watchdog tick above that
219
+ // budget: the provider's timeout and retry decide first, and a provider that
220
+ // gives up is reported as the provider's failure.
206
221
  export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
207
- const firstTransportMs = resolveExplicitMs(
208
- overrides.firstTransportTimeoutMs ?? overrides.firstResponseTimeoutMs,
209
- DEFAULT_FIRST_RESPONSE_TIMEOUT_MS
222
+ const firstTransportMs = aboveProviderBudget(
223
+ resolveExplicitMs(
224
+ overrides.firstTransportTimeoutMs ?? overrides.firstResponseTimeoutMs,
225
+ DEFAULT_FIRST_RESPONSE_TIMEOUT_MS
226
+ ),
227
+ resolveExplicitMs(overrides.providerFirstByteTimeoutMs, PROVIDER_FIRST_BYTE_TIMEOUT_MS)
210
228
  );
211
- const firstSemanticMs = resolveExplicitMs(
212
- overrides.firstSemanticTimeoutMs ?? overrides.firstVisibleTimeoutMs,
213
- DEFAULT_FIRST_VISIBLE_CEILING_MS
229
+ const firstSemanticMs = aboveProviderBudget(
230
+ resolveExplicitMs(
231
+ overrides.firstSemanticTimeoutMs ?? overrides.firstVisibleTimeoutMs,
232
+ DEFAULT_FIRST_VISIBLE_CEILING_MS
233
+ ),
234
+ resolveExplicitMs(overrides.providerFirstOutputTimeoutMs, 0)
214
235
  );
215
236
 
216
237
  let idleStaleMs;
@@ -493,19 +493,10 @@ export function buildProviderCacheOpts(provider, _sessionId, agent, options = {}
493
493
  const ttls = resolveCacheStrategy(agent, options);
494
494
  const capability = cacheCapabilityForProvider(provider);
495
495
  if (capability === 'explicit-breakpoint') {
496
- // 2026-03-06 Anthropic dropped default TTL 1h→5m. We send
497
- // extended-cache-ttl-2025-04-11 header to retain 1h.
496
+ // 2026-03-06 Anthropic dropped default TTL 1h→5m. We request 1h via
497
+ // cache_control ttl:"1h"; no beta header is required.
498
498
  // Verified 2026-04-17 (ephemeral_1h_input_tokens=4722).
499
499
  return { cacheStrategy: ttls, ...oneShotPromptCacheOpts(agent) };
500
500
  }
501
- // NOTE: createSession's direct-call site (manager.mjs) only invokes this
502
- // for explicit-breakpoint (Anthropic-family) providers, so this branch
503
- // stays reachable only from other callers (none in-tree today) — keeping
504
- // it here preserves the documented public API/behavior of this function.
505
- if (provider === 'openai') {
506
- // Public OpenAI API: prompt_cache_retention extends prefix retention.
507
- // openai-oauth rejects the header — falls through to default.
508
- return { cacheRetention: '24h' };
509
- }
510
501
  return {};
511
502
  }
@@ -35,52 +35,124 @@ function transportPid(transport) {
35
35
  return (typeof transport?.pid === 'number' ? transport.pid : null) ?? transport?._process?.pid ?? null;
36
36
  }
37
37
 
38
+ /** Deadline of one process-table enumeration subprocess. A healthy CIM query
39
+ * takes ~1-3 s but exceeds 8 s under heavy load, and a timed-out strict read
40
+ * leaves the finished command's workspace held, so the deadline only cuts
41
+ * off a query that is genuinely stuck. A query that has not answered by then
42
+ * is killed and its snapshot rejected (strict) or empty (best-effort). A
43
+ * termination watch schedules its next pass only after the previous read
44
+ * settled, so enumerators never pile up whatever this value is. */
45
+ export const ENUMERATION_DEADLINE_MS = 20_000;
46
+
38
47
  // Spawn a helper command and resolve its stdout (empty string on any error).
39
- function run(cmd, args) {
40
- return new Promise((resolve) => {
48
+ // `timeoutMs` > 0: past the deadline the helper is killed (Node reaps it on
49
+ // exit) and the call settles at once instead of waiting for it.
50
+ function run(cmd, args, { strict = false, timeoutMs = 0 } = {}) {
51
+ return new Promise((resolve, reject) => {
41
52
  let out = '';
42
53
  let cp;
54
+ let timer = null;
55
+ let settled = false;
56
+ const settle = (finish) => {
57
+ if (settled) return;
58
+ settled = true;
59
+ if (timer) clearTimeout(timer);
60
+ finish();
61
+ };
43
62
  try {
44
63
  cp = spawn(cmd, args, { windowsHide: true });
45
- } catch {
64
+ } catch (error) {
65
+ if (strict) {
66
+ reject(error);
67
+ return;
68
+ }
46
69
  resolve('');
47
70
  return;
48
71
  }
49
72
  cp.stdout?.on('data', (d) => {
50
73
  out += String(d);
51
74
  });
52
- cp.on('error', () => resolve(out));
53
- cp.on('close', () => resolve(out));
75
+ cp.on('error', (error) => settle(() => (strict ? reject(error) : resolve(out))));
76
+ cp.on('close', (code) =>
77
+ settle(() => (strict && code !== 0 ? reject(new Error(`Process enumeration failed (${code}).`)) : resolve(out)))
78
+ );
79
+ if (timeoutMs > 0) {
80
+ timer = setTimeout(() => {
81
+ try {
82
+ cp.kill('SIGKILL');
83
+ } catch {
84
+ /* already gone */
85
+ }
86
+ cp.stdout?.destroy?.();
87
+ cp.stderr?.destroy?.();
88
+ settle(() =>
89
+ strict ? reject(new Error(`Process enumeration timed out after ${timeoutMs} ms.`)) : resolve('')
90
+ );
91
+ }, timeoutMs);
92
+ timer.unref?.();
93
+ }
54
94
  });
55
95
  }
56
96
 
57
97
  // Snapshot the whole process table once: parent map + a per-pid identity
58
98
  // token (Windows CreationDate, POSIX lstart) so a later kill can prove a pid
59
99
  // number was not recycled onto a different process before signalling it.
60
- async function enumerate() {
100
+ // POSIX rows also carry the process group id (Windows has none).
101
+ async function enumerate({ strict = false } = {}) {
61
102
  const childrenOf = new Map();
62
103
  const tokenOf = new Map();
63
104
  const nameOf = new Map();
105
+ const pgidOf = new Map();
64
106
  const out = isWin
65
- ? await run('powershell.exe', [
66
- '-NoProfile',
67
- '-NonInteractive',
68
- '-Command',
69
- `Get-CimInstance Win32_Process | ForEach-Object { "$($_.ProcessId) $($_.ParentProcessId) $($_.Name) $($_.CreationDate.ToString('o'))" }`,
70
- ])
71
- : await run('ps', ['-A', '-o', 'pid=,ppid=,comm=,lstart=']);
107
+ ? await run(
108
+ 'powershell.exe',
109
+ [
110
+ '-NoProfile',
111
+ '-NonInteractive',
112
+ '-Command',
113
+ `${strict ? "$ErrorActionPreference = 'Stop'; " : ''}Get-CimInstance Win32_Process | ForEach-Object { $created = if ($_.CreationDate) { $_.CreationDate.ToString('o') } else { '' }; "$($_.ProcessId) $($_.ParentProcessId) $($_.Name) $created" }`,
114
+ ],
115
+ { strict, timeoutMs: ENUMERATION_DEADLINE_MS }
116
+ )
117
+ : await run('ps', ['-A', '-o', 'pid=,ppid=,pgid=,comm=,lstart='], {
118
+ strict,
119
+ timeoutMs: ENUMERATION_DEADLINE_MS,
120
+ });
121
+ const row = isWin ? /^(\d+)\s+(\d+)\s+()(\S+)(?:\s+(.+))?$/ : /^(\d+)\s+(\d+)\s+(\d+)\s+(\S+)(?:\s+(.+))?$/;
72
122
  for (const line of out.split(/\r?\n/)) {
73
- const m = line.trim().match(/^(\d+)\s+(\d+)\s+(\S+)(?:\s+(.+))?$/);
123
+ const m = line.trim().match(row);
74
124
  if (!m) continue;
75
125
  const pid = Number(m[1]);
76
126
  const ppid = Number(m[2]);
77
- const token = (m[4] || '').trim() || null;
127
+ const token = (m[5] || '').trim() || null;
78
128
  if (!childrenOf.has(ppid)) childrenOf.set(ppid, []);
79
129
  childrenOf.get(ppid).push(pid);
80
130
  tokenOf.set(pid, token);
81
- nameOf.set(pid, m[3]);
131
+ nameOf.set(pid, m[4]);
132
+ if (m[3]) pgidOf.set(pid, Number(m[3]));
133
+ }
134
+ if (strict && !nameOf.has(process.pid)) throw new Error('The process snapshot could not be verified.');
135
+ return { childrenOf, tokenOf, nameOf, pgidOf };
136
+ }
137
+
138
+ /** One strict process-table snapshot: parent links, identity tokens, image
139
+ * names and (POSIX) process groups. Rejects instead of returning a partial
140
+ * table, so callers can tell "nothing found" from "could not look".
141
+ *
142
+ * `shared: true` (pre-kill captures) joins a read already in flight, so many
143
+ * jobs promoted together do not each spawn an enumerator; a capture taken
144
+ * while its root runs is valid whenever that read began. An observation after
145
+ * a kill never shares: a read that began before the kill would report the
146
+ * killed tree alive and defer the confirmation by a whole re-check. */
147
+ let tableInFlight = null;
148
+ export function readProcessTable({ shared = false } = {}) {
149
+ if (!shared) return enumerate({ strict: true });
150
+ if (!tableInFlight) {
151
+ tableInFlight = enumerate({ strict: true }).finally(() => {
152
+ tableInFlight = null;
153
+ });
82
154
  }
83
- return { childrenOf, tokenOf, nameOf };
155
+ return tableInFlight;
84
156
  }
85
157
 
86
158
  // Walk every descendant pid of rootPid (excludes rootPid).
@@ -106,12 +178,18 @@ async function collectDescendants(rootPid) {
106
178
  return descendantsOf(childrenOf, rootPid);
107
179
  }
108
180
 
109
- /** Descendant pids WITH their image names, from one batched process-table
110
- * read. Shared with the shell runner's post-exit descendant observation so
111
- * both use a single enumeration implementation. */
112
- export async function collectDescendantProcesses(rootPid) {
113
- const { childrenOf, nameOf } = await enumerate().catch(() => ({ childrenOf: new Map(), nameOf: new Map() }));
114
- return descendantsOf(childrenOf, rootPid).map((pid) => ({ pid, name: nameOf.get(pid) || '' }));
181
+ /** Descendant pids WITH their image names and identity tokens (creation
182
+ * time), from one batched process-table read. */
183
+ export async function collectDescendantProcesses(rootPid, { strict = false } = {}) {
184
+ const snapshot = enumerate({ strict });
185
+ const { childrenOf, nameOf, tokenOf } = strict
186
+ ? await snapshot
187
+ : await snapshot.catch(() => ({ childrenOf: new Map(), nameOf: new Map(), tokenOf: new Map() }));
188
+ return descendantsOf(childrenOf, rootPid).map((pid) => ({
189
+ pid,
190
+ name: nameOf.get(pid) || '',
191
+ token: tokenOf.get(pid) ?? null,
192
+ }));
115
193
  }
116
194
 
117
195
  /** Force-kill whole process trees by pid. Windows batches one taskkill /T /F
@@ -165,6 +165,8 @@ function boundAccountSend(providerName, row, messages, options) {
165
165
  };
166
166
  }
167
167
  if (options.sessionId) {
168
+ // An explicit empty executor (model-proxy host) must stay empty.
169
+ opts.toolExecutionSessionId = options.toolExecutionSessionId ?? options.sessionId;
168
170
  opts.sessionId = accountScopedSessionId(providerName, row.id, options.sessionId);
169
171
  // The spend still belongs to the visible session (usage-accounting.mjs).
170
172
  opts.usageSessionId = options.usageSessionId || options.sessionId;
@@ -0,0 +1,36 @@
1
+ // Custom `fetch` for the Anthropic SDK client (API-key path): gzips
2
+ // /v1/messages bodies on the libuv threadpool, but ONLY when the effective
3
+ // request origin is exactly https://api.anthropic.com. The decision is made on
4
+ // the final request URL, so a custom baseURL, ANTHROPIC_BASE_URL, proxy or
5
+ // gateway never gets a compressed body. Policy shared with the OAuth path.
6
+ import { sendGzipCompressed } from './lib/request-compression.mjs';
7
+
8
+ const OFFICIAL_ORIGIN = 'https://api.anthropic.com';
9
+
10
+ function officialMessagesUrl(input) {
11
+ try {
12
+ const url = new URL(typeof input === 'string' || input instanceof URL ? input : input.url);
13
+ return url.origin === OFFICIAL_ORIGIN && url.pathname === '/v1/messages';
14
+ } catch {
15
+ return false;
16
+ }
17
+ }
18
+
19
+ function bodyBytes(body) {
20
+ if (typeof body === 'string') return Buffer.from(body);
21
+ if (ArrayBuffer.isView(body)) return Buffer.from(body.buffer, body.byteOffset, body.byteLength);
22
+ return null;
23
+ }
24
+
25
+ export function createAnthropicApiKeyFetch({ baseFetch = (...args) => globalThis.fetch(...args), compress } = {}) {
26
+ return async (input, init) => {
27
+ const raw = init?.method?.toUpperCase() === 'POST' && officialMessagesUrl(input) ? bodyBytes(init.body) : null;
28
+ if (!raw) return baseFetch(input, init);
29
+ return sendGzipCompressed({
30
+ raw,
31
+ headers: init.headers,
32
+ compress,
33
+ send: (body, headers) => baseFetch(input, { ...init, headers, body: body === raw ? init.body : body }),
34
+ });
35
+ };
36
+ }
@@ -45,7 +45,7 @@ function lowered(value) {
45
45
 
46
46
  /** The lowercased error type named by an Anthropic error body (JSON text or parsed object). */
47
47
  export function anthropicErrorTypeFromBody(body) {
48
- if (body && typeof body === 'object') return lowered((body.error && body.error.type) || body.type);
48
+ if (body && typeof body === 'object') return lowered(body.error?.type || body.type);
49
49
  const match = BODY_TYPE_RE.exec(String(body || ''));
50
50
  return match ? lowered(match[1]) : '';
51
51
  }
@@ -28,9 +28,8 @@ export function loadAnthropic() {
28
28
 
29
29
  // 4-BP cache policy aligned with anthropic-oauth — system + tier3 +
30
30
  // messages-tail. Tool schemas sit before system and are covered by the system
31
- // breakpoint, so they do not spend a separate cache_control slot. 1h TTL
32
- // requires the extended-cache-ttl beta header, which we set on the client via
33
- // defaultHeaders below.
31
+ // breakpoint, so they do not spend a separate cache_control slot. The 1h TTL
32
+ // is requested with cache_control ttl:"1h"; no beta header is needed.
34
33
 
35
34
  // BP3 (tier3) rides its own `system` role block (the 3rd system block, tagged
36
35
  // cacheTier:'tier3'). buildSystemBlocks applies the tier3 1h cache_control to
@@ -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.301';
13
+ export const DEFAULT_CLI_VERSION = '2.1.302';
14
14
  export const CLAUDE_CLI_NPM_PACKAGE = '@anthropic-ai/claude-code';
15
15
 
16
16
  const CACHE_SCHEMA_VERSION = 1;