@bastani/atomic 0.9.9 → 0.9.10

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 (864) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/README.md +2 -0
  3. package/dist/builtin/cursor/CHANGELOG.md +12 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/intercom/CHANGELOG.md +30 -0
  6. package/dist/builtin/intercom/README.md +12 -4
  7. package/dist/builtin/intercom/broker/broker.ts +96 -14
  8. package/dist/builtin/intercom/broker/client-message-validation.ts +39 -0
  9. package/dist/builtin/intercom/broker/client.ts +101 -92
  10. package/dist/builtin/intercom/broker/group-isolation.ts +28 -0
  11. package/dist/builtin/intercom/broker/send-handler.ts +62 -10
  12. package/dist/builtin/intercom/broker/send-signature.ts +3 -0
  13. package/dist/builtin/intercom/broker/supervisor-channel.ts +126 -0
  14. package/dist/builtin/intercom/closed-workflow-stage-message.ts +66 -0
  15. package/dist/builtin/intercom/config.ts +10 -0
  16. package/dist/builtin/intercom/contact-supervisor-tool.ts +14 -10
  17. package/dist/builtin/intercom/foreground-detach-handoff.ts +12 -2
  18. package/dist/builtin/intercom/group.ts +46 -0
  19. package/dist/builtin/intercom/inbound-message-admission.ts +79 -0
  20. package/dist/builtin/intercom/incoming-message-delivery.ts +49 -0
  21. package/dist/builtin/intercom/index-heavy.ts +148 -94
  22. package/dist/builtin/intercom/index.ts +66 -4
  23. package/dist/builtin/intercom/intercom-test-seams.ts +6 -0
  24. package/dist/builtin/intercom/intercom-tool.ts +71 -20
  25. package/dist/builtin/intercom/intercom-utils.ts +15 -2
  26. package/dist/builtin/intercom/late-stage-message-router.ts +148 -0
  27. package/dist/builtin/intercom/lifecycle.ts +10 -4
  28. package/dist/builtin/intercom/package.json +2 -2
  29. package/dist/builtin/intercom/reconnect-backoff.ts +6 -0
  30. package/dist/builtin/intercom/reply-tracker.ts +8 -0
  31. package/dist/builtin/intercom/skills/intercom/SKILL.md +2 -0
  32. package/dist/builtin/intercom/stable-delivery-retry.ts +32 -0
  33. package/dist/builtin/intercom/subagent-relay.ts +67 -14
  34. package/dist/builtin/intercom/supervisor-authorization-registry.ts +22 -0
  35. package/dist/builtin/intercom/terminal-ordering-barrier.ts +144 -25
  36. package/dist/builtin/intercom/types.ts +18 -5
  37. package/dist/builtin/intercom/workflow-reply-tracker.ts +19 -0
  38. package/dist/builtin/intercom/workflow-stage-admission.ts +43 -0
  39. package/dist/builtin/intercom/workflow-stage-delivery-failure.ts +77 -0
  40. package/dist/builtin/mcp/CHANGELOG.md +22 -0
  41. package/dist/builtin/mcp/README.md +6 -2
  42. package/dist/builtin/mcp/config.ts +8 -8
  43. package/dist/builtin/mcp/direct-tool-executor.ts +7 -6
  44. package/dist/builtin/mcp/package.json +3 -3
  45. package/dist/builtin/mcp/proxy-call.ts +5 -4
  46. package/dist/builtin/mcp/sampling-handler.ts +7 -2
  47. package/dist/builtin/mcp/tool-call-timeout.ts +101 -0
  48. package/dist/builtin/mcp/tool-result-renderer.ts +3 -2
  49. package/dist/builtin/mcp/types.ts +5 -0
  50. package/dist/builtin/mcp/ui-server.ts +3 -2
  51. package/dist/builtin/subagents/CHANGELOG.md +42 -0
  52. package/dist/builtin/subagents/README.md +6 -3
  53. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  54. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  55. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  56. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  57. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  58. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  59. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  60. package/dist/builtin/subagents/agents/debugger.md +1 -1
  61. package/dist/builtin/subagents/agents/worker.md +1 -1
  62. package/dist/builtin/subagents/package.json +4 -4
  63. package/dist/builtin/subagents/skills/subagent/SKILL.md +1 -1
  64. package/dist/builtin/subagents/src/extension/index.ts +37 -61
  65. package/dist/builtin/subagents/src/extension/notification-content.ts +80 -0
  66. package/dist/builtin/subagents/src/extension/schemas.ts +9 -0
  67. package/dist/builtin/subagents/src/extension/tool-description.ts +1 -0
  68. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +23 -0
  69. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +4 -0
  70. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +2 -0
  71. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +4 -0
  72. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +75 -13
  73. package/dist/builtin/subagents/src/runs/background/async-status.ts +19 -0
  74. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +4 -3
  75. package/dist/builtin/subagents/src/runs/background/notify.ts +76 -15
  76. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +1 -1
  77. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +13 -0
  78. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +1 -0
  79. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +1 -0
  80. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +2 -1
  81. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +4 -0
  82. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +13 -0
  83. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +19 -2
  84. package/dist/builtin/subagents/src/runs/foreground/detached-cleanup-barrier.ts +26 -0
  85. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +19 -30
  86. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +47 -0
  87. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +60 -2
  88. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +21 -0
  89. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +21 -2
  90. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +6 -1
  91. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +2 -0
  92. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -0
  93. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +1 -1
  94. package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +50 -0
  95. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +16 -0
  96. package/dist/builtin/subagents/src/runs/shared/worktree-post-create.ts +75 -0
  97. package/dist/builtin/subagents/src/runs/shared/worktree-root.ts +51 -0
  98. package/dist/builtin/subagents/src/runs/shared/worktree.ts +69 -77
  99. package/dist/builtin/subagents/src/shared/types-config.ts +6 -0
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +3 -2
  101. package/dist/builtin/subagents/src/tui/render-result-compact.ts +5 -3
  102. package/dist/builtin/subagents/src/tui/render-result.ts +5 -3
  103. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +7 -4
  104. package/dist/builtin/web-access/CHANGELOG.md +22 -0
  105. package/dist/builtin/web-access/extract-frames.ts +14 -13
  106. package/dist/builtin/web-access/extract.ts +2 -2
  107. package/dist/builtin/web-access/gemini-api.ts +0 -3
  108. package/dist/builtin/web-access/gemini-web-config.ts +1 -3
  109. package/dist/builtin/web-access/gemini-web.ts +1 -0
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/web-access/perplexity.ts +0 -3
  112. package/dist/builtin/web-access/result-renderers.ts +7 -5
  113. package/dist/builtin/web-access/subprocess.ts +100 -0
  114. package/dist/builtin/web-access/summary-review.ts +14 -3
  115. package/dist/builtin/web-access/video-extract.ts +12 -17
  116. package/dist/builtin/web-access/web-search-browser.ts +18 -10
  117. package/dist/builtin/web-access/web-search-summary.ts +9 -2
  118. package/dist/builtin/web-access/youtube-extract.ts +22 -25
  119. package/dist/builtin/workflows/CHANGELOG.md +153 -0
  120. package/dist/builtin/workflows/README.md +76 -38
  121. package/dist/builtin/workflows/ambient.d.ts +30 -0
  122. package/dist/builtin/workflows/builtin/adversarial-verification-prompts.ts +15 -0
  123. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +93 -0
  124. package/dist/builtin/workflows/builtin/adversarial-verification.d.ts +11 -0
  125. package/dist/builtin/workflows/builtin/adversarial-verification.ts +24 -0
  126. package/dist/builtin/workflows/builtin/classify-and-act-prompts.ts +11 -0
  127. package/dist/builtin/workflows/builtin/classify-and-act-runner.ts +110 -0
  128. package/dist/builtin/workflows/builtin/classify-and-act.d.ts +24 -0
  129. package/dist/builtin/workflows/builtin/classify-and-act.ts +35 -0
  130. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +8 -2
  131. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-prompts.ts +11 -0
  132. package/dist/builtin/workflows/builtin/fan-out-and-synthesize-runner.ts +96 -0
  133. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.d.ts +23 -0
  134. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +32 -0
  135. package/dist/builtin/workflows/builtin/generate-and-filter-prompts.ts +15 -0
  136. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +75 -0
  137. package/dist/builtin/workflows/builtin/generate-and-filter.d.ts +11 -0
  138. package/dist/builtin/workflows/builtin/generate-and-filter.ts +26 -0
  139. package/dist/builtin/workflows/builtin/goal-models.ts +72 -0
  140. package/dist/builtin/workflows/builtin/goal-runner.ts +2 -64
  141. package/dist/builtin/workflows/builtin/index.d.ts +44 -0
  142. package/dist/builtin/workflows/builtin/index.ts +6 -0
  143. package/dist/builtin/workflows/builtin/loop-until-done-prompts.ts +79 -0
  144. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +189 -0
  145. package/dist/builtin/workflows/builtin/loop-until-done.d.ts +34 -0
  146. package/dist/builtin/workflows/builtin/loop-until-done.ts +31 -0
  147. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -1
  148. package/dist/builtin/workflows/builtin/pattern-artifact-root.ts +28 -0
  149. package/dist/builtin/workflows/builtin/ralph-models.ts +26 -5
  150. package/dist/builtin/workflows/builtin/ralph-runner.ts +1 -0
  151. package/dist/builtin/workflows/builtin/tournament-prompts.ts +79 -0
  152. package/dist/builtin/workflows/builtin/tournament-runner.ts +188 -0
  153. package/dist/builtin/workflows/builtin/tournament.d.ts +33 -0
  154. package/dist/builtin/workflows/builtin/tournament.ts +34 -0
  155. package/dist/builtin/workflows/package.json +2 -2
  156. package/dist/builtin/workflows/src/authoring.d.ts +2 -6
  157. package/dist/builtin/workflows/src/durable/backend.ts +163 -120
  158. package/dist/builtin/workflows/src/durable/completed-catalog.ts +37 -64
  159. package/dist/builtin/workflows/src/durable/completed-inspection.ts +4 -72
  160. package/dist/builtin/workflows/src/durable/dbos-backend.ts +242 -195
  161. package/dist/builtin/workflows/src/durable/dbos-embedded-postgres.ts +207 -0
  162. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +42 -42
  163. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +155 -0
  164. package/dist/builtin/workflows/src/durable/dbos-local-postgres.ts +126 -0
  165. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +105 -58
  166. package/dist/builtin/workflows/src/durable/dbos-prompt-reservations.ts +320 -0
  167. package/dist/builtin/workflows/src/durable/dbos-sdk-handle.ts +161 -0
  168. package/dist/builtin/workflows/src/durable/dbos-status-transition.ts +62 -0
  169. package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +2 -2
  170. package/dist/builtin/workflows/src/durable/durable-hash.ts +20 -0
  171. package/dist/builtin/workflows/src/durable/factory.ts +23 -83
  172. package/dist/builtin/workflows/src/durable/format-version.ts +4 -10
  173. package/dist/builtin/workflows/src/durable/index.ts +16 -20
  174. package/dist/builtin/workflows/src/durable/local-command.ts +63 -0
  175. package/dist/builtin/workflows/src/durable/prompt-reservation-state.ts +177 -0
  176. package/dist/builtin/workflows/src/durable/prompt-reservations.ts +36 -0
  177. package/dist/builtin/workflows/src/durable/resume-catalog.ts +2 -200
  178. package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -2
  179. package/dist/builtin/workflows/src/durable/resume-runtime.ts +121 -118
  180. package/dist/builtin/workflows/src/durable/retention-policy.ts +42 -0
  181. package/dist/builtin/workflows/src/durable/run-timing.ts +98 -0
  182. package/dist/builtin/workflows/src/durable/scoped-backend.ts +62 -14
  183. package/dist/builtin/workflows/src/durable/stage-primitive.ts +15 -2
  184. package/dist/builtin/workflows/src/durable/tool-primitive.ts +11 -7
  185. package/dist/builtin/workflows/src/durable/types.ts +25 -18
  186. package/dist/builtin/workflows/src/durable/ui-primitive.ts +117 -29
  187. package/dist/builtin/workflows/src/durable/workflow-status-transition.ts +30 -0
  188. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +20 -5
  189. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -2
  190. package/dist/builtin/workflows/src/engine/primitives/ui.ts +6 -3
  191. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +14 -22
  192. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +14 -14
  193. package/dist/builtin/workflows/src/engine/run.ts +35 -37
  194. package/dist/builtin/workflows/src/engine/runtime.ts +3 -0
  195. package/dist/builtin/workflows/src/engine/workflow-activity.ts +9 -0
  196. package/dist/builtin/workflows/src/extension/completed-stage-intercom-ask.ts +155 -0
  197. package/dist/builtin/workflows/src/extension/config-file-loader.ts +13 -0
  198. package/dist/builtin/workflows/src/extension/config-loader.ts +20 -0
  199. package/dist/builtin/workflows/src/extension/dispatcher.ts +56 -17
  200. package/dist/builtin/workflows/src/extension/extension-factory.ts +13 -10
  201. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +37 -59
  202. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +16 -18
  203. package/dist/builtin/workflows/src/extension/lifecycle-notification-delivery.ts +83 -0
  204. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +80 -41
  205. package/dist/builtin/workflows/src/extension/postmortem-deps.ts +73 -0
  206. package/dist/builtin/workflows/src/extension/public-types.ts +11 -51
  207. package/dist/builtin/workflows/src/extension/render-call.ts +3 -9
  208. package/dist/builtin/workflows/src/extension/render-result.ts +22 -7
  209. package/dist/builtin/workflows/src/extension/runtime-active-block-claim.ts +78 -0
  210. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +50 -29
  211. package/dist/builtin/workflows/src/extension/runtime.ts +70 -219
  212. package/dist/builtin/workflows/src/extension/ui-surface.ts +107 -3
  213. package/dist/builtin/workflows/src/extension/wiring.ts +76 -7
  214. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +10 -5
  215. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +27 -5
  216. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +49 -19
  217. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +8 -8
  218. package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +81 -0
  219. package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +55 -0
  220. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +193 -145
  221. package/dist/builtin/workflows/src/extension/workflow-schema.ts +9 -133
  222. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +189 -0
  223. package/dist/builtin/workflows/src/extension/workflow-targets.ts +1 -1
  224. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +78 -3
  225. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +185 -89
  226. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +92 -11
  227. package/dist/builtin/workflows/src/extension/workflow-tool.ts +18 -24
  228. package/dist/builtin/workflows/src/runs/background/durable-resume-transition.ts +63 -0
  229. package/dist/builtin/workflows/src/runs/background/quit.ts +139 -29
  230. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +97 -0
  231. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +111 -0
  232. package/dist/builtin/workflows/src/runs/background/runner.ts +46 -17
  233. package/dist/builtin/workflows/src/runs/background/startup-admission.ts +77 -0
  234. package/dist/builtin/workflows/src/runs/background/status.ts +133 -224
  235. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +44 -0
  236. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +57 -256
  237. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +7 -4
  238. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +12 -1
  239. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +39 -0
  240. package/dist/builtin/workflows/src/runs/foreground/executor-queued-user-message.ts +75 -0
  241. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +44 -12
  242. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +63 -12
  243. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +30 -4
  244. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +3 -0
  245. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +4 -1
  246. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +0 -67
  247. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +6 -0
  248. package/dist/builtin/workflows/src/runs/foreground/executor.ts +0 -1
  249. package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +169 -0
  250. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +38 -1
  251. package/dist/builtin/workflows/src/runs/foreground/stage-runner-candidate.ts +21 -0
  252. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +21 -3
  253. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +85 -84
  254. package/dist/builtin/workflows/src/runs/foreground/stage-runner-message-admission.ts +195 -0
  255. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +12 -5
  256. package/dist/builtin/workflows/src/runs/foreground/stage-runner-replacement.ts +42 -0
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +100 -8
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +51 -0
  259. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +19 -0
  260. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +28 -2
  261. package/dist/builtin/workflows/src/runs/shared/prompt-callsite.ts +4 -6
  262. package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +89 -0
  263. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +29 -133
  264. package/dist/builtin/workflows/src/runs/shared/worktree-post-create.ts +130 -0
  265. package/dist/builtin/workflows/src/runs/shared/worktree-root.ts +84 -0
  266. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +77 -63
  267. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +4 -0
  268. package/dist/builtin/workflows/src/sdk-surface.ts +1 -1
  269. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +29 -22
  270. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +26 -24
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +5 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +5 -0
  273. package/dist/builtin/workflows/src/shared/intercom-group.ts +51 -0
  274. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +6 -0
  275. package/dist/builtin/workflows/src/shared/persistence-restore.ts +4 -0
  276. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +3 -0
  277. package/dist/builtin/workflows/src/shared/prompt-callsite-context.ts +13 -0
  278. package/dist/builtin/workflows/src/shared/returned-run-status.ts +2 -1
  279. package/dist/builtin/workflows/src/shared/session-transcript.ts +74 -0
  280. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +1 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +8 -0
  282. package/dist/builtin/workflows/src/shared/timing.ts +4 -1
  283. package/dist/builtin/workflows/src/shared/types.ts +2 -6
  284. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +2 -42
  285. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +2 -2
  286. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +7 -3
  287. package/dist/builtin/workflows/src/tui/graph-view-input.ts +29 -67
  288. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +15 -10
  289. package/dist/builtin/workflows/src/tui/graph-view-state.ts +0 -2
  290. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -9
  291. package/dist/builtin/workflows/src/tui/host-input-form.ts +62 -0
  292. package/dist/builtin/workflows/src/tui/mouse-input.ts +63 -0
  293. package/dist/builtin/workflows/src/tui/node-card.ts +1 -0
  294. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +67 -42
  295. package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +49 -0
  296. package/dist/builtin/workflows/src/tui/session-overlays.ts +3 -104
  297. package/dist/builtin/workflows/src/tui/session-picker.ts +3 -12
  298. package/dist/builtin/workflows/src/tui/stage-chat-composer-drafts.ts +19 -0
  299. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +30 -10
  300. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +19 -9
  301. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +25 -38
  302. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +1 -1
  303. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +7 -6
  304. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +7 -1
  305. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
  306. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +19 -20
  307. package/dist/builtin/workflows/src/tui/switcher.ts +4 -4
  308. package/dist/builtin/workflows/src/tui/widget.ts +46 -33
  309. package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +26 -0
  310. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +14 -2
  311. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +26 -27
  312. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +208 -69
  313. package/dist/bun/cli.js +3 -0
  314. package/dist/bun/cli.js.map +1 -1
  315. package/dist/cli/session-picker.d.ts.map +1 -1
  316. package/dist/cli/session-picker.js +3 -0
  317. package/dist/cli/session-picker.js.map +1 -1
  318. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  319. package/dist/core/agent-session-auto-compaction.js +19 -2
  320. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  321. package/dist/core/agent-session-compaction.js +2 -2
  322. package/dist/core/agent-session-compaction.js.map +1 -1
  323. package/dist/core/agent-session-events.d.ts.map +1 -1
  324. package/dist/core/agent-session-events.js +5 -3
  325. package/dist/core/agent-session-events.js.map +1 -1
  326. package/dist/core/agent-session-export.js +1 -1
  327. package/dist/core/agent-session-export.js.map +1 -1
  328. package/dist/core/agent-session-extension-bindings.d.ts +2 -4
  329. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  330. package/dist/core/agent-session-extension-bindings.js +9 -2
  331. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  332. package/dist/core/agent-session-message-queue.d.ts +6 -0
  333. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  334. package/dist/core/agent-session-message-queue.js +107 -36
  335. package/dist/core/agent-session-message-queue.js.map +1 -1
  336. package/dist/core/agent-session-methods.d.ts +18 -7
  337. package/dist/core/agent-session-methods.d.ts.map +1 -1
  338. package/dist/core/agent-session-methods.js.map +1 -1
  339. package/dist/core/agent-session-models.d.ts +3 -1
  340. package/dist/core/agent-session-models.d.ts.map +1 -1
  341. package/dist/core/agent-session-models.js +1 -1
  342. package/dist/core/agent-session-models.js.map +1 -1
  343. package/dist/core/agent-session-post-tool-compaction.d.ts +16 -0
  344. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -0
  345. package/dist/core/agent-session-post-tool-compaction.js +113 -0
  346. package/dist/core/agent-session-post-tool-compaction.js.map +1 -0
  347. package/dist/core/agent-session-prompt.d.ts +12 -1
  348. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  349. package/dist/core/agent-session-prompt.js +22 -5
  350. package/dist/core/agent-session-prompt.js.map +1 -1
  351. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  352. package/dist/core/agent-session-runtime.js +3 -0
  353. package/dist/core/agent-session-runtime.js.map +1 -1
  354. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  355. package/dist/core/agent-session-tool-hooks.js +21 -0
  356. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  357. package/dist/core/agent-session-tree.d.ts.map +1 -1
  358. package/dist/core/agent-session-tree.js +2 -1
  359. package/dist/core/agent-session-tree.js.map +1 -1
  360. package/dist/core/agent-session-types.d.ts +7 -0
  361. package/dist/core/agent-session-types.d.ts.map +1 -1
  362. package/dist/core/agent-session-types.js.map +1 -1
  363. package/dist/core/agent-session.d.ts +6 -0
  364. package/dist/core/agent-session.d.ts.map +1 -1
  365. package/dist/core/agent-session.js +18 -1
  366. package/dist/core/agent-session.js.map +1 -1
  367. package/dist/core/async/job-manager.d.ts +1 -0
  368. package/dist/core/async/job-manager.d.ts.map +1 -1
  369. package/dist/core/async/job-manager.js +29 -5
  370. package/dist/core/async/job-manager.js.map +1 -1
  371. package/dist/core/async/session-manager.d.ts +2 -4
  372. package/dist/core/async/session-manager.d.ts.map +1 -1
  373. package/dist/core/async/session-manager.js +5 -32
  374. package/dist/core/async/session-manager.js.map +1 -1
  375. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  376. package/dist/core/atomic-guide-command.js +2 -0
  377. package/dist/core/atomic-guide-command.js.map +1 -1
  378. package/dist/core/auth-storage.d.ts +20 -10
  379. package/dist/core/auth-storage.d.ts.map +1 -1
  380. package/dist/core/auth-storage.js +151 -92
  381. package/dist/core/auth-storage.js.map +1 -1
  382. package/dist/core/callback-activity.d.ts +27 -0
  383. package/dist/core/callback-activity.d.ts.map +1 -0
  384. package/dist/core/callback-activity.js +44 -0
  385. package/dist/core/callback-activity.js.map +1 -0
  386. package/dist/core/compaction/branch-summarization.d.ts +4 -1
  387. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  388. package/dist/core/compaction/branch-summarization.js +4 -3
  389. package/dist/core/compaction/branch-summarization.js.map +1 -1
  390. package/dist/core/compaction/compaction-boundary.d.ts +1 -1
  391. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  392. package/dist/core/compaction/compaction-boundary.js +10 -23
  393. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  394. package/dist/core/compaction/compaction-runner.d.ts +4 -1
  395. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  396. package/dist/core/compaction/compaction-runner.js +1 -1
  397. package/dist/core/compaction/compaction-runner.js.map +1 -1
  398. package/dist/core/compaction/compaction-types.d.ts +3 -2
  399. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  400. package/dist/core/compaction/compaction-types.js.map +1 -1
  401. package/dist/core/compaction/compaction.d.ts +6 -6
  402. package/dist/core/compaction/compaction.d.ts.map +1 -1
  403. package/dist/core/compaction/compaction.js +12 -9
  404. package/dist/core/compaction/compaction.js.map +1 -1
  405. package/dist/core/compaction/index.d.ts +1 -0
  406. package/dist/core/compaction/index.d.ts.map +1 -1
  407. package/dist/core/compaction/index.js +1 -0
  408. package/dist/core/compaction/index.js.map +1 -1
  409. package/dist/core/compaction/range-planner-diagnostics.d.ts +101 -0
  410. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -0
  411. package/dist/core/compaction/range-planner-diagnostics.js +116 -0
  412. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -0
  413. package/dist/core/compaction/range-planner.d.ts +13 -3
  414. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  415. package/dist/core/compaction/range-planner.js +117 -68
  416. package/dist/core/compaction/range-planner.js.map +1 -1
  417. package/dist/core/compaction/truncated-range-recovery.d.ts +47 -0
  418. package/dist/core/compaction/truncated-range-recovery.d.ts.map +1 -0
  419. package/dist/core/compaction/truncated-range-recovery.js +112 -0
  420. package/dist/core/compaction/truncated-range-recovery.js.map +1 -0
  421. package/dist/core/extensions/api-types.d.ts +2 -2
  422. package/dist/core/extensions/api-types.d.ts.map +1 -1
  423. package/dist/core/extensions/api-types.js.map +1 -1
  424. package/dist/core/extensions/context-types.d.ts +23 -1
  425. package/dist/core/extensions/context-types.d.ts.map +1 -1
  426. package/dist/core/extensions/context-types.js.map +1 -1
  427. package/dist/core/extensions/index.d.ts +1 -1
  428. package/dist/core/extensions/index.d.ts.map +1 -1
  429. package/dist/core/extensions/index.js.map +1 -1
  430. package/dist/core/extensions/loader-api.js +2 -2
  431. package/dist/core/extensions/loader-api.js.map +1 -1
  432. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  433. package/dist/core/extensions/loader-core.js +8 -1
  434. package/dist/core/extensions/loader-core.js.map +1 -1
  435. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  436. package/dist/core/extensions/loader-virtual-modules.js +9 -6
  437. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  438. package/dist/core/extensions/message-types.d.ts +17 -0
  439. package/dist/core/extensions/message-types.d.ts.map +1 -1
  440. package/dist/core/extensions/message-types.js.map +1 -1
  441. package/dist/core/extensions/provider-types.d.ts +3 -0
  442. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  443. package/dist/core/extensions/provider-types.js.map +1 -1
  444. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  445. package/dist/core/extensions/runner-events.js +11 -10
  446. package/dist/core/extensions/runner-events.js.map +1 -1
  447. package/dist/core/extensions/runtime-types.d.ts +2 -2
  448. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  449. package/dist/core/extensions/runtime-types.js.map +1 -1
  450. package/dist/core/extensions/ui-types.d.ts +78 -0
  451. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  452. package/dist/core/extensions/ui-types.js.map +1 -1
  453. package/dist/core/model-registry-auth.d.ts +2 -1
  454. package/dist/core/model-registry-auth.d.ts.map +1 -1
  455. package/dist/core/model-registry-auth.js +25 -6
  456. package/dist/core/model-registry-auth.js.map +1 -1
  457. package/dist/core/model-registry-builtins.d.ts +3 -2
  458. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  459. package/dist/core/model-registry-builtins.js +12 -6
  460. package/dist/core/model-registry-builtins.js.map +1 -1
  461. package/dist/core/model-registry-dynamic.d.ts +1 -0
  462. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  463. package/dist/core/model-registry-dynamic.js +53 -13
  464. package/dist/core/model-registry-dynamic.js.map +1 -1
  465. package/dist/core/model-registry-loader.d.ts +2 -1
  466. package/dist/core/model-registry-loader.d.ts.map +1 -1
  467. package/dist/core/model-registry-loader.js +2 -2
  468. package/dist/core/model-registry-loader.js.map +1 -1
  469. package/dist/core/model-registry-types.d.ts +10 -3
  470. package/dist/core/model-registry-types.d.ts.map +1 -1
  471. package/dist/core/model-registry-types.js.map +1 -1
  472. package/dist/core/model-registry.d.ts +15 -1
  473. package/dist/core/model-registry.d.ts.map +1 -1
  474. package/dist/core/model-registry.js +214 -30
  475. package/dist/core/model-registry.js.map +1 -1
  476. package/dist/core/models-store.d.ts +25 -0
  477. package/dist/core/models-store.d.ts.map +1 -0
  478. package/dist/core/models-store.js +73 -0
  479. package/dist/core/models-store.js.map +1 -0
  480. package/dist/core/oauth-compat.d.ts +17 -0
  481. package/dist/core/oauth-compat.d.ts.map +1 -0
  482. package/dist/core/oauth-compat.js +2 -0
  483. package/dist/core/oauth-compat.js.map +1 -0
  484. package/dist/core/oauth-provider-bridge.d.ts +40 -0
  485. package/dist/core/oauth-provider-bridge.d.ts.map +1 -0
  486. package/dist/core/oauth-provider-bridge.js +169 -0
  487. package/dist/core/oauth-provider-bridge.js.map +1 -0
  488. package/dist/core/output-guard.d.ts +2 -0
  489. package/dist/core/output-guard.d.ts.map +1 -1
  490. package/dist/core/output-guard.js +14 -0
  491. package/dist/core/output-guard.js.map +1 -1
  492. package/dist/core/remote-catalog-provider.d.ts +5 -0
  493. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  494. package/dist/core/remote-catalog-provider.js +138 -0
  495. package/dist/core/remote-catalog-provider.js.map +1 -0
  496. package/dist/core/sdk.d.ts.map +1 -1
  497. package/dist/core/sdk.js +8 -3
  498. package/dist/core/sdk.js.map +1 -1
  499. package/dist/core/session-manager-core.d.ts +1 -1
  500. package/dist/core/session-manager-core.d.ts.map +1 -1
  501. package/dist/core/session-manager-core.js +1 -1
  502. package/dist/core/session-manager-core.js.map +1 -1
  503. package/dist/core/session-manager-entries.d.ts +1 -1
  504. package/dist/core/session-manager-entries.d.ts.map +1 -1
  505. package/dist/core/session-manager-entries.js.map +1 -1
  506. package/dist/core/session-manager-history.d.ts +2 -2
  507. package/dist/core/session-manager-history.js +2 -2
  508. package/dist/core/session-manager-history.js.map +1 -1
  509. package/dist/core/session-manager-list.d.ts.map +1 -1
  510. package/dist/core/session-manager-list.js +65 -23
  511. package/dist/core/session-manager-list.js.map +1 -1
  512. package/dist/core/session-manager-types.d.ts +3 -2
  513. package/dist/core/session-manager-types.d.ts.map +1 -1
  514. package/dist/core/session-manager-types.js.map +1 -1
  515. package/dist/core/slash-commands.d.ts.map +1 -1
  516. package/dist/core/slash-commands.js +9 -5
  517. package/dist/core/slash-commands.js.map +1 -1
  518. package/dist/core/tools/bash.d.ts.map +1 -1
  519. package/dist/core/tools/bash.js +2 -3
  520. package/dist/core/tools/bash.js.map +1 -1
  521. package/dist/core/tools/find.js +2 -2
  522. package/dist/core/tools/find.js.map +1 -1
  523. package/dist/core/tools/grep.js +2 -2
  524. package/dist/core/tools/grep.js.map +1 -1
  525. package/dist/core/tools/ls.js +2 -2
  526. package/dist/core/tools/ls.js.map +1 -1
  527. package/dist/core/tools/read.d.ts.map +1 -1
  528. package/dist/core/tools/read.js +4 -3
  529. package/dist/core/tools/read.js.map +1 -1
  530. package/dist/core/tools/todos-render.d.ts.map +1 -1
  531. package/dist/core/tools/todos-render.js +3 -2
  532. package/dist/core/tools/todos-render.js.map +1 -1
  533. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  534. package/dist/core/tools/tool-definition-wrapper.js +3 -2
  535. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  536. package/dist/core/tools/write.js +2 -2
  537. package/dist/core/tools/write.js.map +1 -1
  538. package/dist/core/workflow-stage-admission.d.ts +29 -0
  539. package/dist/core/workflow-stage-admission.d.ts.map +1 -0
  540. package/dist/core/workflow-stage-admission.js +81 -0
  541. package/dist/core/workflow-stage-admission.js.map +1 -0
  542. package/dist/index-extensions.d.ts +1 -1
  543. package/dist/index-extensions.d.ts.map +1 -1
  544. package/dist/index-extensions.js.map +1 -1
  545. package/dist/index.d.ts +4 -1
  546. package/dist/index.d.ts.map +1 -1
  547. package/dist/index.js +4 -1
  548. package/dist/index.js.map +1 -1
  549. package/dist/main-types.d.ts +13 -0
  550. package/dist/main-types.d.ts.map +1 -0
  551. package/dist/main-types.js +2 -0
  552. package/dist/main-types.js.map +1 -0
  553. package/dist/main.d.ts +2 -5
  554. package/dist/main.d.ts.map +1 -1
  555. package/dist/main.js +25 -17
  556. package/dist/main.js.map +1 -1
  557. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/assistant-message.js +17 -12
  559. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  560. package/dist/modes/interactive/components/atomic-banner.d.ts +7 -0
  561. package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
  562. package/dist/modes/interactive/components/atomic-banner.js +20 -0
  563. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  564. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  565. package/dist/modes/interactive/components/bash-execution.js +5 -3
  566. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  567. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/branch-summary-message.js +3 -4
  569. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  570. package/dist/modes/interactive/components/chat-message-renderer.d.ts +4 -0
  571. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  572. package/dist/modes/interactive/components/chat-message-renderer.js +4 -0
  573. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  574. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/chat-session-host-events.js +79 -8
  576. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  577. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  578. package/dist/modes/interactive/components/chat-session-host-rendering.js +4 -2
  579. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  580. package/dist/modes/interactive/components/chat-session-host.d.ts +1 -0
  581. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/chat-session-host.js +4 -1
  583. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  584. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/compaction-boundary-message.js +3 -4
  586. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  587. package/dist/modes/interactive/components/host-input-form-mount.d.ts +14 -0
  588. package/dist/modes/interactive/components/host-input-form-mount.d.ts.map +1 -0
  589. package/dist/modes/interactive/components/host-input-form-mount.js +79 -0
  590. package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -0
  591. package/dist/modes/interactive/components/host-input-form.d.ts +52 -0
  592. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -0
  593. package/dist/modes/interactive/components/host-input-form.js +278 -0
  594. package/dist/modes/interactive/components/host-input-form.js.map +1 -0
  595. package/dist/modes/interactive/components/host-session-picker.d.ts +46 -0
  596. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -0
  597. package/dist/modes/interactive/components/host-session-picker.js +183 -0
  598. package/dist/modes/interactive/components/host-session-picker.js.map +1 -0
  599. package/dist/modes/interactive/components/index.d.ts +1 -1
  600. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/index.js +1 -1
  602. package/dist/modes/interactive/components/index.js.map +1 -1
  603. package/dist/modes/interactive/components/keybinding-hints.d.ts +2 -0
  604. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/keybinding-hints.js +12 -0
  606. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  607. package/dist/modes/interactive/components/login-dialog.d.ts +3 -1
  608. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/login-dialog.js +8 -2
  610. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  611. package/dist/modes/interactive/components/model-selector.d.ts +7 -1
  612. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/model-selector.js +57 -10
  614. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  615. package/dist/modes/interactive/components/session-selector.d.ts +15 -0
  616. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/session-selector.js +35 -3
  618. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  619. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  620. package/dist/modes/interactive/components/skill-invocation-message.js +3 -2
  621. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  622. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  623. package/dist/modes/interactive/components/tool-execution.js +9 -0
  624. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  625. package/dist/modes/interactive/interactive-agent-events.js +24 -10
  626. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  627. package/dist/modes/interactive/interactive-auth-login.js +7 -1
  628. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-routing.js +3 -3
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +49 -0
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.js +2 -0
  634. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  635. package/dist/modes/interactive/interactive-extension-context.js +14 -0
  636. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  637. package/dist/modes/interactive/interactive-extension-runtime.js +1 -1
  638. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  639. package/dist/modes/interactive/interactive-global-clear.d.ts +13 -0
  640. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -0
  641. package/dist/modes/interactive/interactive-global-clear.js +11 -0
  642. package/dist/modes/interactive/interactive-global-clear.js.map +1 -0
  643. package/dist/modes/interactive/interactive-input-handling.js +17 -10
  644. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-base.d.ts +6 -1
  646. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-base.js +25 -2
  648. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  649. package/dist/modes/interactive/interactive-mode-deps.d.ts +4 -3
  650. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  651. package/dist/modes/interactive/interactive-mode-deps.js +2 -2
  652. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  653. package/dist/modes/interactive/interactive-mode-helpers.d.ts +4 -1
  654. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-mode-helpers.js +14 -1
  656. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  657. package/dist/modes/interactive/interactive-mode-surface.d.ts +3 -2
  658. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  659. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  660. package/dist/modes/interactive/interactive-mode-types.d.ts +3 -0
  661. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  662. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  663. package/dist/modes/interactive/interactive-model-routing.js +7 -4
  664. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  665. package/dist/modes/interactive/interactive-queueing.js +2 -2
  666. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  667. package/dist/modes/interactive/interactive-render-chat.js +25 -4
  668. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  669. package/dist/modes/interactive/interactive-session-routing.js +3 -0
  670. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  671. package/dist/modes/interactive/interactive-slash-commands.js +5 -2
  672. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  673. package/dist/modes/interactive/interactive-startup.d.ts +1 -1
  674. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  675. package/dist/modes/interactive/interactive-startup.js +22 -9
  676. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  677. package/dist/modes/interactive/interactive-terminal-title.d.ts +6 -0
  678. package/dist/modes/interactive/interactive-terminal-title.d.ts.map +1 -0
  679. package/dist/modes/interactive/interactive-terminal-title.js +7 -0
  680. package/dist/modes/interactive/interactive-terminal-title.js.map +1 -0
  681. package/dist/modes/interactive-engine/activity-watchdog.d.ts +45 -0
  682. package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -0
  683. package/dist/modes/interactive-engine/activity-watchdog.js +74 -0
  684. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -0
  685. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts +14 -0
  686. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -0
  687. package/dist/modes/interactive-engine/create-isolated-runtime.js +56 -0
  688. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -0
  689. package/dist/modes/interactive-engine/engine-args.d.ts +10 -0
  690. package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -0
  691. package/dist/modes/interactive-engine/engine-args.js +55 -0
  692. package/dist/modes/interactive-engine/engine-args.js.map +1 -0
  693. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +7 -0
  694. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -0
  695. package/dist/modes/interactive-engine/engine-child-liveness.js +50 -0
  696. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -0
  697. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +47 -0
  698. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -0
  699. package/dist/modes/interactive-engine/engine-custom-ui.js +276 -0
  700. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -0
  701. package/dist/modes/interactive-engine/engine-input-form.d.ts +13 -0
  702. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -0
  703. package/dist/modes/interactive-engine/engine-input-form.js +49 -0
  704. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -0
  705. package/dist/modes/interactive-engine/engine-monitor.d.ts +18 -0
  706. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -0
  707. package/dist/modes/interactive-engine/engine-monitor.js +63 -0
  708. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -0
  709. package/dist/modes/interactive-engine/engine-render-service.d.ts +17 -0
  710. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -0
  711. package/dist/modes/interactive-engine/engine-render-service.js +150 -0
  712. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -0
  713. package/dist/modes/interactive-engine/engine-session-picker.d.ts +22 -0
  714. package/dist/modes/interactive-engine/engine-session-picker.d.ts.map +1 -0
  715. package/dist/modes/interactive-engine/engine-session-picker.js +106 -0
  716. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -0
  717. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +23 -0
  718. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -0
  719. package/dist/modes/interactive-engine/extension-ui-bridge.js +126 -0
  720. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -0
  721. package/dist/modes/interactive-engine/input-form-host.d.ts +15 -0
  722. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -0
  723. package/dist/modes/interactive-engine/input-form-host.js +44 -0
  724. package/dist/modes/interactive-engine/input-form-host.js.map +1 -0
  725. package/dist/modes/interactive-engine/isolated-runtime.d.ts +75 -0
  726. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -0
  727. package/dist/modes/interactive-engine/isolated-runtime.js +448 -0
  728. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -0
  729. package/dist/modes/interactive-engine/protocol.d.ts +184 -0
  730. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -0
  731. package/dist/modes/interactive-engine/protocol.js +254 -0
  732. package/dist/modes/interactive-engine/protocol.js.map +1 -0
  733. package/dist/modes/interactive-engine/remote-command-catalog.d.ts +33 -0
  734. package/dist/modes/interactive-engine/remote-command-catalog.d.ts.map +1 -0
  735. package/dist/modes/interactive-engine/remote-command-catalog.js +51 -0
  736. package/dist/modes/interactive-engine/remote-command-catalog.js.map +1 -0
  737. package/dist/modes/interactive-engine/remote-component.d.ts +16 -0
  738. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -0
  739. package/dist/modes/interactive-engine/remote-component.js +209 -0
  740. package/dist/modes/interactive-engine/remote-component.js.map +1 -0
  741. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts +25 -0
  742. package/dist/modes/interactive-engine/remote-frame-clamp.d.ts.map +1 -0
  743. package/dist/modes/interactive-engine/remote-frame-clamp.js +43 -0
  744. package/dist/modes/interactive-engine/remote-frame-clamp.js.map +1 -0
  745. package/dist/modes/interactive-engine/remote-renderer.d.ts +59 -0
  746. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -0
  747. package/dist/modes/interactive-engine/remote-renderer.js +123 -0
  748. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -0
  749. package/dist/modes/interactive-engine/session-picker-host.d.ts +25 -0
  750. package/dist/modes/interactive-engine/session-picker-host.d.ts.map +1 -0
  751. package/dist/modes/interactive-engine/session-picker-host.js +75 -0
  752. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -0
  753. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts +43 -0
  754. package/dist/modes/interactive-engine/terminal-mode-controller.d.ts.map +1 -0
  755. package/dist/modes/interactive-engine/terminal-mode-controller.js +109 -0
  756. package/dist/modes/interactive-engine/terminal-mode-controller.js.map +1 -0
  757. package/dist/modes/rpc/bounded-writer.d.ts +27 -0
  758. package/dist/modes/rpc/bounded-writer.d.ts.map +1 -0
  759. package/dist/modes/rpc/bounded-writer.js +103 -0
  760. package/dist/modes/rpc/bounded-writer.js.map +1 -0
  761. package/dist/modes/rpc/jsonl.d.ts +15 -12
  762. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  763. package/dist/modes/rpc/jsonl.js +102 -28
  764. package/dist/modes/rpc/jsonl.js.map +1 -1
  765. package/dist/modes/rpc/rpc-client-api.d.ts +83 -0
  766. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -0
  767. package/dist/modes/rpc/rpc-client-api.js +64 -0
  768. package/dist/modes/rpc/rpc-client-api.js.map +1 -0
  769. package/dist/modes/rpc/rpc-client-process.d.ts +19 -0
  770. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -0
  771. package/dist/modes/rpc/rpc-client-process.js +79 -0
  772. package/dist/modes/rpc/rpc-client-process.js.map +1 -0
  773. package/dist/modes/rpc/rpc-client-waits.d.ts +8 -0
  774. package/dist/modes/rpc/rpc-client-waits.d.ts.map +1 -0
  775. package/dist/modes/rpc/rpc-client-waits.js +33 -0
  776. package/dist/modes/rpc/rpc-client-waits.js.map +1 -0
  777. package/dist/modes/rpc/rpc-client.d.ts +48 -124
  778. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  779. package/dist/modes/rpc/rpc-client.js +295 -249
  780. package/dist/modes/rpc/rpc-client.js.map +1 -1
  781. package/dist/modes/rpc/rpc-command-handler.d.ts +5 -1
  782. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  783. package/dist/modes/rpc/rpc-command-handler.js +79 -3
  784. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  785. package/dist/modes/rpc/rpc-event-buffer.d.ts +11 -0
  786. package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -0
  787. package/dist/modes/rpc/rpc-event-buffer.js +30 -0
  788. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -0
  789. package/dist/modes/rpc/rpc-extension-ui.d.ts +7 -1
  790. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  791. package/dist/modes/rpc/rpc-extension-ui.js +54 -32
  792. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  793. package/dist/modes/rpc/rpc-input-scheduler.d.ts +16 -0
  794. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -0
  795. package/dist/modes/rpc/rpc-input-scheduler.js +69 -0
  796. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -0
  797. package/dist/modes/rpc/rpc-input.d.ts +2 -1
  798. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  799. package/dist/modes/rpc/rpc-input.js +4 -9
  800. package/dist/modes/rpc/rpc-input.js.map +1 -1
  801. package/dist/modes/rpc/rpc-keybindings-reload.d.ts +27 -0
  802. package/dist/modes/rpc/rpc-keybindings-reload.d.ts.map +1 -0
  803. package/dist/modes/rpc/rpc-keybindings-reload.js +69 -0
  804. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -0
  805. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  806. package/dist/modes/rpc/rpc-mode.js +63 -8
  807. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  808. package/dist/modes/rpc/rpc-output-buffer.d.ts +10 -0
  809. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -0
  810. package/dist/modes/rpc/rpc-output-buffer.js +70 -0
  811. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -0
  812. package/dist/modes/rpc/rpc-session-binding.d.ts +16 -1
  813. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  814. package/dist/modes/rpc/rpc-session-binding.js +16 -3
  815. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  816. package/dist/modes/rpc/rpc-types.d.ts +109 -0
  817. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  818. package/dist/modes/rpc/rpc-types.js.map +1 -1
  819. package/dist/package-manager-cli-parser.d.ts +2 -0
  820. package/dist/package-manager-cli-parser.d.ts.map +1 -1
  821. package/dist/package-manager-cli-parser.js +24 -5
  822. package/dist/package-manager-cli-parser.js.map +1 -1
  823. package/dist/package-manager-cli.d.ts +7 -0
  824. package/dist/package-manager-cli.d.ts.map +1 -1
  825. package/dist/package-manager-cli.js +65 -1
  826. package/dist/package-manager-cli.js.map +1 -1
  827. package/dist/utils/shell.d.ts +1 -0
  828. package/dist/utils/shell.d.ts.map +1 -1
  829. package/dist/utils/shell.js +46 -0
  830. package/dist/utils/shell.js.map +1 -1
  831. package/docs/changelog.mdx +11 -0
  832. package/docs/compaction.md +53 -17
  833. package/docs/custom-provider.md +24 -5
  834. package/docs/development.md +9 -7
  835. package/docs/docs.json +1 -0
  836. package/docs/extensions.md +30 -16
  837. package/docs/intercom.md +489 -0
  838. package/docs/json.md +1 -1
  839. package/docs/keybindings.md +1 -1
  840. package/docs/packages.md +1 -0
  841. package/docs/quickstart.md +11 -5
  842. package/docs/rpc.md +9 -7
  843. package/docs/sdk.md +6 -0
  844. package/docs/session-format.md +7 -6
  845. package/docs/sessions.md +4 -2
  846. package/docs/settings.md +2 -2
  847. package/docs/subagents.md +7 -2
  848. package/docs/tui.md +61 -2
  849. package/docs/usage.md +6 -5
  850. package/docs/workflows.md +2572 -1379
  851. package/examples/extensions/handoff.ts +1 -1
  852. package/examples/extensions/qna.ts +1 -1
  853. package/examples/extensions/summarize.ts +1 -1
  854. package/npm-shrinkwrap.json +225 -76
  855. package/package.json +7 -6
  856. package/dist/builtin/workflows/src/durable/file-backend.ts +0 -439
  857. package/dist/builtin/workflows/src/durable/file-lock.ts +0 -153
  858. package/dist/builtin/workflows/src/durable/file-state.ts +0 -104
  859. package/dist/builtin/workflows/src/extension/runtime-direct.ts +0 -96
  860. package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +0 -66
  861. package/dist/builtin/workflows/src/runs/foreground/executor-direct-output.ts +0 -91
  862. package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +0 -282
  863. package/dist/builtin/workflows/src/shared/resumable-workflow-notices.ts +0 -43
  864. package/dist/builtin/workflows/src/tui/session-confirm.ts +0 -299
