mixdog 1.4.1 → 1.4.3

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 (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -15,10 +15,12 @@ import { drainPendingMessages, hydratePendingMessages } from './pending-messages
15
15
  import { _unlinkParentAbortListener, _getRuntimeEntry, _evictTerminalSessionRuntime } from './runtime-liveness.mjs';
16
16
  import { acquireSessionLock } from './session-lock.mjs';
17
17
  import { createAskPromptQueue } from './ask-queue.mjs';
18
- import { armTurnDurability, claimTurnRuntime } from './ask-turn-open.mjs';
18
+ import { armTurnDurability, claimTurnRuntime, settleTurnBase } from './ask-turn-open.mjs';
19
19
  import { prepareAskTurn, runAskAgentLoop } from './ask-turn-execute.mjs';
20
20
  import { commitAskTurn, publishAskTurn } from './ask-turn-settle.mjs';
21
+ import { carryReportOnError, turnReportText, withEarlierReport } from '../loop/turn-report.mjs';
21
22
  import { finalizeAskTurnFailure } from './ask-turn-failure.mjs';
23
+ import { armTurnTimeoutOnProviderError, reapTurnShellJobs } from './turn-reap.mjs';
22
24
  import { cacheWarmTurnKind, endCacheWarmTurn, failedTurnProvenance, noteCacheWarmTurn } from '../cache-warm.mjs';
23
25
 
24
26
  export { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
@@ -77,7 +79,17 @@ export function createAskTranscriptMeta(rawTranscriptMeta) {
77
79
  /** One opened turn from provider call to terminal publish; a failure unwinds
78
80
  * the turn state and rethrows. Returns the terminal result preview and the
79
81
  * follow-ups drained right after the provider accepted the turn. */
80
- async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOverride, transcript, askStartedAt }) {
82
+ async function runAskTurn({
83
+ sessionId,
84
+ opened,
85
+ input,
86
+ askOpts,
87
+ onToolCall,
88
+ cwdOverride,
89
+ transcript,
90
+ askStartedAt,
91
+ earlierReport,
92
+ }) {
81
93
  let releaseWorkspace;
82
94
  try {
83
95
  releaseWorkspace = await admitWorkspaceActivity(
@@ -97,6 +109,8 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
97
109
  // them with what the model was told. Asked again for every user turn
98
110
  // the ask runs, queued and background follow-ups included.
99
111
  currentAgents: askOpts?.agentsNow?.(),
112
+ // The session runtime's in-memory settings (the file trails them).
113
+ agentConfig: askOpts?.agentConfig?.() || null,
100
114
  });
101
115
  const result = await runAskAgentLoop({
102
116
  sessionId,
@@ -107,14 +121,19 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
107
121
  onToolCall,
108
122
  takeAssistantTranscriptMetadata: transcript.takeAssistant,
109
123
  });
110
- const terminalResultPreview = await commitAskTurn({
111
- sessionId,
112
- opened,
113
- prepared,
114
- result,
115
- rawTranscriptMeta: transcript.raw,
116
- askStartedAt,
117
- });
124
+ // The earlier turns of this ask relayed nothing (publishAskTurn relays
125
+ // only a turn no queued input follows): their reports lead this one's.
126
+ const terminalResultPreview = withEarlierReport(
127
+ await commitAskTurn({
128
+ sessionId,
129
+ opened,
130
+ prepared,
131
+ result,
132
+ rawTranscriptMeta: transcript.raw,
133
+ askStartedAt,
134
+ }),
135
+ earlierReport
136
+ );
118
137
  const drained = publishAskTurn({
119
138
  sessionId,
120
139
  opened,
@@ -125,6 +144,9 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
125
144
  });
126
145
  return { result: terminalResultPreview, drained };
127
146
  } catch (err) {
147
+ // The turn's terminal error: a provider timeout/stall that ended it (a
148
+ // retry the turn recovered from never reaches here) stops its shell work.
149
+ armTurnTimeoutOnProviderError(sessionId, opened.runtime, opened.turnSignal, err);
128
150
  await finalizeAskTurnFailure({
129
151
  sessionId,
130
152
  err,
@@ -138,12 +160,50 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
138
160
  transcriptMeta: transcript.raw,
139
161
  askStartedAt,
140
162
  });
141
- throw err;
163
+ reapTurnShellJobs(sessionId, opened.runtime);
164
+ // Queued work that fails still hands on the reports of the turns before it.
165
+ throw carryReportOnError(err, earlierReport);
142
166
  } finally {
143
- releaseWorkspace?.();
167
+ // The result is already published; this only holds the session lock until
168
+ // the reader lease is removed, so the next turn's admission follows it. A
169
+ // failed release (the admission thread stopped) never replaces the turn's
170
+ // own outcome.
171
+ try {
172
+ await releaseWorkspace?.();
173
+ } catch {
174
+ // Intentionally ignored: see the comment above.
175
+ }
144
176
  }
145
177
  }
146
178
 
179
+ /** The prompt-cache warmer learns idle gaps from real turns only; a retry is
180
+ * classified by the failed turn's stored provenance. The rebuilt retry
181
+ * message keeps that provenance (ask-turn-execute.mjs). Returns the warmer's
182
+ * turn handle. */
183
+ function noteTurnForCacheWarm(sessionId, claimed, input) {
184
+ const retryProvenance = failedTurnProvenance(claimed.preSession?.messages, input);
185
+ if (retryProvenance) input.retryProvenance = retryProvenance;
186
+ return noteCacheWarmTurn(sessionId, cacheWarmTurnKind(input, claimed.preSession?.messages));
187
+ }
188
+
189
+ /** Clear the controller only if it's still ours (closeSession may have
190
+ * swapped it). The rest of the runtime entry stays intact so agent type=list
191
+ * can still surface the final stage (done/error/cancelling). */
192
+ function detachAskRuntime(sessionId, askGeneration) {
193
+ const entry = _getRuntimeEntry(sessionId);
194
+ if (entry && entry.generation === askGeneration) {
195
+ _unlinkParentAbortListener(entry);
196
+ entry.controller = null;
197
+ // Detach the live session reference; ask is over.
198
+ entry.session = null;
199
+ }
200
+ // Final-stage runtime diagnostics are useful only while the turn is
201
+ // unwinding. Once its controller is detached, retaining the full entry
202
+ // (and any accidental references hanging from it) for the host lifetime
203
+ // turns one-shot agent traffic into an unbounded manager Map.
204
+ _evictTerminalSessionRuntime(sessionId);
205
+ }
206
+
147
207
  export async function askSession(sessionId, prompt, context, onToolCall, cwdOverride, explicitPrefetch, askOpts = {}) {
148
208
  const askStartedAt = Date.now();
149
209
  const transcript = createAskTranscriptMeta(askOpts?.transcriptMeta);
@@ -180,8 +240,9 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
180
240
  // Hoisted so the outer finally (which runs once after the whole turn loop)
181
241
  // can compare against the last turn's generation.
182
242
  let askGeneration = 0;
183
- let crashRecoveryChecked = false;
184
- let sessionStartEmitted = false;
243
+ // Crash-checkpoint recovery and the session-start event belong to the first
244
+ // turn of this ask only.
245
+ let firstTurn = true;
185
246
  // A failed-turn retry rewinds only the turn it retries, never a drained
186
247
  // follow-up turn.
187
248
  let retryFailedTurn = askOpts.retryFailedTurn === true;
@@ -213,27 +274,32 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
213
274
  input.retryAttemptId = askOpts.retryAttemptId;
214
275
  retryTurnId = null;
215
276
  }
216
- // Synchronous pre-await setup (must happen before any await so
217
- // closeSession() can't interleave between load and registration).
218
- const claimed = claimTurnRuntime({
219
- sessionId,
220
- askOpts,
221
- recoverCheckpoint: !crashRecoveryChecked,
222
- emitStart: !sessionStartEmitted,
223
- });
224
- // The prompt-cache warmer learns idle gaps from real turns only; a
225
- // retry is classified by the failed turn's stored provenance.
226
- // The rebuilt retry message keeps that provenance (ask-turn-execute.mjs).
227
- const retryProvenance = failedTurnProvenance(claimed.preSession?.messages, input);
228
- if (retryProvenance) input.retryProvenance = retryProvenance;
229
- warmTurn = noteCacheWarmTurn(sessionId, cacheWarmTurnKind(input, claimed.preSession?.messages));
230
- crashRecoveryChecked = true;
231
- sessionStartEmitted = true;
232
- askGeneration = claimed.askGeneration;
233
- const opened = {
234
- ...claimed,
235
- ...armTurnDurability({ sessionId, ...claimed, pendingEntries: input.pendingEntries }),
236
- };
277
+ // The earlier turns of this ask relayed nothing (publishAskTurn relays
278
+ // only a turn no queued input follows): this turn failing before it
279
+ // runs (runAskTurn carries the report once it has) still hands them on.
280
+ const earlierReport = result ? turnReportText(result) : '';
281
+ let opened;
282
+ try {
283
+ // The previous turn's save has landed and this turn's base is on disk
284
+ // before the turn touches the session (one unsettled turn per session).
285
+ await settleTurnBase(sessionId, { recoverCheckpoint: firstTurn });
286
+ // Synchronous pre-await setup (must happen before any await so
287
+ // closeSession() can't interleave between load and registration).
288
+ const claimed = claimTurnRuntime({
289
+ sessionId,
290
+ askOpts,
291
+ emitStart: firstTurn,
292
+ });
293
+ warmTurn = noteTurnForCacheWarm(sessionId, claimed, input);
294
+ firstTurn = false;
295
+ askGeneration = claimed.askGeneration;
296
+ opened = {
297
+ ...claimed,
298
+ ...armTurnDurability({ sessionId, ...claimed, pendingEntries: input.pendingEntries }),
299
+ };
300
+ } catch (error) {
301
+ throw carryReportOnError(error, earlierReport);
302
+ }
237
303
  // From here the turn's own unwind (ask-turn-failure) acks or releases
238
304
  // its entries; the queue keeps owning only the not-yet-started ones.
239
305
  queue.markStarted();
@@ -246,6 +312,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
246
312
  cwdOverride,
247
313
  transcript,
248
314
  askStartedAt,
315
+ earlierReport,
249
316
  });
