@bastani/atomic 0.9.2 → 0.9.3-alpha.2

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 (606) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +15 -0
  4. package/dist/builtin/cursor/README.md +2 -1
  5. package/dist/builtin/cursor/package.json +2 -2
  6. package/dist/builtin/cursor/src/cursor-models-raw.json +2 -9
  7. package/dist/builtin/cursor/src/model-mapper.ts +14 -3
  8. package/dist/builtin/cursor/src/proto/protobuf-codec-base64.ts +22 -0
  9. package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +53 -13
  10. package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +24 -7
  11. package/dist/builtin/cursor/src/proto/protobuf-codec.ts +3 -2
  12. package/dist/builtin/cursor/src/stream.ts +5 -11
  13. package/dist/builtin/cursor/src/transport-types.ts +3 -0
  14. package/dist/builtin/cursor/src/transport.ts +1 -0
  15. package/dist/builtin/intercom/package.json +1 -1
  16. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  17. package/dist/builtin/mcp/direct-tools.ts +4 -2
  18. package/dist/builtin/mcp/package.json +1 -1
  19. package/dist/builtin/mcp/proxy-call.ts +3 -1
  20. package/dist/builtin/mcp/utils.ts +18 -7
  21. package/dist/builtin/subagents/CHANGELOG.md +20 -0
  22. package/dist/builtin/subagents/README.md +6 -6
  23. package/dist/builtin/subagents/agents/code-simplifier.md +7 -6
  24. package/dist/builtin/subagents/agents/codebase-analyzer.md +5 -4
  25. package/dist/builtin/subagents/agents/codebase-locator.md +3 -3
  26. package/dist/builtin/subagents/agents/codebase-online-researcher.md +10 -10
  27. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +4 -4
  28. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +3 -3
  29. package/dist/builtin/subagents/agents/codebase-research-locator.md +4 -4
  30. package/dist/builtin/subagents/agents/debugger.md +5 -5
  31. package/dist/builtin/subagents/agents/worker.md +56 -0
  32. package/dist/builtin/subagents/package.json +1 -1
  33. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  34. package/dist/builtin/subagents/src/agents/agent-loaders.ts +3 -5
  35. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +3 -3
  36. package/dist/builtin/subagents/src/extension/fanout-child.ts +1 -0
  37. package/dist/builtin/subagents/src/extension/index.ts +6 -3
  38. package/dist/builtin/subagents/src/extension/schemas.ts +2 -7
  39. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -3
  40. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -4
  41. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +15 -1
  42. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +35 -1
  43. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  44. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +2 -2
  45. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -1
  46. package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +4 -2
  47. package/dist/builtin/subagents/src/shared/types-async.ts +1 -0
  48. package/dist/builtin/subagents/src/shared/types-depth.ts +5 -5
  49. package/dist/builtin/subagents/src/shared/types-runtime.ts +2 -1
  50. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +27 -5
  51. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  52. package/dist/builtin/subagents/src/tui/render-layout.ts +27 -4
  53. package/dist/builtin/subagents/src/tui/render-result-animation.ts +22 -31
  54. package/dist/builtin/subagents/src/tui/render-result-compact.ts +6 -6
  55. package/dist/builtin/subagents/src/tui/render-result.ts +20 -19
  56. package/dist/builtin/subagents/src/tui/render-status-progress.ts +3 -3
  57. package/dist/builtin/subagents/src/tui/render-widget.ts +46 -7
  58. package/dist/builtin/subagents/src/tui/render.ts +2 -2
  59. package/dist/builtin/web-access/package.json +1 -1
  60. package/dist/builtin/workflows/CHANGELOG.md +56 -0
  61. package/dist/builtin/workflows/README.md +3 -3
  62. package/dist/builtin/workflows/builtin/goal-artifacts.ts +11 -6
  63. package/dist/builtin/workflows/builtin/goal-ledger.ts +33 -1
  64. package/dist/builtin/workflows/builtin/goal-prompts.ts +23 -28
  65. package/dist/builtin/workflows/builtin/goal-reducer.ts +2 -2
  66. package/dist/builtin/workflows/builtin/goal-reports.ts +2 -5
  67. package/dist/builtin/workflows/builtin/goal-review.ts +1 -1
  68. package/dist/builtin/workflows/builtin/goal-runner.ts +10 -17
  69. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +3 -3
  70. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +1 -3
  71. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +1 -1
  72. package/dist/builtin/workflows/builtin/ralph-core.ts +7 -17
  73. package/dist/builtin/workflows/builtin/ralph-runner.ts +11 -18
  74. package/dist/builtin/workflows/builtin/shared-prompts.ts +1 -1
  75. package/dist/builtin/workflows/package.json +1 -1
  76. package/dist/builtin/workflows/src/authoring.d.ts +1 -1
  77. package/dist/builtin/workflows/src/durable/backend.ts +343 -0
  78. package/dist/builtin/workflows/src/durable/child-primitive.ts +79 -0
  79. package/dist/builtin/workflows/src/durable/dbos-backend.ts +421 -0
  80. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +171 -0
  81. package/dist/builtin/workflows/src/durable/factory.ts +96 -0
  82. package/dist/builtin/workflows/src/durable/file-backend.ts +433 -0
  83. package/dist/builtin/workflows/src/durable/index.ts +73 -0
  84. package/dist/builtin/workflows/src/durable/resume-catalog.ts +217 -0
  85. package/dist/builtin/workflows/src/durable/resume-runtime.ts +299 -0
  86. package/dist/builtin/workflows/src/durable/scoped-backend.ts +171 -0
  87. package/dist/builtin/workflows/src/durable/stage-primitive.ts +284 -0
  88. package/dist/builtin/workflows/src/durable/tool-primitive.ts +180 -0
  89. package/dist/builtin/workflows/src/durable/types.ts +168 -0
  90. package/dist/builtin/workflows/src/durable/ui-primitive.ts +96 -0
  91. package/dist/builtin/workflows/src/engine/options.ts +3 -0
  92. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +2 -2
  93. package/dist/builtin/workflows/src/engine/primitives/task.ts +4 -4
  94. package/dist/builtin/workflows/src/engine/primitives/ui.ts +22 -8
  95. package/dist/builtin/workflows/src/engine/primitives/workflow.ts +8 -0
  96. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +69 -0
  97. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +31 -0
  98. package/dist/builtin/workflows/src/engine/run.ts +148 -6
  99. package/dist/builtin/workflows/src/engine/runtime.ts +8 -2
  100. package/dist/builtin/workflows/src/extension/config-loader.ts +35 -15
  101. package/dist/builtin/workflows/src/extension/discovery.ts +20 -8
  102. package/dist/builtin/workflows/src/extension/extension-factory.ts +6 -12
  103. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +5 -1
  104. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +4 -2
  105. package/dist/builtin/workflows/src/extension/runtime.ts +48 -9
  106. package/dist/builtin/workflows/src/extension/wiring.ts +1 -1
  107. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +143 -4
  108. package/dist/builtin/workflows/src/runs/background/quit.ts +61 -0
  109. package/dist/builtin/workflows/src/runs/background/status.ts +1 -0
  110. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +5 -5
  111. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +74 -33
  112. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +20 -1
  113. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +8 -7
  114. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +1 -0
  115. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +1 -1
  116. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +19 -2
  117. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +4 -0
  118. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +10 -10
  119. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +5 -1
  120. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +25 -0
  121. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +3 -0
  122. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -0
  123. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +20 -0
  124. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +23 -1
  125. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +30 -1
  126. package/dist/builtin/workflows/src/shared/store-public-types.ts +6 -2
  127. package/dist/builtin/workflows/src/shared/store-run-methods.ts +12 -6
  128. package/dist/builtin/workflows/src/shared/types.ts +55 -0
  129. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +11 -10
  130. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +1 -1
  131. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +41 -0
  132. package/dist/builtin/workflows/src/tui/graph-view-input.ts +82 -24
  133. package/dist/builtin/workflows/src/tui/graph-view-render.ts +7 -0
  134. package/dist/builtin/workflows/src/tui/graph-view-state.ts +22 -2
  135. package/dist/builtin/workflows/src/tui/graph-view-types.ts +4 -5
  136. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +9 -11
  137. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +9 -3
  138. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +11 -2
  139. package/dist/builtin/workflows/src/tui/stage-chat-view-live-events.ts +35 -0
  140. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +51 -17
  141. package/dist/builtin/workflows/src/tui/stage-chat-view-status.ts +36 -0
  142. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +5 -1
  143. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -1
  144. package/dist/builtin/workflows/src/tui/status-list.ts +14 -2
  145. package/dist/builtin/workflows/src/tui/widget.ts +23 -8
  146. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +5 -4
  147. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +8 -8
  148. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +151 -0
  149. package/dist/cli/args.d.ts.map +1 -1
  150. package/dist/cli/args.js +9 -9
  151. package/dist/cli/args.js.map +1 -1
  152. package/dist/config-self-update.d.ts.map +1 -1
  153. package/dist/config-self-update.js +3 -4
  154. package/dist/config-self-update.js.map +1 -1
  155. package/dist/config.d.ts.map +1 -1
  156. package/dist/config.js +4 -5
  157. package/dist/config.js.map +1 -1
  158. package/dist/core/agent-session-bash.d.ts +1 -0
  159. package/dist/core/agent-session-bash.d.ts.map +1 -1
  160. package/dist/core/agent-session-bash.js +1 -0
  161. package/dist/core/agent-session-bash.js.map +1 -1
  162. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  163. package/dist/core/agent-session-tool-registry.js +23 -0
  164. package/dist/core/agent-session-tool-registry.js.map +1 -1
  165. package/dist/core/bash-executor.d.ts +2 -0
  166. package/dist/core/bash-executor.d.ts.map +1 -1
  167. package/dist/core/bash-executor.js +1 -0
  168. package/dist/core/bash-executor.js.map +1 -1
  169. package/dist/core/compaction/compaction.d.ts +29 -0
  170. package/dist/core/compaction/compaction.d.ts.map +1 -1
  171. package/dist/core/compaction/compaction.js +36 -1
  172. package/dist/core/compaction/compaction.js.map +1 -1
  173. package/dist/core/compaction/context-compaction-metrics.d.ts +14 -2
  174. package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -1
  175. package/dist/core/compaction/context-compaction-metrics.js +50 -1
  176. package/dist/core/compaction/context-compaction-metrics.js.map +1 -1
  177. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  178. package/dist/core/compaction/context-compaction-prompt.js +2 -0
  179. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  180. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  181. package/dist/core/compaction/context-compaction-runner.js +1 -1
  182. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  183. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  184. package/dist/core/compaction/context-deletion-application.js +5 -5
  185. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  186. package/dist/core/compaction/context-deletion-targets.d.ts +2 -0
  187. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  188. package/dist/core/compaction/context-deletion-targets.js +23 -3
  189. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  190. package/dist/core/compaction/context-deletion-tool-definitions.d.ts +6 -0
  191. package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -1
  192. package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -1
  193. package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -1
  194. package/dist/core/compaction/context-deletion-tools.js +18 -10
  195. package/dist/core/compaction/context-deletion-tools.js.map +1 -1
  196. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  197. package/dist/core/compaction/context-transcript-analysis.js +2 -4
  198. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  199. package/dist/core/copilot-gemini-tool-arguments.d.ts.map +1 -1
  200. package/dist/core/copilot-gemini-tool-arguments.js +2 -60
  201. package/dist/core/copilot-gemini-tool-arguments.js.map +1 -1
  202. package/dist/core/extensions/context-types.d.ts +2 -0
  203. package/dist/core/extensions/context-types.d.ts.map +1 -1
  204. package/dist/core/extensions/context-types.js.map +1 -1
  205. package/dist/core/extensions/index.d.ts +2 -2
  206. package/dist/core/extensions/index.d.ts.map +1 -1
  207. package/dist/core/extensions/index.js +1 -1
  208. package/dist/core/extensions/index.js.map +1 -1
  209. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  210. package/dist/core/extensions/loader-virtual-modules.js +57 -32
  211. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  212. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  213. package/dist/core/extensions/runner-context.js +11 -0
  214. package/dist/core/extensions/runner-context.js.map +1 -1
  215. package/dist/core/extensions/tool-events.d.ts +13 -13
  216. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  217. package/dist/core/extensions/tool-events.js +3 -3
  218. package/dist/core/extensions/tool-events.js.map +1 -1
  219. package/dist/core/extensions/types.d.ts +1 -1
  220. package/dist/core/extensions/types.d.ts.map +1 -1
  221. package/dist/core/extensions/types.js +1 -1
  222. package/dist/core/extensions/types.js.map +1 -1
  223. package/dist/core/flattened-tool-arguments.d.ts +18 -0
  224. package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
  225. package/dist/core/flattened-tool-arguments.js +104 -0
  226. package/dist/core/flattened-tool-arguments.js.map +1 -1
  227. package/dist/core/messages.d.ts +1 -0
  228. package/dist/core/messages.d.ts.map +1 -1
  229. package/dist/core/messages.js +46 -1
  230. package/dist/core/messages.js.map +1 -1
  231. package/dist/core/sdk-exports.d.ts +1 -1
  232. package/dist/core/sdk-exports.d.ts.map +1 -1
  233. package/dist/core/sdk-exports.js +1 -1
  234. package/dist/core/sdk-exports.js.map +1 -1
  235. package/dist/core/sdk-types.d.ts +2 -2
  236. package/dist/core/sdk-types.d.ts.map +1 -1
  237. package/dist/core/sdk-types.js.map +1 -1
  238. package/dist/core/sdk.d.ts.map +1 -1
  239. package/dist/core/sdk.js +12 -0
  240. package/dist/core/sdk.js.map +1 -1
  241. package/dist/core/session-manager-core.d.ts +15 -7
  242. package/dist/core/session-manager-core.d.ts.map +1 -1
  243. package/dist/core/session-manager-core.js +20 -9
  244. package/dist/core/session-manager-core.js.map +1 -1
  245. package/dist/core/session-manager-entries.d.ts +2 -2
  246. package/dist/core/session-manager-entries.d.ts.map +1 -1
  247. package/dist/core/session-manager-entries.js +9 -3
  248. package/dist/core/session-manager-entries.js.map +1 -1
  249. package/dist/core/session-manager-history.d.ts.map +1 -1
  250. package/dist/core/session-manager-history.js +2 -1
  251. package/dist/core/session-manager-history.js.map +1 -1
  252. package/dist/core/session-manager-list.d.ts +3 -3
  253. package/dist/core/session-manager-list.d.ts.map +1 -1
  254. package/dist/core/session-manager-list.js +27 -8
  255. package/dist/core/session-manager-list.js.map +1 -1
  256. package/dist/core/session-manager-storage.d.ts +3 -1
  257. package/dist/core/session-manager-storage.d.ts.map +1 -1
  258. package/dist/core/session-manager-storage.js +55 -12
  259. package/dist/core/session-manager-storage.js.map +1 -1
  260. package/dist/core/session-manager-tool-dependencies.d.ts +10 -0
  261. package/dist/core/session-manager-tool-dependencies.d.ts.map +1 -0
  262. package/dist/core/session-manager-tool-dependencies.js +133 -0
  263. package/dist/core/session-manager-tool-dependencies.js.map +1 -0
  264. package/dist/core/session-manager-types.d.ts +22 -0
  265. package/dist/core/session-manager-types.d.ts.map +1 -1
  266. package/dist/core/session-manager-types.js.map +1 -1
  267. package/dist/core/session-manager.d.ts +2 -2
  268. package/dist/core/session-manager.d.ts.map +1 -1
  269. package/dist/core/session-manager.js +1 -1
  270. package/dist/core/session-manager.js.map +1 -1
  271. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  272. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  273. package/dist/core/settings-manager-basic-accessors.js +18 -0
  274. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  275. package/dist/core/settings-manager-resource-accessors.d.ts +4 -0
  276. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  277. package/dist/core/settings-manager-resource-accessors.js +15 -0
  278. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  279. package/dist/core/settings-types.d.ts +11 -0
  280. package/dist/core/settings-types.d.ts.map +1 -1
  281. package/dist/core/settings-types.js.map +1 -1
  282. package/dist/core/system-prompt.d.ts +1 -1
  283. package/dist/core/system-prompt.d.ts.map +1 -1
  284. package/dist/core/system-prompt.js +3 -2
  285. package/dist/core/system-prompt.js.map +1 -1
  286. package/dist/core/tools/artifact-protocol.d.ts +11 -0
  287. package/dist/core/tools/artifact-protocol.d.ts.map +1 -0
  288. package/dist/core/tools/artifact-protocol.js +76 -0
  289. package/dist/core/tools/artifact-protocol.js.map +1 -0
  290. package/dist/core/tools/artifacts.d.ts +18 -0
  291. package/dist/core/tools/artifacts.d.ts.map +1 -0
  292. package/dist/core/tools/artifacts.js +90 -0
  293. package/dist/core/tools/artifacts.js.map +1 -0
  294. package/dist/core/tools/bash-async-jobs.d.ts +20 -0
  295. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -0
  296. package/dist/core/tools/bash-async-jobs.js +59 -0
  297. package/dist/core/tools/bash-async-jobs.js.map +1 -0
  298. package/dist/core/tools/bash-async-output.d.ts +10 -0
  299. package/dist/core/tools/bash-async-output.d.ts.map +1 -0
  300. package/dist/core/tools/bash-async-output.js +80 -0
  301. package/dist/core/tools/bash-async-output.js.map +1 -0
  302. package/dist/core/tools/bash-interceptor.d.ts +10 -0
  303. package/dist/core/tools/bash-interceptor.d.ts.map +1 -0
  304. package/dist/core/tools/bash-interceptor.js +39 -0
  305. package/dist/core/tools/bash-interceptor.js.map +1 -0
  306. package/dist/core/tools/bash-leading-cd.d.ts +7 -0
  307. package/dist/core/tools/bash-leading-cd.d.ts.map +1 -0
  308. package/dist/core/tools/bash-leading-cd.js +59 -0
  309. package/dist/core/tools/bash-leading-cd.js.map +1 -0
  310. package/dist/core/tools/bash-pty-native.d.ts +14 -0
  311. package/dist/core/tools/bash-pty-native.d.ts.map +1 -0
  312. package/dist/core/tools/bash-pty-native.js +71 -0
  313. package/dist/core/tools/bash-pty-native.js.map +1 -0
  314. package/dist/core/tools/bash.d.ts +28 -17
  315. package/dist/core/tools/bash.d.ts.map +1 -1
  316. package/dist/core/tools/bash.js +152 -35
  317. package/dist/core/tools/bash.js.map +1 -1
  318. package/dist/core/tools/block-resolver.d.ts +16 -0
  319. package/dist/core/tools/block-resolver.d.ts.map +1 -0
  320. package/dist/core/tools/block-resolver.js +74 -0
  321. package/dist/core/tools/block-resolver.js.map +1 -0
  322. package/dist/core/tools/conflict-registry.d.ts +16 -0
  323. package/dist/core/tools/conflict-registry.d.ts.map +1 -0
  324. package/dist/core/tools/conflict-registry.js +44 -0
  325. package/dist/core/tools/conflict-registry.js.map +1 -0
  326. package/dist/core/tools/directory-tree.d.ts +13 -0
  327. package/dist/core/tools/directory-tree.d.ts.map +1 -0
  328. package/dist/core/tools/directory-tree.js +81 -0
  329. package/dist/core/tools/directory-tree.js.map +1 -0
  330. package/dist/core/tools/edit.d.ts +4 -29
  331. package/dist/core/tools/edit.d.ts.map +1 -1
  332. package/dist/core/tools/edit.js +136 -228
  333. package/dist/core/tools/edit.js.map +1 -1
  334. package/dist/core/tools/fetch-url.d.ts +74 -0
  335. package/dist/core/tools/fetch-url.d.ts.map +1 -0
  336. package/dist/core/tools/fetch-url.js +518 -0
  337. package/dist/core/tools/fetch-url.js.map +1 -0
  338. package/dist/core/tools/find.d.ts +27 -9
  339. package/dist/core/tools/find.d.ts.map +1 -1
  340. package/dist/core/tools/find.js +400 -176
  341. package/dist/core/tools/find.js.map +1 -1
  342. package/dist/core/tools/glob-path-utils.d.ts +8 -0
  343. package/dist/core/tools/glob-path-utils.d.ts.map +1 -0
  344. package/dist/core/tools/glob-path-utils.js +26 -0
  345. package/dist/core/tools/glob-path-utils.js.map +1 -0
  346. package/dist/core/tools/grep.d.ts +12 -0
  347. package/dist/core/tools/grep.d.ts.map +1 -1
  348. package/dist/core/tools/grep.js +141 -17
  349. package/dist/core/tools/grep.js.map +1 -1
  350. package/dist/core/tools/hashline-engine/apply.d.ts +11 -0
  351. package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -0
  352. package/dist/core/tools/hashline-engine/apply.js +752 -0
  353. package/dist/core/tools/hashline-engine/apply.js.map +1 -0
  354. package/dist/core/tools/hashline-engine/block.d.ts +40 -0
  355. package/dist/core/tools/hashline-engine/block.d.ts.map +1 -0
  356. package/dist/core/tools/hashline-engine/block.js +117 -0
  357. package/dist/core/tools/hashline-engine/block.js.map +1 -0
  358. package/dist/core/tools/hashline-engine/diff-preview.d.ts +15 -0
  359. package/dist/core/tools/hashline-engine/diff-preview.d.ts.map +1 -0
  360. package/dist/core/tools/hashline-engine/diff-preview.js +98 -0
  361. package/dist/core/tools/hashline-engine/diff-preview.js.map +1 -0
  362. package/dist/core/tools/hashline-engine/format.d.ts +71 -0
  363. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -0
  364. package/dist/core/tools/hashline-engine/format.js +178 -0
  365. package/dist/core/tools/hashline-engine/format.js.map +1 -0
  366. package/dist/core/tools/hashline-engine/fs.d.ts +81 -0
  367. package/dist/core/tools/hashline-engine/fs.d.ts.map +1 -0
  368. package/dist/core/tools/hashline-engine/fs.js +143 -0
  369. package/dist/core/tools/hashline-engine/fs.js.map +1 -0
  370. package/dist/core/tools/hashline-engine/index.d.ts +18 -0
  371. package/dist/core/tools/hashline-engine/index.d.ts.map +1 -0
  372. package/dist/core/tools/hashline-engine/index.js +20 -0
  373. package/dist/core/tools/hashline-engine/index.js.map +1 -0
  374. package/dist/core/tools/hashline-engine/input.d.ts +101 -0
  375. package/dist/core/tools/hashline-engine/input.d.ts.map +1 -0
  376. package/dist/core/tools/hashline-engine/input.js +398 -0
  377. package/dist/core/tools/hashline-engine/input.js.map +1 -0
  378. package/dist/core/tools/hashline-engine/messages.d.ts +99 -0
  379. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -0
  380. package/dist/core/tools/hashline-engine/messages.js +144 -0
  381. package/dist/core/tools/hashline-engine/messages.js.map +1 -0
  382. package/dist/core/tools/hashline-engine/mismatch.d.ts +45 -0
  383. package/dist/core/tools/hashline-engine/mismatch.d.ts.map +1 -0
  384. package/dist/core/tools/hashline-engine/mismatch.js +90 -0
  385. package/dist/core/tools/hashline-engine/mismatch.js.map +1 -0
  386. package/dist/core/tools/hashline-engine/normalize.d.ts +21 -0
  387. package/dist/core/tools/hashline-engine/normalize.d.ts.map +1 -0
  388. package/dist/core/tools/hashline-engine/normalize.js +33 -0
  389. package/dist/core/tools/hashline-engine/normalize.js.map +1 -0
  390. package/dist/core/tools/hashline-engine/parser.d.ts +24 -0
  391. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -0
  392. package/dist/core/tools/hashline-engine/parser.js +381 -0
  393. package/dist/core/tools/hashline-engine/parser.js.map +1 -0
  394. package/dist/core/tools/hashline-engine/patcher.d.ts +118 -0
  395. package/dist/core/tools/hashline-engine/patcher.d.ts.map +1 -0
  396. package/dist/core/tools/hashline-engine/patcher.js +341 -0
  397. package/dist/core/tools/hashline-engine/patcher.js.map +1 -0
  398. package/dist/core/tools/hashline-engine/prefixes.d.ts +43 -0
  399. package/dist/core/tools/hashline-engine/prefixes.d.ts.map +1 -0
  400. package/dist/core/tools/hashline-engine/prefixes.js +135 -0
  401. package/dist/core/tools/hashline-engine/prefixes.js.map +1 -0
  402. package/dist/core/tools/hashline-engine/recovery.d.ts +41 -0
  403. package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -0
  404. package/dist/core/tools/hashline-engine/recovery.js +168 -0
  405. package/dist/core/tools/hashline-engine/recovery.js.map +1 -0
  406. package/dist/core/tools/hashline-engine/snapshots.d.ts +65 -0
  407. package/dist/core/tools/hashline-engine/snapshots.d.ts.map +1 -0
  408. package/dist/core/tools/hashline-engine/snapshots.js +108 -0
  409. package/dist/core/tools/hashline-engine/snapshots.js.map +1 -0
  410. package/dist/core/tools/hashline-engine/stream.d.ts +3 -0
  411. package/dist/core/tools/hashline-engine/stream.d.ts.map +1 -0
  412. package/dist/core/tools/hashline-engine/stream.js +111 -0
  413. package/dist/core/tools/hashline-engine/stream.js.map +1 -0
  414. package/dist/core/tools/hashline-engine/tokenizer.d.ts +69 -0
  415. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -0
  416. package/dist/core/tools/hashline-engine/tokenizer.js +430 -0
  417. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -0
  418. package/dist/core/tools/hashline-engine/types.d.ts +166 -0
  419. package/dist/core/tools/hashline-engine/types.d.ts.map +1 -0
  420. package/dist/core/tools/hashline-engine/types.js +9 -0
  421. package/dist/core/tools/hashline-engine/types.js.map +1 -0
  422. package/dist/core/tools/hashline.d.ts +29 -0
  423. package/dist/core/tools/hashline.d.ts.map +1 -0
  424. package/dist/core/tools/hashline.js +110 -0
  425. package/dist/core/tools/hashline.js.map +1 -0
  426. package/dist/core/tools/index.d.ts +6 -4
  427. package/dist/core/tools/index.d.ts.map +1 -1
  428. package/dist/core/tools/index.js +52 -35
  429. package/dist/core/tools/index.js.map +1 -1
  430. package/dist/core/tools/notebook.d.ts +38 -0
  431. package/dist/core/tools/notebook.d.ts.map +1 -0
  432. package/dist/core/tools/notebook.js +125 -0
  433. package/dist/core/tools/notebook.js.map +1 -0
  434. package/dist/core/tools/read-document-extract.d.ts +9 -0
  435. package/dist/core/tools/read-document-extract.d.ts.map +1 -0
  436. package/dist/core/tools/read-document-extract.js +212 -0
  437. package/dist/core/tools/read-document-extract.js.map +1 -0
  438. package/dist/core/tools/read-selectors.d.ts +24 -0
  439. package/dist/core/tools/read-selectors.d.ts.map +1 -0
  440. package/dist/core/tools/read-selectors.js +277 -0
  441. package/dist/core/tools/read-selectors.js.map +1 -0
  442. package/dist/core/tools/read-url.d.ts +37 -0
  443. package/dist/core/tools/read-url.d.ts.map +1 -0
  444. package/dist/core/tools/read-url.js +39 -0
  445. package/dist/core/tools/read-url.js.map +1 -0
  446. package/dist/core/tools/read.d.ts +11 -11
  447. package/dist/core/tools/read.d.ts.map +1 -1
  448. package/dist/core/tools/read.js +224 -94
  449. package/dist/core/tools/read.js.map +1 -1
  450. package/dist/core/tools/resource-selectors.d.ts +44 -0
  451. package/dist/core/tools/resource-selectors.d.ts.map +1 -0
  452. package/dist/core/tools/resource-selectors.js +808 -0
  453. package/dist/core/tools/resource-selectors.js.map +1 -0
  454. package/dist/core/tools/search-details.d.ts +26 -0
  455. package/dist/core/tools/search-details.d.ts.map +1 -0
  456. package/dist/core/tools/search-details.js +24 -0
  457. package/dist/core/tools/search-details.js.map +1 -0
  458. package/dist/core/tools/search-line-ranges.d.ts +11 -0
  459. package/dist/core/tools/search-line-ranges.d.ts.map +1 -0
  460. package/dist/core/tools/search-line-ranges.js +65 -0
  461. package/dist/core/tools/search-line-ranges.js.map +1 -0
  462. package/dist/core/tools/search-native.d.ts +97 -0
  463. package/dist/core/tools/search-native.d.ts.map +1 -0
  464. package/dist/core/tools/search-native.js +27 -0
  465. package/dist/core/tools/search-native.js.map +1 -0
  466. package/dist/core/tools/search.d.ts +24 -0
  467. package/dist/core/tools/search.d.ts.map +1 -0
  468. package/dist/core/tools/search.js +573 -0
  469. package/dist/core/tools/search.js.map +1 -0
  470. package/dist/core/tools/truncate.d.ts +4 -4
  471. package/dist/core/tools/truncate.d.ts.map +1 -1
  472. package/dist/core/tools/truncate.js +3 -3
  473. package/dist/core/tools/truncate.js.map +1 -1
  474. package/dist/core/tools/url-ip-guards.d.ts +4 -0
  475. package/dist/core/tools/url-ip-guards.d.ts.map +1 -0
  476. package/dist/core/tools/url-ip-guards.js +126 -0
  477. package/dist/core/tools/url-ip-guards.js.map +1 -0
  478. package/dist/core/tools/write.d.ts +12 -2
  479. package/dist/core/tools/write.d.ts.map +1 -1
  480. package/dist/core/tools/write.js +166 -14
  481. package/dist/core/tools/write.js.map +1 -1
  482. package/dist/core/trust-manager.d.ts.map +1 -1
  483. package/dist/core/trust-manager.js +2 -3
  484. package/dist/core/trust-manager.js.map +1 -1
  485. package/dist/index-extensions.d.ts +2 -2
  486. package/dist/index-extensions.d.ts.map +1 -1
  487. package/dist/index-extensions.js +1 -1
  488. package/dist/index-extensions.js.map +1 -1
  489. package/dist/index.d.ts +3 -3
  490. package/dist/index.d.ts.map +1 -1
  491. package/dist/index.js +3 -3
  492. package/dist/index.js.map +1 -1
  493. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +1 -0
  494. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/chat-session-host-runtime.js +12 -0
  496. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
  497. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts +4 -0
  498. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts.map +1 -0
  499. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js +131 -0
  500. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js.map +1 -0
  501. package/dist/modes/interactive/components/chat-session-host.d.ts +2 -0
  502. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/chat-session-host.js +7 -1
  504. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  505. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/chat-transcript.js +15 -4
  507. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  508. package/dist/modes/interactive/components/custom-editor.d.ts +1 -0
  509. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/custom-editor.js +9 -2
  511. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  512. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  514. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  515. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  516. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  517. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  518. package/dist/modes/interactive/components/settings-selector-types.d.ts +2 -0
  519. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  521. package/dist/modes/interactive/components/tool-execution.d.ts +3 -0
  522. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/tool-execution.js +26 -0
  524. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  525. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/tree-selector-content.js +0 -5
  527. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -1
  528. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  529. package/dist/modes/interactive/interactive-auth-login.js +1 -0
  530. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  531. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  532. package/dist/modes/interactive/interactive-autocomplete.js +80 -2
  533. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  534. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  535. package/dist/modes/interactive/interactive-hotkeys-debug.js +3 -0
  536. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  537. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  538. package/dist/modes/interactive/interactive-input-handling.js +51 -0
  539. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  540. package/dist/modes/interactive/interactive-mode-base.d.ts +5 -0
  541. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  542. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  543. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  544. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  545. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  546. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  547. package/dist/modes/interactive/interactive-mode-surface.d.ts +12 -0
  548. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  549. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  550. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  551. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  552. package/dist/modes/interactive/interactive-mode.js +1 -0
  553. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  554. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  555. package/dist/modes/interactive/interactive-model-routing.js +4 -1
  556. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  557. package/dist/modes/interactive/interactive-onboarding.d.ts +11 -0
  558. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -0
  559. package/dist/modes/interactive/interactive-onboarding.js +220 -0
  560. package/dist/modes/interactive/interactive-onboarding.js.map +1 -0
  561. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  562. package/dist/modes/interactive/interactive-selectors.js +4 -0
  563. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  564. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  565. package/dist/modes/interactive/interactive-session-routing.js +6 -0
  566. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  567. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  568. package/dist/modes/interactive/interactive-slash-commands.js +9 -4
  569. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  570. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  571. package/dist/modes/interactive/interactive-startup.js +28 -0
  572. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  573. package/dist/utils/child-process.d.ts.map +1 -1
  574. package/dist/utils/child-process.js +21 -1
  575. package/dist/utils/child-process.js.map +1 -1
  576. package/dist/utils/markit.d.ts +8 -0
  577. package/dist/utils/markit.d.ts.map +1 -0
  578. package/dist/utils/markit.js +53 -0
  579. package/dist/utils/markit.js.map +1 -0
  580. package/dist/utils/paths.d.ts +2 -1
  581. package/dist/utils/paths.d.ts.map +1 -1
  582. package/dist/utils/paths.js +14 -1
  583. package/dist/utils/paths.js.map +1 -1
  584. package/docs/compaction.md +18 -1
  585. package/docs/containerization.md +1 -1
  586. package/docs/docs.json +1 -0
  587. package/docs/extensions.md +25 -36
  588. package/docs/models.md +1 -1
  589. package/docs/providers.md +2 -1
  590. package/docs/quickstart.md +11 -6
  591. package/docs/sdk.md +5 -5
  592. package/docs/session-format.md +6 -0
  593. package/docs/sessions.md +6 -0
  594. package/docs/settings.md +7 -0
  595. package/docs/subagents.md +3 -2
  596. package/docs/tools.md +49 -0
  597. package/docs/usage.md +3 -3
  598. package/docs/workflows.md +112 -8
  599. package/examples/extensions/subagent/README.md +5 -5
  600. package/examples/extensions/subagent/agents/planner.md +1 -1
  601. package/examples/extensions/subagent/agents/reviewer.md +1 -1
  602. package/examples/extensions/subagent/agents/scout.md +2 -2
  603. package/examples/extensions/subagent/display.ts +3 -3
  604. package/examples/sdk/05-tools.ts +3 -3
  605. package/examples/sdk/README.md +1 -1
  606. package/package.json +5 -3