@@ -1,3 +1,4 @@
1
+ import { nextEventLoopTurn, runWorkflowDefinitionCallback } from "./workflow-activity.js";
1
2
  import type { RunSnapshot, StageSnapshot } from "../shared/store-types.js";
2
3
  import type { WorkflowDefinition, WorkflowInputValues, WorkflowOutputValues, WorkflowRunContext } from "../shared/types.js";
3
4
  import type { WorkflowFailure } from "../shared/workflow-failures.js";
@@ -29,6 +30,7 @@ import {
29
30
  finalizeKilled,
30
31
  finalizeKilledByFailure,
31
32
  recordActiveBlockedFailure,
33
+ normalizeStageLessFailureMetadata,
32
34
  reconcileTerminalRunResult,
33
35
  selectRunFailureDisposition,
34
36
  } from "../runs/foreground/executor-lifecycle.js";
@@ -37,8 +39,8 @@ import { isWorkflowDefinition, workflowDefinitionRequirementMessage } from "../r
37
39
  import { getDurableBackend } from "../durable/factory.js";
38
40
  import { classifyReturnedRunStatus } from "./run-returned-status.js";
39
41
  import { createToolPrimitive, createCheckpointIdGenerator } from "../durable/tool-primitive.js";
40
- import { persistDurableCacheEntry } from "../durable/resume-catalog.js";
41
42
  import { createDurableStagePrimitive, createDurableTaskPrimitive, recordStageCheckpoint, createStageReplayKeyGenerator, recordCachedStageWithTracker } from "../durable/stage-primitive.js";