250
317
  result = turn.result;
251
318
  endCacheWarmTurn(sessionId, warmTurn);
@@ -287,21 +354,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
287
354
  queue.releaseUnstarted();
288
355
  // A thrown setup/provider path must never leave a delayed checkpoint
289
356
  // writer alive after the turn lock is released.
290
- // Clear the controller only if it's still ours (closeSession may have
291
- // swapped it). Leave the rest of the runtime entry intact so agent type=list
292
- // can still surface the final stage (done/error/cancelling).
293
- const entry = _getRuntimeEntry(sessionId);
294
- if (entry && entry.generation === askGeneration) {
295
- _unlinkParentAbortListener(entry);
296
- entry.controller = null;
297
- // Detach the live session reference; ask is over.
298
- entry.session = null;
299
- }
300
- // Final-stage runtime diagnostics are useful only while the turn is
301
- // unwinding. Once its controller is detached, retaining the full entry
302
- // (and any accidental references hanging from it) for the host lifetime
303
- // turns one-shot agent traffic into an unbounded manager Map.
304
- _evictTerminalSessionRuntime(sessionId);
357
+ detachAskRuntime(sessionId, askGeneration);
305
358
  unlock();
306
359
  }
307
360
  }
@@ -50,19 +50,21 @@ export function turnStepAutoEffort(autoEffort, effortConfiguration) {
50
50
  : null;
51
51
  }
