@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
@@ -3,22 +3,24 @@ import { quitAllRuns } from "../runs/background/quit.js";
3
3
  import { cancellationRegistry } from "../runs/background/cancellation-registry.js";
4
4
  import { stageControlRegistry } from "../runs/foreground/stage-control-registry.js";
5
5
  import { store } from "../shared/store.js";
6
- import { restoreOnSessionStart } from "../shared/persistence-restore.js";
7
- import { findResumableWorkflowNotices } from "../shared/resumable-workflow-notices.js";
8
6
  import { installCompactionHook } from "../shared/persistence-compaction-policy.js";
9
7
  import { clearForms } from "../tui/inline-form-store.js";
10
8
  import { installStoreWidget } from "../tui/store-widget-installer.js";
11
- import { registerIntercomParentSession } from "../intercom/intercom-bridge.js";
12
- import {
13
- resetWorkflowLifecycleNotificationState,
14
- seedWorkflowLifecycleNotificationState,
15
- withWorkflowLifecycleNotificationsSuppressed,
16
- } from "./lifecycle-notifications.js";
9
+ import { resetWorkflowLifecycleNotificationState } from "./lifecycle-notifications.js";
17
10
  import { resetWorkflowHilAnswerNotificationState } from "./hil-answer-notifications.js";
18
11
  import type { ExtensionAPI } from "./public-types.js";
19
12
  import type { WorkflowExtensionRuntimeState } from "./extension-runtime-state.js";
20
13
  import { deAdvertiseAskUserQuestionWhenHeadless, formatStartupDiagnostics } from "./workflow-command-surfaces.js";
21
14
  import { inFlightRunCount } from "./workflow-targets.js";
15
+ import { shutdownDbos } from "../durable/dbos-lifecycle.js";
16
+
17
+ let processShutdownInstalled = false;
18
+
19
+ function installDbosProcessShutdown(): void {
20
+ if (processShutdownInstalled) return;
21
+ processShutdownInstalled = true;
22
+ process.once("beforeExit", () => shutdownDbos());
23
+ }
22
24
 