43
+ import { inheritedRunElapsedMs } from "../durable/run-timing.js";
42
44
  import type { DurableCompletedStageCheckpoint } from "../durable/stage-primitive.js";
43
45
  import { createDurableChildWorkflowPrimitive } from "../durable/child-primitive.js";
44
46
  import { ScopedDurableBackend, type DurableScope } from "../durable/scoped-backend.js";
@@ -46,10 +48,6 @@ import { finalizeDurableTerminalStatus } from "./run-durable-finalize.js";
46
48
  import { createDurableStageSessionRecorder } from "./run-durable-stage-session.js";
47
49
  import type { DurableWorkflowBackend } from "../durable/backend.js";
48
50
 
49
- function nextEventLoopTurn(): Promise<void> {
50
- return new Promise((resolve) => setTimeout(resolve, 0));
51
- }
52
-
53
51
  type WorkflowRunInputArgument = Parameters<typeof resolveAndValidateInputs>[1];
54
52
 
55
53
  export function run<
@@ -100,6 +98,19 @@ export async function run<
100
98
  else callerSignal.addEventListener("abort", () => { ownController.abort(callerSignal.reason); }, { once: true });
101
99
  }
102
100
  const exit = createWorkflowExitManager({ runId, exitScope, controller: ownController });
101
+ // Durable workflow backend — registers this run and wires ctx.tool/ui/stage.
102
+ // Declared early so the stage-end recorder can attach to stageOptions and so
103
+ // resume can seed inherited elapsed time. Child runs with a durable scope
104
+ // route their internal side-effect checkpoints under the root workflow so
105
+ // interrupted children do not re-execute completed side effects on parent
106
+ // resume. cross-ref: issue #1498 — DBOS-backed cross-session resumability.
107
+ const rootBackend: DurableWorkflowBackend = opts.durableBackend ?? getDurableBackend();
108
+ const durableBackend: DurableWorkflowBackend = opts.durableScope !== undefined
109
+ ? new ScopedDurableBackend(rootBackend, opts.durableScope)
110
+ : rootBackend;
111
+ const inheritedElapsedMs = opts.parentRun === undefined
112
+ ? inheritedRunElapsedMs({ backend: durableBackend, runId, continuationSource: opts.continuation?.source })
113
+ : undefined;
103
114
 