52
52
 
53
- export function autoEffortMode() {
53
+ // `config`: a session runtime's in-memory agent config (its file copy trails
54
+ // it by a debounce); other callers read the file.
55
+ export function autoEffortMode(config = null) {
54
56
  if (process.env.MIXDOG_AUTO_EFFORT) return normalizeAutoEffortMode(process.env.MIXDOG_AUTO_EFFORT);
55
57
  try {
56
- return builtinFeatureActive(readSection('agent'), 'autoEffort') ? 'on' : 'off';
58
+ return builtinFeatureActive(config || readSection('agent'), 'autoEffort') ? 'on' : 'off';
57
59
  } catch {
58
60
  return 'off';
59
61
  }
60
62
  }
61
63
 
62
64
  /** The global "Auto reasoning base" setting; absent or unreadable is medium. */
63
- export function autoEffortBaseSetting() {
65
+ export function autoEffortBaseSetting(config = null) {
64
66
  try {
65
- return autoEffortBase(readSection('agent')?.autoEffortBase);
67
+ return autoEffortBase((config || readSection('agent'))?.autoEffortBase);
66
68
  } catch {
67
69
  return autoEffortBase(undefined);
68
70
  }
@@ -99,8 +101,8 @@ function lastText(messages, role) {
99
101
  * briefly (its first-use load is the longest wait): a missing, still-loading,
100
102
  * or slow model yields null and the default effort.
101
103
  */
102
- export async function resolveTurnAutoEffort({ sessionId, session, provider, input }) {
103
- const mode = autoEffortMode();
104
+ export async function resolveTurnAutoEffort({ sessionId, session, provider, input, config = null }) {
105
+ const mode = autoEffortMode(config);
104
106
  // promptSource marks runtime-injected turns (completion notices, queued work).
105
107
  // Agent sessions are judged like any other: their spawn brief and later Lead
106
108
  // `send` messages arrive as plain prompts.
@@ -113,7 +115,7 @@ export async function resolveTurnAutoEffort({ sessionId, session, provider, inpu
113
115
  if (!turnEffortConfigurationMode(session, provider)) return null;
114
116
  const chosen = String(session.effort || '').toLowerCase();
115
117
  const options = effortOptionsFor(session.provider, autoEffortModel(session.provider, provider, session.model));
116
- const setting = autoEffortBaseSetting();
118
+ const setting = autoEffortBaseSetting(config);
117
119
  const base = clampAutoEffortBase({ base: setting, options }) ?? autoEffortBase(setting);
118
120
  const record = {
119
121
  at: new Date().toISOString(),
@@ -59,7 +59,13 @@ function retainedUserTurn(session, retained, transcriptMeta, currentAgents) {
59
59
  },
60
60
  currentAgents
61
61
  );
62
- return { historyMessages, userTurnMessage, outgoing: [...historyMessages, userTurnMessage] };
62
+ const noticeRevision = retained.message.meta?.promptSettingsNoticeRevision;
63
+ return {
64
+ historyMessages,
65
+ userTurnMessage,
66
+ outgoing: [...historyMessages, userTurnMessage],
67
+ promptSettingsNotice: noticeRevision ? { revision: noticeRevision } : null,
68
+ };
63
69
  }
64
70
 
65
71
  // The turn's user message: the retained one of a retried failed turn, or a
@@ -147,7 +153,15 @@ function persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGe
147
153
 
148
154
  /** Resolves the provider, builds the user turn and pre-commits it; returns
149
155
  * what the loop and the commit need from this preparation. */
150
- export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta, currentAgents }) {
156
+ export async function prepareAskTurn({
157
+ sessionId,
158
+ opened,
159
+ input,
160
+ cwdOverride,
161
+ transcriptMeta,
162
+ currentAgents,
163
+ agentConfig = null,
164
+ }) {
151
165
  const { turn, runtime, turnSignal, askGeneration, checkpoint, turnToken, startedAt, codexTurnId } = opened;
152
166
  const session = turn.session;
153
167
  // Where the turn sits in a bot-to-bot chain (session-runtime/bot-hops.mjs).
@@ -167,7 +181,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
167
181
  // reads the session as the turn found it (synchronously, on this call).
168
182
  // The first request still carries its decision: it is awaited below,
169
183
  // together with the user turn, before the effort configuration is stamped.
170
- const autoEffortPending = resolveTurnAutoEffort({ sessionId, session, provider, input });
184
+ const autoEffortPending = resolveTurnAutoEffort({ sessionId, session, provider, input, config: agentConfig });
171
185
  autoEffortPending.catch(() => {});
172
186
  applyTurnContextMeta(session, provider);
173
187
  const effectiveCwd = cwdOverride || session.cwd;
@@ -206,6 +220,9 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
206
220
  if (effortConfiguration) stampTurnEffort(userTurn.userTurnMessage, effortConfiguration);
207
221
  const { historyMessages, outgoing } = userTurn;
208
222
  turn.userTurnContent = userTurn.userTurnMessage.content;
223
+ // The turn opens right after the history it was built on: its checkpoint
224
+ // boundary, never looked up again by the prompt's text.
225
+ turn.boundary = historyMessages.length;
209
226
  turn.outgoing = outgoing;
210
227
  precommitUserTurn(session, outgoing, historyMessages, input);
211
228
  persistTurnPreflight(session, { turnToken, startedAt, checkpoint, askGeneration });
@@ -236,6 +253,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
236
253
  deferredToolDelta: userTurn.deferredToolDelta,
237
254
  goalReminder: userTurn.goalReminder,
238
255
  workflowNotice: userTurn.workflowNotice,
256
+ promptSettingsNotice: userTurn.promptSettingsNotice,
239
257
  orchestrationModeNotice: userTurn.orchestrationModeNotice,
240
258
  workspaceNotice: userTurn.workspaceNotice,
241
259
  setupNotice: userTurn.setupNotice,
@@ -16,7 +16,7 @@ import {
16
16
  } from './pending-messages.mjs';
17
17
  import { _getRuntimeEntry, markSessionCancelled, markSessionError } from './runtime-liveness.mjs';
18
18
  import { SessionClosedError } from './session-errors.mjs';
19
- import { clearTurnCheckpoint } from './turn-checkpoint.mjs';
19
+ import { holdTurnUntilDurable, turnCoveredOnDisk } from './turn-durability.mjs';
20
20
  import { attachFailedTurnCompletion } from './ask-turn-settle.mjs';
21
21
  import { turnFailureRecord } from '../turn-failure.mjs';
22
22
  import { transcriptRouteMetadataFields } from '../../../../shared/transcript-metadata.mjs';
@@ -97,6 +97,17 @@ async function persistFinalizedSession({ session, sessionId, generation, pending
97
97
  }
98
98
  }
99
99
 
100
+ /** Keep the failed turn's checkpoint until a landed save covers its
101
+ * finalized transcript (turn-durability.mjs); returns the save issued for
102
+ * it, or null when an earlier one already landed it. */
103
+ function holdFinalizedTurn({ sessionId, session, turnToken, generation }) {
104
+ const save = turnCoveredOnDisk(session, turnToken)
105
+ ? null
106
+ : saveSessionAsync(session, { expectedGeneration: generation });
107
+ holdTurnUntilDurable({ sessionId, session, turnToken, generation, save });
108
+ return save;
109
+ }
110
+
100
111
  /** A SessionClosedError unwind: keeps the interruption snapshot unless the
101
112
  * runtime already closed, in which case the consumed queue entries are
102
113
  * released untouched. */
@@ -119,14 +130,14 @@ async function finalizeCancelledTurn({
119
130
  if (currentRuntime?.prepareCloseSnapshot === prepareCloseSnapshot) {
120
131
  currentRuntime.prepareCloseSnapshot = null;
121
132
  }
122
- const settled = await persistFinalizedSession({
133
+ await persistFinalizedSession({
123
134
  session,
124
135
  sessionId,
125
136
  generation,
126
137
  pendingEntries: turn.pendingEntries,
127
138
  promptSurvived: finalized.responsePreserved,
128
139
  });
129
- if (settled) clearTurnCheckpoint(sessionId, turnCheckpointToken);
140
+ holdFinalizedTurn({ sessionId, session, turnToken: turnCheckpointToken, generation });
130
141
  if (currentRuntime) currentRuntime.session = session;
131
142
  markSessionCancelled(sessionId);
132
143
  }
@@ -169,6 +180,9 @@ export async function finalizeAskTurnFailure({
169
180
  if (session) {
170
181
  session.liveTurnMessages = null;
171
182
  delete session.activeTurnCheckpoint;
183
+ // Every record saved from here on carries this turn as finalized: a
184
+ // crash after one lands deletes the checkpoint instead of replaying it.
185
+ session.turnCoverage = turnCheckpointToken;
172
186
  // The provider prefix snapshot commits per successful send INSIDE the
173
187
  // turn, while the transcript unwinds to its pre-turn/finalized shape
174
188
  // below. A surviving mid-turn snapshot flags every retry as
@@ -206,7 +220,8 @@ export async function finalizeAskTurnFailure({
206
220
  // contract answers "did the provider produce output we must commit?" for
207
221
  // every transport. Anthropic's stall/truncation errors carry neither
208
222
  // liveTextEmitted nor unsafeToRetry — only partialContent/partialToolCalls
209
- // — and used to drop the streamed summary from history on that provider.
223
+ // — so consulting the flags would drop the streamed summary from history on
224
+ // that provider.
210
225
  const providerOutcome = readStreamOutcome(err);
211
226
  const preserveProviderPartial =
212
227
  restoredResetText ||
@@ -252,15 +267,16 @@ export async function finalizeAskTurnFailure({
252
267
  releasePendingMessages(sessionId, turn.pendingEntries);
253
268
  }
254
269
  }
255
- if (!errorStateDurable && session) {
256
- try {
257
- errorStateDurable = (await settleAskCleanup(saveSessionAsync(session, { expectedGeneration: generation })))
258
- .settled;
259
- } catch {
260
- /* retain checkpoint when canonical persistence fails */
270
+ if (session) {
271
+ const save = holdFinalizedTurn({ sessionId, session, turnToken: turnCheckpointToken, generation });
272
+ if (save && !errorStateDurable) {
273
+ try {
274
+ await settleAskCleanup(save);
275
+ } catch {
276
+ /* the checkpoint stays until a save covering the turn lands */
277
+ }
261
278
  }
262
279
  }
263
- if (errorStateDurable) clearTurnCheckpoint(sessionId, turnCheckpointToken);
264
280
  logAskError(sessionId, err, providerOutcome);
265
281
  markSessionError(sessionId, err?.message ? err.message : String(err));
266
282
  }
@@ -1,25 +1,50 @@
1
1
  // manager/ask-turn-open.mjs
2
- // Opening one turn: load and reconcile the stored session and claim the
2
+ // Opening one turn: settle the previous turn's durability and the durable
3
+ // base this turn opens on (settleTurnBase, awaited before anything below),
4
+ // load and reconcile the stored session and claim the
3
5
  // runtime entry with a fresh abort controller (claimTurnRuntime), then arm
4
6
  // the turn's durability — the crash-checkpoint scheduler and the close
5
7
  // snapshot hook (armTurnDurability). Both are synchronous so closeSession()
6
8
  // cannot interleave between load and registration.
7
9
  import { randomUUID } from 'node:crypto';
8
- import { loadSession, saveSession, readSessionLifecycleFromDisk } from '../store.mjs';
10
+ import { loadSession } from '../store.mjs';
11
+ import { durableTranscriptBase } from '../store/transcript-durability.mjs';
9
12
  import { createAbortController } from '../../../../shared/abort-controller.mjs';
10
13
  import { normalizeStaleCompactingStage } from './compaction-runner.mjs';
11
14
  import { linkParentSignalToSession, markSessionAskStart, _touchRuntime } from './runtime-liveness.mjs';
12
15
  import { SessionClosedError } from './session-errors.mjs';
13
16
  import { ensureCodexWireSessionId, mintUuidV7 } from './session-id.mjs';
14
17
  import { createTurnInterruptionTracker } from './turn-interruption.mjs';
15
- import { clearTurnCheckpoint, recoverTurnCheckpoint } from './turn-checkpoint.mjs';
18
+ import { _recoverTurnCheckpointDurably, setAsideUnrecoveredCheckpoint } from './turn-checkpoint-recovery.mjs';
19
+ import { adoptDiskGeneration, awaitPreviousTurnDurable, ensureDurableTranscript } from './turn-durability.mjs';
16
20
  import { emitAskSessionStart } from './ask-support.mjs';
21
+ import { applyHeldSessionRoute } from './session-lifecycle.mjs';
17
22
  import { createAskTurnState, createCloseSnapshot, createTurnCheckpointScheduler } from './ask-turn-state.mjs';
18
23
 
24
+ /** Before a turn claims the session: the previous turn's finalized
25
+ * transcript is durably saved (its checkpoint deleted only then), a crashed
26
+ * turn's checkpoint is recovered (`recoverCheckpoint`, once per ask), and
27
+ * the transcript the turn opens on is the one a landed save holds — so the
28
+ * new checkpoint names a base that is on disk. Throws TurnPersistenceError
29
+ * when a save does not land; other sessions never wait on this one. */
30
+ export async function settleTurnBase(sessionId, { recoverCheckpoint }) {
31
+ await awaitPreviousTurnDurable(sessionId);
32
+ const session = loadSession(sessionId);
33
+ // claimTurnRuntime reports a missing or closed session.
34
+ if (!session || session.closed === true) return;
35
+ adoptDiskGeneration(session, sessionId);
36
+ if (recoverCheckpoint) _recoverTurnCheckpointDurably(session, sessionId);
37
+ await ensureDurableTranscript(session);
38
+ // This turn's checkpoint replaces the session's checkpoint file. Whatever
39
+ // is still there (a conflict, an unreadable header, a crashed turn this
40
+ // ask did not recover) is set aside first, never overwritten.
41
+ setAsideUnrecoveredCheckpoint(session, sessionId);
42
+ }
43
+
19
44
  /** Loads the session for a new turn and reconciles its on-disk lifecycle:
20
- * crash-checkpoint recovery (once per ask), a stale compacting stage, and
21
- * split-brain re-adoption of a disk generation another surface bumped. */
22
- function loadTurnSession(sessionId, { recoverCheckpoint }) {
45
+ * a stale compacting stage and split-brain re-adoption of a disk generation
46
+ * another surface bumped. */
47
+ function loadTurnSession(sessionId) {
23
48
  const session = loadSession(sessionId);
24
49
  if (!session) {
25
50
  throw new Error(`Session "${sessionId}" not found`);
@@ -28,44 +53,21 @@ function loadTurnSession(sessionId, { recoverCheckpoint }) {
28
53
  throw new SessionClosedError(sessionId, 'session already closed');
29
54
  }
30
55
  const codexWireSessionId = ensureCodexWireSessionId(session);
31
- if (recoverCheckpoint) {
32
- const recovery = recoverTurnCheckpoint(session);
33
- if (recovery.changed) {
34
- saveSession(session, {
35
- sync: true,
36
- expectedGeneration: session.generation,
37
- });
38
- if (recovery.turnToken) clearTurnCheckpoint(sessionId, recovery.turnToken);
39
- }
40
- }
41
56
  // A prior crash/partial-save during compaction may have pinned
42
57
  // compaction.lastStage='compacting'. This ask is starting fresh, so
43
58
  // recover the stale transient stage before the loop's pre-send compact
44
59
  // path runs (it will overwrite lastStage with real telemetry).
45
60
  normalizeStaleCompactingStage(session);
46
- // Split-brain re-adoption: another surface (e.g. desktop click-through
47
- // of a session still actively owned by this process) may have
48
- // resumed-and-detached this session, bumping the ON-DISK generation
49
- // while the conversation kept going here. Every save from this process
50
- // would then be silently dropped by _shouldDrop's ownership rule and
51
- // the on-disk transcript would freeze at the last landed save. A new
52
- // ask on a NON-closed session is an explicit ownership claim: adopt
53
- // the disk generation so this turn's commits land and heal the file.
54
- const diskLifecycle = readSessionLifecycleFromDisk(sessionId);
55
- if (
56
- diskLifecycle &&
57
- diskLifecycle.closed !== true &&
58
- diskLifecycle.generation > (typeof session.generation === 'number' ? session.generation : 0)
59
- ) {
60
- session.generation = diskLifecycle.generation;
61
- }
61
+ adoptDiskGeneration(session, sessionId);
62
+ // A route saved while the previous turn ran applies from this turn.
63
+ applyHeldSessionRoute(session);
62
64
  return { session, codexWireSessionId };
63
65
  }
64
66
 
65
67
  /** Loads the session and installs this turn's controller on the runtime
66
68
  * entry, re-cascading any parent abort link and marking the ask started. */
67
- export function claimTurnRuntime({ sessionId, askOpts, recoverCheckpoint, emitStart }) {
68
- const { session: preSession, codexWireSessionId } = loadTurnSession(sessionId, { recoverCheckpoint });
69
+ export function claimTurnRuntime({ sessionId, askOpts, emitStart }) {
70
+ const { session: preSession, codexWireSessionId } = loadTurnSession(sessionId);
69
71
  const askGeneration = typeof preSession.generation === 'number' ? preSession.generation : 0;
70
72
  const runtime = _touchRuntime(sessionId);
71
73
  // Preserve any parent-abort link agent-dispatch established BEFORE we
@@ -121,6 +123,7 @@ export function armTurnDurability({
121
123
  startedAt,
122
124
  turn,
123
125
  interruption,
126
+ base: durableTranscriptBase(preSession),
124
127
  });
125
128
  const prepareCloseSnapshot = createCloseSnapshot({ turn, interruption, checkpoint, runtime });
126
129
  // closeSession is synchronous and generation-first by design. Expose a
@@ -9,6 +9,7 @@ import { positiveInt } from '../../../../shared/numbers.mjs';
9
9
  import { appendAgentTrace } from '../../agent-trace.mjs';
10
10
  import { snapshotPendingDeferredToolDelta } from '../../runtime-core/deferred-tool-delta.mjs';
11
11
  import { snapshotPendingGoalReminder } from '../../runtime-core/goal-reminder.mjs';
12
+ import { beginTodoTurn, todoStartReminder } from '../loop/no-tool-turn/todo-check.mjs';
12
13
  import { resolveSessionContextMeta } from './context-meta.mjs';
13
14
  import {
14
15
  promptContentText,
@@ -20,6 +21,7 @@ import {
20
21
  snapshotPendingSetupNotice,
21
22
  } from './prompt-utils.mjs';
22
23
  import { snapshotPendingWorkflowNotice } from './workflow-switch-notice.mjs';
24
+ import { snapshotPendingPromptSettingsNotice } from './prompt-settings.mjs';
23
25
  import { snapshotPendingOrchestrationModeNotice } from './orchestration-mode-switch-notice.mjs';
24
26
  import { buildAgentListingNotice } from './agent-listing-notice.mjs';
25
27
  import { codexWireSendOpts } from './session-id.mjs';
@@ -175,6 +177,12 @@ export async function buildUserTurn({
175
177
  }
176
178
  const currentTimeBlock = buildCurrentTimeBlock(prompt);
177
179
  const deferredToolDelta = snapshotPendingDeferredToolDelta(session);
180
+ // A real prompt (no runtime source: not a Goal turn or task notification)
181
+ // opens a new todo reminder cycle; every turn clears the last turn's waits.
182
+ const genuinePrompt = !turnPromptSource?.source;
183
+ beginTodoTurn(session, { genuine: genuinePrompt });
184
+ // An agent's new brief or follow-up with no open list asks for one, once.
185
+ const todoStart = genuinePrompt ? todoStartReminder(session) : null;
178
186
  // Read paused state after hydration and queue selection, not at
179
187
  // input intake: either can precede the previous turn's pause.
180
188
  // This supplies context only; it never resumes the Goal.
@@ -192,8 +200,11 @@ export async function buildUserTurn({
192
200
  const orchestrationModeNotice = snapshotPendingOrchestrationModeNotice(session);
193
201
  // Agents enabled or switched off since the conversation was last told.
194
202
  const agentListingNotice = buildAgentListingNotice(session, currentAgents);
203
+ // Prompt-shaping settings changed since the prompt was built (told once).
204
+ const promptSettingsNotice = snapshotPendingPromptSettingsNotice(session);
195
205
  const reminderBlock = [
196
206
  workflowNotice?.content || '',
207
+ promptSettingsNotice?.content || '',
197
208
  orchestrationModeNotice?.content || '',
198
209
  agentListingNotice?.content || '',
199
210
  workspaceNotice?.content || '',
@@ -201,6 +212,7 @@ export async function buildUserTurn({
201
212
  currentTimeBlock ? `<system-reminder>\n# Current Time\n${currentTimeBlock}\n</system-reminder>` : '',
202
213
  deferredToolDelta?.content || '',
203
214
  goalReminder?.content || '',
215
+ todoStart || '',
204
216
  ]
205
217
  .filter(Boolean)
206
218
  .join('\n\n');
@@ -212,6 +224,8 @@ export async function buildUserTurn({
212
224
  ...(effortConfiguration ? { effortConfiguration } : {}),
213
225
  // What its reminder told, read back by later turns (agent-listing-notice.mjs).
214
226
  ...(agentListingNotice ? { agentListing: agentListingNotice.meta } : {}),
227
+ // A retry resubmits this message as is: it acknowledges the same notice.
228
+ ...(promptSettingsNotice ? { promptSettingsNoticeRevision: promptSettingsNotice.revision } : {}),
215
229
  };
216
230
  const userTurnMessage = withRuntimeUserContext(
217
231
  {
@@ -228,6 +242,7 @@ export async function buildUserTurn({
228
242
  goalReminder,
229
243
  workflowNotice,
230
244
  orchestrationModeNotice,
245
+ promptSettingsNotice,
231
246
  agentListingNotice,
232
247
  workspaceNotice,
233
248
  setupNotice,