@bastani/atomic 0.9.14-alpha.1 → 0.9.14-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  5. package/dist/builtin/mcp/package.json +4 -4
  6. package/dist/builtin/subagents/CHANGELOG.md +20 -0
  7. package/dist/builtin/subagents/README.md +6 -4
  8. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  10. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  13. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  14. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  15. package/dist/builtin/subagents/agents/debugger.md +1 -1
  16. package/dist/builtin/subagents/agents/worker.md +1 -1
  17. package/dist/builtin/subagents/package.json +6 -5
  18. package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
  19. package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
  20. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
  21. package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
  22. package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
  23. package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
  24. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  25. package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
  26. package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
  27. package/dist/builtin/subagents/src/agents/agents.ts +7 -5
  28. package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
  29. package/dist/builtin/subagents/src/agents/identity.ts +1 -1
  30. package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
  31. package/dist/builtin/subagents/src/agents/skills.ts +64 -6
  32. package/dist/builtin/subagents/src/extension/config.ts +1 -1
  33. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
  34. package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
  35. package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
  36. package/dist/builtin/subagents/src/extension/index.ts +23 -23
  37. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  38. package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
  39. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
  40. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
  41. package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
  42. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
  43. package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
  44. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  45. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
  46. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
  47. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
  48. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
  49. package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
  50. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
  51. package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
  52. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
  53. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
  54. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
  55. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
  56. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
  57. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
  58. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
  59. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
  60. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
  61. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
  62. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
  63. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
  64. package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
  65. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
  66. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
  67. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
  68. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
  69. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
  70. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
  71. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
  72. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
  73. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
  74. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
  75. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
  76. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  77. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
  78. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
  79. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
  80. package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
  81. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  82. package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
  83. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
  84. package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
  85. package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
  86. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
  87. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  88. package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
  89. package/dist/builtin/subagents/src/shared/settings.ts +4 -4
  90. package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
  91. package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
  92. package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
  93. package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
  94. package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
  95. package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
  96. package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
  97. package/dist/builtin/subagents/src/shared/types.ts +6 -6
  98. package/dist/builtin/subagents/src/shared/utils.ts +3 -3
  99. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
  100. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  101. package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
  102. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
  103. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  104. package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
  105. package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
  106. package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
  107. package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
  108. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  109. package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
  110. package/dist/builtin/subagents/src/tui/render.ts +4 -4
  111. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  112. package/dist/builtin/web-access/package.json +3 -3
  113. package/dist/builtin/workflows/CHANGELOG.md +57 -0
  114. package/dist/builtin/workflows/README.md +31 -9
  115. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  116. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  117. package/dist/builtin/workflows/builtin/goal-models.ts +10 -10
  118. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  119. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  120. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  121. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  122. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -25
  123. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  124. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  125. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  126. package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -15
  127. package/dist/builtin/workflows/builtin/ralph-models.ts +29 -29
  128. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  129. package/dist/builtin/workflows/package.json +2 -2
  130. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  131. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  132. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  133. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  134. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  135. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  136. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  137. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  138. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  139. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  140. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  141. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  142. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  143. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  144. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  146. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  147. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  148. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  149. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  150. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  151. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  152. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  153. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  154. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  155. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  156. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  157. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  158. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  159. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  160. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  161. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  162. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  163. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  164. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  165. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  166. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  167. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  173. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  175. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  176. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  177. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  178. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  179. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  180. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  181. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  182. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  183. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  184. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  185. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  189. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  190. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  191. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  192. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  193. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  194. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  226. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  227. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  228. package/dist/builtin/workflows/src/durable/completed-catalog.ts +10 -0
  229. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  230. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  231. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  232. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  233. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  234. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  235. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  236. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  237. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  238. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  239. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  240. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  241. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  242. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  243. package/dist/builtin/workflows/src/extension/index.bundle.mjs +2736 -1444
  244. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  245. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  246. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  247. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  248. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  249. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +32 -4
  250. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +19 -20
  251. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +27 -20
  252. package/dist/builtin/workflows/src/runs/foreground/executor.ts +4 -0
  253. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  254. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  255. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  256. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  258. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +15 -1
  259. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +15 -1
  260. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  261. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  262. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  263. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  264. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  265. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  266. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  267. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  268. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  269. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  270. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  271. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  272. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  273. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  274. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  275. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  276. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  277. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  278. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  279. package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +7 -8
  280. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  281. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  282. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  283. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  284. package/dist/cli/args.d.ts +1 -0
  285. package/dist/cli/args.d.ts.map +1 -1
  286. package/dist/cli/args.js +11 -0
  287. package/dist/cli/args.js.map +1 -1
  288. package/dist/cli/auth-check.d.ts +1 -1
  289. package/dist/cli/auth-check.js.map +1 -1
  290. package/dist/cli/credential-print.d.ts +1 -1
  291. package/dist/cli/credential-print.js.map +1 -1
  292. package/dist/cli/list-models.d.ts +1 -1
  293. package/dist/cli/list-models.js.map +1 -1
  294. package/dist/cli/startup-ui.d.ts +9 -0
  295. package/dist/cli/startup-ui.d.ts.map +1 -1
  296. package/dist/cli/startup-ui.js +7 -1
  297. package/dist/cli/startup-ui.js.map +1 -1
  298. package/dist/core/agent-session-custom-message-commit.js +2 -2
  299. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  300. package/dist/core/agent-session-export.d.ts +6 -1
  301. package/dist/core/agent-session-export.d.ts.map +1 -1
  302. package/dist/core/agent-session-export.js +6 -3
  303. package/dist/core/agent-session-export.js.map +1 -1
  304. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  305. package/dist/core/agent-session-extension-bindings.js +6 -4
  306. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  307. package/dist/core/agent-session-methods.d.ts +5 -2
  308. package/dist/core/agent-session-methods.d.ts.map +1 -1
  309. package/dist/core/agent-session-methods.js.map +1 -1
  310. package/dist/core/agent-session-prompt.d.ts +12 -1
  311. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  312. package/dist/core/agent-session-prompt.js +31 -10
  313. package/dist/core/agent-session-prompt.js.map +1 -1
  314. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  315. package/dist/core/agent-session-services.d.ts +1 -1
  316. package/dist/core/agent-session-services.js.map +1 -1
  317. package/dist/core/agent-session-skill-block.d.ts +1 -0
  318. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  319. package/dist/core/agent-session-skill-block.js +18 -2
  320. package/dist/core/agent-session-skill-block.js.map +1 -1
  321. package/dist/core/agent-session-state.d.ts.map +1 -1
  322. package/dist/core/agent-session-state.js +2 -1
  323. package/dist/core/agent-session-state.js.map +1 -1
  324. package/dist/core/agent-session-types.d.ts +2 -1
  325. package/dist/core/agent-session-types.d.ts.map +1 -1
  326. package/dist/core/agent-session-types.js.map +1 -1
  327. package/dist/core/agent-session.d.ts +1 -1
  328. package/dist/core/agent-session.js.map +1 -1
  329. package/dist/core/atomic-guide-command.js +2 -2
  330. package/dist/core/atomic-guide-command.js.map +1 -1
  331. package/dist/core/builtin-packages.d.ts.map +1 -1
  332. package/dist/core/builtin-packages.js +0 -6
  333. package/dist/core/builtin-packages.js.map +1 -1
  334. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  335. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  336. package/dist/core/cloudflare-gateway-binding.js +11 -0
  337. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  338. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  339. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  340. package/dist/core/codex-fast-mode-transport.js +130 -0
  341. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  342. package/dist/core/codex-fast-mode.d.ts +20 -6
  343. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  344. package/dist/core/codex-fast-mode.js +111 -3
  345. package/dist/core/codex-fast-mode.js.map +1 -1
  346. package/dist/core/diagnostics.d.ts +4 -0
  347. package/dist/core/diagnostics.d.ts.map +1 -1
  348. package/dist/core/diagnostics.js.map +1 -1
  349. package/dist/core/event-bus.d.ts +12 -0
  350. package/dist/core/event-bus.d.ts.map +1 -1
  351. package/dist/core/event-bus.js +22 -0
  352. package/dist/core/event-bus.js.map +1 -1
  353. package/dist/core/experimental.d.ts +25 -0
  354. package/dist/core/experimental.d.ts.map +1 -1
  355. package/dist/core/experimental.js +24 -0
  356. package/dist/core/experimental.js.map +1 -1
  357. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  358. package/dist/core/export-html/template.js +4 -3
  359. package/dist/core/extension-session-state.d.ts +28 -0
  360. package/dist/core/extension-session-state.d.ts.map +1 -0
  361. package/dist/core/extension-session-state.js +55 -0
  362. package/dist/core/extension-session-state.js.map +1 -0
  363. package/dist/core/extensions/api-types.d.ts +6 -0
  364. package/dist/core/extensions/api-types.d.ts.map +1 -1
  365. package/dist/core/extensions/api-types.js.map +1 -1
  366. package/dist/core/extensions/context-types.d.ts +4 -0
  367. package/dist/core/extensions/context-types.d.ts.map +1 -1
  368. package/dist/core/extensions/context-types.js.map +1 -1
  369. package/dist/core/extensions/loader-api.d.ts +1 -1
  370. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  371. package/dist/core/extensions/loader-api.js +16 -10
  372. package/dist/core/extensions/loader-api.js.map +1 -1
  373. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  374. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  375. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  376. package/dist/core/extensions/runner-context.d.ts +2 -0
  377. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  378. package/dist/core/extensions/runner-context.js +8 -0
  379. package/dist/core/extensions/runner-context.js.map +1 -1
  380. package/dist/core/extensions/runner.d.ts +1 -0
  381. package/dist/core/extensions/runner.d.ts.map +1 -1
  382. package/dist/core/extensions/runner.js +3 -0
  383. package/dist/core/extensions/runner.js.map +1 -1
  384. package/dist/core/extensions/runtime-types.d.ts +3 -0
  385. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  386. package/dist/core/extensions/runtime-types.js.map +1 -1
  387. package/dist/core/http-dispatcher.d.ts.map +1 -1
  388. package/dist/core/http-dispatcher.js +5 -0
  389. package/dist/core/http-dispatcher.js.map +1 -1
  390. package/dist/core/keybindings.d.ts +24 -0
  391. package/dist/core/keybindings.d.ts.map +1 -1
  392. package/dist/core/keybindings.js +6 -0
  393. package/dist/core/keybindings.js.map +1 -1
  394. package/dist/core/model-config.d.ts +5 -0
  395. package/dist/core/model-config.d.ts.map +1 -1
  396. package/dist/core/model-config.js +1 -0
  397. package/dist/core/model-config.js.map +1 -1
  398. package/dist/core/model-registry.d.ts +1 -1
  399. package/dist/core/model-registry.js.map +1 -1
  400. package/dist/core/model-resolver-cli.d.ts +1 -1
  401. package/dist/core/model-resolver-cli.js.map +1 -1
  402. package/dist/core/model-resolver-defaults.js +3 -3
  403. package/dist/core/model-resolver-defaults.js.map +1 -1
  404. package/dist/core/model-resolver-initial.d.ts +1 -1
  405. package/dist/core/model-resolver-initial.js.map +1 -1
  406. package/dist/core/model-resolver-scope.d.ts +1 -1
  407. package/dist/core/model-resolver-scope.js.map +1 -1
  408. package/dist/core/model-runtime.d.ts +54 -0
  409. package/dist/core/model-runtime.d.ts.map +1 -1
  410. package/dist/core/model-runtime.js +96 -13
  411. package/dist/core/model-runtime.js.map +1 -1
  412. package/dist/core/oauth-login.js.map +1 -1
  413. package/dist/core/project-trust.d.ts +10 -0
  414. package/dist/core/project-trust.d.ts.map +1 -1
  415. package/dist/core/project-trust.js +12 -0
  416. package/dist/core/project-trust.js.map +1 -1
  417. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  418. package/dist/core/resource-loader-assets.js +14 -5
  419. package/dist/core/resource-loader-assets.js.map +1 -1
  420. package/dist/core/resource-loader-core.d.ts +3 -0
  421. package/dist/core/resource-loader-core.d.ts.map +1 -1
  422. package/dist/core/resource-loader-core.js +5 -0
  423. package/dist/core/resource-loader-core.js.map +1 -1
  424. package/dist/core/resource-loader-internals.d.ts +2 -0
  425. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  426. package/dist/core/resource-loader-internals.js.map +1 -1
  427. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  428. package/dist/core/resource-loader-reload.js +2 -0
  429. package/dist/core/resource-loader-reload.js.map +1 -1
  430. package/dist/core/resource-loader-types.d.ts +2 -0
  431. package/dist/core/resource-loader-types.d.ts.map +1 -1
  432. package/dist/core/resource-loader-types.js.map +1 -1
  433. package/dist/core/resource-loader.d.ts +2 -0
  434. package/dist/core/resource-loader.d.ts.map +1 -1
  435. package/dist/core/resource-loader.js +1 -0
  436. package/dist/core/resource-loader.js.map +1 -1
  437. package/dist/core/sdk-types.d.ts +7 -6
  438. package/dist/core/sdk-types.d.ts.map +1 -1
  439. package/dist/core/sdk-types.js.map +1 -1
  440. package/dist/core/sdk.d.ts.map +1 -1
  441. package/dist/core/sdk.js +17 -6
  442. package/dist/core/sdk.js.map +1 -1
  443. package/dist/core/session-manager-core.d.ts +7 -1
  444. package/dist/core/session-manager-core.d.ts.map +1 -1
  445. package/dist/core/session-manager-core.js +11 -2
  446. package/dist/core/session-manager-core.js.map +1 -1
  447. package/dist/core/session-manager-entries.d.ts +2 -2
  448. package/dist/core/session-manager-entries.d.ts.map +1 -1
  449. package/dist/core/session-manager-entries.js +6 -4
  450. package/dist/core/session-manager-entries.js.map +1 -1
  451. package/dist/core/session-manager-list.d.ts.map +1 -1
  452. package/dist/core/session-manager-list.js +5 -1
  453. package/dist/core/session-manager-list.js.map +1 -1
  454. package/dist/core/session-manager-types.d.ts +25 -2
  455. package/dist/core/session-manager-types.d.ts.map +1 -1
  456. package/dist/core/session-manager-types.js.map +1 -1
  457. package/dist/core/session-manager.d.ts +1 -1
  458. package/dist/core/session-manager.d.ts.map +1 -1
  459. package/dist/core/session-manager.js.map +1 -1
  460. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  461. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  462. package/dist/core/settings-manager-basic-accessors.js +8 -0
  463. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  464. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  465. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  466. package/dist/core/settings-manager-ui-accessors.js +9 -0
  467. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  468. package/dist/core/settings-manager.d.ts +1 -1
  469. package/dist/core/settings-manager.d.ts.map +1 -1
  470. package/dist/core/settings-manager.js.map +1 -1
  471. package/dist/core/settings-types.d.ts +4 -0
  472. package/dist/core/settings-types.d.ts.map +1 -1
  473. package/dist/core/settings-types.js.map +1 -1
  474. package/dist/core/skill-catalog.d.ts +35 -0
  475. package/dist/core/skill-catalog.d.ts.map +1 -0
  476. package/dist/core/skill-catalog.js +264 -0
  477. package/dist/core/skill-catalog.js.map +1 -0
  478. package/dist/core/skills-async.d.ts.map +1 -1
  479. package/dist/core/skills-async.js +12 -6
  480. package/dist/core/skills-async.js.map +1 -1
  481. package/dist/core/skills.d.ts +2 -0
  482. package/dist/core/skills.d.ts.map +1 -1
  483. package/dist/core/skills.js +8 -5
  484. package/dist/core/skills.js.map +1 -1
  485. package/dist/core/slash-commands.d.ts.map +1 -1
  486. package/dist/core/slash-commands.js +1 -5
  487. package/dist/core/slash-commands.js.map +1 -1
  488. package/dist/core/system-prompt.js +2 -2
  489. package/dist/core/system-prompt.js.map +1 -1
  490. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +7 -3
  491. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  492. package/dist/core/tools/ask-user-question/ask-user-question.js +15 -10
  493. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  494. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +1 -0
  495. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts.map +1 -1
  496. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +1 -0
  497. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  498. package/dist/core/tools/ask-user-question/state/key-router.d.ts.map +1 -1
  499. package/dist/core/tools/ask-user-question/state/key-router.js +3 -1
  500. package/dist/core/tools/ask-user-question/state/key-router.js.map +1 -1
  501. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +3 -0
  502. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
  503. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +3 -0
  504. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  505. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts +1 -0
  506. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -1
  507. package/dist/core/tools/ask-user-question/state/state-reducer.js +3 -1
  508. package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -1
  509. package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts +2 -0
  510. package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts.map +1 -1
  511. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +1 -0
  512. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -1
  513. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts +3 -0
  514. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  515. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +2 -1
  516. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  517. package/dist/core/tools/bash.d.ts.map +1 -1
  518. package/dist/core/tools/bash.js +2 -0
  519. package/dist/core/tools/bash.js.map +1 -1
  520. package/dist/core/tools/edit-batch.d.ts +33 -0
  521. package/dist/core/tools/edit-batch.d.ts.map +1 -0
  522. package/dist/core/tools/edit-batch.js +89 -0
  523. package/dist/core/tools/edit-batch.js.map +1 -0
  524. package/dist/core/tools/edit.d.ts +1 -1
  525. package/dist/core/tools/edit.d.ts.map +1 -1
  526. package/dist/core/tools/edit.js +100 -42
  527. package/dist/core/tools/edit.js.map +1 -1
  528. package/dist/core/tools/find.d.ts.map +1 -1
  529. package/dist/core/tools/find.js +3 -1
  530. package/dist/core/tools/find.js.map +1 -1
  531. package/dist/core/tools/grep.js +1 -1
  532. package/dist/core/tools/grep.js.map +1 -1
  533. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  534. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  535. package/dist/core/tools/hashline-engine/format.js +4 -2
  536. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  537. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  538. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  539. package/dist/core/tools/hashline-engine/messages.js +4 -2
  540. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  541. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  542. package/dist/core/tools/hashline-engine/parser.js +16 -4
  543. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  544. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  545. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  546. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  547. package/dist/core/tools/hashline.d.ts.map +1 -1
  548. package/dist/core/tools/hashline.js +8 -2
  549. package/dist/core/tools/hashline.js.map +1 -1
  550. package/dist/core/tools/ls.d.ts.map +1 -1
  551. package/dist/core/tools/ls.js +2 -0
  552. package/dist/core/tools/ls.js.map +1 -1
  553. package/dist/core/tools/read.d.ts.map +1 -1
  554. package/dist/core/tools/read.js +8 -1
  555. package/dist/core/tools/read.js.map +1 -1
  556. package/dist/core/tools/search.d.ts.map +1 -1
  557. package/dist/core/tools/search.js +2 -0
  558. package/dist/core/tools/search.js.map +1 -1
  559. package/dist/core/tools/todos.d.ts +3 -12
  560. package/dist/core/tools/todos.d.ts.map +1 -1
  561. package/dist/core/tools/todos.js +19 -4
  562. package/dist/core/tools/todos.js.map +1 -1
  563. package/dist/core/tools/write.d.ts.map +1 -1
  564. package/dist/core/tools/write.js +2 -0
  565. package/dist/core/tools/write.js.map +1 -1
  566. package/dist/index.d.ts +8 -5
  567. package/dist/index.d.ts.map +1 -1
  568. package/dist/index.js +6 -2
  569. package/dist/index.js.map +1 -1
  570. package/dist/main-runtime-api-key.d.ts +1 -1
  571. package/dist/main-runtime-api-key.js.map +1 -1
  572. package/dist/main-session-options.d.ts +1 -1
  573. package/dist/main-session-options.js.map +1 -1
  574. package/dist/main.d.ts.map +1 -1
  575. package/dist/main.js +10 -2
  576. package/dist/main.js.map +1 -1
  577. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  578. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  579. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  580. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  581. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  582. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  583. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  584. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  586. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  587. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  588. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  589. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  590. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  591. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  592. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  593. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  594. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/model-selector.js +2 -1
  596. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  597. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  598. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  599. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  600. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  602. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  603. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  604. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  605. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  606. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  607. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  608. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  609. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  610. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  611. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  612. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/tool-execution.js +12 -1
  614. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  615. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  616. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  617. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  618. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  619. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  620. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  621. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  622. package/dist/modes/interactive/interactive-extension-custom-ui.js +2 -2
  623. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  624. package/dist/modes/interactive/interactive-mode-base.d.ts +38 -3
  625. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  626. package/dist/modes/interactive/interactive-mode-base.js +75 -10
  627. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  628. package/dist/modes/interactive/interactive-mode-surface.d.ts +7 -1
  629. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  630. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  631. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  632. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  633. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  634. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  635. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  636. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  637. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  638. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  639. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  640. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  641. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  642. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  643. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  644. package/dist/modes/interactive/interactive-selectors.js +7 -3
  645. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  646. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  647. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  648. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  649. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  650. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  651. package/dist/modes/interactive/interactive-startup.js +34 -9
  652. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  653. package/dist/modes/interactive/interactive-tui.d.ts +18 -1
  654. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  655. package/dist/modes/interactive/interactive-tui.js +126 -38
  656. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  657. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  658. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  659. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  660. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  661. package/dist/modes/interactive/theme/dark.json +2 -0
  662. package/dist/modes/interactive/theme/light.json +2 -0
  663. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  664. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  665. package/dist/modes/interactive/theme/theme-class.js +6 -1
  666. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  667. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  668. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  669. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  670. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  671. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  672. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  673. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  674. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  675. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  676. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  677. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  678. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  679. package/dist/modes/json-event.d.ts +6 -1
  680. package/dist/modes/json-event.d.ts.map +1 -1
  681. package/dist/modes/json-event.js +17 -2
  682. package/dist/modes/json-event.js.map +1 -1
  683. package/dist/modes/rpc/rpc-client.js.map +1 -1
  684. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  685. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  686. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  687. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  688. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  689. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  690. package/dist/modes/rpc/rpc-types.js.map +1 -1
  691. package/dist/package-manager-cli.js.map +1 -1
  692. package/dist/server/create-harness.d.ts.map +1 -1
  693. package/dist/server/create-harness.js +11 -0
  694. package/dist/server/create-harness.js.map +1 -1
  695. package/dist/utils/abort.d.ts +9 -0
  696. package/dist/utils/abort.d.ts.map +1 -0
  697. package/dist/utils/abort.js +19 -0
  698. package/dist/utils/abort.js.map +1 -0
  699. package/dist/utils/tools-manager.d.ts +16 -1
  700. package/dist/utils/tools-manager.d.ts.map +1 -1
  701. package/dist/utils/tools-manager.js +19 -19
  702. package/dist/utils/tools-manager.js.map +1 -1
  703. package/docs/custom-provider.md +9 -8
  704. package/docs/development.md +0 -1
  705. package/docs/docs.json +0 -1
  706. package/docs/environment-variables.md +3 -0
  707. package/docs/extensions.md +73 -2
  708. package/docs/json.md +3 -1
  709. package/docs/keybindings.md +7 -3
  710. package/docs/models/artificial-analysis-index.md +2 -2
  711. package/docs/models/model-selection.md +32 -23
  712. package/docs/models/pareto-efficiency.md +25 -24
  713. package/docs/providers.md +95 -2
  714. package/docs/quickstart.md +4 -2
  715. package/docs/rpc.md +21 -7
  716. package/docs/sdk.md +26 -1
  717. package/docs/session-format.md +5 -2
  718. package/docs/settings.md +34 -3
  719. package/docs/skills.md +16 -1
  720. package/docs/terminal-setup.md +15 -2
  721. package/docs/themes.md +22 -4
  722. package/docs/tools.md +4 -2
  723. package/docs/tui.md +2 -0
  724. package/docs/usage.md +5 -4
  725. package/docs/workflows.md +65 -22
  726. package/npm-shrinkwrap.json +247 -253
  727. package/package.json +11 -11
  728. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  729. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  730. package/dist/builtin/i-have-adhd/README.md +0 -18
  731. package/dist/builtin/i-have-adhd/index.ts +0 -238
  732. package/dist/builtin/i-have-adhd/package.json +0 -56
  733. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  734. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  735. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  736. package/docs/i-have-adhd.md +0 -36