104
115
  const runSnapshot: RunSnapshot = {
105
116
  id: runId,
@@ -117,6 +128,7 @@ export async function run<
117
128
  resumedFromRunId: opts.continuation.source.id,
118
129
  resumeFromStageId: opts.continuation.resumeFromStageId,
119
130
  } : {}),
131
+ ...(inheritedElapsedMs !== undefined ? { accumulatedDurationMs: inheritedElapsedMs } : {}),
120
132
  };
121
133
 
122
134
  const classifiedFailures = new Map<unknown, WorkflowFailure>();
@@ -146,6 +158,7 @@ export async function run<
146
158
  ...(runSnapshot.rootRunId !== undefined ? { rootRunId: runSnapshot.rootRunId } : {}),
147
159
  ...(runSnapshot.resumedFromRunId !== undefined ? { resumedFromRunId: runSnapshot.resumedFromRunId } : {}),
148
160
  ...(runSnapshot.resumeFromStageId !== undefined ? { resumeFromStageId: runSnapshot.resumeFromStageId } : {}),
161
+ ...(runSnapshot.accumulatedDurationMs !== undefined ? { accumulatedDurationMs: runSnapshot.accumulatedDurationMs } : {}),
149
162
  ts: runSnapshot.startedAt,
150
163
  });