23
25
  export interface WorkflowLifecycleRegistrationDeps {
24
26
  runtimeState: WorkflowExtensionRuntimeState;
@@ -31,6 +33,7 @@ export function registerWorkflowLifecycleHandlers(
31
33
  deps: WorkflowLifecycleRegistrationDeps,
32
34
  ): void {
33
35
  if (typeof pi.on !== "function") return;
36
+ installDbosProcessShutdown();
34
37
  const { runtimeState } = deps;
35
38
  pi.on("session_before_switch", async (event, ctx) => {
36
39
  const reason = typeof event === "object" && event !== null && "reason" in event
@@ -58,7 +61,7 @@ export function registerWorkflowLifecycleHandlers(
58
61
  return { cancel: true };
59
62
  });
60
63
 
61
- pi.on("session_start", async (event, ctx) => {
64
+ pi.on("session_start", async (_event, ctx) => {
62
65
  runtimeState.resetWorkflowDiscoveryForSession();
63
66
  deAdvertiseAskUserQuestionWhenHeadless(pi, ctx?.hasUI);
64
67
  await runtimeState.ensureWorkflowConfigLoaded();
@@ -68,7 +71,7 @@ export function registerWorkflowLifecycleHandlers(
68
71
  resetWorkflowLifecycleNotificationState(runtimeState.lifecycleNotificationState);
69
72
  resetWorkflowHilAnswerNotificationState(runtimeState.hilAnswerNotificationState);
70
73
  stageControlRegistry.clear();
71
- runtimeState.setIntercomParentSession(registerIntercomParentSession(pi));
74
+ // Named workflows publish lifecycle notices through the normal notification path.
72
75
  runtimeState.setNotificationsActive(true);
73
76
  runtimeState.startWorkflowDiscoveryWarmup(() => {
74
77
  if (!ctx?.ui) return;
@@ -81,70 +84,45 @@ export function registerWorkflowLifecycleHandlers(
81
84
  deps.storeWidgetRef.current?.();
82
85
  deps.storeWidgetRef.current = installStoreWidget({ ui: ctx.ui }, store);
83
86
  }
84
- const sessionManager = ctx?.sessionManager ?? pi.sessionManager;
85
- runtimeState.updateHostStageSessionDir(sessionManager);
86
- if (sessionManager) {
87
- const cfg = runtimeState.configLoadRef.current?.config;
88
- withWorkflowLifecycleNotificationsSuppressed(runtimeState.lifecycleNotificationState, () => {
89
- try {
90
- restoreOnSessionStart(
91
- sessionManager,
92
- {
93
- resumeInFlight: cfg?.resumeInFlight ?? "ask",
94
- persistRuns: cfg?.persistRuns ?? true,
95
- },
96
- store,
97
- );
98
- } catch {
99
- // Host session-entry failures must not prevent the session from starting.
100
- }
101
- seedWorkflowLifecycleNotificationState(runtimeState.lifecycleNotificationState, store.snapshot());
102
- });
103
- const reason = typeof event === "object" && event !== null && "reason" in event
104
- ? (event as { readonly reason?: string }).reason
105
- : undefined;
106
- if (reason === "startup" || reason === "resume") {
107
- const getEntries = sessionManager.getEntries;
108
- if (typeof getEntries === "function") {
109
- let authoritativeCatalog: Awaited<ReturnType<typeof runtimeState.runtimeProxy.prepareDurableResumable>> = [];
110
- try {
111
- authoritativeCatalog = await runtimeState.runtimeProxy.prepareDurableResumable();
112
- } catch {
113
- // A resume-catalog failure must not prevent the host session from starting.
114
- }
115
- try {
116
- const resumable = findResumableWorkflowNotices(getEntries.call(sessionManager), authoritativeCatalog);
117
- if (resumable.length > 0) {
118
- const commands = resumable
119
- .map((workflow) => `\`${workflow.name}\` (${workflow.workflowId.slice(0, 8)}): /workflow resume ${workflow.workflowId}`)
120
- .join("\n");
121
- ctx?.ui?.notify?.(`This session has resumable workflows:\n${commands}`, "info");
122
- }
123
- } catch {
124
- // Host session-entry failures must not prevent the session from starting.
125
- }
126
- }
127
- }
128
- }
87
+ // Session JSONL contains chat transcripts only. Workflow state is loaded
88
+ // from DBOS on the first workflow command or run, never during startup.
89
+ runtimeState.updateHostStageSessionDir(ctx?.sessionManager ?? pi.sessionManager);
129
90
  });
130
91
 
131
92
  installCompactionHook(pi, store);
132
- pi.on("session_shutdown", (event) => {
93
+ pi.on("session_shutdown", async (event) => {
133
94
  const reason = typeof event === "object" && event !== null && "reason" in event
134
95
  ? (event as { readonly reason?: string }).reason
135
96
  : undefined;
136
97
  deps.intercomControlRef.current?.();
137
98
  deps.intercomControlRef.current = null;
138
99
  if (reason === "quit") {
139
- // CLI/orchestrator quit is a resumable process boundary, not explicit
140
- // `/workflow kill`. Durable-progress workflows stay available through
100
+ // CLI/orchestrator quit is a resumable process boundary, not destructive
101
+ // cancellation. Durable-progress workflows stay available through
141
102
  // `/workflow resume`; stage handles are disposed after being paused.
142
- quitAllRuns({ store, stageControlRegistry });
103
+ try {
104
+ const results = await quitAllRuns({ store, stageControlRegistry });
105
+ const failures = results.filter((result) => !result.ok);
106
+ if (failures.length > 0) {
107
+ console.error(
108
+ "atomic-workflows: session shutdown could not gracefully quit every run:",
109
+ failures.map((result) =>
110
+ `${result.runId}: ${result.reason}${"message" in result ? ` (${result.message})` : ""}`
111
+ ).join(", "),
112
+ );
113
+ }
114
+ } finally {
115
+ stageControlRegistry.clear();
116
+ }
117
+ } else {
118
+ // Every non-quit host-session boundary invalidates detached lazy handles
119
+ // synchronously, before they can attach to the replacement session.
143
120
  stageControlRegistry.clear();
144
121
  }
145
122
  deps.storeWidgetRef.current?.();
146
123
  deps.storeWidgetRef.current = null;
147
124
  runtimeState.resetWorkflowDiscoveryForSession();
148
125
  runtimeState.setNotificationsActive(false);
126
+ await shutdownDbos();
149
127
  });
150
128
  }
@@ -58,13 +58,15 @@ export interface WorkflowExtensionRuntimeState {
58
58
  startWorkflowDiscoveryWarmup(onSettled?: () => void): void;
59
59
  runWithLifecycleSuppressedForPolicy<T>(policy: WorkflowExecutionPolicy, fn: () => Promise<T>): Promise<T>;
60
60
  setNotificationsActive(active: boolean): void;
61
- setIntercomParentSession(session: string | null): void;
62
61
  updateHostStageSessionDir(sessionManager: SessionManager | undefined): void;
62
+ /** Current default stage session directory, when the host set a non-default one. */
63
+ resolveDefaultStageSessionDir(): string | undefined;
63
64
  }
64
65
 
65
66
  export function createWorkflowExtensionRuntimeState(
66
67
  pi: ExtensionAPI,
67
68
  adapters: StageAdapters,
69
+ resolveCwd: () => string = () => pi.sessionManager?.getCwd?.() ?? process.cwd(),
68
70
  ): WorkflowExtensionRuntimeState {
69
71
  const persistenceRef = { current: makePersistencePort(pi, WORKFLOW_CONFIG_DEFAULTS.persistRuns) };
70
72
  const mcpPort = makeMcpPort(pi);
@@ -75,6 +77,7 @@ export function createWorkflowExtensionRuntimeState(
75
77
  persistRuns: WORKFLOW_CONFIG_DEFAULTS.persistRuns,
76
78
  statusFile: WORKFLOW_CONFIG_DEFAULTS.statusFile,
77
79
  resumeInFlight: WORKFLOW_CONFIG_DEFAULTS.resumeInFlight,
80
+ worktree: WORKFLOW_CONFIG_DEFAULTS.worktree,
78
81
  },
79
82
  };
80
83
  let statusWriterRef: StatusWriter = createStatusWriter(store, runtimeConfigRef.current);
@@ -119,25 +122,17 @@ export function createWorkflowExtensionRuntimeState(
119
122
  });
120
123
  };
121
124
 
122
- let intercomParentSession: string | null = null;
123
- const intercomPort = {
124
- emit: typeof pi.events?.emit === "function"
125
- ? (event: string, payload: Record<string, unknown>) => pi.events!.emit!(event, payload)
126
- : undefined,
127
- parentSession: () => intercomParentSession ?? undefined,
128
- };
129
125
  const hostStageSessionDir: { current: string | undefined } = { current: undefined };
130
126
  const resolveDefaultStageSessionDir = (): string | undefined => hostStageSessionDir.current;
131
127
  const startupDiscovery = discoverStartupWorkflowsSync();
132
128
  const runtimeRef: { current: ExtensionRuntime } = {
133
129
  current: createExtensionRuntime({
134
130
  registry: startupDiscovery.registry,
135
- cwd: process.cwd(),
131
+ cwd: resolveCwd(),
136
132
  adapters,
137
133
  cancellation: cancellationRegistry,
138
134
  persistence: persistenceRef.current,
139
135
  mcp: mcpPort,
140
- intercom: intercomPort,
141
136
  config: runtimeConfigRef.current,
142
137
  resolveDefaultStageSessionDir,
143
138
  }),
@@ -147,11 +142,15 @@ export function createWorkflowExtensionRuntimeState(
147
142
  const runtimeProxy: ExtensionRuntime = {
148
143
  get registry() { return runtimeRef.current.registry; },
149
144
  dispatch(args, options) { return runtimeRef.current.dispatch(args, options); },
150
- runDirect(args, options) { return runtimeRef.current.runDirect(args, options); },
151
145
  resumeFailedRun(sourceRunId, stageId, options) { return runtimeRef.current.resumeFailedRun(sourceRunId, stageId, options); },
152
146
  resumeDurableWorkflow(workflowIdOrPrefix, options) { return runtimeRef.current.resumeDurableWorkflow(workflowIdOrPrefix, options); },
153
- listDurableResumable(sessionDir) { return runtimeRef.current.listDurableResumable(sessionDir); },
154
- prepareDurableResumable(workflowIdOrPrefix, sessionDir) { return runtimeRef.current.prepareDurableResumable(workflowIdOrPrefix, sessionDir); },
147
+ listDurableResumable() { return runtimeRef.current.listDurableResumable(); },
148
+ prepareDurableResumable(workflowIdOrPrefix) { return runtimeRef.current.prepareDurableResumable(workflowIdOrPrefix); },
149
+ prepareDurableResumableForIds(workflowIds) {
150
+ const targeted = runtimeRef.current.prepareDurableResumableForIds;
151
+ if (targeted !== undefined) return targeted.call(runtimeRef.current, workflowIds);
152
+ return runtimeRef.current.prepareDurableResumable();
153
+ },
155
154
  prepareCompletedDurable() {
156
155
  return runtimeRef.current.prepareCompletedDurable?.() ?? Promise.resolve([]);
157
156
  },
@@ -190,12 +189,11 @@ export function createWorkflowExtensionRuntimeState(
190
189
  if (models === undefined) return runtimeProxy;
191
190
  return createExtensionRuntime({
192
191
  registry: runtimeRef.current.registry,
193
- cwd: process.cwd(),
192
+ cwd: resolveCwd(),
194
193
  adapters,
195
194
  cancellation: cancellationRegistry,
196
195
  persistence: persistenceRef.current,
197
196
  mcp: mcpPort,
198
- intercom: intercomPort,
199
197
  config: runtimeConfigRef.current,
200
198
  models,
201
199
  resolveDefaultStageSessionDir,
@@ -218,6 +216,7 @@ export function createWorkflowExtensionRuntimeState(
218
216
  persistRuns: effectiveConfig.persistRuns,
219
217
  statusFile: effectiveConfig.statusFile,
220
218
  resumeInFlight: effectiveConfig.resumeInFlight,
219
+ worktree: effectiveConfig.worktree,
221
220
  };
222
221
  lifecycleNotificationConfigRef.current = effectiveConfig.workflowNotifications;
223
222
  reinstallLifecycleNotifications();
@@ -229,12 +228,11 @@ export function createWorkflowExtensionRuntimeState(
229
228
  function rebuildRuntime(registry = runtimeRef.current.registry): void {
230
229
  runtimeRef.current = createExtensionRuntime({
231
230
  registry,
232
- cwd: process.cwd(),
231
+ cwd: resolveCwd(),
233
232
  adapters,
234
233
  cancellation: cancellationRegistry,
235
234
  persistence: persistenceRef.current,
236
235
  mcp: mcpPort,
237
- intercom: intercomPort,
238
236
  config: runtimeConfigRef.current,
239
237
  resolveDefaultStageSessionDir,
240
238
  });
@@ -432,7 +430,6 @@ export function createWorkflowExtensionRuntimeState(
432
430
  reinstallLifecycleNotifications();
433
431
  reinstallHilAnswerNotifications();
434
432
  },
435
- setIntercomParentSession(session) { intercomParentSession = session; },
436
433
  updateHostStageSessionDir(sessionManager) {
437
434
  try {
438
435
  hostStageSessionDir.current = sessionManager?.usesDefaultSessionDir?.() === false
@@ -442,5 +439,6 @@ export function createWorkflowExtensionRuntimeState(
442
439
  hostStageSessionDir.current = undefined;
443
440
  }
444
441
  },
442
+ resolveDefaultStageSessionDir,
445
443
  };
446
444
  }
@@ -0,0 +1,83 @@
1
+ import type {
2
+ WorkflowLifecycleNotificationState,
3
+ WorkflowLifecycleNoticeDetails,
4
+ } from "./lifecycle-notifications.js";
5
+
6
+ interface LifecycleNoticeDeliveryOptions {
7
+ readonly state: WorkflowLifecycleNotificationState;
8
+ readonly emit: (details: WorkflowLifecycleNoticeDetails) => boolean | Promise<boolean>;
9
+ /** Whether this installation is configured to deliver the given notice kind. */
10
+ readonly eligible: (details: WorkflowLifecycleNoticeDetails) => boolean;
11
+ }
12
+
13
+ /**
14
+ * Owns terminal-notice admission with capped-backoff retry. Delivery state lives
15
+ * on the shared notification state, so a pending admission started under one
16
+ * configuration installation is not re-sent by a later reinstall: the shared
17
+ * pending token remains authoritative until its original send settles. If that
18
+ * send later fails, the failed payload is handed to whichever installation is
19
+ * currently active through the shared retry-observer set, preserving exactly
20
+ * once main-chat delivery across config reload and session-preserving reinstall.
21
+ */
22
+ export function createLifecycleNoticeDelivery(options: LifecycleNoticeDeliveryOptions): {
23
+ deliver(key: string, details: WorkflowLifecycleNoticeDetails): void;
24
+ dispose(): void;
25
+ } {
26
+ const retryTimers = new Set<ReturnType<typeof setTimeout>>();
27
+ const attempts = new Map<string, number>();
28
+ let active = true;
29
+
30
+ const deliver = (key: string, details: WorkflowLifecycleNoticeDetails): void => {
31
+ // A disposed installation never starts a new send; an active one refuses to
32
+ // duplicate an already-delivered or still-pending admission.
33
+ if (!active) return;
34
+ if (options.state.deliveredTerminalRuns.has(key) || options.state.pendingTerminalRuns.has(key)) return;
35
+ const token = Symbol(key);
36
+ options.state.pendingTerminalRuns.set(key, token);
37
+ const attempt = (attempts.get(key) ?? 0) + 1;
38
+ attempts.set(key, attempt);
39
+ const settle = (delivered: boolean): void => {
40
+ // Another installation may have superseded this pending admission.
41
+ if (options.state.pendingTerminalRuns.get(key) !== token) return;
42
+ options.state.pendingTerminalRuns.delete(key);
43
+ if (delivered) {
44
+ options.state.deliveredTerminalRuns.add(key);
45
+ options.state.retryableTerminalRuns.delete(key);
46
+ options.state.retryableTerminalNotices.delete(key);
47
+ return;
48
+ }
49
+ options.state.retryableTerminalRuns.add(key);
50
+ options.state.retryableTerminalNotices.set(key, details);
51
+ if (active) {
52
+ const timer = setTimeout(() => {
53
+ retryTimers.delete(timer);
54
+ if (active) deliver(key, details);
55
+ }, Math.min(20 * (2 ** (attempt - 1)), 1_000));
56
+ retryTimers.add(timer);
57
+ return;
58
+ }
59
+ // This installation was disposed while its admission was in flight; hand
60
+ // the failed payload to a currently-active installation, if any.
61
+ for (const observer of options.state.retryObservers) observer(key, details);
62
+ };
63
+ const result = options.emit(details);
64
+ if (typeof result === "boolean") settle(result);
65
+ else void result.then(settle);
66
+ };
67
+
68
+ const retryObserver = (key: string, details: WorkflowLifecycleNoticeDetails): void => {
69
+ if (active && options.eligible(details)) deliver(key, details);
70
+ };
71
+ options.state.retryObservers.add(retryObserver);
72
+
73
+ return {
74
+ deliver,
75
+ dispose() {
76
+ active = false;
77
+ options.state.retryObservers.delete(retryObserver);
78
+ for (const timer of retryTimers) clearTimeout(timer);
79
+ // Do not clear pending tokens or mark them retryable: an in-flight
80
+ // admission remains authoritative and settles into the shared state.
81
+ },
82
+ };
83
+ }
@@ -24,6 +24,7 @@ import {
24
24
  } from "../shared/returned-run-status.js";
25
25
  import { deriveGraphThemeFromPiTheme, type GraphTheme } from "../tui/graph-theme.js";
26
26
  import { renderWorkflowNoticeCard, type WorkflowNoticeTone } from "../tui/workflow-notice-card.js";
27
+ import { createLifecycleNoticeDelivery } from "./lifecycle-notification-delivery.js";
27
28
 
28
29
  export const LIFECYCLE_NOTICE_CUSTOM_TYPE = "workflows:lifecycle-notice";
29
30
  export const LIFECYCLE_NOTICE_SNIPPET_LIMIT = 240;
@@ -56,11 +57,16 @@ export interface WorkflowLifecycleNoticeDetails {
56
57
  readonly error?: string;
57
58
  readonly failedStageId?: string;
58
59
  readonly durationMs?: number;
60
+ readonly active?: boolean;
59
61
  readonly createdAt: number;
60
62
  }
61
63
 
62
64
  export interface WorkflowLifecycleNotificationState {
63
65
  readonly deliveredTerminalRuns: Set<string>;
66
+ readonly retryableTerminalNotices: Map<string, WorkflowLifecycleNoticeDetails>;
67
+ readonly pendingTerminalRuns: Map<string, symbol>;
68
+ readonly retryableTerminalRuns: Set<string>;
69
+ readonly retryObservers: Set<(key: string, details: WorkflowLifecycleNoticeDetails) => void>;
64
70
  readonly deliveredInputPrompts: Set<string>;
65
71
  suppressionDepth: number;
66
72
  }
@@ -76,23 +82,28 @@ export interface WorkflowLifecycleNotificationOptions {
76
82
  }
77
83
 
78
84
  type RawRenderer = PiMessageRenderer;
79
-
80
- // Process-lifetime registration dedupe: extension hosts are object identities
81
- // and may be garbage-collected, but renderer registrations are not unregistered.
82
85
  const rendererRegisteredHosts = new WeakSet<object>();
83
-
84
86
  export function createWorkflowLifecycleNotificationState(): WorkflowLifecycleNotificationState {
85
87
  return {
86
88
  deliveredTerminalRuns: new Set<string>(),
89
+ pendingTerminalRuns: new Map<string, symbol>(),
90
+ retryableTerminalNotices: new Map<string, WorkflowLifecycleNoticeDetails>(),
91
+ retryableTerminalRuns: new Set<string>(),
92
+ retryObservers: new Set<(key: string, details: WorkflowLifecycleNoticeDetails) => void>(),
87
93
  deliveredInputPrompts: new Set<string>(),
88
94
  suppressionDepth: 0,
89
95
  };
90
96
  }
91
97
 
98
+ /** Reset all prior-session lifecycle delivery and dedupe state. */
92
99
  export function resetWorkflowLifecycleNotificationState(
93
100
  state: WorkflowLifecycleNotificationState,
94
101
  ): void {
95
102
  state.deliveredTerminalRuns.clear();
103
+ state.pendingTerminalRuns.clear();
104
+ state.retryableTerminalRuns.clear();
105
+ state.retryableTerminalNotices.clear();
106
+ state.retryObservers.clear();
96
107
  state.deliveredInputPrompts.clear();
97
108
  state.suppressionDepth = 0;
98
109
  }
@@ -104,8 +115,11 @@ export function seedWorkflowLifecycleNotificationState(
104
115
  for (const run of snapshot.runs) {
105
116
  if (!isTopLevelWorkflowRun(run)) continue;
106
117
  const noticeKind = terminalNoticeKind(run);
107
- if (noticeKind !== undefined && run.endedAt !== undefined) {
108
- state.deliveredTerminalRuns.add(terminalRunKey(noticeKind, run.id));
118
+ if (noticeKind !== undefined && lifecycleOccurrenceAt(run, noticeKind) !== undefined) {
119
+ const key = terminalRunKey(noticeKind, run);
120
+ if (!state.pendingTerminalRuns.has(key) && !state.retryableTerminalRuns.has(key)) {
121
+ state.deliveredTerminalRuns.add(key);
122
+ }
109
123
  }
110
124
  if (run.pendingPrompt !== undefined) {
111
125
  state.deliveredInputPrompts.add(runAwaitingInputKey(run.id, run.pendingPrompt));
@@ -166,30 +180,25 @@ export function installWorkflowLifecycleNotifications(
166
180
 
167
181
  const notifyOn = new Set<WorkflowLifecycleNoticeKind>(options.config.notifyOn);
168
182
  const state = options.state ?? createWorkflowLifecycleNotificationState();
169
- if (options.seedExisting !== false) {
170
- seedWorkflowLifecycleNotificationState(state, options.store.snapshot());
171
- }
183
+ let delivery!: ReturnType<typeof createLifecycleNoticeDelivery>;
184
+ if (options.seedExisting !== false) seedWorkflowLifecycleNotificationState(state, options.store.snapshot());
172
185
 
173
- const emit = (details: WorkflowLifecycleNoticeDetails): void => {
174
- const content = formatWorkflowLifecycleNoticeText(details);
175
- const deliveryOptions = { triggerTurn: true, deliverAs: "steer" as const };
186
+ const emit = (details: WorkflowLifecycleNoticeDetails): boolean | Promise<boolean> => {
176
187
  try {
177
- // Store subscribers are notified in a tight loop. A lifecycle notice
178
- // failure must never abort sibling subscribers such as status writers.
179
- void Promise.resolve(
180
- send(
181
- {
182
- customType: LIFECYCLE_NOTICE_CUSTOM_TYPE,
183
- content,
184
- display: true,
185
- details,
186
- },
187
- deliveryOptions,
188
- ),
189
- ).catch((error: unknown) => warnLifecycleSendFailure(error));
188
+ const result = send({
189
+ customType: LIFECYCLE_NOTICE_CUSTOM_TYPE,
190
+ content: formatWorkflowLifecycleNoticeText(details),
191
+ display: true,
192
+ details,
193
+ }, { triggerTurn: true, deliverAs: "steer", persistWhenStreaming: true });
194
+ if (result === undefined) return true;
195
+ return Promise.resolve(result).then(() => true, (error: unknown) => {
196
+ warnLifecycleSendFailure(error);
197
+ return false;
198
+ });
190
199
  } catch (error) {
191
200
  warnLifecycleSendFailure(error);
192
- // Best-effort notification only; keep store delivery isolated.
201
+ return false;
193
202
  }
194
203
  };
195
204
 
@@ -198,16 +207,19 @@ export function installWorkflowLifecycleNotifications(
198
207
  kind: "completed" | "failed" | "blocked",
199
208
  ): void => {
200
209
  const noticeKind = terminalNoticeKind(run);
201
- if (noticeKind !== kind || run.endedAt === undefined || !notifyOn.has(kind)) {
210
+ if (noticeKind !== kind || lifecycleOccurrenceAt(run, kind) === undefined || !notifyOn.has(kind)) {
202
211
  return;
203
212
  }
204
213
 
205
- const key = terminalRunKey(kind, run.id);
206
- if (state.deliveredTerminalRuns.has(key)) return;
207
-
208
- state.deliveredTerminalRuns.add(key);
209
- if (state.suppressionDepth > 0) return;
210
- emit(makeTerminalNotice(run, kind));
214
+ const key = terminalRunKey(kind, run);
215
+ if (state.deliveredTerminalRuns.has(key) || state.pendingTerminalRuns.has(key)) return;
216
+ if (state.suppressionDepth > 0) {
217
+ state.deliveredTerminalRuns.add(key);
218
+ state.retryableTerminalRuns.delete(key);
219
+ state.retryableTerminalNotices.delete(key);
220
+ return;
221
+ }
222
+ delivery.deliver(key, makeTerminalNotice(run, kind));
211
223
  };
212
224
 
213
225
  const emitStageAwaitingInputNoticeOnce = (
@@ -250,8 +262,17 @@ export function installWorkflowLifecycleNotifications(
250
262
  }
251
263
  }
252
264
  };
265
+ delivery = createLifecycleNoticeDelivery({ state, emit, eligible: (details) => notifyOn.has(details.kind) });
266
+ for (const [key, details] of state.retryableTerminalNotices) {
267
+ if (notifyOn.has(details.kind)) delivery.deliver(key, details);
268
+ }
253
269
 
254
- return options.store.subscribe(inspect);
270
+ const unsubscribe = options.store.subscribe(inspect);
271
+ inspect(options.store.snapshot());
272
+ return () => {
273
+ unsubscribe();
274
+ delivery.dispose();
275
+ };
255
276
  }
256
277
 
257
278
  export function registerLifecycleNoticeRenderer(
@@ -286,7 +307,8 @@ export function formatWorkflowLifecycleNoticeText(details: WorkflowLifecycleNoti
286
307
  }
287
308
  if (details.kind === "blocked") {
288
309
  const errorText = details.error ? `: ${details.error}` : "";
289
- return `! Workflow "${workflowName}" ended blocked (run ${details.runId})${errorText}. Inspect: /workflow status ${details.runId}`;
310
+ const stateText = details.active === true ? "is blocked" : "ended blocked";
311
+ return `! Workflow "${workflowName}" ${stateText} (run ${details.runId})${errorText}. Inspect: /workflow status ${details.runId}`;
290
312
  }
291
313
  const prompt = details.promptMessage ? ` Prompt: ${details.promptMessage}` : "";
292
314
  if (details.scope === "run") {
@@ -306,19 +328,22 @@ function makeTerminalNotice(
306
328
  const failedStage = run.failedStageId
307
329
  ? run.stages.find((stage) => stage.id === run.failedStageId)
308
330
  : undefined;
309
- const error = run.error ?? returnedNoticeError(run, kind) ?? (kind === "blocked" ? run.exitReason : undefined);
331
+ const activeBlocked = kind === "blocked" && isActiveRecoverableBlockedRun(run);
332
+ const error = activeBlocked
333
+ ? run.failureMessage ?? structuredRecoverableWorkflowFailureText(run) ?? run.error
334
+ : run.error ?? returnedNoticeError(run, kind) ?? (kind === "blocked" ? run.exitReason : undefined);
310
335
  return {
311
336
  kind,
312
337
  scope: "run",
313
338
  runId: run.id,
314
339
  workflowName: run.name,
315
340
  status: effectiveRunStatus(run),
341
+ ...(activeBlocked ? { active: true } : {}),
316
342
  ...(error ? { error: truncateSnippet(error) } : {}),
317
343
  ...(run.failedStageId ? { failedStageId: run.failedStageId } : {}),
318
344
  ...(failedStage ? { stageId: failedStage.id, stageName: failedStage.name } : {}),
319
345
  ...(run.durationMs !== undefined ? { durationMs: run.durationMs } : {}),
320
- // Normal store paths stamp endedAt; Date.now() is defensive for malformed restored snapshots.
321
- createdAt: run.endedAt ?? Date.now(),
346
+ createdAt: lifecycleOccurrenceAt(run, kind) ?? Date.now(),
322
347
  };
323
348
  }
324
349
 
@@ -337,12 +362,25 @@ function jsonString(value: string): string {
337
362
  }
338
363
 
339
364
  function terminalNoticeKind(run: RunSnapshot): "completed" | "failed" | "blocked" | undefined {
365
+ if (isActiveRecoverableBlockedRun(run)) return "blocked";
340
366
  const status = effectiveRunStatus(run);
341
367
  if (status === "failed" || status === "blocked") return status;
342
368
  if (status !== "completed") return undefined;
343
369
  return "completed";
344
370
  }
345
371
 
372
+ function isActiveRecoverableBlockedRun(run: RunSnapshot): boolean {
373
+ return run.blockedAt !== undefined && structuredRecoverableWorkflowFailureText(run) !== undefined;
374
+ }
375
+
376
+ function lifecycleOccurrenceAt(
377
+ run: RunSnapshot,
378
+ kind: "completed" | "failed" | "blocked",
379
+ ): number | undefined {
380
+ if (kind === "blocked" && isActiveRecoverableBlockedRun(run)) return run.blockedAt;
381
+ return run.endedAt;
382
+ }
383
+
346
384
  function returnedNoticeError(run: RunSnapshot, kind: "completed" | "failed" | "blocked"): string | undefined {
347
385
  const structuredFailureText = structuredRecoverableWorkflowFailureText(run);
348
386
  if (kind === "blocked" && structuredFailureText !== undefined) return structuredFailureText;
@@ -353,8 +391,9 @@ function returnedNoticeError(run: RunSnapshot, kind: "completed" | "failed" | "b
353
391
  return undefined;
354
392
  }
355
393
 
356
- function terminalRunKey(kind: "completed" | "failed" | "blocked", runId: string): string {
357
- return `${kind}:${runId}`;
394
+ function terminalRunKey(kind: "completed" | "failed" | "blocked", run: RunSnapshot): string {
395
+ const occurrence = kind === "blocked" ? run.blockedAt ?? lifecycleOccurrenceAt(run, kind) : "";
396
+ return occurrence === undefined ? `${kind}:${run.id}` : `${kind}:${run.id}:${occurrence}`;
358
397
  }
359
398
 
360
399
  function awaitingInputKey(runId: string, stage: StageSnapshot): string {
@@ -413,7 +452,7 @@ function renderLifecycleNoticeCard(
413
452
  : details.kind === "awaiting_input"
414
453
  ? `Workflow "${details.workflowName}" needs input`
415
454
  : details.kind === "blocked"
416
- ? `Workflow "${details.workflowName}" ended blocked`
455
+ ? `Workflow "${details.workflowName}" ${details.active === true ? "is blocked" : "ended blocked"}`
417
456
  : `Workflow "${details.workflowName}" completed`;
418
457
  return renderWorkflowNoticeCard({
419
458
  title,
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Extension-side wiring for the shared post-mortem stage-chat resolver.
3
+ *
4
+ * Builds `PostMortemStageChatDeps` from live extension runtime surfaces
5
+ * (stage adapters, durable per-run cwd, and the default stage session dir after
6
+ * a host restart) so both the TUI attach pane and `workflow send` revive an
7
+ * eligible terminal agent stage through the same detached, single-flight
8
+ * resolver instead of process-local handle presence alone.
9
+ *
10
+ * cross-ref:
11
+ * - src/runs/foreground/postmortem-stage-chat.ts (resolver)
12
+ * - src/tui/overlay-adapter.ts (attach pane wiring)
13
+ * - src/extension/workflow-tool-send.ts (send parity)
14
+ */
15
+ import { store } from "../shared/store.js";
16
+ import { getDurableBackend } from "../durable/factory.js";
17
+ import {
18
+ ensurePostMortemStageHandle,
19
+ type EnsurePostMortemStageHandleResult,
20
+ type PostMortemStageChatDeps,
21
+ } from "../runs/foreground/postmortem-stage-chat.js";
22
+ import { stageControlRegistry } from "../runs/foreground/stage-control-registry.js";
23
+ import type { StageAdapters } from "../runs/foreground/stage-runner.js";
24
+
25
+ export interface PostMortemResolverDeps {
26
+ readonly adapters: StageAdapters;
27
+ readonly resolveDefaultStageSessionDir: () => string | undefined;
28
+ }
29
+
30
+ /** Persisted original/resolved cwd for a durable run tree, when still available. */
31
+ function resolveStageCwd(runId: string): string | undefined {
32
+ try {
33
+ const backend = getDurableBackend();
34
+ const owningHandle = backend.getWorkflow(runId);
35
+ const run = store.snapshot().runs.find((candidate) => candidate.id === runId);
36
+ const rootRunId = run?.rootRunId ?? owningHandle?.rootWorkflowId;
37
+ const cwdHandle = rootRunId === undefined
38
+ ? owningHandle
39
+ : backend.getWorkflow(rootRunId) ?? owningHandle;
40
+ return cwdHandle?.workflowCwd ?? cwdHandle?.invocationCwd ?? undefined;
41
+ } catch {
42
+ return undefined;
43
+ }
44
+ }
45
+
46
+ /** Resolver deps for a specific run, keyed so revived handles use the real run cwd. */
47
+ export function postMortemDepsForRun(
48
+ runId: string,
49
+ deps: PostMortemResolverDeps,
50
+ ): PostMortemStageChatDeps {
51
+ return {
52
+ registry: stageControlRegistry,
53
+ adapters: deps.adapters,
54
+ cwd: resolveStageCwd(runId),
55
+ defaultSessionDir: deps.resolveDefaultStageSessionDir(),
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Build a `(runId, stageId) => result | undefined` resolver for the attach pane.
61
+ * Unknown stages return `undefined`; known but non-revivable stages retain the
62
+ * resolver's explicit reason so the pane can explain why chat is unavailable.
63
+ */
64
+ export function createPostMortemHandleResolver(
65
+ deps: PostMortemResolverDeps,
66
+ ): (runId: string, stageId: string) => EnsurePostMortemStageHandleResult | undefined {
67
+ return (runId, stageId) => {
68
+ const run = store.snapshot().runs.find((candidate) => candidate.id === runId);
69
+ const stage = run?.stages.find((candidate) => candidate.id === stageId);
70
+ if (stage === undefined) return undefined;
71
+ return ensurePostMortemStageHandle(runId, stage, postMortemDepsForRun(runId, deps));
72
+ };
73
+ }