@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
@@ -5,6 +5,8 @@ import type { StageSessionRuntime } from "./stage-runner-types.js";
5
5
  type TextLikeContent = {
6
6
  readonly type?: string;
7
7
  readonly text?: string;
8
+ readonly id?: string;
9
+ readonly name?: string;
8
10
  };
9
11
 
10
12
  type MessageWithTextContent = {
@@ -33,6 +35,52 @@ export function lastAssistantTextFromMessages(messages: AgentSession["messages"]
33
35
  return undefined;
34
36
  }
35
37
 
38
+ /**
39
+ * Artifact text for a successful `structured_output` call (issue #2198).
40
+ *
41
+ * Primary: the ordinary text of the exact assistant message that carried the
42
+ * successful tool call, so corrective attempts and later admitted turns cannot
43
+ * replace the pairing. Fallback: when that message carries no ordinary text —
44
+ * or the session no longer holds it after model-fallback recreation — the most
45
+ * recent earlier assistant message that carries text and makes no
46
+ * `structured_output` call. Assistant turns after the successful call never
47
+ * win. When neither side exists the caller writes an empty artifact and its
48
+ * receipt carries the standard empty-artifact warning; the companion
49
+ * transcript remains the recovery path.
50
+ */
51
+ export function assistantArtifactTextForToolCall(
52
+ messages: AgentSession["messages"],
53
+ toolCallId: string,
54
+ ): string | undefined {
55
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
56
+ const message = messages[index];
57
+ if (message?.role !== "assistant") continue;
58
+ const { content } = message as MessageWithTextContent;
59
+ if (!Array.isArray(content)) continue;
60
+ if (!content.some((block) => block.type === "toolCall" && block.id === toolCallId)) continue;
61
+ const text = extractMessageText(message);
62
+ if (text.trim().length > 0) return text;
63
+ return lastNonStructuredAssistantTextBefore(messages, index);
64
+ }
65
+ return lastNonStructuredAssistantTextBefore(messages, messages.length);
66
+ }
67
+
68
+ function lastNonStructuredAssistantTextBefore(
69
+ messages: AgentSession["messages"],
70
+ endIndex: number,
71
+ ): string | undefined {
72
+ for (let index = endIndex - 1; index >= 0; index -= 1) {
73
+ const message = messages[index];
74
+ if (message?.role !== "assistant") continue;
75
+ const { content } = message as MessageWithTextContent;
76
+ if (!Array.isArray(content)) continue;
77
+ if (content.some((block) => block.type === "toolCall" && block.name === "structured_output")) continue;
78
+ const text = extractMessageText(message);
79
+ if (text.trim().length > 0) return text;
80
+ }
81
+ return undefined;
82
+ }
83
+
36
84
  function messageStopReason(message: AgentSession["messages"][number]): string | undefined {
37
85
  const record = message as { readonly stopReason?: unknown };
38
86
  return typeof record.stopReason === "string" ? record.stopReason : undefined;
@@ -218,8 +218,11 @@ export function validatePromptOutputOptions(outputOptions: StageOutputOptions):
218
218
  * "done, see the file" and persist that sentence as its deliverable, which is a
219
219
  * foot-gun the workflow definition cannot see.
220
220
  */
221
- export function stageOutputInstruction(outputOptions: StageOutputOptions): string {
221
+ export function stageOutputInstruction(outputOptions: StageOutputOptions, hasStructuredOutput = false): string {
222
222
  if (typeof outputOptions.output !== "string" || outputOptions.output.length === 0) return "";
223
+ if (hasStructuredOutput) {
224
+ return "\n\n[This stage has two final output channels. In the same final assistant message, write the complete human-readable artifact as ordinary assistant text before calling structured_output. That text is saved verbatim as the artifact and is what later stages read; the structured_output tool arguments are the machine-readable result for workflow logic. Do not replace the artifact text with JSON or a pointer to another file. Files you write yourself are not the artifact.]";
225
+ }
223
226
  return "\n\n[This stage's final message is saved verbatim as its artifact and is what later stages read. Return the complete result in that message rather than a pointer to it. Files you write yourself are not the artifact.]";
224
227
  }
225
228
 
@@ -8,6 +8,15 @@ export const STRUCTURED_OUTPUT_MISSING_ERROR =
8
8
 
9
9
  const STRUCTURED_OUTPUT_TOOL_NAME = "structured_output";
10
10
 
11
+ export interface StructuredOutputExecutionSnapshot<TValue> {
12
+ readonly toolCallId: string;
13
+ readonly value: TValue;
14
+ }
15
+
16
+ export interface StructuredOutputExecutionCapture<TValue> {
17
+ snapshot?: StructuredOutputExecutionSnapshot<TValue>;
18
+ }
19
+
11
20
  type ToolResultContentBlock = {
12
21
  readonly type?: unknown;
13
22
  readonly text?: unknown;
@@ -36,7 +45,11 @@ export function structuredOutputToolErrorFromEvent(event: unknown): string | und
36
45
  return toolResultText(resultRecord?.content) ?? "structured_output tool call failed schema validation.";
37
46
  }
38
47
 
39
- export function formatStructuredOutputCorrectionPrompt(error: string, attempt: number): string {
48
+ export function formatStructuredOutputCorrectionPrompt(
49
+ error: string,
50
+ attempt: number,
51
+ needsArtifactText = false,
52
+ ): string {
40
53
  return [
41
54
  "The previous response failed this stage's structured-output contract.",
42
55
  "",
@@ -46,7 +59,10 @@ export function formatStructuredOutputCorrectionPrompt(error: string, attempt: n
46
59
  error,
47
60
  "",
48
61
  "You must finish by calling the `structured_output` tool exactly once with arguments matching the registered schema.",
49
- "Do not answer with plain JSON text, Markdown, or prose. If you attempted `structured_output` and validation failed, correct the tool arguments and call `structured_output` again.",
62
+ "If you attempted `structured_output` and validation failed, correct the tool arguments and call `structured_output` again.",
63
+ needsArtifactText
64
+ ? "In the same final assistant message, include the complete human-readable artifact as ordinary text before calling `structured_output`; the tool arguments are the separate machine-readable result. Do not put prose after the tool call, and do not write the artifact as plain JSON text or Markdown code."
65
+ : "Do not answer with plain JSON text, Markdown, or prose.",
50
66
  ].join("\n");
51
67
  }
52
68
 
@@ -60,11 +76,34 @@ export function stringifyStructuredOutputValue(value: unknown): string {
60
76
  }
61
77
  }
62
78
 
63
- export function stageOptionsWithStructuredOutput(
64
- options: StageOptions | undefined,
65
- capture: StructuredOutputCapture<unknown> | undefined,
79
+ export function stageOptionsWithStructuredOutput<TSchemaDef extends TSchema>(
80
+ options: StageOptions<TSchemaDef | undefined> | undefined,
81
+ capture: StructuredOutputCapture<Static<TSchemaDef>> | undefined,
82
+ executionCapture?: StructuredOutputExecutionCapture<Static<TSchemaDef>>,
66
83
  ): StageOptions | undefined {
67
84
  if (!options?.schema || !capture) return options;
85
+ const structuredOutputTool = createStructuredOutputTool({
86
+ schema: options.schema,
87
+ capture,
88
+ });
89
+ const executeStructuredOutput = structuredOutputTool.execute;
90
+ const capturedStructuredOutputTool = {
91
+ ...structuredOutputTool,
92
+ async execute(...args: Parameters<typeof executeStructuredOutput>) {
93
+ const result = await executeStructuredOutput(...args);
94
+ // Mirror the shared capture, which keeps the latest successful call:
95
+ // a model-fallback session recreation can execute the tool a second
96
+ // time, and the snapshot must describe the call the live session (and
97
+ // its messages) actually holds, not an abandoned earlier one.
98
+ if (executionCapture !== undefined && capture.called) {
99
+ executionCapture.snapshot = {
100
+ toolCallId: args[0],
101
+ value: args[1],
102
+ };
103
+ }
104
+ return result;
105
+ },
106
+ };
68
107
  const tools =
69
108
  options.tools === undefined
70
109
  ? options.noTools === "all"
@@ -76,12 +115,6 @@ export function stageOptionsWithStructuredOutput(
76
115
  ...options,
77
116
  ...(tools !== undefined ? { tools } : {}),
78
117
  ...(excludedTools !== undefined ? { excludedTools } : {}),
79
- customTools: [
80
- ...(options.customTools ?? []),
81
- createStructuredOutputTool({
82
- schema: options.schema as TSchema,
83
- capture: capture as StructuredOutputCapture<Static<TSchema>>,
84
- }),
85
- ],
118
+ customTools: [...(options.customTools ?? []), capturedStructuredOutputTool],
86
119
  };
87
120
  }
@@ -13,7 +13,12 @@ export type WorkflowCustomUiOverlayOptions = OverlayOptions;
13
13
  export type WorkflowCustomUiOverlayHandle = OverlayHandle;
14
14
  export type WorkflowCustomUiFactory<T> = (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (value: T) => void) => WorkflowCustomUiComponent | Promise<WorkflowCustomUiComponent>;
15
15
  export interface WorkflowCustomUiOptions {
16
- /** Render as a nested overlay. Workflow graph hosts may reject this when unsupported. */
16
+ /**
17
+ * Ask the host to render as an overlay. Workflow graph hosts accept this: the
18
+ * attached stage chat mounts the widget on its ordinary custom-UI slot, which
19
+ * already keeps the stage transcript visible behind it, instead of opening a
20
+ * nested overlay above the graph chrome.
21
+ */
17
22
  readonly overlay?: boolean;
18
23
  /** AbortSignal to programmatically dismiss the custom UI. */
19
24
  readonly signal?: AbortSignal;
@@ -98,6 +103,8 @@ export interface WorkflowToolOptions {
98
103
  readonly maxAttempts?: number;
99
104
  readonly intervalMs?: number;
100
105
  readonly backoffRate?: number;
106
+ /** Maximum duration in milliseconds for each callback attempt. */
107
+ readonly timeoutMs?: number;
101
108
  }
102
109
  export type WorkflowToolReturnOptions = WorkflowToolOptions & {
103
110
  readonly failureMode: "return";
@@ -265,6 +272,8 @@ export interface ToolNodeSnapshot extends WorkflowSerializableObject {
265
272
  /** Stable durable node identity. */
266
273
  readonly id: string;
267
274
  readonly name: string;
275
+ /** Exact invocation arguments retained for read-only graph inspection. */
276
+ readonly args?: Readonly<Record<string, WorkflowSerializableValue>>;
268
277
  readonly argsHash: string;
269
278
  readonly ordinal: number;
270
279
  readonly parentIds: readonly string[];
@@ -274,6 +283,11 @@ export interface ToolNodeSnapshot extends WorkflowSerializableObject {
274
283
  readonly executionOrder?: number;
275
284
  readonly startedAt?: number;
276
285
  readonly endedAt?: number;
286
+ readonly durationMs?: number;
287
+ /** Full serializable callback result, when one was retained. */
288
+ readonly result?: WorkflowSerializableValue;
289
+ /** Callback source captured from `fn.toString()` at registration. */
290
+ readonly source?: string;
277
291
  readonly resultSummary?: string;
278
292
  readonly error?: string;
279
293
  readonly attachable: false;
@@ -49,7 +49,12 @@ export type WorkflowCustomUiFactory<T> = (
49
49
  ) => WorkflowCustomUiComponent | Promise<WorkflowCustomUiComponent>;
50
50
 
51
51
  export interface WorkflowCustomUiOptions {
52
- /** Render as a nested overlay. Workflow graph hosts may reject this when unsupported. */
52
+ /**
53
+ * Ask the host to render as an overlay. Workflow graph hosts accept this: the
54
+ * attached stage chat mounts the widget on its ordinary custom-UI slot, which
55
+ * already keeps the stage transcript visible behind it, instead of opening a
56
+ * nested overlay above the graph chrome.
57
+ */
53
58
  readonly overlay?: boolean;
54
59
  /** AbortSignal to programmatically dismiss the custom UI. */
55
60
  readonly signal?: AbortSignal;
@@ -156,6 +161,8 @@ export interface WorkflowToolOptions {
156
161
  readonly maxAttempts?: number;
157
162
  readonly intervalMs?: number;
158
163
  readonly backoffRate?: number;
164
+ /** Maximum duration in milliseconds for each callback attempt. */
165
+ readonly timeoutMs?: number;
159
166
  }
160
167
 
161
168
  export type WorkflowToolReturnOptions = WorkflowToolOptions & { readonly failureMode: "return" };
@@ -369,6 +376,8 @@ export interface ToolNodeSnapshot extends WorkflowSerializableObject {
369
376
  /** Stable durable node identity. */
370
377
  readonly id: string;
371
378
  readonly name: string;
379
+ /** Exact invocation arguments retained for read-only graph inspection. */
380
+ readonly args?: Readonly<Record<string, WorkflowSerializableValue>>;
372
381
  readonly argsHash: string;
373
382
  readonly ordinal: number;
374
383
  readonly parentIds: readonly string[];
@@ -378,6 +387,11 @@ export interface ToolNodeSnapshot extends WorkflowSerializableObject {
378
387
  readonly executionOrder?: number;
379
388
  readonly startedAt?: number;
380
389
  readonly endedAt?: number;
390
+ readonly durationMs?: number;
391
+ /** Full serializable callback result, when one was retained. */
392
+ readonly result?: WorkflowSerializableValue;
393
+ /** Callback source captured from `fn.toString()` at registration. */
394
+ readonly source?: string;
381
395
  readonly resultSummary?: string;
382
396
  readonly error?: string;
383
397
  readonly attachable: false;
@@ -10,6 +10,7 @@ import type {
10
10
  WorkflowChildReplaySnapshot,
11
11
  WorkflowNotice,
12
12
  } from "./store-types.js";
13
+ import { boundedToolPayload, boundedToolPayloadRecord, boundedToolText } from "./tool-payload-bounds.js";
13
14
  import type { WorkflowOutputValues, WorkflowSerializableValue } from "./types.js";
14
15
 
15
16
  export const COMPACT_RESULT_FIELD_LIMIT = 1024;
@@ -115,7 +116,9 @@ function compactStage(stage: StageSnapshot): StageSnapshot {
115
116
  attemptedModels: _attemptedModels,
116
117
  modelAttempts: _modelAttempts,
117
118
  // Agent-stage results can be unbounded and graph cards do not render
118
- // them. Durable tool cards use ToolNodeSnapshot.resultSummary instead.
119
+ // them. Tool cards render a constant body, so `resultSummary` is kept
120
+ // for status surfaces while the bounded full payload below backs the
121
+ // read-only detail view.
119
122
  result: _result,
120
123
  ...metadata
121
124
  } = stage;
@@ -133,7 +136,16 @@ function compactStage(stage: StageSnapshot): StageSnapshot {
133
136
  }
134
137
 
135
138
  function compactToolNode(node: ToolNodeSnapshot): ToolNodeSnapshot {
136
- return { ...node, parentIds: [...node.parentIds] };
139
+ return {
140
+ ...node,
141
+ parentIds: [...node.parentIds],
142
+ // Author payloads may be cyclic, may throw on property access, and may be
143
+ // arbitrarily large. `boundedToolPayload` contains all three so building a
144
+ // snapshot cannot throw and one version cannot retain a whole payload.
145
+ ...(node.args !== undefined ? { args: boundedToolPayloadRecord(node.args) } : {}),
146
+ ...(node.result !== undefined ? { result: boundedToolPayload(node.result) } : {}),
147
+ ...(node.source !== undefined ? { source: boundedToolText(node.source) } : {}),
148
+ };
137
149
  }
138
150
 
139
151
  function compactRun(run: RunSnapshot): RunSnapshot {
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Kind-aware answers for primitive workflow HIL prompts.
3
+ *
4
+ * Workflow-tool payloads cross a model/provider boundary before they reach the
5
+ * prompt waiter. Normalize them while the pending prompt descriptor is still
6
+ * available, rather than letting each UI sink guess what a raw value means.
7
+ */
8
+
9
+ import type { PendingPrompt, PromptKind } from "./store-types.js";
10
+
11
+ export type PrimitivePromptKind = Exclude<PromptKind, "custom">;
12
+
13
+ export type PrimitivePrompt = Pick<PendingPrompt, "kind" | "choices" | "initial"> & {
14
+ readonly kind: PrimitivePromptKind;
15
+ };
16
+
17
+ type PrimitivePendingPrompt = PendingPrompt & { readonly kind: PrimitivePromptKind };
18
+
19
+ export function isPrimitivePrompt(prompt: PendingPrompt): prompt is PrimitivePendingPrompt {
20
+ return prompt.kind !== "custom";
21
+ }
22
+
23
+ export type PrimitivePromptAnswer = string | boolean;
24
+
25
+ export interface PromptAnswerAccepted {
26
+ readonly ok: true;
27
+ readonly value: PrimitivePromptAnswer;
28
+ }
29
+
30
+ export interface PromptAnswerRejected {
31
+ readonly ok: false;
32
+ }
33
+
34
+ export type PrimitivePromptAnswerResult = PromptAnswerAccepted | PromptAnswerRejected;
35
+
36
+ const CONFIRM_TRUE = new Set(["true", "yes", "y", "approve", "confirm"]);
37
+ const CONFIRM_FALSE = new Set(["false", "no", "n", "reject", "deny"]);
38
+
39
+ function normalizeText(value: string): string {
40
+ return value.trim().toLowerCase();
41
+ }
42
+
43
+ function accepted(value: PrimitivePromptAnswer): PromptAnswerAccepted {
44
+ return { ok: true, value };
45
+ }
46
+
47
+ function rejected(): PromptAnswerRejected {
48
+ return { ok: false };
49
+ }
50
+
51
+ function selectIndex(value: unknown, choiceCount: number): number | undefined {
52
+ if (typeof value === "number") {
53
+ return Number.isInteger(value) && value >= 1 && value <= choiceCount ? value - 1 : undefined;
54
+ }
55
+ if (typeof value !== "string") return undefined;
56
+ const trimmed = value.trim();
57
+ if (!/^[1-9]\d*$/u.test(trimmed)) return undefined;
58
+ const index = Number(trimmed);
59
+ return Number.isSafeInteger(index) && index <= choiceCount ? index - 1 : undefined;
60
+ }
61
+
62
+ function coerceConfirm(value: unknown): PrimitivePromptAnswerResult {
63
+ if (typeof value === "boolean") return accepted(value);
64
+ if (typeof value !== "string") return rejected();
65
+ const normalized = normalizeText(value);
66
+ if (CONFIRM_TRUE.has(normalized)) return accepted(true);
67
+ if (CONFIRM_FALSE.has(normalized)) return accepted(false);
68
+ return rejected();
69
+ }
70
+
71
+ function coerceSelect(choices: readonly string[], value: unknown): PrimitivePromptAnswerResult {
72
+ if (typeof value === "string") {
73
+ const normalized = normalizeText(value);
74
+ const choice = choices.find((candidate) => normalizeText(candidate) === normalized);
75
+ if (choice !== undefined) return accepted(choice);
76
+ }
77
+ const index = selectIndex(value, choices.length);
78
+ return index === undefined ? rejected() : accepted(choices[index]!);
79
+ }
80
+
81
+ /**
82
+ * Normalize a raw answer for a primitive prompt, or reject it.
83
+ *
84
+ * The `default` branch is unreachable through the guarded call sites, which all
85
+ * exclude `custom` prompts. It exists so a malformed descriptor is rejected
86
+ * rather than falling through to `undefined`, which would make
87
+ * `requirePrimitivePromptAnswer` throw a bare `TypeError` on `result.ok`.
88
+ */
89
+ export function coercePrimitivePromptAnswer(prompt: PrimitivePrompt, value: unknown): PrimitivePromptAnswerResult {
90
+ switch (prompt.kind) {
91
+ case "input":
92
+ case "editor":
93
+ return typeof value === "string" ? accepted(value) : rejected();
94
+ case "confirm":
95
+ return coerceConfirm(value);
96
+ case "select":
97
+ return coerceSelect(prompt.choices ?? [], value);
98
+ default:
99
+ return rejected();
100
+ }
101
+ }
102
+
103
+ /** Require a prompt answer to identify a value; defaults are reserved for abort/cancel paths. */
104
+ export function requirePrimitivePromptAnswer(prompt: PrimitivePrompt, value: unknown): PrimitivePromptAnswer {
105
+ const result = coercePrimitivePromptAnswer(prompt, value);
106
+ if (result.ok) return result.value;
107
+ throw new Error(
108
+ `atomic-workflows: Invalid ${prompt.kind} prompt answer. ${primitivePromptAnswerExpectation(prompt)}`,
109
+ );
110
+ }
111
+
112
+ /** Explain the only accepted workflow-tool answer shapes for a prompt. */
113
+ export function primitivePromptAnswerExpectation(prompt: PrimitivePrompt): string {
114
+ switch (prompt.kind) {
115
+ case "input":
116
+ case "editor":
117
+ return "Expected a text string in response, text, or message.";
118
+ case "confirm":
119
+ return "Expected a boolean or a case-insensitive trimmed string: true/false, yes/y, no/n, approve/reject, or confirm/deny.";
120
+ case "select":
121
+ return `Expected an exact choice label (case-insensitive, trimmed) or a 1-based numeric index. Available choices: ${prompt.choices?.join(", ") || "(none)"}.`;
122
+ default:
123
+ return "Expected an answer matching the pending prompt kind.";
124
+ }
125
+ }
126
+
127
+ /** Format a truthful workflow-send noop for an unusable primitive answer. */
128
+ export function primitivePromptAnswerRejection(promptId: string, prompt: PrimitivePrompt): string {
129
+ return `Invalid answer for ${prompt.kind} prompt ${promptId}. ${primitivePromptAnswerExpectation(prompt)}`;
130
+ }
@@ -0,0 +1,98 @@
1
+ import { sessionScopedExtensionState } from "@bastani/atomic";
2
+
3
+ /**
4
+ * Shared across duplicate copies of this module after a host scope is adopted.
5
+ * Windows' resolver can evaluate the same singleton file twice: one copy
6
+ * registers, the other adopts. A module-local `instance` then splits them.
7
+ *
8
+ * Construction records this copy's local in the process bag if the key is new,
9
+ * but `current()` / `facade` stay module-local until `adopt`. That keeps
10
+ * no-scope evaluations isolated. The first `adopt` claims the recorded local
11
+ * (the first constructor's populated object) into the host scope.
12
+ */
13
+ const SHARED_STATES_KEY = Symbol.for("atomic-workflows/session-scoped-singleton-pre-adoption@1");
14
+
15
+ interface SharedSingletonState<T extends object> {
16
+ local: T;
17
+ instance: T | undefined;
18
+ localClaimed: boolean;
19
+ }
20
+
21
+ interface ProcessSingletonStates {
22
+ readonly version: 1;
23
+ readonly byKey: Map<string, SharedSingletonState<object>>;
24
+ }
25
+
26
+ function processBag(): Record<symbol, ProcessSingletonStates | undefined> {
27
+ return globalThis as typeof globalThis & Record<symbol, ProcessSingletonStates | undefined>;
28
+ }
29
+
30
+ function recordLocal<T extends object>(key: string, local: T): SharedSingletonState<T> {
31
+ const bag = processBag();
32
+ let states = bag[SHARED_STATES_KEY];
33
+ if (states === undefined || states.version !== 1) {
34
+ states = { version: 1, byKey: new Map() };
35
+ bag[SHARED_STATES_KEY] = states;
36
+ }
37
+ const existing = states.byKey.get(key) as SharedSingletonState<T> | undefined;
38
+ if (existing !== undefined) return existing;
39
+ const created: SharedSingletonState<T> = { local, instance: undefined, localClaimed: false };
40
+ states.byKey.set(key, created as SharedSingletonState<object>);
41
+ return created;
42
+ }
43
+
44
+ /** Drop every shared slot so unit tests stay isolated. */
45
+ export function resetSessionScopedSingletonPreAdoptionForTests(): void {
46
+ delete processBag()[SHARED_STATES_KEY];
47
+ }
48
+
49
+ /**
50
+ * Stable facade over a run-scoped singleton that can re-bind to host
51
+ * session-scoped state after `/reload` re-evaluates the module graph.
52
+ *
53
+ * Local state seeds at most one unseen scope; later unseen scopes start fresh.
54
+ * After the first adopt, every module copy for the same key reads one instance.
55
+ */
56
+ export interface SessionScopedSingleton<T extends object> {
57
+ readonly facade: T;
58
+ readonly adopt: (scope: object) => T;
59
+ readonly current: () => T;
60
+ }
61
+
62
+ export function createSessionScopedSingleton<T extends object>(
63
+ key: string,
64
+ createLocal: () => T,
65
+ ): SessionScopedSingleton<T> {
66
+ const local = createLocal();
67
+ const shared = recordLocal(key, local);
68
+ let instance = local;
69
+
70
+ const live = (): T => shared.instance ?? instance;
71
+
72
+ const current = (): T => live();
73
+
74
+ const adopt = (scope: object): T => {
75
+ shared.instance = sessionScopedExtensionState(scope, key, () => {
76
+ if (shared.localClaimed) return createLocal();
77
+ shared.localClaimed = true;
78
+ return shared.local;
79
+ });
80
+ instance = shared.instance;
81
+ return shared.instance;
82
+ };
83
+
84
+ const facade = new Proxy(local, {
85
+ get(_target, prop) {
86
+ const value = Reflect.get(live(), prop, live());
87
+ if (typeof value === "function") {
88
+ return value.bind(live());
89
+ }
90
+ return value;
91
+ },
92
+ has(_target, prop) {
93
+ return Reflect.has(live(), prop);
94
+ },
95
+ });
96
+
97
+ return { facade, adopt, current };
98
+ }
@@ -7,6 +7,7 @@ import type {
7
7
  PiKeybindings,
8
8
  PiTheme,
9
9
  } from "../extension/wiring.js";
10
+ import { createSessionScopedSingleton } from "./session-scoped-singleton.js";
10
11
  import type { StageInputAnswer, StagePromptAdapter } from "./stage-prompt.js";
11
12
  import type { StagePromptAnswerSource, Store } from "./store.js";
12
13
  import { store as defaultStore } from "./store.js";
@@ -329,4 +330,11 @@ export async function mountStageCustomUi(
329
330
  return { request, component };
330
331
  }
331
332
 
332
- export const stageUiBroker = new StageUiBroker();
333
+ const SESSION_KEY = "workflows:stage-ui:v1";
334
+ const singleton = createSessionScopedSingleton(SESSION_KEY, () => new StageUiBroker());
335
+
336
+ export const stageUiBroker = singleton.facade;
337
+
338
+ export function adoptStageUiBroker(scope: object): StageUiBroker {
339
+ return singleton.adopt(scope);
340
+ }
@@ -1,3 +1,4 @@
1
+ import { createSessionScopedSingleton } from "./session-scoped-singleton.js";
1
2
  import { createStoreContext } from "./store-internal.js";
2
3
  import { createPromptStoreMethods } from "./store-prompt-methods.js";
3
4
  import type { Store } from "./store-public-types.js";
@@ -15,4 +16,11 @@ export function createStore(): Store {
15
16
  };
16
17
  }
17
18
 
18
- export const store: Store = createStore();
19
+ const SESSION_KEY = "workflows:store:v1";
20
+ const singleton = createSessionScopedSingleton(SESSION_KEY, createStore);
21
+
22
+ export const store: Store = singleton.facade;
23
+
24
+ export function adoptStore(scope: object): Store {
25
+ return singleton.adopt(scope);
26
+ }
@@ -106,7 +106,8 @@ export interface Store {
106
106
  recordToolNodeEnd(
107
107
  runId: string,
108
108
  nodeId: string,
109
- update: Pick<ToolNodeSnapshot, "status"> & Partial<Pick<ToolNodeSnapshot, "endedAt" | "resultSummary" | "error">>,
109
+ update: Pick<ToolNodeSnapshot, "status"> &
110
+ Partial<Pick<ToolNodeSnapshot, "endedAt" | "durationMs" | "result" | "resultSummary" | "error">>,
110
111
  ): boolean;
111
112
  /** Link a workflow boundary stage to its live child run before that child completes. */
112
113
  recordStageWorkflowChildRun(runId: string, stageId: string, ref: WorkflowChildRunRef): boolean;
@@ -1,6 +1,7 @@
1
1
  import { type StoreContext, TERMINAL_STATUSES } from "./store-internal.js";
2
2
  import type { Store } from "./store-public-types.js";
3
3
  import type { RunSnapshot, ToolNodeSnapshot } from "./store-types.js";
4
+ import { boundedToolPayload } from "./tool-payload-bounds.js";
4
5
 
5
6
  type ToolNodeStoreMethods = Pick<Store, "recordToolNodeStart" | "recordToolNodeRunning" | "recordToolNodeEnd">;
6
7
 
@@ -44,6 +45,12 @@ export function createToolNodeStoreMethods(context: StoreContext): ToolNodeStore
44
45
  return false;
45
46
  node.status = update.status;
46
47
  if (update.endedAt !== undefined) node.endedAt = update.endedAt;
48
+ if (update.durationMs !== undefined) node.durationMs = update.durationMs;
49
+ // The live store is read raw by session/status surfaces that clone and
50
+ // re-serialize it, so the author's result is detached and bounded here
51
+ // rather than aliased. The durable checkpoint keeps the exact output,
52
+ // which is what a cached replay returns.
53
+ if (update.result !== undefined) node.result = boundedToolPayload(update.result);
47
54
  if (update.resultSummary !== undefined) node.resultSummary = update.resultSummary;
48
55
  if (update.error !== undefined) node.error = update.error;
49
56
  context.bumpAndNotify();
@@ -3,7 +3,12 @@
3
3
  * cross-ref: spec §5.5
4
4
  */
5
5
 
6
- import type { WorkflowExitStatus, WorkflowInputValues, WorkflowOutputValues } from "./types.js";
6
+ import type {
7
+ WorkflowExitStatus,
8
+ WorkflowInputValues,
9
+ WorkflowOutputValues,
10
+ WorkflowSerializableValue,
11
+ } from "./types.js";
7
12
 
8
13
  export type RunStatus = "pending" | "running" | "paused" | WorkflowExitStatus | "killed";
9
14
  export type StageStatus =
@@ -23,6 +28,8 @@ export interface ToolNodeSnapshot {
23
28
  readonly kind: "tool";
24
29
  readonly id: string;
25
30
  readonly name: string;
31
+ /** Exact invocation arguments retained for read-only graph inspection. */
32
+ readonly args?: Readonly<Record<string, WorkflowSerializableValue>>;
26
33
  readonly argsHash: string;
27
34
  readonly ordinal: number;
28
35
  readonly parentIds: readonly string[];
@@ -35,8 +42,18 @@ export interface ToolNodeSnapshot {
35
42
  executionOrder?: number;
36
43
  startedAt?: number;
37
44
  endedAt?: number;
45
+ durationMs?: number;
46
+ /** Full serializable callback result, when one was retained. */
47
+ result?: WorkflowSerializableValue;
48
+ /**
49
+ * Callback source captured from `fn.toString()` when the call was
50
+ * registered. Inspection-only: capture never re-runs the callback, never
51
+ * reads a file, and never reaches past the value already in hand.
52
+ */
53
+ source?: string;
38
54
  resultSummary?: string;
39
55
  error?: string;
56
+ /** Tool nodes remain read-only graph inspection targets, never chat targets. */
40
57
  readonly attachable: false;
41
58
  }
42
59