151
164
  }
@@ -185,16 +198,6 @@ export async function run<
185
198
  classifyExecutorFailure,
186
199
  drainWorkflowExitCleanups: exit.drainWorkflowExitCleanups,
187
200
  });
188
- // Durable workflow backend — registers this run and wires ctx.tool/ui/stage.
189
- // Declared early so the stage-end recorder can attach to stageOptions.
190
- // cross-ref: issue #1498 — DBOS-backed cross-session resumability.
191
- // Child runs with a durable scope route their internal side-effect
192
- // checkpoints under the root workflow so interrupted children do not
193
- // re-execute completed side effects on parent resume.
194
- const rootBackend: DurableWorkflowBackend = opts.durableBackend ?? getDurableBackend();
195
- const durableBackend: DurableWorkflowBackend = opts.durableScope !== undefined
196
- ? new ScopedDurableBackend(rootBackend, opts.durableScope)
197
- : rootBackend;
198
201
  const checkpointIdGenerator = createCheckpointIdGenerator();
199
202
  const stageReplayKeyGenerator = createStageReplayKeyGenerator(runId);
200
203
  const completedStageReplayKeys = new Map<string, string>();
@@ -209,14 +212,13 @@ export async function run<
209
212
  const durableOnStageEnd = async (stageRunId: string, snapshot: StageSnapshot): Promise<void> => {
210
213
  if (stageRunId === runId && snapshot.status === "completed") {
211
214
  await recordStageCheckpoint(durableStageDeps, snapshot);
212
- if (opts.persistence && durableBackend.persistent) {
213
- const cacheEntry = durableBackend.toCacheEntry(runId);
214
- if (cacheEntry) persistDurableCacheEntry(opts.persistence, cacheEntry);
215
- }
216
215
  }
217
216
  await userOnStageEnd?.(stageRunId, snapshot);
218
217
  };