@@ -3,6 +3,7 @@ export const WORKFLOW_TOOL_DESCRIPTION =
3
3
  "when workflow execution fits but another shape would better achieve the task, author a custom TypeScript workflow({...}) inline with normal coding tools, reload it, and run it; after successfully creating and reloading a newly authored custom workflow, report the folder containing its generated code as 'Custom workflow created. You can inspect its code at: <workflow-folder-path>'; do this only for newly created custom workflows, never builtin or pre-existing workflows; " +
4
4
  "discover with list/get/inputs/models, list session runs with status (no runId; statusFilter narrows the list), inspect status/stages/stage details, " +
5
5
  "send prompt answers or steering only while the root workflow is nonterminal, pause/resume/interrupt/quit runs, and reload workflow resources. " +
6
+ "For primitive prompt answers, use booleans or the documented confirm labels, exact case-insensitive select labels or 1-based indexes, and text strings for input/editor; an invalid answer remains pending and returns guidance instead of choosing a default. " +
6
7
  "For large stage handoffs, write context to files/artifacts, pass paths via reads, and prompt downstream agents to 'Read the file at <path>...' instead of injecting large previous text. " +
7
8
  "Wrap critical parts of run inputs and steering messages in <keepContext>...</keepContext> so compaction preserves them verbatim in the stages that inherit them; tag role constraints, prohibitions, must-hold criteria, and identifiers, not background or bulk reference material. " +