@@ -55,6 +55,18 @@ export interface WorkflowModelFallbackFields {
55
55
  }
56
56
 
57
57
  export type WorkflowModelValue = string | object;
58
+ // Standalone authoring contract mirror of shared/types.ts StageUserMessageContent,
59
+ // whose runtime source of truth is derived from AgentSession["sendUserMessage"].
60
+ export interface StageTextContent {
61
+ readonly type: "text";
62
+ readonly text: string;
63
+ }
64
+ export interface StageImageContent {
65
+ readonly type: "image";
66
+ readonly data: string;
67
+ readonly mimeType: string;
68
+ }
69
+ export type StageUserMessageContent = string | readonly (StageTextContent | StageImageContent)[];
58
70
  export type WorkflowStageResult<TSchemaDef extends TSchema | undefined = undefined> = [TSchemaDef] extends [TSchema]
59
71
  ? Static<TSchemaDef>
60
72
  : string;
@@ -223,6 +235,7 @@ export interface WorkflowPersistencePort {
223
235
 
224
236
  export interface StageSessionRuntime {
225
237
  prompt(text: string, options?: PromptOptions): Promise<string | void>;
238
+ sendUserMessage?(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
226
239
  steer(text: string): Promise<void>;
227
240
  followUp(text: string): Promise<void>;
228
241
  subscribe(listener: (event: never) => void): () => void;
@@ -284,10 +297,17 @@ export interface StageAdapters {
284
297
  readonly complete?: CompleteAdapter;
285
298
  }
286
299
 
300
+ export type StageUserMessageDelivery = "steer" | "followUp";
301
+
302
+ export interface StageSendUserMessageOptions {
303
+ readonly deliverAs?: StageUserMessageDelivery;
304
+ }
305
+
287
306
  export interface StageContext<TSchemaDef extends TSchema | undefined = undefined> {
288
307
  readonly name: string;
289
308
  prompt(text: string, options?: StagePromptOptions): Promise<WorkflowStageResult<TSchemaDef>>;
290
309
  complete(text: string, options?: CompleteStageOpts): Promise<string>;
310
+ sendUserMessage(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
291
311
  steer(text: string): Promise<void>;
292
312
  followUp(text: string): Promise<void>;
293
313
  subscribe(listener: (event: never) => void): () => void;
@@ -57,6 +57,28 @@ export interface WorkflowRunContext<TInputs extends WorkflowInputValues = Workfl
57
57
  parallel(steps: readonly WorkflowTaskStep[], options?: WorkflowParallelOptions): Promise<WorkflowTaskResult[]>;
58
58
  workflow<TChildInputs extends WorkflowInputValues, TChildOutputs extends WorkflowOutputValues, TChildRunInputs extends WorkflowInputValues = TChildInputs>(definition: WorkflowDefinition<TChildInputs, TChildOutputs, TChildRunInputs> & TDefinitionBrand, ...args: WorkflowRunChildArgs<TChildRunInputs>): Promise<WorkflowChildResult<TChildOutputs>>;
59
59
  readonly ui: WorkflowUIContext;
60
+ /**
61
+ * Durable cached tool execution. Runs arbitrary TypeScript code and caches
62
+ * the result durably so completed side effects are not repeated on resume.
63
+ * Only `ctx.*` blocks (tool, ui, stage, task, chain, parallel, workflow)
64
+ * produce durable checkpoints.
65
+ *
66
+ * cross-ref: issue #1498 — DBOS-backed cross-session resumability.
67
+ */
68
+ tool: WorkflowToolPrimitive;
69
+ }
70
+ /**
71
+ * `ctx.tool` primitive signature. Runs an async function and caches the result.
72
+ */
73
+ export interface WorkflowToolPrimitive {
74
+ <TValue extends WorkflowSerializableValue>(name: string, args: Readonly<Record<string, WorkflowSerializableValue>>, fn: () => Promise<TValue>, options?: WorkflowToolOptions): Promise<TValue>;
75
+ }
76
+ /** Options for `ctx.tool`. */
77
+ export interface WorkflowToolOptions {
78
+ readonly retriesAllowed?: boolean;
79
+ readonly maxAttempts?: number;
80
+ readonly intervalMs?: number;
81
+ readonly backoffRate?: number;
60
82
  }
61
83
  export type WorkflowRunFn<TInputs extends WorkflowInputValues = WorkflowInputValues, TOutputs extends WorkflowOutputValues = WorkflowOutputValues, TDefinitionBrand extends object = {}> = (ctx: WorkflowRunContext<TInputs, TDefinitionBrand, TOutputs>) => Promise<TOutputs> | TOutputs;
62
84
  export interface WorkflowRuntimeConfig {
@@ -140,7 +162,7 @@ export interface RunOpts {
140
162
  readonly parentRun?: WorkflowParentRunLink;
141
163
  readonly onRunStart?: (snapshot: RunSnapshot) => void;
142
164
  readonly onStageStart?: (runId: string, snapshot: StageSnapshot) => void;
143
- readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => void;
165
+ readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => unknown;
144
166
  readonly onRunEnd?: (runId: string, status: RunStatus, result?: WorkflowOutputValues, error?: string, exitReason?: string) => void;
145
167
  }
146
168
  export interface WorkflowProgressSummary extends WorkflowSerializableObject {
@@ -104,6 +104,35 @@ export interface WorkflowRunContext<
104
104
  ...args: WorkflowRunChildArgs<TChildRunInputs>
105
105
  ): Promise<WorkflowChildResult<TChildOutputs>>;
106
106
  readonly ui: WorkflowUIContext;
107
+ /**
108
+ * Durable cached tool execution. Runs arbitrary TypeScript code and caches
109
+ * the result durably so completed side effects are not repeated on resume.
110
+ * Only `ctx.*` blocks (tool, ui, stage, task, chain, parallel, workflow)
111
+ * produce durable checkpoints.
112
+ *
113
+ * cross-ref: issue #1498 — DBOS-backed cross-session resumability.
114
+ */
115
+ tool: WorkflowToolPrimitive;
116
+ }
117
+
118
+ /**
119
+ * `ctx.tool` primitive signature. Runs an async function and caches the result.
120
+ */
121
+ export interface WorkflowToolPrimitive {
122
+ <TValue extends WorkflowSerializableValue>(
123
+ name: string,
124
+ args: Readonly<Record<string, WorkflowSerializableValue>>,
125
+ fn: () => Promise<TValue>,
126
+ options?: WorkflowToolOptions,
127
+ ): Promise<TValue>;
128
+ }
129
+
130
+ /** Options for `ctx.tool`. */
131
+ export interface WorkflowToolOptions {
132
+ readonly retriesAllowed?: boolean;
133
+ readonly maxAttempts?: number;
134
+ readonly intervalMs?: number;
135
+ readonly backoffRate?: number;
107
136
  }
108
137
 
109
138
  export type WorkflowRunFn<
@@ -206,7 +235,7 @@ export interface RunOpts {
206
235
  readonly parentRun?: WorkflowParentRunLink;
207
236
  readonly onRunStart?: (snapshot: RunSnapshot) => void;
208
237
  readonly onStageStart?: (runId: string, snapshot: StageSnapshot) => void;
209
- readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => void;
238
+ readonly onStageEnd?: (runId: string, snapshot: StageSnapshot) => unknown;
210
239
  readonly onRunEnd?: (runId: string, status: RunStatus, result?: WorkflowOutputValues, error?: string, exitReason?: string) => void;
211
240
  }
212
241
 
@@ -30,6 +30,10 @@ export interface RunEndMetadata {
30
30
  readonly exitReason?: string;
31
31
  }
32
32
 
33
+ export interface RunPauseMetadata {
34
+ readonly resumable?: boolean;
35
+ readonly exitReason?: string;
36
+ }
33
37
  export interface RunBlockedMetadata extends RunEndMetadata {
34
38
  readonly failureRecoverability: "recoverable";
35
39
  readonly failedStageId: string;
@@ -204,8 +208,8 @@ export interface Store {
204
208
  recordStageBlocked(runId: string, stageId: string, blockedBy: string): boolean;
205
209
  recordStageUnblocked(runId: string, stageId: string): boolean;
206
210
  recordStageNotice(runId: string, stageId: string, notice: StageNotice): boolean;
207
- /** Mark a run as `paused`. */
208
- recordRunPaused(runId: string, pausedAt?: number): boolean;
211
+ /** Mark a run as `paused`. Optional metadata can annotate resumable quit/detach state. */
212
+ recordRunPaused(runId: string, pausedAt?: number, metadata?: RunPauseMetadata): boolean;
209
213
  /** Restore a run from `paused` back to `running`. */
210
214
  recordRunResumed(runId: string, resumedAt?: number): boolean;
211
215
  /** Drop every run and notice. */
@@ -1,5 +1,5 @@
1
1
  import type { WorkflowOutputValues } from "./types.js";
2
- import type { Store, RunBlockedMetadata, RunEndMetadata } from "./store-public-types.js";
2
+ import type { Store, RunBlockedMetadata, RunEndMetadata, RunPauseMetadata } from "./store-public-types.js";
3
3
  import type { RunSnapshot, RunStatus, StoreSnapshot, WorkflowNotice } from "./store-types.js";
4
4
  import { accumulatePausedDurationMs, elapsedRunMs } from "./timing.js";
5
5
  import { isTopLevelWorkflowRun } from "./run-visibility.js";
@@ -164,14 +164,19 @@ export function createRunStoreMethods(context: StoreContext): RunStoreMethods {
164
164
  return true;
165
165
  },
166
166
 
167
- recordRunPaused(runId: string, pausedAt?: number): boolean {
167
+ recordRunPaused(runId: string, pausedAt?: number, metadata?: RunPauseMetadata): boolean {
168
168
  const run = context.findRun(runId);
169
169
  if (!run) return false;
170
170
  if (TERMINAL_STATUSES.has(run.status)) return false;
171
- if (run.status === "paused") return false;
172
- run.status = "paused";
173
- run.pausedAt = pausedAt ?? Date.now();
174
- run.resumedAt = undefined;
171
+ const wasPaused = run.status === "paused";
172
+ if (!wasPaused) {
173
+ run.status = "paused";
174
+ run.pausedAt = pausedAt ?? Date.now();
175
+ run.resumedAt = undefined;
176
+ }
177
+ if (metadata?.resumable !== undefined) run.resumable = metadata.resumable;
178
+ if (metadata?.exitReason !== undefined) run.exitReason = metadata.exitReason;
179
+ if (wasPaused && metadata === undefined) return false;
175
180
  context.bumpAndNotify();
176
181
  return true;
177
182
  },
@@ -186,6 +191,7 @@ export function createRunStoreMethods(context: StoreContext): RunStoreMethods {
186
191
  run.pausedDurationMs = accumulatePausedDurationMs(run.pausedDurationMs, run.pausedAt, resumedTs);
187
192
  run.resumedAt = resumedTs;
188
193
  run.pausedAt = undefined;
194
+ delete run.exitReason;
189
195
  context.bumpAndNotify();
190
196
  return true;
191
197
  },
@@ -21,6 +21,15 @@ export type { TSchema };
21
21
 
22
22
  export type { AgentSessionEvent, ContextCompactionResult, ModelCycleResult, PromptOptions };
23
23
 
24
+ export type StageUserMessageContent = Parameters<AgentSession["sendUserMessage"]>[0];
25
+
26
+ export type StageUserMessageDelivery = "steer" | "followUp";
27
+
28
+ export interface StageSendUserMessageOptions {
29
+ /** Delivery mode to use when the stage session is already streaming. Defaults to followUp. */
30
+ readonly deliverAs?: StageUserMessageDelivery;
31
+ }
32
+
24
33
  export type WorkflowModelValue = NonNullable<CreateAgentSessionOptions["model"]> | string;
25
34
  export type WorkflowModelUsage = AuthoringContract.WorkflowModelUsage;
26
35
  export type WorkflowModelAttempt = AuthoringContract.WorkflowModelAttempt;
@@ -178,6 +187,10 @@ export interface StageOptions<TSchemaDef extends TSchema | undefined = TSchema |
178
187
  scopedModels?: CreateAgentSessionOptions["scopedModels"];
179
188
  sessionManager?: SessionManager;
180
189
  settingsManager?: SettingsManager;
190
+ /** Internal durable resume hook: reopen this exact Atomic/Pi session file instead of forking. */
191
+ resumeFromSessionFile?: string;
192
+ /** Internal durable replay key used to map a live LM session to durable resume state. */
193
+ durableReplayKey?: string;
181
194
  }
182
195
 
183
196
  // ---------------------------------------------------------------------------
@@ -299,6 +312,15 @@ export interface StageContext<TSchemaDef extends TSchema | undefined = undefined
299
312
  prompt(text: string, options?: StagePromptOptions): Promise<WorkflowStageResult<TSchemaDef>>;
300
313
  complete(text: string, options?: CompleteStageOpts): Promise<string>;
301
314
 
315
+ /**
316
+ * Send a user-authored follow-on message to this stage session.
317
+ *
318
+ * When the session is idle this starts a new user turn immediately. When the
319
+ * session is streaming, the message is queued as a follow-up by default, or
320
+ * as steering when `deliverAs: "steer"` is provided.
321
+ */
322
+ sendUserMessage(content: StageUserMessageContent, options?: StageSendUserMessageOptions): Promise<void>;
323
+
302
324
  /** Queue messages during streaming. */
303
325
  steer(text: string): Promise<void>;
304
326
  followUp(text: string): Promise<void>;
@@ -381,6 +403,39 @@ export interface WorkflowRunContext<
381
403
  ): Promise<WorkflowChildResult<TChildOutputs>>;
382
404
  /** HIL primitives for user interaction during a run. */
383
405
  readonly ui: WorkflowUIContext;
406
+ /**
407
+ * Durable cached tool execution. Runs arbitrary TypeScript code and caches
408
+ * the result so completed side effects are not repeated on resume.
409
+ * Only `ctx.*` blocks produce durable checkpoints.
410
+ *
411
+ * cross-ref: issue #1498 — DBOS-backed cross-session resumability.
412
+ */
413
+ tool: WorkflowToolPrimitive;
414
+ }
415
+
416
+ /**
417
+ * `ctx.tool` primitive signature. Runs an async function and caches the result
418
+ * durably via the durable workflow backend.
419
+ */
420
+ export interface WorkflowToolPrimitive {
421
+ <TValue extends WorkflowSerializableValue>(
422
+ name: string,
423
+ args: Readonly<Record<string, WorkflowSerializableValue>>,
424
+ fn: () => Promise<TValue>,
425
+ options?: WorkflowToolOptions,
426
+ ): Promise<TValue>;
427
+ }
428
+
429
+ /** Options for `ctx.tool`. */
430
+ export interface WorkflowToolOptions {
431
+ /** When true, the tool function is retried on failure. Default false. */
432
+ readonly retriesAllowed?: boolean;
433
+ /** Max retry attempts when retriesAllowed is true. Default 3. */
434
+ readonly maxAttempts?: number;
435
+ /** Initial retry interval in ms. Default 1000. */
436
+ readonly intervalMs?: number;
437
+ /** Backoff multiplier. Default 2. */
438
+ readonly backoffRate?: number;
384
439
  }
385
440
 
386
441
  // ---------------------------------------------------------------------------
@@ -7,7 +7,8 @@
7
7
  * - One status-coloured rounded run card:
8
8
  * title: runId8 · workflowName · ● running
9
9
  * body: compact `k=v · k=v · +N more` input summary when present
10
- * - One hint row: ▸ /workflow connect <id> attach & watch
10
+ * - One compact next-step hint:
11
+ * ▸ /workflow connect <id> watch, attach & steer
11
12
  *
12
13
  * What we deliberately do NOT emit (was in the legacy 7-row layout):
13
14
  * - the `✓ submitted · /workflow <name>` echo line — pi already shows
@@ -19,9 +20,9 @@
19
20
  * an 8-char hex string visually communicates "identifier";
20
21
  * - the `status starting…` body row — the `● running` badge on row 1
21
22
  * occupies the same semantic slot;
22
- * - the second hint row `▸ /workflow status` — that is a separate
23
- * intent (list other in-flight runs), already discoverable from a
24
- * bare `/workflow` invocation and the picker's confirm panel.
23
+ * - the second hint row `▸ /workflow status` — that is a separate intent
24
+ * (list other in-flight runs), already discoverable from a bare `/workflow`
25
+ * invocation and the picker's confirm panel.
25
26
  *
26
27
  * Plain mode drops ANSI; the rounded panel/card layout shape is preserved.
27
28
  *
@@ -70,8 +71,7 @@ export interface RenderDispatchConfirmOpts {
70
71
  /**
71
72
  * Render the post-dispatch confirmation: one rounded panel containing a
72
73
  * rounded run card with runId, workflow name, inputs summary, and a
73
- * `● running` status badge, followed by one hint row pointing at
74
- * `/workflow connect <id>`.
74
+ * `● running` status badge, followed by a workflow-control hint.
75
75
  */
76
76
  export function renderDispatchConfirm(opts: RenderDispatchConfirmOpts): string {
77
77
  const width = effectiveWidth(opts.width);
@@ -142,10 +142,11 @@ export function renderDispatchConfirm(opts: RenderDispatchConfirmOpts): string {
142
142
  : [` ${titleSuffix ?? "started in background"} `];
143
143
  const titleLine = ` ● ${tag} ${opts.workflowName} ${trailing.text} `;
144
144
 
145
- const hints = renderHintRows(
146
- [{ command: `/workflow connect ${tag}`, hint: "attach & watch" }],
147
- theme,
148
- ).split("\n").map((line) => ` ${line} `);
145
+ const hints = renderHintRows([
146
+ { command: `/workflow connect ${tag}`, hint: "watch, attach & steer" },
147
+ ], theme)
148
+ .split("\n")
149
+ .map((line) => ` ${line} `);
149
150
 
150
151
  return renderRoundedBox({
151
152
  title: "DISPATCHED",
@@ -3,7 +3,7 @@ export const HINT_KEYS: Array<{ key: string; label: string }> = [
3
3
  { key: "↵", label: "attach" },
4
4
  { key: "/", label: "stages" },
5
5
  { key: "ctrl+d", label: "detach" },
6
- { key: "q", label: "kill" },
6
+ { key: "q", label: "quit" },
7
7
  ];
8
8
 
9
9
  /**
@@ -16,6 +16,8 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
16
16
  protected _renderGraph(width: number): string[] {
17
17
  const run = this._getCurrentRun();
18
18
  if (!run || this.cachedLayout.length === 0) {
19
+ this.lastGraphViewport = null;
20
+ this.graphNodeHitRects = [];
19
21
  const dim = hexToAnsi(this.graphTheme.dim);
20
22
  return [
21
23
  this._centerCanvasContent(
@@ -40,6 +42,7 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
40
42
  );
41
43
  const viewportWidth = Math.max(1, width - leftMargin);
42
44
  const fullCanvasWidth = Math.max(canvasWidth, viewportWidth);
45
+ this.lastGraphViewport = { leftMargin, viewportWidth };
43
46
  this._clampGraphHorizontalScroll(fullCanvasWidth, viewportWidth);
44
47
  if (this.pendingEnsureFocusedVisible) {
45
48
  this._scrollFocusedColumnIntoView(viewportWidth, fullCanvasWidth);
@@ -129,6 +132,44 @@ export abstract class GraphViewGraphRenderer extends GraphViewRenderHelpers {
129
132
  });
130
133
  }
131
134
 
135
+ protected _recordGraphNodeHitRects(
136
+ graphStartRow: number,
137
+ visibleRowCount: number,
138
+ ): void {
139
+ const viewport = this.lastGraphViewport;
140
+ if (!viewport || visibleRowCount <= 0) {
141
+ this.graphNodeHitRects = [];
142
+ return;
143
+ }
144
+
145
+ const visibleTop = graphStartRow;
146
+ const visibleBottom = graphStartRow + visibleRowCount;
147
+ const viewportLeft = viewport.leftMargin;
148
+ const viewportRight = viewport.leftMargin + viewport.viewportWidth;
149
+ const rects: typeof this.graphNodeHitRects = [];
150
+
151
+ for (let index = 0; index < this.cachedLayout.length; index++) {
152
+ const node = this.cachedLayout[index]!;
153
+ const top = graphStartRow + node.y - this.graphScrollOffset;
154
+ const bottom = top + NODE_H;
155
+ const left = viewport.leftMargin + node.x - this.graphScrollColOffset;
156
+ const right = left + NODE_W;
157
+ const clippedTop = Math.max(visibleTop, top);
158
+ const clippedBottom = Math.min(visibleBottom, bottom);
159
+ const clippedLeft = Math.max(viewportLeft, left);
160
+ const clippedRight = Math.min(viewportRight, right);
161
+ if (clippedTop >= clippedBottom || clippedLeft >= clippedRight) continue;
162
+ rects.push({
163
+ index,
164
+ top: clippedTop,
165
+ bottom: clippedBottom,
166
+ left: clippedLeft,
167
+ right: clippedRight,
168
+ });
169
+ }
170
+ this.graphNodeHitRects = rects;
171
+ }
172
+
132
173
  protected _visibleGraphLines(
133
174
  graphLines: string[],
134
175
  frameWidth: number,
@@ -11,6 +11,13 @@ import {
11
11
  import { filterStages, type SwitcherState } from "./switcher.js";
12
12
  import { Key, matchesKey } from "./text-helpers.js";
13
13
 
14
+ interface SgrMouseEvent {
15
+ buttonCode: number;
16
+ col: number;
17
+ row: number;
18
+ final: "M" | "m";
19
+ }
20
+
14
21
  /** Keyboard, mouse, switcher, prompt, and focus navigation handling. */
15
22
  export abstract class GraphViewInputController extends GraphViewRenderer {
16
23
  /** Returns true if consumed. */
@@ -80,6 +87,15 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
80
87
  return true;
81
88
  }
82
89
 
90
+ const clickedNodeIndex = this._graphNodeIndexForClick(data);
91
+ if (clickedNodeIndex !== undefined) {
92
+ if (clickedNodeIndex !== null) {
93
+ this._setFocusedIndex(clickedNodeIndex);
94
+ this._activateFocusedNode();
95
+ }
96
+ return true;
97
+ }
98
+
83
99
  // Vertical-graph navigation: up/down step between depth levels
84
100
  // (col), left/right step between siblings at the same depth (row).
85
101
  // j/k preserved as a flat-order fallback for muscle memory.
@@ -115,12 +131,7 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
115
131
  return true;
116
132
  }
117
133
  if (matchesKey(data, Key.enter)) {
118
- // Enter attaches the popup interior to the focused stage. The
119
- // attach shell swaps in the stage-chat view without remounting
120
- // the overlay; without a callback, fall back to the legacy
121
- // expand/collapse toggle so non-attach hosts still work.
122
- if (this._attachFocusedStage()) return true;
123
- this.detailsExpanded = !this.detailsExpanded;
134
+ this._activateFocusedNode();
124
135
  return true;
125
136
  }
126
137
  // `ctrl+d` detaches the whole popup (host hides the overlay). This
@@ -133,16 +144,13 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
133
144
  }
134
145
  return true;
135
146
  }
136
- // `q` kills the active run (no confirm). `h` hides the pane via
137
- // the overlay's setHidden() flag (not unmount); Escape/Ctrl+C closes.
147
+ // `q` quits/detaches the orchestrator view without authoritatively
148
+ // killing the workflow. The workflow remains resumable via
149
+ // `/workflow resume`; use `/workflow kill` for non-resumable disposal.
138
150
  if (matchesKey(data, "q")) {
139
151
  const run = this._getCurrentRun();
140
- const targetRunId = this._focusedStageTarget()?.runId ?? run?.id;
141
- const targetRun = targetRunId !== undefined
142
- ? this.currentSnapshot?.runs.find((candidate) => candidate.id === targetRunId)
143
- : undefined;
144
- if (targetRun && targetRun.endedAt === undefined && this.onKill) {
145
- this.onKill(targetRun.id);
152
+ if (run && run.endedAt === undefined && this.onQuit) {
153
+ this.onQuit(run.id);
146
154
  }
147
155
  this.onClose?.();
148
156
  return true;
@@ -265,6 +273,15 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
265
273
  return true;
266
274
  }
267
275
 
276
+ private _activateFocusedNode(): void {
277
+ // Enter and direct node clicks attach the popup interior to the focused
278
+ // stage. The attach shell swaps in the stage-chat view without remounting
279
+ // the overlay; without a callback, fall back to the legacy expand/collapse
280
+ // toggle so non-attach hosts still work.
281
+ if (this._attachFocusedStage()) return;
282
+ this.detailsExpanded = !this.detailsExpanded;
283
+ }
284
+
268
285
  private _attachFocusedStage(): boolean {
269
286
  if (!this.onStageAttach) return false;
270
287
  const node = this.cachedLayout[this.focusedIndex];
@@ -278,13 +295,6 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
278
295
  return true;
279
296
  }
280
297
 
281
- private _focusedStageTarget(): { runId: string; stageId: string } | undefined {
282
- const node = this.cachedLayout[this.focusedIndex];
283
- if (!node) return undefined;
284
- const target = expandedStageTarget(this.expandedGraph, node.stage.id);
285
- return target ? { runId: target.runId, stageId: target.stageId } : undefined;
286
- }
287
-
288
298
  private _setFocusedIndex(index: number): void {
289
299
  const max = Math.max(0, this.cachedLayout.length - 1);
290
300
  const next = Math.max(0, Math.min(index, max));
@@ -298,10 +308,55 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
298
308
  this.graphScrollOffset = Math.max(0, this.graphScrollOffset + deltaRows);
299
309
  }
300
310
 
311
+ private _graphNodeIndexForClick(data: string): number | null | undefined {
312
+ const click = this._sgrLeftMousePress(data);
313
+ if (!click) return undefined;
314
+ if (this.mode !== "overlay") return undefined;
315
+ if (this.cachedLayout.length === 0) return null;
316
+
317
+ for (const rect of this.graphNodeHitRects) {
318
+ if (
319
+ click.row >= rect.top &&
320
+ click.row < rect.bottom &&
321
+ click.col >= rect.left &&
322
+ click.col < rect.right
323
+ ) {
324
+ return rect.index;
325
+ }
326
+ }
327
+ return null;
328
+ }
329
+
330
+ private _parseSgrMouse(data: string): SgrMouseEvent | null {
331
+ const sgr = data.match(/^\x1b\[<(\d+);(\d+);(\d+)([Mm])$/);
332
+ if (!sgr) return null;
333
+ const oneBasedCol = Number.parseInt(sgr[2]!, 10);
334
+ const oneBasedRow = Number.parseInt(sgr[3]!, 10);
335
+ const final = sgr[4];
336
+ if (oneBasedCol < 1 || oneBasedRow < 1) return null;
337
+ if (final !== "M" && final !== "m") return null;
338
+ return {
339
+ buttonCode: Number.parseInt(sgr[1]!, 10),
340
+ col: oneBasedCol - 1,
341
+ row: oneBasedRow - 1,
342
+ final,
343
+ };
344
+ }
345
+
346
+ private _sgrLeftMousePress(data: string): { col: number; row: number } | null {
347
+ const sgr = this._parseSgrMouse(data);
348
+ if (!sgr || sgr.final !== "M") return null;
349
+ const buttonCode = sgr.buttonCode;
350
+ if ((buttonCode & 64) !== 0 || (buttonCode & 32) !== 0 || (buttonCode & 3) !== 0) {
351
+ return null;
352
+ }
353
+ return { col: sgr.col, row: sgr.row };
354
+ }
355
+
301
356
  private _mouseWheelDeltaRows(data: string): number {
302
- const sgr = data.match(/^\x1b\[<(\d+);\d+;\d+M$/);
303
- if (sgr) {
304
- return this._wheelDeltaForButtonCode(Number.parseInt(sgr[1]!, 10));
357
+ const sgr = this._parseSgrMouse(data);
358
+ if (sgr && sgr.final === "M") {
359
+ return this._wheelDeltaForButtonCode(sgr.buttonCode);
305
360
  }
306
361
  if (data.startsWith("\x1b[M") && data.length >= 6) {
307
362
  return this._wheelDeltaForButtonCode(data.charCodeAt(3) - 32);
@@ -330,4 +385,7 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
330
385
  get _graphScrollOffset(): number {
331
386
  return this.graphScrollOffset;
332
387
  }
388
+ get _graphScrollColOffset(): number {
389
+ return this.graphScrollColOffset;
390
+ }
333
391
  }
@@ -37,6 +37,7 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
37
37
 
38
38
  protected _renderOverlay(width: number): string[] {
39
39
  const frameWidth = Math.max(40, width);
40
+ this.lastOverlayFrameWidth = frameWidth;
40
41
  const lines: string[] = [];
41
42
  const run = this._getCurrentRun();
42
43
 
@@ -58,6 +59,10 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
58
59
  frameWidth,
59
60
  bodyTarget,
60
61
  );
62
+ this._recordGraphNodeHitRects(
63
+ this._overlayVerticalMarginRows() + 3 + visibleGraph.topPad,
64
+ visibleGraph.lines.length,
65
+ );
61
66
  for (let i = 0; i < visibleGraph.topPad; i++)
62
67
  lines.push(this._blankRow(frameWidth));
63
68
  for (const line of visibleGraph.lines) {
@@ -78,6 +83,8 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
78
83
  }
79
84
 
80
85
  protected _renderEmptyState(width: number): string[] {
86
+ this.graphNodeHitRects = [];
87
+ this.lastGraphViewport = null;
81
88
  const t = this.graphTheme;
82
89
  const muted = hexToAnsi(t.textMuted);
83
90
  const dim = hexToAnsi(t.dim);
@@ -34,6 +34,19 @@ export interface GraphStageCounts {
34
34
  skipped: number;
35
35
  }
36
36
 
37
+ interface GraphNodeHitRect {
38
+ index: number;
39
+ top: number;
40
+ bottom: number;
41
+ left: number;
42
+ right: number;
43
+ }
44
+
45
+ interface GraphViewportGeometry {
46
+ leftMargin: number;
47
+ viewportWidth: number;
48
+ }
49
+
37
50
  /** Expansion, focus, prompt, and store-backed layout state for GraphView. */
38
51
  export abstract class GraphViewState {
39
52
  protected mode: GraphViewMode;
@@ -41,7 +54,7 @@ export abstract class GraphViewState {
41
54
  protected store: Store;
42
55
  protected graphTheme: GraphTheme;
43
56
  protected onClose?: () => void;
44
- protected onKill?: (runId: string) => void;
57
+ protected onQuit?: (runId: string) => void;
45
58
  protected onHide?: () => void;
46
59
  protected onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
47
60
  protected onStageAttach?: (runId: string, stageId: string) => void;
@@ -64,6 +77,9 @@ export abstract class GraphViewState {
64
77
  protected currentSnapshot: StoreSnapshot | null = null;
65
78
  protected graphScrollOffset = 0;
66
79
  protected graphScrollColOffset = 0;
80
+ protected graphNodeHitRects: GraphNodeHitRect[] = [];
81
+ protected lastGraphViewport: GraphViewportGeometry | null = null;
82
+ protected lastOverlayFrameWidth = 80;
67
83
  protected pendingEnsureFocusedVisible = true;
68
84
  protected lastAutoFocusedAwaitingInputKey: string | null = null;
69
85
 
@@ -77,7 +93,7 @@ export abstract class GraphViewState {
77
93
  this.store = opts.store;
78
94
  this.graphTheme = opts.graphTheme;
79
95
  this.onClose = opts.onClose;
80
- this.onKill = opts.onKill;
96
+ this.onQuit = opts.onQuit;
81
97
  this.onHide = opts.onHide;
82
98
  this.onPromptResolve = opts.onPromptResolve;
83
99
  this.onStageAttach = opts.onStageAttach;
@@ -121,6 +137,8 @@ export abstract class GraphViewState {
121
137
  this.focusedIndex = 0;
122
138
  this.graphScrollOffset = 0;
123
139
  this.graphScrollColOffset = 0;
140
+ this.graphNodeHitRects = [];
141
+ this.lastGraphViewport = null;
124
142
  this.pendingEnsureFocusedVisible = true;
125
143
  this.promptState = null;
126
144
  return;
@@ -130,6 +148,8 @@ export abstract class GraphViewState {
130
148
  const graphStages = this._graphStages(run);
131
149
  const nextLayout = computeLayout(graphStages, { orientation: "vertical" });
132
150
  this.cachedLayout = nextLayout;
151
+ this.graphNodeHitRects = [];
152
+ this.lastGraphViewport = null;
133
153
 
134
154
  let focusNeedsReveal = this.pendingEnsureFocusedVisible;
135
155
  // One-shot: if the host passed `initialFocusedStageId`, snap the
@@ -10,12 +10,11 @@ export interface GraphViewOpts {
10
10
  graphTheme: GraphTheme;
11
11
  onClose?: () => void;
12
12
  /**
13
- * Invoked when the user presses `q` inside the pane on an in-flight
14
- * run. Fires immediately (no confirm) per the toggle-driven UX:
15
- * `h` hides without quitting; `q` is reserved for terminating the
16
- * current run.
13
+ * Invoked when the user presses `q` inside the pane. This quits/detaches
14
+ * the orchestrator view and leaves the workflow resumable; it must not use
15
+ * the `/workflow kill` terminal path.
17
16
  */
18
- onKill?: (runId: string) => void;
17
+ onQuit?: (runId: string) => void;
19
18
  /**
20
19
  * Invoked when the user presses `h` inside the pane. Hides without
21
20
  * unmounting (overlay-adapter calls `setHidden(true)`). Re-open via