219
- const durableOnStageSession = createDurableStageSessionRecorder({ runId, deps: durableStageDeps, backend: durableBackend, persistence: opts.persistence, onStageSession: opts.onStageSession });
218
+ const durableOnStageSession = createDurableStageSessionRecorder({
219
+ runId, deps: durableStageDeps, onStageSession: opts.onStageSession,
220
+ ...(opts.parentRun === undefined ? { runSnapshot } : {}),
221
+ });
220
222
  const stageOptions: EngineStageRuntimeOptions = {
221
223
  continuation: opts.continuation,
222
224
  models: opts.models,
@@ -273,6 +275,7 @@ export async function run<
273
275
  inputRuntimeDefaults,
274
276
  workflowInvocationCwd,
275
277
  stageRegistry, gitWorktreeSetupCache,
278
+ worktreeSymlinkDirectories: opts.config?.worktree?.symlinkDirectories,
276
279
  exit,
277
280
  classifyExecutorFailure,
278
281
  });
@@ -321,11 +324,8 @@ export async function run<
321
324
  resumable: true,
322
325
  ...(opts.persistence !== undefined ? { sessionFile: undefined } : {}),
323
326
  };
324
- if (opts.continuation === undefined && opts.parentRun === undefined) {
325
- durableBackend.registerWorkflow({ ...durableRootWorkflowRegistration, invocationCwd: workflowInvocationCwd });
326
- } else if (opts.parentRun === undefined) {
327
- durableBackend.setWorkflowStatus(runId, "running");
328
- }
327
+ const shouldRegisterDurableRoot = opts.parentRun === undefined
328
+ && (opts.continuation === undefined || opts.continuation.source.id !== runId);
329
329
  const tool = createToolPrimitive({
330
330
  workflowId: runId,
331
331
  backend: durableBackend,
@@ -365,6 +365,7 @@ export async function run<
365
365
  runId,
366
366
  activeStore,
367
367
  opts,
368
+ stageControlRegistry: stageRegistry,
368
369
  tracker,
369
370
  replayIndex,
370
371
  signal: ownController.signal,
@@ -406,11 +407,13 @@ export async function run<
406
407
  }
407
408
  }
408
409
 
409
- if (opts.continuation === undefined && opts.parentRun === undefined) {
410
+ if (shouldRegisterDurableRoot) {
410
411
  durableBackend.registerWorkflow({ ...durableRootWorkflowRegistration, ...workflowInvocationMetadata(inputRuntimeDefaults, workflowInvocationCwd, gitWorktreeSetupCache) });
412
+ } else if (opts.parentRun === undefined) {
413
+ durableBackend.setWorkflowStatus(runId, "running");
411
414
  }
412
-
413
- const rawResult = await def.run(ctx);
415
+ if (opts.deferWorkflowStart === true) opts.onWorkflowStartReady?.();
416
+ const rawResult = await runWorkflowDefinitionCallback(def.name, runId, () => def.run(ctx));
414
417
  if (ownController.signal.aborted) {
415
418
  const selectedExit = findWorkflowExitSignal(ownController.signal.reason, exitScope);
416
419
  if (selectedExit !== undefined) return await finalizers.finalizeWorkflowExit(selectedExit);
@@ -422,16 +425,12 @@ export async function run<
422
425
  const result = normalizeWorkflowRunOutput(def.name, rawResult);
423
426
  assertWorkflowRunOutputs(def.name, result, def.outputs);
424
427
  assertWorkflowCreatedStage(runSnapshot);
425
- await durableBackend.flush?.();
428
+ await durableBackend.flush();
426
429
  const returned = classifyReturnedRunStatus(result, runSnapshot);
427
430
  const recorded = activeStore.recordRunEnd(runId, returned.status, result, returned.error, returned.metadata);
428
431
  appendRunEndWhenRecorded(opts.persistence, recorded, { runId, status: returned.status, result, ...(returned.error !== undefined ? { error: returned.error } : {}), ...(returned.metadata ?? {}), ...(runSnapshot.endedAt !== undefined ? { endedAt: runSnapshot.endedAt } : {}), ...(runSnapshot.durationMs !== undefined ? { durationMs: runSnapshot.durationMs } : {}), ts: Date.now() });
429
432
  durableBackend.setWorkflowStatus(runId, returned.status, undefined, returned.metadata?.resumable);
430
- await durableBackend.flush?.();
431
- if (opts.persistence && durableBackend.persistent) {
432
- const cacheEntry = durableBackend.toCacheEntry(runId);
433
- if (cacheEntry) persistDurableCacheEntry(opts.persistence, cacheEntry);
434
- }
433
+ await durableBackend.flush();
435
434
  return reconcileTerminalRunResult(runId, runSnapshot, activeStore, { status: returned.status, result, error: returned.error }, opts.onRunEnd);
436
435
  } catch (err) {
437
436
  const selectedExit = findWorkflowExitSignal(err, exitScope) ?? findWorkflowExitSignal(ownController.signal.reason, exitScope);
@@ -444,12 +443,12 @@ export async function run<
444
443
  }
445
444
 
446
445
  const failure = classifyExecutorFailure(err);
447
- const metadata = selectRunFailureDisposition({
446
+ const metadata = normalizeStageLessFailureMetadata(selectRunFailureDisposition({
448
447
  outerFailure: failure,
449
448
  thrownError: err,
450
449
  stages: runSnapshot.stages,
451
450
  classifyFailure: classifyExecutorFailure,
452
- });
451
+ }), runSnapshot.stages.length);
453
452
 
454
453
  if (metadata.failureDisposition === "terminal_killed") {
455
454
  for (const failedStageId of metadata.failedStageIds) scheduler.blockKnownNonTerminalDescendants(failedStageId);
@@ -491,7 +490,6 @@ export async function run<
491
490
  runSnapshot,
492
491
  isRoot: opts.parentRun === undefined,
493
492
  durableBackend,
494
- persistence: opts.persistence,
495
493
  });