8
9
  "For transcripts, prefer status/stages/stage to get sessionFile/transcriptPath, " +
@@ -50,6 +51,8 @@ export const DEFAULT_PROMPT_GUIDANCE: string[] = [
50
51
  `**Workflow authoring and handoffs**:
51
52
  - When a user asks to create or edit a workflow, clarify only unresolved requirements that materially affect its purpose, inputs, stages, handoffs, validation, success criteria, or starter pattern. Read the workflow docs/examples, implement the TypeScript definition with normal coding tools, reload it, and run representative test inputs before presenting it. Use the create-spec skill when it adds value; it is not mandatory when context is already sufficient.
52
53
  - After creating and reloading a newly authored custom workflow, close the loop by stating the folder containing the workflow file just written, for example \`.atomic/workflows/\`, in this shape: \`Custom workflow created. You can inspect its code at: <workflow-folder-path>\`. Do this only for newly created custom workflows, never builtin or pre-existing workflows.
54
+ - Keep a small, readable workflow in one entry file. Do not split short one-use prompts, create one file per stage, add wrapper-only modules, hide the graph across files, or use line counts alone as a module boundary.
55
+ - When a meaningful source boundary improves clarity, reuse, ownership, or testability, keep the graph and control flow in the top-level workflow entry file and extract cohesive concerns such as long or reused prompt builders, shared TypeBox schemas and workflow-specific types, model-policy constants shared by several stages, deterministic helpers with their own testable behavior, or reusable child workflow definitions into a subdirectory below the top-level discovery directory — either one owned by a single workflow or a shared support directory. Project and user discovery scans only top-level \`.ts\`/\`.js\`/\`.mjs\`/\`.cjs\` files in the workflow directory, so those support modules are not scanned as extra top-level workflow candidates; use \`.js\` import extensions from TypeScript source.
53
56
  - When creating or editing a workflow that pins an explicit stage \`model\` or \`fallbackModels\`, consult \`packages/coding-agent/docs/models/model-selection.md\` for role-based recommendations, treating benchmark thinking levels as measurement configurations rather than universal workflow defaults, then call \`workflow({ action: "models" })\` to see the models actually present in the user's configured catalog. Use only the catalog's returned \`fullId\` values as model strings, and append a thinking suffix only when that exact level appears in the entry's \`availableThinkingLevels\`; apply the stage role and failure-cost policy independently to the primary and every fallback; treat an absent or empty \`availableThinkingLevels\` as no suffix support rather than inferring one. If a guide-recommended model for the role is unavailable, try another guide-recommended model that is present in the catalog. If the selected model does not support the role's level, choose another catalog model that does or leave the stage unpinned rather than inventing or silently promoting a level. An explicit user request for a level overrides the role default, but never fabricate an unsupported catalog level. If no recommendation intersects with the catalog, leave the stage unpinned rather than inventing a substitute, and mention the limitation, asking the user only if the workflow requires an explicit model choice. If the catalog is empty, continue with unpinned stages, state that no configured models were returned, and do not fabricate model IDs. Do not inspect or infer credentials, environment variables, auth files, token validity, entitlements, or the reason a model is absent; \`isCurrent\` marks the active selection, not a quality recommendation.
54
57
  - Consult docs/workflows.md and its starter patterns (Classify-and-act, Fan-out-and-synthesize, Adversarial verification, Generate-and-filter, Tournament, Loop until done, and Stacked implementation slices) when designing a stage graph.
55
58
  - Treat workflow composition as a first-class authoring option. Before duplicating stages, inspect reusable workflow modules and builtin exports; import their definitions and invoke them with \`ctx.workflow(...)\`, mapping typed inputs and consuming only declared outputs. Nested workflows can themselves import children, so combine small reusable graphs into a richer parent while respecting \`maxDepth\`.
@@ -61,7 +64,7 @@ export const DEFAULT_PROMPT_GUIDANCE: string[] = [
61
64
  - Bounded loops must create distinct tracked work for every iteration; never reopen an ancestor below its downstream work. Stacked implementation slices are unrolled, not looped: each slice gets a fresh child boundary and distinct tracked nodes, and no slice may add an edge back to the current frontier, itself, or an ancestor. If a retained session receives follow-up without new dependency work, keep it as non-topological activity metadata rather than adding a back-edge. Before launch, sketch nodes and dependencies for every branch and loop and reject any proposed parent edge to the node itself or an ancestor.
62
65
  - Treat dynamic graph validation during execution, replay, and DBOS hydration as the authoritative cycle boundary. If runtime topology code changes, require incremental edge checks and DBOS hydration validation; prompt guidance and TypeScript types cannot replace those runtime checks.
63
66
  - Every workflow invocation automatically receives one stable, non-default Intercom group. Intercom-capable stages inherit it, nested workflows keep the top-level invocation group, and subagents inherit their launching stage's group. Do not mint or thread group names through ordinary workflow definitions. Use an explicit \`group\` only for an intentional override: a named group or \`group: true\` creates a subgroup, while \`group: "default"\` opts into the shared default group. Stages without Intercom access receive no group, and \`contact_supervisor\` still crosses group boundaries for authorized escalation.
64
- - Prefer \`ctx.tool(name, args, fn)\` for workflow-owned TypeScript operations with side effects, such as filesystem writes, network mutations, and external API actions. It creates a tracked, non-attachable durable graph node before invoking \`fn\`; it may be used before, between, after, or without model stages. A completed \`ctx.tool\` call is durably checkpointed with its serializable result, so resume replays that result without rerunning \`fn\`. For checks that may fail during a bounded repair loop, opt into \`failureMode: "return"\`, branch on the typed outcome, and pass only the needed error fields to the repair stage or artifact yourself; Atomic does not inject failure evidence into later prompts. Cancellation and storage faults still throw. Keep pure computation and side-effect-free transformations as ordinary TypeScript. Do not wrap agent-stage internals or every function call indiscriminately; this rule applies to side effects orchestrated directly by the workflow definition.
67
+ - Prefer \`ctx.tool(name, args, fn)\` for workflow-owned TypeScript operations with side effects, such as filesystem writes, network mutations, and external API actions. It creates a tracked, non-attachable durable graph node before invoking \`fn\`; it may be used before, between, after, or without model stages. A completed \`ctx.tool\` call is durably checkpointed with its serializable result, so resume replays that result without rerunning \`fn\`. For checks that may fail during a bounded repair loop, opt into \`failureMode: "return"\`, branch on the typed outcome, and pass only the needed error fields to the repair stage or artifact yourself; Atomic does not inject failure evidence into later prompts. Retries do not bound a hung callback, so every \`ctx.tool\` callback that starts a child process or performs network I/O MUST set an explicit positive finite \`timeoutMs\` and forward the supplied \`signal\` to cancellable work. A timeout applies per attempt, aborts that attempt's signal, and gives retries a fresh deadline and signal. Cancellation and storage faults still throw. Keep pure computation and side-effect-free transformations as ordinary TypeScript. Do not wrap agent-stage internals or every function call indiscriminately; this rule applies to side effects orchestrated directly by the workflow definition.
65
68
  - Pass large stage context through files/artifacts and \`reads\` with an explicit \`Read the file at <path>...\` prompt rather than large \`previous\` payloads or injected session history.
66
69
  - Wrap critical stage-prompt content in \`<keepContext>\` / \`</keepContext>\`. Tagged content survives compression verbatim regardless of the compression ratio, and every line of the span including the tag lines is protected. A long-running stage will be compacted, and compaction ranks lines individually: an objective is verbose and restated while the constraint that narrows it is usually one line, so the constraint is the cheaper deletion and what survives reads as broader permission than intended. Tag role constraints that bound a stage to part of the work, acceptance criteria and immutable contracts, explicit prohibitions, and identifiers a stage must not lose such as a target branch, worktree path, or run ID. Do not tag bulk context: protected lines count against the keep target rather than raising it, so a large protected span makes the surrounding transcript compress harder — tag the constraint, not the material it applies to.
67
70
  - Separate implementation/review acceptance from explicitly authorized final actions such as PR/MR/review creation, release tagging, deployment, or publication. Stop implementation loops once acceptance is proven and carry a remaining final action separately.
@@ -1,5 +1,33 @@
1
1
  import { type Static, Type } from "typebox";
2
2
 
3
+ /**
4
+ * Advertise the JSON value types accepted by workflow-send responses.
5
+ *
6
+ * `Type.Unknown()` emits `{}`, which tells a provider nothing about this
7
+ * property. A retained session shows an assistant tool call that answered a
8
+ * `ctx.ui.confirm` prompt with the string `"true"` rather than a boolean, so
9
+ * naming the accepted types is worth doing. It is not the runtime fix: no
10
+ * inspected host or pi-ai layer converts a boolean to a string, and prompt-kind
11
+ * normalization happens at the pending-prompt boundary, not in provider
12
+ * argument validation.
13
+ *
14
+ * String comes first so validation does not convert text answers to booleans.
15
+ */
16
+ const WorkflowResponseSchema = Type.Union(
17
+ [
18
+ Type.String(),
19
+ Type.Boolean(),
20
+ Type.Number(),
21
+ Type.Null(),
22
+ Type.Array(Type.Unknown()),
23
+ Type.Record(Type.String(), Type.Unknown()),
24
+ ],
25
+ {
26
+ description:
27
+ "Answer payload for a pending stage prompt. Primitive prompts accept text strings, booleans, or numeric select indexes according to the prompt kind; structured prompts may accept JSON arrays or objects.",
28
+ },
29
+ );
30
+
3
31
  export const WorkflowParametersSchema = Type.Object(
4
32
  {
5
33
  workflow: Type.Optional(
@@ -114,11 +142,7 @@ export const WorkflowParametersSchema = Type.Object(
114
142
  description: "Text to send to a stage for prompt answers, steering, follow-ups, or resume messages.",
115
143
  }),
116
144
  ),
117
- response: Type.Optional(
118
- Type.Unknown({
119
- description: "Structured response payload for answering a pending stage prompt.",
120
- }),
121
- ),
145
+ response: Type.Optional(WorkflowResponseSchema),
122
146
  delivery: Type.Optional(
123
147
  Type.Union(
124
148
  [
@@ -10,6 +10,11 @@ import {
10
10
  expandedStageLabel,
11
11
  expandWorkflowGraph,
12
12
  } from "../shared/expanded-workflow-graph.js";
13
+ import {
14
+ coercePrimitivePromptAnswer,
15
+ isPrimitivePrompt,
16
+ primitivePromptAnswerRejection,
17
+ } from "../shared/prompt-answer.js";
13
18
  import { coerceStageInputAnswer, hasStageInputAnswerContent, type StageInputAnswer } from "../shared/stage-prompt.js";
14
19
  import { stageUiBroker } from "../shared/stage-ui-broker.js";
15
20
  import { store } from "../shared/store.js";
@@ -287,7 +292,33 @@ export async function workflowSendAction(
287
292
  `Input request ${promptId} was already answered.`,
288
293
  );
289
294
  }
290
- const ok = store.resolveStagePendingPrompt(stageRunId, stage.stageId, promptId, promptPayloadFromArgs(args), {
295
+ const rawPayload = promptPayloadFromArgs(args);
296
+ const pendingPrompt = snapshot?.pendingPrompt;
297
+ const primitivePrompt =
298
+ pendingPrompt?.id === promptId && isPrimitivePrompt(pendingPrompt) ? pendingPrompt : undefined;
299
+ if (primitivePrompt !== undefined) {
300
+ const coercedPayload = coercePrimitivePromptAnswer(primitivePrompt, rawPayload);
301
+ if (!coercedPayload.ok) {
302
+ return workflowSendResult(
303
+ stageRunId,
304
+ stage.stageId,
305
+ "answer",
306
+ "noop",
307
+ primitivePromptAnswerRejection(promptId, primitivePrompt),
308
+ );
309
+ }
310
+ const ok = store.resolveStagePendingPrompt(stageRunId, stage.stageId, promptId, coercedPayload.value, {
311
+ answerSource: "workflow_tool",
312
+ });
313
+ return workflowSendResult(
314
+ stageRunId,
315
+ stage.stageId,
316
+ "answer",
317
+ ok ? "ok" : "noop",
318
+ ok ? `Answered prompt ${promptId}.` : `No matching pending prompt ${promptId}.`,
319
+ );
320
+ }
321
+ const ok = store.resolveStagePendingPrompt(stageRunId, stage.stageId, promptId, rawPayload, {
291
322
  answerSource: "workflow_tool",
292
323
  });
293
324
  return workflowSendResult(
@@ -13,6 +13,8 @@
13
13
  * cross-ref: spec §8.1 Phase D (kill-runtime-wiring downstream)
14
14
  */
15
15
 
16
+ import { createSessionScopedSingleton } from "../../shared/session-scoped-singleton.js";
17
+
16
18
  // ---------------------------------------------------------------------------
17
19
  // Types
18
20
  // ---------------------------------------------------------------------------
@@ -123,4 +125,11 @@ export function createCancellationRegistry(): CancellationRegistry {
123
125
  * Singleton registry for the default runtime. Consumers needing isolation
124
126
  * should call createCancellationRegistry() instead.
125
127
  */
126
- export const cancellationRegistry: CancellationRegistry = createCancellationRegistry();
128
+ const SESSION_KEY = "workflows:cancellation:v1";
129
+ const singleton = createSessionScopedSingleton(SESSION_KEY, createCancellationRegistry);
130
+
131
+ export const cancellationRegistry: CancellationRegistry = singleton.facade;
132
+
133
+ export function adoptCancellationRegistry(scope: object): CancellationRegistry {
134
+ return singleton.adopt(scope);
135
+ }
@@ -9,6 +9,8 @@
9
9
  * cross-ref: spec detached-runner §job-tracker
10
10
  */
11
11
 
12
+ import { createSessionScopedSingleton } from "../../shared/session-scoped-singleton.js";
13
+
12
14
  // ---------------------------------------------------------------------------
13
15
  // Types
14
16
  // ---------------------------------------------------------------------------
@@ -113,4 +115,11 @@ export function createJobTracker(): JobTracker {
113
115
  /**
114
116
  * Singleton tracker for the default runtime.
115
117
  */
116
- export const jobTracker: JobTracker = createJobTracker();
118
+ const SESSION_KEY = "workflows:job-tracker:v1";
119
+ const singleton = createSessionScopedSingleton(SESSION_KEY, createJobTracker);
120
+
121
+ export const jobTracker: JobTracker = singleton.facade;
122
+
123
+ export function adoptJobTracker(scope: object): JobTracker {
124
+ return singleton.adopt(scope);
125
+ }
@@ -262,6 +262,8 @@ export function askUserQuestionToolEvent(event: unknown): AskUserQuestionToolEve
262
262
 
263
263
  export const READINESS_GATE_ADVANCE_LABEL = "I'm ready to move on to the next workflow stage.";
264
264
 
265
+ export const READINESS_GATE_CHAT_MESSAGE = "The user would like to chat more about this";
266
+
265
267
  const READINESS_GATE_ADVANCE_NORMALIZED = READINESS_GATE_ADVANCE_LABEL.trim().toLowerCase();
266
268
 
267
269
  export const READINESS_GATE_QUESTION_PARAMS = {
@@ -313,6 +315,32 @@ export function toolResultHasChatAnswer(result: unknown): boolean {
313
315
  return answers.some((a) => a !== null && typeof a === "object" && (a as Record<string, unknown>).kind === "chat");
314
316
  }
315
317
 
318
+ export type ReadinessDecision = { readonly action: "advance" } | { readonly action: "stay"; readonly message?: string };
319
+
320
+ function firstReadinessAnswer(result: unknown): Record<string, unknown> | undefined {
321
+ if (result === null || typeof result !== "object") return undefined;
322
+ const details = (result as Record<string, unknown>).details;
323
+ if (details === null || typeof details !== "object") return undefined;
324
+ const answers = (details as Record<string, unknown>).answers;
325
+ if (!Array.isArray(answers)) return undefined;
326
+ const first = answers[0];
327
+ return first !== null && typeof first === "object" ? (first as Record<string, unknown>) : undefined;
328
+ }
329
+
330
+ export function readinessStayMessage(result: unknown): string | undefined {
331
+ const first = firstReadinessAnswer(result);
332
+ if (first === undefined) return undefined;
333
+ if (first.kind === "chat") return READINESS_GATE_CHAT_MESSAGE;
334
+ if (first.kind !== "custom" || typeof first.answer !== "string") return undefined;
335
+ return first.answer.trim().length > 0 ? first.answer : undefined;
336
+ }
337
+
338
+ export function interpretReadinessResult(result: unknown): ReadinessDecision {
339
+ if (readinessResultMeansAdvance(result)) return { action: "advance" };
340
+ const message = readinessStayMessage(result);
341
+ return message !== undefined ? { action: "stay", message } : { action: "stay" };
342
+ }
343
+
316
344
  export { RESUME_CONTINUATION_PROMPT } from "../../shared/resume-continuation.js";
317
345
 
318
346
  export function shouldInjectResumeContinuation(state: {
@@ -327,7 +355,7 @@ export function shouldInjectResumeContinuation(state: {
327
355
  let cachedReadinessGateTool: ReturnType<typeof createAskUserQuestionToolDefinition> | undefined;
328
356
  function readinessGateTool(): ReturnType<typeof createAskUserQuestionToolDefinition> {
329
357
  if (cachedReadinessGateTool === undefined) {
330
- cachedReadinessGateTool = createAskUserQuestionToolDefinition();
358
+ cachedReadinessGateTool = createAskUserQuestionToolDefinition({ chatAsOption: true });
331
359
  }
332
360
  return cachedReadinessGateTool;
333
361
  }
@@ -336,9 +364,9 @@ export async function askReadinessViaStageBroker(
336
364
  runId: string,
337
365
  stageId: string,
338
366
  signal: AbortSignal,
339
- ): Promise<"advance" | "stay"> {
367
+ ): Promise<ReadinessDecision> {
340
368
  const execute = readinessGateTool().execute;
341
- if (execute === undefined) return "advance";
369
+ if (execute === undefined) return { action: "advance" };
342
370
  const gateContext = {
343
371
  hasUI: true,
344
372
  ui: {
@@ -368,7 +396,7 @@ export async function askReadinessViaStageBroker(
368
396
  undefined,
369
397
  gateContext as unknown as Parameters<typeof execute>[4],
370
398
  );
371
- return readinessResultMeansAdvance(result) ? "advance" : "stay";
399
+ return interpretReadinessResult(result);
372
400
  } finally {
373
401
  stageUiBroker.clearStagePrompt(runId, stageId);
374
402
  }
@@ -2,6 +2,7 @@ import type { DurableStageTopology } from "../../durable/types.js";
2
2
  import type { DurableUiReplayRequest } from "../../durable/ui-primitive.js";
3
3
  import type { GraphFrontierTracker } from "../../engine/graph-inference.js";
4
4
  import { appendStageEnd, appendStageStart } from "../../shared/persistence-session-entries.js";
5
+ import { requirePrimitivePromptAnswer } from "../../shared/prompt-answer.js";
5
6
  import { withPromptCallerStack } from "../../shared/prompt-callsite-context.js";
6
7
  import { stageUiBroker } from "../../shared/stage-ui-broker.js";
7
8
  import type { Store } from "../../shared/store.js";
@@ -221,8 +222,16 @@ export function buildPromptNodeUiAdapter(input: {
221
222
  if (shouldReplay) {
222
223
  await Promise.resolve();
223
224
  input.throwIfWorkflowExitSelected();
225
+ let response = replayAnswer.value;
226
+ try {
227
+ if (!isCustom) response = requirePrimitivePromptAnswer(descriptor, response);
228
+ } catch (err) {
229
+ applyFailureToStage(stageSnapshot, input.classifyExecutorFailure(err));
230
+ await finalizePromptStage("failed");
231
+ throw err;
232
+ }
224
233
  await finalizePromptStage("completed");
225
- return replayAnswer.value;
234
+ return response;
226
235
  }
227
236
 
228
237
  try {
@@ -234,15 +243,9 @@ export function buildPromptNodeUiAdapter(input: {
234
243
  }
235
244
 
236
245
  if (isCustom) {
237
- if (descriptor.options?.overlay === true) {
238
- const error = new Error(
239
- "atomic-workflows: ctx.ui.custom overlay mode is unavailable in the workflow graph viewer",
240
- );
241
- applyFailureToStage(stageSnapshot, input.classifyExecutorFailure(error));
242
- await finalizePromptStage("failed");
243
- throw error;
244
- }
245
-
246
+ // `overlay: true` is a placement hint the attached stage-chat host
247
+ // honours by mounting on its ordinary custom-UI slot, so a workflow
248
+ // asking for an overlay is served rather than failed here.
246
249
  const mergedSignal = mergeHilSignals(input.signal, descriptor.options?.signal);
247
250
  try {
248
251
  if (mergedSignal.signal.aborted) throw hilAbortError(mergedSignal.signal);
@@ -323,9 +326,10 @@ export function buildPromptNodeUiAdapter(input: {
323
326
  },
324
327
  );
325
328
  });
329
+ const normalizedResponse = requirePrimitivePromptAnswer(descriptor, response);
326
330
  await waitForExplicitResume();
327
331
  await finalizePromptStage("completed");
328
- return response;
332
+ return normalizedResponse;
329
333
  } catch (err) {
330
334
  if (input.signal.aborted) {
331
335
  input.preserveWorkflowExitSkippedReason(stageSnapshot, "run-aborted");
@@ -355,22 +359,17 @@ export function buildPromptNodeUiAdapter(input: {
355
359
  });
356
360
  },
357
361
  async input(promptText: string): Promise<string> {
358
- const response = await ask({ kind: "input", message: promptText });
359
- return typeof response === "string" ? response : String(response ?? "");
362
+ return (await ask({ kind: "input", message: promptText })) as string;
360
363
  },
361
364
  async confirm(message: string): Promise<boolean> {
362
- const response = await ask({ kind: "confirm", message });
363
- return response === true;
365
+ return (await ask({ kind: "confirm", message })) as boolean;
364
366
  },
365
367
  async select<T extends string>(message: string, options: readonly T[]): Promise<T> {
366
368
  if (options.length === 0) throw new Error("atomic-workflows: ctx.ui.select requires at least one option");
367
- const response = await ask({ kind: "select", message, choices: options });
368
- if (typeof response === "string" && (options as readonly string[]).includes(response)) return response as T;
369
- return options[0]!;
369
+ return (await ask({ kind: "select", message, choices: options })) as T;
370
370
  },
371
371
  async editor(initial?: string): Promise<string> {
372
- const response = await ask({ kind: "editor", message: "Edit and save to continue.", initial });
373
- return typeof response === "string" ? response : (initial ?? "");
372
+ return (await ask({ kind: "editor", message: "Edit and save to continue.", initial })) as string;
374
373
  },
375
374
  async custom<T>(factory: WorkflowCustomUiFactory<T>, options?: WorkflowCustomUiOptions): Promise<T> {
376
375
  const response = await ask(customPromptDescriptor(factory, options));
@@ -6,6 +6,7 @@ import { hasExplicitFastModeCandidate } from "./executor-direct-helpers.js";
6
6
  import {
7
7
  askReadinessViaStageBroker,
8
8
  RESUME_CONTINUATION_PROMPT,
9
+ type ReadinessDecision,
9
10
  shouldInjectResumeContinuation,
10
11
  } from "./executor-hil.js";
11
12
  import { applyFailureToStage } from "./executor-lifecycle.js";
@@ -45,7 +46,7 @@ export function createTrackedStageCaller(input: {
45
46
  const { runtime } = input;
46
47
  const readinessGateEnabled =
47
48
  runtime.opts.confirmStageReadiness !== undefined || runtime.opts.usePromptNodesForUi === true;
48
- const confirmReadiness = async (): Promise<"advance" | "stay"> => {
49
+ const confirmReadiness = async (): Promise<ReadinessDecision> => {
49
50
  try {
50
51
  if (runtime.opts.confirmStageReadiness !== undefined) {
51
52
  const ready = await runtime.opts.confirmStageReadiness({
@@ -54,11 +55,11 @@ export function createTrackedStageCaller(input: {
54
55
  stageName: runtime.name,
55
56
  signal: runtime.signal,
56
57
  });
57
- return ready ? "advance" : "stay";
58
+ return ready ? { action: "advance" } : { action: "stay" };
58
59
  }
59
60
  return await askReadinessViaStageBroker(runtime.runId, runtime.stageId, runtime.signal);
60
61
  } catch {
61
- return "advance";
62
+ return { action: "advance" };
62
63
  }
63
64
  };
64
65
 
@@ -230,27 +231,33 @@ export function createTrackedStageCaller(input: {
230
231
  try {
231
232
  while (runtime.state.askUserQuestionObservedThisTurn || repeatReadinessAfterChatTurn) {
232
233
  const decision = await confirmReadiness();
233
- if (decision === "advance") break;
234
+ if (decision.action === "advance") break;
234
235
  if (runtime.signal.aborted) break;
235
236
  runtime.state.askUserQuestionObservedThisTurn = false;
236
237
  runtime.state.chatAnswerObservedThisTurn = false;
237
- runtime.state.waitingForStageChatTurn = true;
238
- try {
239
- await runtime.raceStageSessionHeartbeat(
240
- raceAbort(
241
- new Promise<void>((resolve) => {
242
- resolveNextTurnEnd = resolve;
243
- runtime.state.wakeWaitingForStageChatTurn = resolve;
244
- }),
245
- runtime.signal,
246
- ),
247
- );
248
- } finally {
249
- runtime.state.wakeWaitingForStageChatTurn = undefined;
250
- runtime.state.waitingForStageChatTurn = false;
238
+ if (decision.message !== undefined) {
239
+ result = (await runtime.raceStageSessionHeartbeat(
240
+ raceAbort(runtime.innerCtx.prompt(decision.message), runtime.signal),
241
+ )) as T;
242
+ } else {
243
+ runtime.state.waitingForStageChatTurn = true;
244
+ try {
245
+ await runtime.raceStageSessionHeartbeat(
246
+ raceAbort(
247
+ new Promise<void>((resolve) => {
248
+ resolveNextTurnEnd = resolve;
249
+ runtime.state.wakeWaitingForStageChatTurn = resolve;
250
+ }),
251
+ runtime.signal,
252
+ ),
253
+ );
254
+ } finally {
255
+ runtime.state.wakeWaitingForStageChatTurn = undefined;
256
+ runtime.state.waitingForStageChatTurn = false;
257
+ }
258
+ if (runtime.signal.aborted) break;
259
+ result = (runtime.innerCtx.__getLastAssistantText() ?? result) as T;
251
260
  }
252
- if (runtime.signal.aborted) break;
253
- result = (runtime.innerCtx.__getLastAssistantText() ?? result) as T;
254
261
  const continuationDrain = await drainResumeContinuations(result);
255
262
  result = continuationDrain.result;
256
263
  repeatReadinessAfterChatTurn ||= continuationDrain.chatAnswerObserved;
@@ -7,12 +7,16 @@
7
7
  */
8
8
 
9
9
  export { raceAbort } from "./executor-abort.js";
10
+ export type { ReadinessDecision } from "./executor-hil.js";
10
11
  export {
11
12
  askReadinessViaStageBroker,
13
+ interpretReadinessResult,
12
14
  READINESS_GATE_ADVANCE_LABEL,
15
+ READINESS_GATE_CHAT_MESSAGE,
13
16
  READINESS_GATE_QUESTION_PARAMS,
14
17
  RESUME_CONTINUATION_PROMPT,
15
18
  readinessResultMeansAdvance,
19
+ readinessStayMessage,
16
20
  shouldInjectResumeContinuation,
17
21
  toolResultHasChatAnswer,
18
22
  } from "./executor-hil.js";
@@ -26,6 +26,7 @@
26
26
  */
27
27
 
28
28
  import type { AgentSession, AgentSessionEvent } from "@bastani/atomic";
29
+ import { createSessionScopedSingleton } from "../../shared/session-scoped-singleton.js";
29
30
  import type { StageDeliveryActivityEvent } from "./stage-delivery-activity.js";
30
31
  import type { StageQueuedUserMessages } from "./stage-queued-user-messages.js";
31
32
  import type { StageUserMessageDeliveryAction } from "./stage-runner-types.js";
@@ -188,6 +189,8 @@ export interface StageControlRegistry {
188
189
  get(runId: string, stageId: string): StageControlHandle | undefined;
189
190
  /** Resolve all currently-registered chat handles for a run. */
190
191
  forRun(runId: string): readonly StageControlHandle[];
192
+ /** True when this run currently has a registration map. */
193
+ has(runId: string): boolean;
191
194
  /** Build a run-level control aggregate. Cheap; not memoised. */
192
195
  run(runId: string): WorkflowRunControlHandle;
193
196
  /**
@@ -196,6 +199,13 @@ export interface StageControlRegistry {
196
199
  * their subscriptions when the host store is cleared.
197
200
  */
198
201
  clear(): void;
202
+ /**
203
+ * Drop only handles detached from run-level control (`controlsDependencies`
204
+ * false), disposing them through the background-dispose path. Live executor
205
+ * handles that still own workflow execution stay registered. Emptied run
206
+ * maps are pruned.
207
+ */
208
+ clearDetached(): void;
199
209
  }
200
210
 
201
211
  /**
@@ -415,6 +425,9 @@ export function createStageControlRegistry(): StageControlRegistry {
415
425
  if (!runMap) return [];
416
426
  return [...runMap.values()].map((entry) => entry.handle);
417
427
  },
428
+ has(runId: string): boolean {
429
+ return _byRun.has(runId);
430
+ },
418
431
  run(runId: string): WorkflowRunControlHandle {
419
432
  return makeRunHandle(runId);
420
433
  },
@@ -425,6 +438,16 @@ export function createStageControlRegistry(): StageControlRegistry {
425
438
  disposeEntryInBackground(entry, "atomic-workflows: stage handle dispose failed");
426
439
  }
427
440
  },
441
+ clearDetached(): void {
442
+ for (const [runId, runMap] of [..._byRun]) {
443
+ for (const [stageId, entry] of [...runMap]) {
444
+ if (entry.controlsDependencies) continue;
445
+ runMap.delete(stageId);
446
+ disposeEntryInBackground(entry, "atomic-workflows: detached stage handle dispose failed");
447
+ }
448
+ if (runMap.size === 0) _byRun.delete(runId);
449
+ }
450
+ },
428
451
  };
429
452
  }
430
453
 
@@ -433,4 +456,11 @@ export function createStageControlRegistry(): StageControlRegistry {
433
456
  * explicit instance via `RunOpts.stageControlRegistry`; the singleton
434
457
  * is the default consumer surface used by the extension factory.
435
458
  */
436
- export const stageControlRegistry: StageControlRegistry = createStageControlRegistry();
459
+ const SESSION_KEY = "workflows:stage-control:v1";
460
+ const singleton = createSessionScopedSingleton(SESSION_KEY, createStageControlRegistry);
461
+
462
+ export const stageControlRegistry: StageControlRegistry = singleton.facade;
463
+
464
+ export function adoptStageControlRegistry(scope: object): StageControlRegistry {
465
+ return singleton.adopt(scope);
466
+ }
@@ -1,7 +1,8 @@
1
1
  import { createStructuredOutputCapture, runCallback } from "@bastani/atomic";
2
+ import type { Static, TSchema } from "typebox";
2
3
  import type { StageExecutionMeta } from "../../shared/types.js";
3
4
  import { StageSessionController } from "./stage-runner-controller.js";
4
- import { assistantMessage } from "./stage-runner-messages.js";
5
+ import { assistantArtifactTextForToolCall, assistantMessage } from "./stage-runner-messages.js";
5
6
  import {
6
7
  finalizePromptOutput,
7
8
  splitPromptOptions,
@@ -12,6 +13,7 @@ import {
12
13
  formatStructuredOutputCorrectionPrompt,
13
14
  STRUCTURED_OUTPUT_MAX_CORRECTIVE_PROMPTS,
14
15
  STRUCTURED_OUTPUT_MISSING_ERROR,
16
+ type StructuredOutputExecutionCapture,
15
17
  stageOptionsWithStructuredOutput,
16
18
  stringifyStructuredOutputValue,
17
19
  } from "./stage-runner-structured-output.js";
@@ -19,8 +21,14 @@ import type { InternalStageContext, StageRunnerOpts } from "./stage-runner-types
19
21
 
20
22
  export function createStageContext(opts: StageRunnerOpts): InternalStageContext {
21
23
  const { stageId, stageName, adapters, runId, workflowIntercomGroup, signal, stageOptions, executionMode } = opts;
22
- const structuredOutputCapture = stageOptions?.schema ? createStructuredOutputCapture<unknown>() : undefined;
23
- const effectiveStageOptions = stageOptionsWithStructuredOutput(stageOptions, structuredOutputCapture);
24
+ const structuredOutputCapture = stageOptions?.schema ? createStructuredOutputCapture<Static<TSchema>>() : undefined;
25
+ const structuredOutputExecutionCapture: StructuredOutputExecutionCapture<Static<TSchema>> | undefined =
26
+ stageOptions?.schema ? {} : undefined;
27
+ const effectiveStageOptions = stageOptionsWithStructuredOutput(
28
+ stageOptions,
29
+ structuredOutputCapture,
30
+ structuredOutputExecutionCapture,
31
+ );
24
32
  const meta: StageExecutionMeta = {
25
33
  runId,
26
34
  stageId,
@@ -34,6 +42,7 @@ export function createStageContext(opts: StageRunnerOpts): InternalStageContext
34
42
  let lastAssistantText: string | undefined;
35
43
  let lastFinalizedOutput: string | undefined;
36
44
  let lastFinalizedMessageCount: number | undefined;
45
+ let structuredArtifactFinalized = false;
37
46
  let adapterMessages = [] as InternalStageContext["messages"];
38
47
 
39
48
  function runtimeCwd(): string {
@@ -43,7 +52,8 @@ export function createStageContext(opts: StageRunnerOpts): InternalStageContext
43
52
  function finalizedOutputIsCurrent(): boolean {
44
53
  return (
45
54
  lastFinalizedOutput !== undefined &&
46
- (lastFinalizedMessageCount === undefined ||
55
+ (structuredArtifactFinalized ||
56
+ lastFinalizedMessageCount === undefined ||
47
57
  controller.currentSession?.messages.length === lastFinalizedMessageCount)
48
58
  );
49
59
  }
@@ -54,9 +64,10 @@ export function createStageContext(opts: StageRunnerOpts): InternalStageContext
54
64
  async prompt(text, options) {
55
65
  const { sdkOptions, outputOptions } = splitPromptOptions(options);
56
66
  validatePromptOutputOptions(outputOptions);
67
+ const hasOutputArtifact = typeof outputOptions.output === "string" && outputOptions.output.length > 0;
57
68
  // The runtime owns the artifact write, so it states that contract itself
58
69
  // rather than relying on every workflow definition to describe it.
59
- const promptText = `${text}${stageOutputInstruction(outputOptions)}`;
70
+ const promptText = `${text}${stageOutputInstruction(outputOptions, structuredOutputCapture !== undefined)}`;
60
71
  if (structuredOutputCapture?.called) {
61
72
  throw new Error(
62
73
  "atomic-workflows: stage schema supports one prompt() call per stage context because structured_output may be called exactly once. Create a new ctx.stage(...) for each additional schema-backed prompt.",
@@ -97,19 +108,39 @@ export function createStageContext(opts: StageRunnerOpts): InternalStageContext
97
108
  throw new Error(structuredOutputError);
98
109
  }
99
110
  correctiveAttempts += 1;
100
- nextPrompt = formatStructuredOutputCorrectionPrompt(structuredOutputError, correctiveAttempts);
111
+ nextPrompt = formatStructuredOutputCorrectionPrompt(
112
+ structuredOutputError,
113
+ correctiveAttempts,
114
+ hasOutputArtifact,
115
+ );
116
+ }
117
+ const sessionMessages = controller.currentSession?.messages;
118
+ const executionSnapshot = structuredOutputExecutionCapture?.snapshot;
119
+ if (executionSnapshot === undefined) {
120
+ throw new Error(
121
+ "atomic-workflows: structured_output completed without an execution snapshot; the successful tool call could not be paired with its result.",
122
+ );
101
123
  }
102
- const rawStructuredText = stringifyStructuredOutputValue(structuredOutputCapture.value);
124
+ // The exact successful tool-call message owns the artifact. When it
125
+ // carries no ordinary text — or the session no longer holds it after
126
+ // model-fallback recreation — fall back to the last non-structured
127
+ // assistant text so an earlier-turn deliverable is not discarded
128
+ // (issue #2198); only when no prose exists anywhere is the artifact
129
+ // empty, and its receipt then carries the empty-artifact warning.
130
+ const rawOutputText = hasOutputArtifact
131
+ ? (assistantArtifactTextForToolCall(sessionMessages ?? [], executionSnapshot.toolCallId) ?? "")
132
+ : stringifyStructuredOutputValue(executionSnapshot.value);
103
133
  lastAssistantText = await finalizePromptOutput(
104
- rawStructuredText,
134
+ rawOutputText,
105
135
  outputOptions,
106
136
  runtimeCwd(),
107
137
  runId,
108
- controller.currentSession?.messages,
138
+ sessionMessages,
109
139
  );
110
140
  lastFinalizedOutput = lastAssistantText;
111
141
  lastFinalizedMessageCount = controller.currentSession?.messages.length;
112
- return structuredOutputCapture.value as never;
142
+ if (hasOutputArtifact) structuredArtifactFinalized = true;
143
+ return executionSnapshot.value as never;
113
144
  }
114
145
  await controller.promptWithFallback(promptText, sdkOptions);
115
146
  const rawText = controller.lastAssistantText(lastAssistantText) ?? "";