496
494
  } finally {
497
495
  gitWorktreeSetupCacheOwner.release(() => opts.cancellation?.unregister(runId));
@@ -33,6 +33,7 @@ export interface EngineRuntimeInput {
33
33
  readonly inputRuntimeDefaults: Partial<StageOptions>;
34
34
  readonly workflowInvocationCwd: string;
35
35
  readonly gitWorktreeSetupCache: GitWorktreeSetupCache;
36
+ readonly worktreeSymlinkDirectories?: readonly string[];
36
37
  readonly stageRegistry: StageControlRegistry;
37
38
  readonly exit: WorkflowExitManager;
38
39
  readonly classifyExecutorFailure: LiveStageRuntime["classifyExecutorFailure"];
@@ -76,6 +77,7 @@ export class EngineRuntime {
76
77
  readonly inputRuntimeDefaults: Partial<StageOptions>;
77
78
  readonly workflowInvocationCwd: string;
78
79
  readonly gitWorktreeSetupCache: GitWorktreeSetupCache;
80
+ readonly worktreeSymlinkDirectories?: readonly string[];
79
81
 
80
82
  private readonly spawnAgentStage: (
81
83
  name: string,
@@ -97,6 +99,7 @@ export class EngineRuntime {
97
99
  this.inputRuntimeDefaults = input.inputRuntimeDefaults;
98
100
  this.workflowInvocationCwd = input.workflowInvocationCwd;
99
101
  this.gitWorktreeSetupCache = input.gitWorktreeSetupCache;
102
+ this.worktreeSymlinkDirectories = input.worktreeSymlinkDirectories;
100
103
 
101
104
  // The runtime only wires host-injected ports; stage sessions are still
102
105
  // created lazily by the stage runner through input.adapters.agentSession.
@@ -0,0 +1,9 @@
1
+ import { runCallback } from "@bastani/atomic";
2
+
3
+ export function nextEventLoopTurn(): Promise<void> {
4
+ return new Promise((resolve) => setTimeout(resolve, 0));
5
+ }
6
+
7
+ export function runWorkflowDefinitionCallback<T>(name: string, runId: string, callback: () => T | Promise<T>): Promise<T> {
8
+ return runCallback({ kind: "workflow.run", name, runId }, callback);
9
+ }
@@ -0,0 +1,155 @@
1
+ import type { StageControlHandle } from "../runs/foreground/stage-control-registry.js";
2
+ import type {
3
+ EnsurePostMortemStageHandleResult,
4
+ PostMortemUnavailableReason,
5
+ } from "../runs/foreground/postmortem-stage-chat.js";
6
+
7
+ const LATE_STAGE_MESSAGE_EVENT = "atomic:workflow-stage-late-message";
8
+ const POST_MORTEM_ATTACH_TIMEOUT_MS = 10_000;
9
+
10
+ interface IntercomAskMessage {
11
+ readonly customType: "intercom_message";
12
+ readonly content: string;
13
+ readonly details?: {
14
+ readonly message?: {
15
+ readonly expectsReply?: boolean;
16
+ };
17
+ };
18
+ }
19
+
20
+ interface CompletedStageAskEvent {
21
+ handled: boolean;
22
+ completion?: Promise<void>;
23
+ readonly batch: boolean;
24
+ readonly workflowRunId?: string;
25
+ readonly workflowStageId?: string;
26
+ readonly messages: readonly IntercomAskMessage[];
27
+ }
28
+
29
+ interface WorkflowEventSurface {
30
+ readonly events?: {
31
+ on?(event: string, listener: (payload: unknown) => void): (() => void) | void;
32
+ };
33
+ on?(event: "session_shutdown", listener: () => void): void;
34
+ }
35
+
36
+ export type CompletedStageHandleResolver = (
37
+ runId: string,
38
+ stageId: string,
39
+ ) => EnsurePostMortemStageHandleResult | undefined;
40
+
41
+ /**
42
+ * Claims late blocking Intercom asks for completed workflow stages and runs one
43
+ * post-mortem turn in the retained conversation. Ordinary late notifications
44
+ * keep using the existing parent-chat route.
45
+ */
46
+ export function registerCompletedStageIntercomAskRouter(
47
+ pi: WorkflowEventSurface,
48
+ resolveHandle: CompletedStageHandleResolver,
49
+ ): () => void {
50
+ const queues = new Map<string, Promise<void>>();
51
+ let disposed = false;
52
+ const unsubscribe = pi.events?.on?.(LATE_STAGE_MESSAGE_EVENT, (payload) => {
53
+ if (disposed || !isCompletedStageAskEvent(payload) || payload.handled === true) return;
54
+ payload.handled = true;
55
+ payload.completion = enqueueTargetTurn(
56
+ queues,
57
+ `${payload.workflowRunId}:${payload.workflowStageId}`,
58
+ () => deliverAsPostMortemTurn(payload, resolveHandle),
59
+ );
60
+ });
61
+ const dispose = (): void => {
62
+ disposed = true;
63
+ queues.clear();
64
+ unsubscribe?.();
65
+ };
66
+ pi.on?.("session_shutdown", dispose);
67
+ return dispose;
68
+ }
69
+
70
+ function isCompletedStageAskEvent(payload: unknown): payload is CompletedStageAskEvent & {
71
+ readonly workflowRunId: string;
72
+ readonly workflowStageId: string;
73
+ } {
74
+ if (typeof payload !== "object" || payload === null) return false;
75
+ const event = payload as Partial<CompletedStageAskEvent>;
76
+ return typeof event.workflowRunId === "string"
77
+ && event.workflowRunId.length > 0
78
+ && typeof event.workflowStageId === "string"
79
+ && event.workflowStageId.length > 0
80
+ && Array.isArray(event.messages)
81
+ && event.messages.length > 0
82
+ && event.messages.every((message) =>
83
+ message?.customType === "intercom_message"
84
+ && typeof message.content === "string"
85
+ && message.details?.message?.expectsReply === true,
86
+ );
87
+ }
88
+
89
+ function enqueueTargetTurn(
90
+ queues: Map<string, Promise<void>>,
91
+ key: string,
92
+ deliver: () => Promise<void>,
93
+ ): Promise<void> {
94
+ const previous = queues.get(key) ?? Promise.resolve();
95
+ const current = previous.catch(() => {}).then(deliver);
96
+ queues.set(key, current);
97
+ void current.finally(() => {
98
+ if (queues.get(key) === current) queues.delete(key);
99
+ }).catch(() => {});
100
+ return current;
101
+ }
102
+
103
+ async function deliverAsPostMortemTurn(
104
+ event: CompletedStageAskEvent & { readonly workflowRunId: string; readonly workflowStageId: string },
105
+ resolveHandle: CompletedStageHandleResolver,
106
+ ): Promise<void> {
107
+ const resolution = resolveHandle(event.workflowRunId, event.workflowStageId);
108
+ if (resolution === undefined) {
109
+ throw new Error(
110
+ `Intercom ask target is unavailable: completed workflow stage ${event.workflowRunId}/${event.workflowStageId} was deleted or is no longer retained.`,
111
+ );
112
+ }
113
+ if (!resolution.ok) {
114
+ throw new Error(unavailableReason(event.workflowRunId, event.workflowStageId, resolution.reason));
115
+ }
116
+ const handle = resolution.handle;
117
+ if (handle.status !== "completed" || handle.isDisposed === true) {
118
+ throw new Error(
119
+ `Intercom ask target is not resumable: workflow stage ${event.workflowRunId}/${event.workflowStageId} has no retained completed conversation.`,
120
+ );
121
+ }
122
+ await attachWithTimeout(handle);
123
+ for (const message of event.messages) {
124
+ if (handle.isStreaming) await handle.followUp(message.content);
125
+ else await handle.prompt(message.content);
126
+ }
127
+ }
128
+
129
+ async function attachWithTimeout(handle: StageControlHandle): Promise<void> {
130
+ let timeout: ReturnType<typeof setTimeout> | undefined;
131
+ const bounded = new Promise<never>((_, reject) => {
132
+ timeout = setTimeout(() => reject(new Error(
133
+ `Intercom ask target failed to resume within ${POST_MORTEM_ATTACH_TIMEOUT_MS}ms: retained stage conversation ${handle.runId}/${handle.stageId}.`,
134
+ )), POST_MORTEM_ATTACH_TIMEOUT_MS);
135
+ });
136
+ try {
137
+ await Promise.race([handle.ensureAttached(), bounded]);
138
+ } finally {
139
+ if (timeout !== undefined) clearTimeout(timeout);
140
+ }
141
+ }
142
+
143
+ function unavailableReason(runId: string, stageId: string, reason: PostMortemUnavailableReason): string {
144
+ const target = `${runId}/${stageId}`;
145
+ switch (reason) {
146
+ case "not_terminal":
147
+ return `Intercom ask target is not resumable: workflow stage ${target} is not a completed stage with a retained conversation.`;
148
+ case "no_session":
149
+ return `Intercom ask target is unavailable: completed workflow stage ${target} has no retained conversation.`;
150
+ case "invalid_session":
151
+ return `Intercom ask target is unavailable: retained conversation for completed workflow stage ${target} is missing, deleted, or invalid.`;
152
+ case "no_adapter":
153
+ return `Intercom ask target is not resumable: no workflow stage session adapter can reopen ${target}.`;
154
+ }
155
+ }
@@ -73,6 +73,19 @@ function validateConfig(value: unknown): string | null {
73
73
  }
74
74
  }
75
75
  }
76
+ if ("worktree" in c) {
77
+ const worktree = c["worktree"];
78
+ if (worktree === null || typeof worktree !== "object" || Array.isArray(worktree)) {
79
+ return `"worktree" must be a JSON object, got ${JSON.stringify(typeof worktree)}`;
80
+ }
81
+ const config = worktree as Record<string, unknown>;
82
+ if ("symlinkDirectories" in config) {
83
+ const directories = config["symlinkDirectories"];
84
+ if (!Array.isArray(directories) || directories.some((entry) => typeof entry !== "string")) {
85
+ return `"worktree.symlinkDirectories" must be an array of strings`;
86
+ }
87
+ }
88
+ }
76
89
 
77
90
  if ("workflows" in c) {
78
91
  if (c["workflows"] === null || typeof c["workflows"] !== "object" || Array.isArray(c["workflows"])) {
@@ -42,6 +42,10 @@ export interface WorkflowNotificationsConfig {
42
42
  readonly notifyOn?: readonly WorkflowLifecycleNoticeKind[];
43
43
  }
44
44
 
45
+ export interface WorkflowWorktreeConfig {
46
+ /** Main-root directories symlinked into temporary worktrees. */
47
+ readonly symlinkDirectories?: readonly string[];
48
+ }
45
49
  export interface WorkflowExtensionConfig {
46
50
  /** Explicit named workflows to register by module path. */
47
51
  readonly workflows?: Readonly<Record<string, WorkflowConfigEntry>>;
@@ -57,6 +61,8 @@ export interface WorkflowExtensionConfig {
57
61
  readonly resumeInFlight?: "ask" | "auto" | "never";
58
62
  /** Main-chat workflow lifecycle notices. */
59
63
  readonly workflowNotifications?: WorkflowNotificationsConfig;
64
+ /** Temporary-worktree post-creation settings. */
65
+ readonly worktree?: WorkflowWorktreeConfig;
60
66
  }
61
67
 
62
68
  /** Severity of a config diagnostic. */
@@ -159,6 +165,9 @@ function mergeConfigs(
159
165
  },
160
166
  }
161
167
  : {}),
168
+ ...(base.worktree !== undefined || override.worktree !== undefined
169
+ ? { worktree: { ...(base.worktree ?? {}), ...(override.worktree ?? {}) } }
170
+ : {}),
162
171
  ...(workflows !== undefined ? { workflows } : {}),
163
172
  };
164
173
  }
@@ -184,6 +193,9 @@ export const WORKFLOW_CONFIG_DEFAULTS = {
184
193
  enabled: true,
185
194
  notifyOn: ["completed", "failed", "blocked", "awaiting_input"] as const,
186
195
  },
196
+ worktree: {
197
+ symlinkDirectories: ["node_modules"] as readonly string[],
198
+ },
187
199
  } as const;
188
200
 
189
201
  /**
@@ -200,6 +212,9 @@ export interface WorkflowEffectiveConfig {
200
212
  readonly enabled: boolean;
201
213
  readonly notifyOn: readonly WorkflowLifecycleNoticeKind[];
202
214
  };
215
+ readonly worktree: {
216
+ readonly symlinkDirectories: readonly string[];
217
+ };
203
218
  readonly workflows?: Readonly<Record<string, WorkflowConfigEntry>>;
204
219
  }
205
220
 
@@ -228,6 +243,11 @@ export function withWorkflowDefaults(
228
243
  config.workflowNotifications?.notifyOn
229
244
  ?? WORKFLOW_CONFIG_DEFAULTS.workflowNotifications.notifyOn,
230
245
  },
246
+ worktree: {
247
+ symlinkDirectories:
248
+ config.worktree?.symlinkDirectories
249
+ ?? WORKFLOW_CONFIG_DEFAULTS.worktree.symlinkDirectories,
250
+ },
231
251
  ...(config.workflows !== undefined ? { workflows: config.workflows } : {}),
232
252
  };
233
253
  }
@@ -13,10 +13,12 @@ import { store as defaultStore, type Store } from "../shared/store.js";
13
13
  import type { CancellationRegistry } from "../runs/background/cancellation-registry.js";
14
14
  import { jobTracker as defaultJobTracker, type JobTracker } from "../runs/background/job-tracker.js";
15
15
  import { resolveAndValidateInputs } from "../runs/foreground/executor.js";
16
- import { runDetached } from "../runs/background/runner.js";
16
+ import { launchDetachedUntilStartup, workflowStartupFailureMessage } from "../runs/background/startup-admission.js";
17
17
  import type { WorkflowToolResult, WorkflowInputEntry } from "./render-result.js";
18
18
  import { deriveInputFields, schemaIsRequired } from "../shared/schema-introspection.js";
19
+ import { effectiveRunStatus } from "../shared/returned-run-status.js";
19
20
  import type { WorkflowToolArgs } from "./index.js";
21
+ import { getDurableBackend } from "../durable/factory.js";
20
22
  import {
21
23
  INTERACTIVE_WORKFLOW_POLICY,
22
24
  type WorkflowExecutionPolicy,
@@ -38,6 +40,19 @@ function failedRunResult(name: string | undefined, runId: string, error: string)
38
40
  stages: [],
39
41
  };
40
42
  }
43
+ async function discardUnadmittedRun(runId: string, activeStore: Store): Promise<void> {
44
+ activeStore.removeRun(runId);
45
+ const backend = getDurableBackend();
46
+ const handle = backend.getWorkflow(runId);
47
+ if (handle?.status === "running") {
48
+ backend.setWorkflowStatus(runId, "failed", handle.pendingPrompts, false);
49
+ await backend.flush();
50
+ }
51
+ const deleted = await backend.deleteWorkflowIfInactive(runId);
52
+ if (!deleted.ok && deleted.reason !== "not_found") {
53
+ throw new Error(`workflow ${runId} remained ${deleted.reason}`);
54
+ }
55
+ }
41
56
 
42
57
  // ---------------------------------------------------------------------------
43
58
  // Options
@@ -163,20 +178,44 @@ export async function dispatch(
163
178
  );
164
179
  }
165
180
 
166
- const accepted = runDetached(def, inputs, {
167
- registry: opts.registry,
168
- adapters: opts.adapters,
169
- store: opts.store,
170
- cancellation: opts.cancellation,
171
- jobs: opts.jobs,
172
- persistence: opts.persistence,
173
- mcp: opts.mcp,
174
- config: opts.config,
175
- models: opts.models,
176
- executionMode: policy.mode,
177
- cwd: opts.cwd,
178
- defaultSessionDir: opts.defaultSessionDir,
179
- });
181
+ const runId = crypto.randomUUID();
182
+ let launch: ReturnType<typeof launchDetachedUntilStartup>;
183
+ try {
184
+ launch = launchDetachedUntilStartup(def, inputs, {
185
+ registry: opts.registry,
186
+ adapters: opts.adapters,
187
+ store: opts.store,
188
+ cancellation: opts.cancellation,
189
+ jobs: opts.jobs,
190
+ persistence: opts.persistence,
191
+ mcp: opts.mcp,
192
+ config: opts.config,
193
+ models: opts.models,
194
+ executionMode: policy.mode,
195
+ cwd: opts.cwd,
196
+ defaultSessionDir: opts.defaultSessionDir,
197
+ runId,
198
+ });
199
+ } catch (error) {
200
+ return failedRunResult(def.name, runId, error instanceof Error ? error.message : String(error));
201
+ }
202
+ const { accepted } = launch;
203
+ const admission = await launch.wait;
204
+ if (!admission.started) {
205
+ const activeStore = opts.store ?? defaultStore;
206
+ const snapshot = activeStore.runs().find((run) => run.id === accepted.runId);
207
+ const error = workflowStartupFailureMessage(
208
+ admission,
209
+ snapshot?.error,
210
+ `Workflow run ${accepted.runId} ended before startup admission`,
211
+ );
212
+ try {
213
+ await discardUnadmittedRun(accepted.runId, activeStore);
214
+ } catch (cleanupError) {
215
+ return failedRunResult(accepted.name, accepted.runId, `${error}; startup cleanup failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`);
216
+ }
217
+ return failedRunResult(accepted.name, accepted.runId, error);
218
+ }
180
219
  if (policy.awaitTerminalRun === true) {
181
220
  const tracker = opts.jobs ?? defaultJobTracker;
182
221
  const job = tracker.get(accepted.runId);
@@ -201,7 +240,7 @@ export async function dispatch(
201
240
  action: "run",
202
241
  name: snapshot.name,
203
242
  runId: snapshot.id,
204
- status: snapshot.status,
243
+ status: effectiveRunStatus(snapshot),
205
244
  result: snapshot.result,
206
245
  error: snapshot.error,
207
246
  exited: snapshot.exited,
@@ -220,7 +259,7 @@ export async function dispatch(
220
259
  }
221
260
 
222
261
  default:
223
- // status/kill/resume are not routed here; unknown actions are bugs.
262
+ // Status and run-control actions are not routed here; unknown actions are bugs.
224
263
  throw new Error(`WorkflowDispatcher: unknown action "${action}"`);
225
264
  }
226
265
  }
@@ -1,4 +1,3 @@
1
- import { quitRun } from "../runs/background/quit.js";
2
1
  import { store } from "../shared/store.js";
3
2
  import { subscribeIntercomControl } from "../intercom/result-intercom.js";
4
3
  import { buildIntercomCallbacks } from "../intercom/intercom-routing.js";
@@ -15,6 +14,9 @@ import { createWorkflowExtensionRuntimeState } from "./extension-runtime-state.j
15
14
  import { registerWorkflowLifecycleHandlers } from "./extension-lifecycle.js";
16
15
  import { dynamicTextRenderComponent } from "./render-component.js";
17
16
  import { makeExecuteWorkflowTool } from "./workflow-tool.js";
17
+ import { createPostMortemHandleResolver, postMortemDepsForRun } from "./postmortem-deps.js";
18
+ import { registerCompletedStageIntercomAskRouter } from "./completed-stage-intercom-ask.js";
19
+ import type { PostMortemHandleResolution } from "../tui/workflow-attach-pane-types.js";
18
20
  import { registerWorkflowTool } from "./workflow-tool-registration.js";
19
21
  import { registerWorkflowSlashCommand } from "./workflow-command-registration.js";
20
22
  import { installInputInterceptor, type WorkflowCommandHandler } from "./workflow-command-utils.js";
@@ -34,13 +36,9 @@ function registerWorkflowMessageRenderers(pi: ExtensionAPI): void {
34
36
 
35
37
  function buildWorkflowOverlay(
36
38
  pi: ExtensionAPI,
39
+ resolvePostMortemHandle: (runId: string, stageId: string) => PostMortemHandleResolution,
37
40
  ): GraphOverlayPort {
38
- return buildGraphOverlayAdapter(pi, store, {
39
- onQuitRun: (runId) => {
40
- quitRun(runId, { store });
41
- pi.ui?.notify?.(`Workflow quit; resume with /workflow resume.`, "info");
42
- },
43
- });
41
+ return buildGraphOverlayAdapter(pi, store, { resolvePostMortemHandle });
44
42
  }
45
43
 
46
44
  function registerWorkflowShortcut(pi: ExtensionAPI, overlay: GraphOverlayPort): void {
@@ -77,15 +75,21 @@ function registerIntercomControl(
77
75
  function factory(pi: ExtensionAPI): void {
78
76
  const adapters = buildRuntimeAdapters(pi);
79
77
  const runtimeState = createWorkflowExtensionRuntimeState(pi, adapters);
80
- const overlay = buildWorkflowOverlay(pi);
78
+ const postMortemResolverDeps = {
79
+ adapters,
80
+ resolveDefaultStageSessionDir: runtimeState.resolveDefaultStageSessionDir,
81
+ };
82
+ const postMortemHandleResolver = createPostMortemHandleResolver(postMortemResolverDeps);
83
+ const overlay = buildWorkflowOverlay(pi, postMortemHandleResolver);
84
+ registerCompletedStageIntercomAskRouter(pi, postMortemHandleResolver);
81
85
  const workflowCommands = new Map<string, WorkflowCommandHandler>();
82
86
  const storeWidgetRef: { current: (() => void) | null } = { current: null };
83
87
  const intercomControlRef: { current: (() => void) | null } = { current: null };
84
88
  const executeWorkflowTool = makeExecuteWorkflowTool(
85
89
  (ctx) => runtimeState.runtimeForContext(ctx),
86
- () => runtimeState.persistenceRef.current,
87
90
  runtimeState.reloadWorkflowResources,
88
91
  runtimeState.ensureWorkflowResourcesLoaded,
92
+ { resolvePostMortemDeps: (runId) => postMortemDepsForRun(runId, postMortemResolverDeps) },
89
93
  );
90
94
 
91
95
  registerWorkflowTool(pi, executeWorkflowTool, runtimeState.runWithLifecycleSuppressedForPolicy);
@@ -99,7 +103,6 @@ function factory(pi: ExtensionAPI): void {
99
103
  runControl: {
100
104
  pi,
101
105
  overlay,
102
- getPersistence: () => runtimeState.persistenceRef.current,
103
106
  runtimeForContext: runtimeState.runtimeForContext,
104
107
  ensureWorkflowResourcesLoaded: runtimeState.ensureWorkflowResourcesLoaded,
105
108
  },