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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/package.json +3 -3
  5. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  6. package/dist/builtin/subagents/README.md +6 -4
  7. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  8. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  10. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  13. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  14. package/dist/builtin/subagents/agents/debugger.md +1 -1
  15. package/dist/builtin/subagents/agents/worker.md +1 -1
  16. package/dist/builtin/subagents/package.json +6 -5
  17. package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
  18. package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
  19. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
  20. package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
  21. package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
  22. package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
  23. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  24. package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
  25. package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
  26. package/dist/builtin/subagents/src/agents/agents.ts +7 -5
  27. package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
  28. package/dist/builtin/subagents/src/agents/identity.ts +1 -1
  29. package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
  30. package/dist/builtin/subagents/src/agents/skills.ts +64 -6
  31. package/dist/builtin/subagents/src/extension/config.ts +1 -1
  32. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
  33. package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
  34. package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
  35. package/dist/builtin/subagents/src/extension/index.ts +23 -23
  36. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  37. package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
  38. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
  39. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
  40. package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
  41. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
  42. package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
  43. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  44. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
  45. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
  46. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
  47. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
  49. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
  50. package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
  51. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
  52. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
  53. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
  54. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
  55. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
  56. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
  57. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
  58. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
  59. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
  60. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
  61. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
  62. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
  63. package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
  64. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
  65. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
  66. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
  67. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
  68. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
  69. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
  70. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
  71. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
  72. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
  73. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
  74. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
  75. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  76. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
  77. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
  78. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
  79. package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
  80. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  81. package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
  82. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
  83. package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
  84. package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
  85. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
  86. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  87. package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
  88. package/dist/builtin/subagents/src/shared/settings.ts +4 -4
  89. package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
  90. package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
  91. package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
  92. package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
  93. package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
  94. package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
  95. package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
  96. package/dist/builtin/subagents/src/shared/types.ts +6 -6
  97. package/dist/builtin/subagents/src/shared/utils.ts +3 -3
  98. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
  99. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
  101. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
  102. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  103. package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
  104. package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
  105. package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
  106. package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
  107. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  108. package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
  109. package/dist/builtin/subagents/src/tui/render.ts +4 -4
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/workflows/CHANGELOG.md +45 -0
  112. package/dist/builtin/workflows/README.md +30 -8
  113. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  114. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  115. package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
  116. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  117. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  118. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  119. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  120. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
  121. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  122. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  123. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  124. package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -15
  125. package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
  126. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  127. package/dist/builtin/workflows/package.json +2 -2
  128. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  129. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  130. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  131. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  132. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  133. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  134. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  135. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  136. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  137. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  138. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  139. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  140. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  141. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  142. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  143. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  144. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  146. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  147. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  148. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  149. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  150. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  151. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  152. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  153. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  154. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  155. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  156. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  157. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  158. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  159. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  160. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  161. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  162. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  163. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  164. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  165. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  166. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  167. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  173. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  174. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  175. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  176. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  177. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  178. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  179. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  180. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  181. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  182. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  183. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  184. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  185. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  187. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  188. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  189. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  190. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  191. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  192. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  193. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  194. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  224. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  225. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  226. package/dist/builtin/workflows/src/durable/completed-catalog.ts +10 -0
  227. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  228. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  229. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  230. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  231. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  232. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  233. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  234. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  235. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  236. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  237. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  238. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  239. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  240. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  241. package/dist/builtin/workflows/src/extension/index.bundle.mjs +2680 -1418
  242. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  243. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  244. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  245. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  246. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  247. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
  248. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  249. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  250. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  251. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  252. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  253. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +9 -0
  254. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +9 -0
  255. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  256. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  257. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  258. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  259. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  260. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  261. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  262. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  263. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  264. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  265. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  266. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  267. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  268. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  269. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  270. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  271. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  272. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  273. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  274. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  275. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  276. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  277. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  278. package/dist/cli/args.d.ts +1 -0
  279. package/dist/cli/args.d.ts.map +1 -1
  280. package/dist/cli/args.js +11 -0
  281. package/dist/cli/args.js.map +1 -1
  282. package/dist/cli/auth-check.d.ts +1 -1
  283. package/dist/cli/auth-check.js.map +1 -1
  284. package/dist/cli/credential-print.d.ts +1 -1
  285. package/dist/cli/credential-print.js.map +1 -1
  286. package/dist/cli/list-models.d.ts +1 -1
  287. package/dist/cli/list-models.js.map +1 -1
  288. package/dist/cli/startup-ui.d.ts +9 -0
  289. package/dist/cli/startup-ui.d.ts.map +1 -1
  290. package/dist/cli/startup-ui.js +7 -1
  291. package/dist/cli/startup-ui.js.map +1 -1
  292. package/dist/core/agent-session-custom-message-commit.js +2 -2
  293. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  294. package/dist/core/agent-session-export.d.ts +6 -1
  295. package/dist/core/agent-session-export.d.ts.map +1 -1
  296. package/dist/core/agent-session-export.js +6 -3
  297. package/dist/core/agent-session-export.js.map +1 -1
  298. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  299. package/dist/core/agent-session-extension-bindings.js +6 -4
  300. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  301. package/dist/core/agent-session-methods.d.ts +5 -2
  302. package/dist/core/agent-session-methods.d.ts.map +1 -1
  303. package/dist/core/agent-session-methods.js.map +1 -1
  304. package/dist/core/agent-session-prompt.d.ts +12 -1
  305. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  306. package/dist/core/agent-session-prompt.js +31 -10
  307. package/dist/core/agent-session-prompt.js.map +1 -1
  308. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  309. package/dist/core/agent-session-services.d.ts +1 -1
  310. package/dist/core/agent-session-services.js.map +1 -1
  311. package/dist/core/agent-session-skill-block.d.ts +1 -0
  312. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  313. package/dist/core/agent-session-skill-block.js +18 -2
  314. package/dist/core/agent-session-skill-block.js.map +1 -1
  315. package/dist/core/agent-session-state.d.ts.map +1 -1
  316. package/dist/core/agent-session-state.js +2 -1
  317. package/dist/core/agent-session-state.js.map +1 -1
  318. package/dist/core/agent-session-types.d.ts +2 -1
  319. package/dist/core/agent-session-types.d.ts.map +1 -1
  320. package/dist/core/agent-session-types.js.map +1 -1
  321. package/dist/core/agent-session.d.ts +1 -1
  322. package/dist/core/agent-session.js.map +1 -1
  323. package/dist/core/atomic-guide-command.js +2 -2
  324. package/dist/core/atomic-guide-command.js.map +1 -1
  325. package/dist/core/builtin-packages.d.ts.map +1 -1
  326. package/dist/core/builtin-packages.js +0 -6
  327. package/dist/core/builtin-packages.js.map +1 -1
  328. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  329. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  330. package/dist/core/cloudflare-gateway-binding.js +11 -0
  331. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  332. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  333. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  334. package/dist/core/codex-fast-mode-transport.js +130 -0
  335. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  336. package/dist/core/codex-fast-mode.d.ts +20 -6
  337. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  338. package/dist/core/codex-fast-mode.js +111 -3
  339. package/dist/core/codex-fast-mode.js.map +1 -1
  340. package/dist/core/diagnostics.d.ts +4 -0
  341. package/dist/core/diagnostics.d.ts.map +1 -1
  342. package/dist/core/diagnostics.js.map +1 -1
  343. package/dist/core/event-bus.d.ts +12 -0
  344. package/dist/core/event-bus.d.ts.map +1 -1
  345. package/dist/core/event-bus.js +22 -0
  346. package/dist/core/event-bus.js.map +1 -1
  347. package/dist/core/experimental.d.ts +25 -0
  348. package/dist/core/experimental.d.ts.map +1 -1
  349. package/dist/core/experimental.js +24 -0
  350. package/dist/core/experimental.js.map +1 -1
  351. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  352. package/dist/core/export-html/template.js +4 -3
  353. package/dist/core/extension-session-state.d.ts +28 -0
  354. package/dist/core/extension-session-state.d.ts.map +1 -0
  355. package/dist/core/extension-session-state.js +55 -0
  356. package/dist/core/extension-session-state.js.map +1 -0
  357. package/dist/core/extensions/api-types.d.ts +6 -0
  358. package/dist/core/extensions/api-types.d.ts.map +1 -1
  359. package/dist/core/extensions/api-types.js.map +1 -1
  360. package/dist/core/extensions/context-types.d.ts +4 -0
  361. package/dist/core/extensions/context-types.d.ts.map +1 -1
  362. package/dist/core/extensions/context-types.js.map +1 -1
  363. package/dist/core/extensions/loader-api.d.ts +1 -1
  364. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  365. package/dist/core/extensions/loader-api.js +16 -10
  366. package/dist/core/extensions/loader-api.js.map +1 -1
  367. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  368. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  369. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  370. package/dist/core/extensions/runner-context.d.ts +2 -0
  371. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  372. package/dist/core/extensions/runner-context.js +8 -0
  373. package/dist/core/extensions/runner-context.js.map +1 -1
  374. package/dist/core/extensions/runner.d.ts +1 -0
  375. package/dist/core/extensions/runner.d.ts.map +1 -1
  376. package/dist/core/extensions/runner.js +3 -0
  377. package/dist/core/extensions/runner.js.map +1 -1
  378. package/dist/core/extensions/runtime-types.d.ts +3 -0
  379. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  380. package/dist/core/extensions/runtime-types.js.map +1 -1
  381. package/dist/core/http-dispatcher.d.ts.map +1 -1
  382. package/dist/core/http-dispatcher.js +5 -0
  383. package/dist/core/http-dispatcher.js.map +1 -1
  384. package/dist/core/keybindings.d.ts +24 -0
  385. package/dist/core/keybindings.d.ts.map +1 -1
  386. package/dist/core/keybindings.js +6 -0
  387. package/dist/core/keybindings.js.map +1 -1
  388. package/dist/core/model-config.d.ts +5 -0
  389. package/dist/core/model-config.d.ts.map +1 -1
  390. package/dist/core/model-config.js +1 -0
  391. package/dist/core/model-config.js.map +1 -1
  392. package/dist/core/model-registry.d.ts +1 -1
  393. package/dist/core/model-registry.js.map +1 -1
  394. package/dist/core/model-resolver-cli.d.ts +1 -1
  395. package/dist/core/model-resolver-cli.js.map +1 -1
  396. package/dist/core/model-resolver-defaults.js +3 -3
  397. package/dist/core/model-resolver-defaults.js.map +1 -1
  398. package/dist/core/model-resolver-initial.d.ts +1 -1
  399. package/dist/core/model-resolver-initial.js.map +1 -1
  400. package/dist/core/model-resolver-scope.d.ts +1 -1
  401. package/dist/core/model-resolver-scope.js.map +1 -1
  402. package/dist/core/model-runtime.d.ts +54 -0
  403. package/dist/core/model-runtime.d.ts.map +1 -1
  404. package/dist/core/model-runtime.js +96 -13
  405. package/dist/core/model-runtime.js.map +1 -1
  406. package/dist/core/oauth-login.js.map +1 -1
  407. package/dist/core/project-trust.d.ts +10 -0
  408. package/dist/core/project-trust.d.ts.map +1 -1
  409. package/dist/core/project-trust.js +12 -0
  410. package/dist/core/project-trust.js.map +1 -1
  411. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  412. package/dist/core/resource-loader-assets.js +14 -5
  413. package/dist/core/resource-loader-assets.js.map +1 -1
  414. package/dist/core/resource-loader-core.d.ts +3 -0
  415. package/dist/core/resource-loader-core.d.ts.map +1 -1
  416. package/dist/core/resource-loader-core.js +5 -0
  417. package/dist/core/resource-loader-core.js.map +1 -1
  418. package/dist/core/resource-loader-internals.d.ts +2 -0
  419. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  420. package/dist/core/resource-loader-internals.js.map +1 -1
  421. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  422. package/dist/core/resource-loader-reload.js +2 -0
  423. package/dist/core/resource-loader-reload.js.map +1 -1
  424. package/dist/core/resource-loader-types.d.ts +2 -0
  425. package/dist/core/resource-loader-types.d.ts.map +1 -1
  426. package/dist/core/resource-loader-types.js.map +1 -1
  427. package/dist/core/resource-loader.d.ts +2 -0
  428. package/dist/core/resource-loader.d.ts.map +1 -1
  429. package/dist/core/resource-loader.js +1 -0
  430. package/dist/core/resource-loader.js.map +1 -1
  431. package/dist/core/sdk-types.d.ts +7 -6
  432. package/dist/core/sdk-types.d.ts.map +1 -1
  433. package/dist/core/sdk-types.js.map +1 -1
  434. package/dist/core/sdk.d.ts.map +1 -1
  435. package/dist/core/sdk.js +17 -6
  436. package/dist/core/sdk.js.map +1 -1
  437. package/dist/core/session-manager-core.d.ts +7 -1
  438. package/dist/core/session-manager-core.d.ts.map +1 -1
  439. package/dist/core/session-manager-core.js +11 -2
  440. package/dist/core/session-manager-core.js.map +1 -1
  441. package/dist/core/session-manager-entries.d.ts +2 -2
  442. package/dist/core/session-manager-entries.d.ts.map +1 -1
  443. package/dist/core/session-manager-entries.js +6 -4
  444. package/dist/core/session-manager-entries.js.map +1 -1
  445. package/dist/core/session-manager-list.d.ts.map +1 -1
  446. package/dist/core/session-manager-list.js +5 -1
  447. package/dist/core/session-manager-list.js.map +1 -1
  448. package/dist/core/session-manager-types.d.ts +25 -2
  449. package/dist/core/session-manager-types.d.ts.map +1 -1
  450. package/dist/core/session-manager-types.js.map +1 -1
  451. package/dist/core/session-manager.d.ts +1 -1
  452. package/dist/core/session-manager.d.ts.map +1 -1
  453. package/dist/core/session-manager.js.map +1 -1
  454. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  455. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  456. package/dist/core/settings-manager-basic-accessors.js +8 -0
  457. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  458. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  459. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  460. package/dist/core/settings-manager-ui-accessors.js +9 -0
  461. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  462. package/dist/core/settings-manager.d.ts +1 -1
  463. package/dist/core/settings-manager.d.ts.map +1 -1
  464. package/dist/core/settings-manager.js.map +1 -1
  465. package/dist/core/settings-types.d.ts +4 -0
  466. package/dist/core/settings-types.d.ts.map +1 -1
  467. package/dist/core/settings-types.js.map +1 -1
  468. package/dist/core/skill-catalog.d.ts +35 -0
  469. package/dist/core/skill-catalog.d.ts.map +1 -0
  470. package/dist/core/skill-catalog.js +264 -0
  471. package/dist/core/skill-catalog.js.map +1 -0
  472. package/dist/core/skills-async.d.ts.map +1 -1
  473. package/dist/core/skills-async.js +12 -6
  474. package/dist/core/skills-async.js.map +1 -1
  475. package/dist/core/skills.d.ts +2 -0
  476. package/dist/core/skills.d.ts.map +1 -1
  477. package/dist/core/skills.js +8 -5
  478. package/dist/core/skills.js.map +1 -1
  479. package/dist/core/slash-commands.d.ts.map +1 -1
  480. package/dist/core/slash-commands.js +1 -5
  481. package/dist/core/slash-commands.js.map +1 -1
  482. package/dist/core/system-prompt.js +2 -2
  483. package/dist/core/system-prompt.js.map +1 -1
  484. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +4 -2
  485. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  486. package/dist/core/tools/ask-user-question/ask-user-question.js +13 -9
  487. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  488. package/dist/core/tools/bash.d.ts.map +1 -1
  489. package/dist/core/tools/bash.js +2 -0
  490. package/dist/core/tools/bash.js.map +1 -1
  491. package/dist/core/tools/edit.d.ts.map +1 -1
  492. package/dist/core/tools/edit.js +2 -0
  493. package/dist/core/tools/edit.js.map +1 -1
  494. package/dist/core/tools/find.d.ts.map +1 -1
  495. package/dist/core/tools/find.js +3 -1
  496. package/dist/core/tools/find.js.map +1 -1
  497. package/dist/core/tools/grep.js +1 -1
  498. package/dist/core/tools/grep.js.map +1 -1
  499. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  500. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  501. package/dist/core/tools/hashline-engine/format.js +4 -2
  502. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  503. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  504. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  505. package/dist/core/tools/hashline-engine/messages.js +4 -2
  506. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  507. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  508. package/dist/core/tools/hashline-engine/parser.js +16 -4
  509. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  510. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  511. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  512. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  513. package/dist/core/tools/hashline.d.ts.map +1 -1
  514. package/dist/core/tools/hashline.js +8 -2
  515. package/dist/core/tools/hashline.js.map +1 -1
  516. package/dist/core/tools/ls.d.ts.map +1 -1
  517. package/dist/core/tools/ls.js +2 -0
  518. package/dist/core/tools/ls.js.map +1 -1
  519. package/dist/core/tools/read.d.ts.map +1 -1
  520. package/dist/core/tools/read.js +8 -1
  521. package/dist/core/tools/read.js.map +1 -1
  522. package/dist/core/tools/search.d.ts.map +1 -1
  523. package/dist/core/tools/search.js +2 -0
  524. package/dist/core/tools/search.js.map +1 -1
  525. package/dist/core/tools/todos.d.ts +3 -12
  526. package/dist/core/tools/todos.d.ts.map +1 -1
  527. package/dist/core/tools/todos.js +19 -4
  528. package/dist/core/tools/todos.js.map +1 -1
  529. package/dist/core/tools/write.d.ts.map +1 -1
  530. package/dist/core/tools/write.js +2 -0
  531. package/dist/core/tools/write.js.map +1 -1
  532. package/dist/index.d.ts +8 -5
  533. package/dist/index.d.ts.map +1 -1
  534. package/dist/index.js +6 -2
  535. package/dist/index.js.map +1 -1
  536. package/dist/main-runtime-api-key.d.ts +1 -1
  537. package/dist/main-runtime-api-key.js.map +1 -1
  538. package/dist/main-session-options.d.ts +1 -1
  539. package/dist/main-session-options.js.map +1 -1
  540. package/dist/main.d.ts.map +1 -1
  541. package/dist/main.js +10 -2
  542. package/dist/main.js.map +1 -1
  543. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  544. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  545. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  546. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  547. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  548. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  549. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  550. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  551. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  552. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  553. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  554. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  556. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  557. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  558. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  559. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  560. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  561. package/dist/modes/interactive/components/model-selector.js +2 -1
  562. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  563. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  564. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  565. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  566. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  567. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  568. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  569. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  571. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  572. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  573. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  574. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  575. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  576. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  578. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/tool-execution.js +12 -1
  580. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  581. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  582. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  583. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  584. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  585. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  586. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  587. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  588. package/dist/modes/interactive/interactive-extension-custom-ui.js +2 -2
  589. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  590. package/dist/modes/interactive/interactive-mode-base.d.ts +38 -3
  591. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  592. package/dist/modes/interactive/interactive-mode-base.js +75 -10
  593. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  594. package/dist/modes/interactive/interactive-mode-surface.d.ts +7 -1
  595. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  596. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  597. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  598. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  599. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  600. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  601. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  602. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  603. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  604. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  605. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  606. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  607. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  608. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  609. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  610. package/dist/modes/interactive/interactive-selectors.js +7 -3
  611. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  612. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  613. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  614. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  615. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  616. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  617. package/dist/modes/interactive/interactive-startup.js +34 -9
  618. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  619. package/dist/modes/interactive/interactive-tui.d.ts +18 -1
  620. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  621. package/dist/modes/interactive/interactive-tui.js +126 -38
  622. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  623. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  624. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  625. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  626. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  627. package/dist/modes/interactive/theme/dark.json +2 -0
  628. package/dist/modes/interactive/theme/light.json +2 -0
  629. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  630. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  631. package/dist/modes/interactive/theme/theme-class.js +6 -1
  632. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  633. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  634. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  635. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  636. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  637. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  638. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  639. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  640. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  641. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  642. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  643. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  644. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  645. package/dist/modes/json-event.d.ts +6 -1
  646. package/dist/modes/json-event.d.ts.map +1 -1
  647. package/dist/modes/json-event.js +17 -2
  648. package/dist/modes/json-event.js.map +1 -1
  649. package/dist/modes/rpc/rpc-client.js.map +1 -1
  650. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  651. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  652. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  653. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  654. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  655. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  656. package/dist/modes/rpc/rpc-types.js.map +1 -1
  657. package/dist/package-manager-cli.js.map +1 -1
  658. package/dist/server/create-harness.d.ts.map +1 -1
  659. package/dist/server/create-harness.js +11 -0
  660. package/dist/server/create-harness.js.map +1 -1
  661. package/dist/utils/abort.d.ts +9 -0
  662. package/dist/utils/abort.d.ts.map +1 -0
  663. package/dist/utils/abort.js +19 -0
  664. package/dist/utils/abort.js.map +1 -0
  665. package/dist/utils/tools-manager.d.ts +16 -1
  666. package/dist/utils/tools-manager.d.ts.map +1 -1
  667. package/dist/utils/tools-manager.js +19 -19
  668. package/dist/utils/tools-manager.js.map +1 -1
  669. package/docs/custom-provider.md +9 -8
  670. package/docs/development.md +0 -1
  671. package/docs/docs.json +0 -1
  672. package/docs/environment-variables.md +3 -0
  673. package/docs/extensions.md +73 -2
  674. package/docs/json.md +3 -1
  675. package/docs/keybindings.md +7 -3
  676. package/docs/models/artificial-analysis-index.md +2 -2
  677. package/docs/models/model-selection.md +32 -23
  678. package/docs/models/pareto-efficiency.md +25 -24
  679. package/docs/providers.md +95 -2
  680. package/docs/quickstart.md +4 -2
  681. package/docs/rpc.md +21 -7
  682. package/docs/sdk.md +26 -1
  683. package/docs/session-format.md +5 -2
  684. package/docs/settings.md +34 -3
  685. package/docs/skills.md +16 -1
  686. package/docs/terminal-setup.md +15 -2
  687. package/docs/themes.md +22 -4
  688. package/docs/tools.md +3 -1
  689. package/docs/tui.md +2 -0
  690. package/docs/usage.md +5 -4
  691. package/docs/workflows.md +62 -19
  692. package/npm-shrinkwrap.json +211 -232
  693. package/package.json +8 -8
  694. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  695. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  696. package/dist/builtin/i-have-adhd/README.md +0 -18
  697. package/dist/builtin/i-have-adhd/index.ts +0 -238
  698. package/dist/builtin/i-have-adhd/package.json +0 -56
  699. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  700. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  701. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  702. package/docs/i-have-adhd.md +0 -36
@@ -0,0 +1,305 @@
1
+ /**
2
+ * open-claude-design ⇄ impeccable live protocol.
3
+ *
4
+ * In a chat session the agent owns the live poll loop, and "the review is over"
5
+ * needs no ceremony because the user simply keeps talking. A workflow stage
6
+ * boundary is a commit point, and the live contract's `"timeout" -> LOOP` is an
7
+ * instruction to a model rather than a constraint: a stage that concludes on a
8
+ * poll timeout would end a review the user never finished.
9
+ *
10
+ * So the workflow drives the protocol instead. Polling and replying are durable
11
+ * `ctx.tool` nodes; the model is invoked only for the events that need it
12
+ * (`generate`, `steer`, `manual_edit_apply`, and mount failures). Termination
13
+ * stops being a judgment and becomes the helper's own `exit` event.
14
+ *
15
+ * `timeout` is absorbed here rather than surfaced, so an idle hour costs no
16
+ * graph nodes. Every poll/reply invocation must, however, exit successfully;
17
+ * helper failures are surfaced instead of being mistaken for another timeout.
18
+ */
19
+
20
+ import { spawn } from "node:child_process";
21
+ import { fileURLToPath } from "node:url";
22
+
23
+ /** JSON values emitted by the live helper. */
24
+ export type JsonValue = string | number | boolean | null | readonly JsonValue[] | { readonly [key: string]: JsonValue };
25
+
26
+ /** Events the live helper delivers. Anything unknown is treated as ignorable. */
27
+ export type LiveEventType =
28
+ | "generate"
29
+ | "steer"
30
+ | "accept"
31
+ | "discard"
32
+ | "prefetch"
33
+ | "manual_edit_apply"
34
+ | "variant_mounted"
35
+ | "variant_mount_failed"
36
+ | "timeout"
37
+ | "exit";
38
+
39
+ export type LiveEvent = {
40
+ readonly type: LiveEventType | string;
41
+ readonly id?: string;
42
+ readonly variant?: number;
43
+ readonly variantId?: string;
44
+ readonly url?: string;
45
+ readonly pageUrl?: string;
46
+ readonly error?: string;
47
+ readonly file?: string;
48
+ readonly sourceFile?: string;
49
+ readonly message?: string;
50
+ readonly data?: JsonValue;
51
+ readonly screenshot?: string;
52
+ readonly raw: string;
53
+ /** Preserve additional upstream event fields without narrowing their JSON shape. */
54
+ readonly [key: string]: JsonValue | undefined;
55
+ };
56
+
57
+ /** Events the model must handle before the loop may reply and poll again. */
58
+ const MODEL_EVENTS = new Set<string>(["generate", "steer", "manual_edit_apply", "variant_mount_failed"]);
59
+
60
+ export function needsModel(event: LiveEvent): boolean {
61
+ return MODEL_EVENTS.has(event.type);
62
+ }
63
+
64
+ /** Reply status the helper expects for each model-handled event. */
65
+ export function replyTokenFor(event: LiveEvent): string {
66
+ if (event.type === "steer") return "steer_done";
67
+ return "done";
68
+ }
69
+
70
+ const LEGACY_REPLY_STATUSES = new Set(["done", "error", "complete", "discard", "discarded"]);
71
+
72
+ function isJsonObject(value: JsonValue): value is { readonly [key: string]: JsonValue } {
73
+ return typeof value === "object" && value !== null && !Array.isArray(value);
74
+ }
75
+
76
+ /** Last JSON object printed by a live script, which is the event payload. */
77
+ export function parseLiveEvent(stdout: string): LiveEvent {
78
+ const lines = stdout.split(/\r?\n/).filter((line) => line.trim().startsWith("{"));
79
+ for (const line of [...lines].reverse()) {
80
+ try {
81
+ const parsed = JSON.parse(line) as JsonValue;
82
+ if (!isJsonObject(parsed) || typeof parsed.type !== "string") continue;
83
+ // Keep the complete JSON event, not only the fields known by the old
84
+ // protocol. 4.1.1 adds mount diagnostics and structured reply data.
85
+ return { ...parsed, type: parsed.type, raw: line } as LiveEvent;
86
+ } catch {
87
+ /* not the event line */
88
+ }
89
+ }
90
+ // An unreadable poll is not an ending. Treat it as a timeout so the caller
91
+ // polls again rather than concluding a review nobody finished.
92
+ return { type: "timeout", raw: stdout };
93
+ }
94
+
95
+ export type LivePollDeps = {
96
+ readonly run?: (scriptPath: string, args: readonly string[], cwd: string, signal?: AbortSignal) => Promise<ScriptResult>;
97
+ };
98
+
99
+ export type LiveReplyInput = {
100
+ readonly workflowCwd: string;
101
+ readonly event: LiveEvent;
102
+ readonly status?: string;
103
+ /** Source/manifest path accepted by generate and mount-failure replies. */
104
+ readonly file?: string;
105
+ /** The helper's positional message argument (there is no --message flag). */
106
+ readonly message?: string;
107
+ /** Structured result accepted by manual_edit_apply replies. */
108
+ readonly data?: JsonValue;
109
+ readonly signal?: AbortSignal;
110
+ readonly deps?: LivePollDeps;
111
+ };
112
+
113
+ function assertSuccessfulScript(result: ScriptResult, operation: string): ScriptResult {
114
+ if (result.code !== 0) {
115
+ const details = result.stderr.length > 0 ? `: ${result.stderr}` : "";
116
+ throw new Error(`${operation} failed with exit code ${result.code}${details}`);
117
+ }
118
+ return result;
119
+ }
120
+
121
+ /**
122
+ * Poll until the helper delivers an event that matters. `timeout` events and
123
+ * unreadable output loop internally, so callers only ever see substantive
124
+ * events or `exit`.
125
+ */
126
+ export async function pollLiveEvent(input: {
127
+ readonly workflowCwd: string;
128
+ readonly signal?: AbortSignal;
129
+ readonly deps?: LivePollDeps;
130
+ }): Promise<LiveEvent> {
131
+ const script = liveScriptPath("live-poll.mjs");
132
+ const run = input.deps?.run ?? runNodeScript;
133
+ for (;;) {
134
+ if (input.signal?.aborted === true) return { type: "exit", raw: "aborted" };
135
+ const result = assertSuccessfulScript(await run(script, [], input.workflowCwd, input.signal), "live poll");
136
+ const event = parseLiveEvent(result.stdout);
137
+ if (event.type !== "timeout") return event;
138
+ }
139
+ }
140
+
141
+ /** Acknowledge a model-handled event so the helper unblocks the overlay. */
142
+ export async function replyLiveEvent(input: LiveReplyInput): Promise<ScriptResult> {
143
+ const id = input.event.id;
144
+ if (typeof id !== "string" || id.length === 0 || id.startsWith("--")) {
145
+ throw new Error(`Cannot reply to ${input.event.type}: live event id is missing`);
146
+ }
147
+ if (LEGACY_REPLY_STATUSES.has(id)) {
148
+ throw new Error(`Cannot reply to live event ${id}: expected an event id before the reply status`);
149
+ }
150
+ const status = input.status ?? replyTokenFor(input.event);
151
+ if (status.length === 0 || status.startsWith("--")) {
152
+ throw new Error(`Cannot reply to live event ${id}: reply status is missing`);
153
+ }
154
+ const args = ["--reply", id, status];
155
+ const file = input.file ?? input.event.file;
156
+ const message = input.message ?? input.event.message;
157
+ const data = input.data ?? input.event.data;
158
+ if (file !== undefined) args.push("--file", file);
159
+ if (data !== undefined) args.push("--data", JSON.stringify(data));
160
+ if (message !== undefined) args.push(message);
161
+ const script = liveScriptPath("live-poll.mjs");
162
+ const run = input.deps?.run ?? runNodeScript;
163
+ return assertSuccessfulScript(await run(script, args, input.workflowCwd, input.signal), "live reply");
164
+ }
165
+
166
+ /**
167
+ * Absolute path to one of the impeccable live scripts.
168
+ *
169
+ * Always the copy that ships inside this package — `packages/workflows/skills`
170
+ * in the repository, `dist/builtin/workflows/skills` once bundled — which sits
171
+ * one level up from this module in both layouts, so `import.meta.url` finds it
172
+ * without the host naming a path.
173
+ *
174
+ * A project-vendored copy is deliberately NOT consulted. The workflow drives
175
+ * this protocol directly: it depends on `live-poll.mjs`'s CLI surface, its
176
+ * `--reply` tokens, and its JSON event vocabulary. The bundled scripts ship and
177
+ * are tested with this code, so they cannot drift from it; a forked copy in a
178
+ * project could, and would break the loop in ways no test here would catch.
179
+ */
180
+ export function liveScriptPath(script: string): string {
181
+ return fileURLToPath(new URL(`../skills/impeccable/scripts/${script}`, import.meta.url));
182
+ }
183
+
184
+ export type ScriptResult = { readonly code: number; readonly stdout: string; readonly stderr: string };
185
+
186
+ function runNodeScript(
187
+ scriptPath: string,
188
+ args: readonly string[],
189
+ cwd: string,
190
+ signal?: AbortSignal,
191
+ ): Promise<ScriptResult> {
192
+ return new Promise((resolve, reject) => {
193
+ const child = spawn(process.execPath, [scriptPath, ...args], {
194
+ cwd,
195
+ env: { ...process.env, GH_PAGER: "cat" },
196
+ stdio: ["ignore", "pipe", "pipe"],
197
+ });
198
+ let stdout = "";
199
+ let stderr = "";
200
+ let settled = false;
201
+ const onAbort = () => child.kill("SIGTERM");
202
+ signal?.addEventListener("abort", onAbort, { once: true });
203
+ child.stdout.on("data", (chunk: Buffer) => {
204
+ stdout += chunk.toString();
205
+ });
206
+ child.stderr.on("data", (chunk: Buffer) => {
207
+ stderr += chunk.toString();
208
+ });
209
+ child.on("error", (error) => {
210
+ if (settled) return;
211
+ settled = true;
212
+ signal?.removeEventListener("abort", onAbort);
213
+ reject(error);
214
+ });
215
+ child.on("close", (code) => {
216
+ if (settled) return;
217
+ settled = true;
218
+ signal?.removeEventListener("abort", onAbort);
219
+ resolve({ code: code ?? -1, stdout: stdout.trim(), stderr: stderr.trim() });
220
+ });
221
+ });
222
+ }
223
+ /** Prompt for the stage that handles one live event. */
224
+ export function buildLiveEventPrompt(input: {
225
+ readonly event: LiveEvent;
226
+ readonly previewPath: string;
227
+ }): string {
228
+ const shared = [
229
+ `<live_event>\n${input.event.raw}\n</live_event>`,
230
+ `<preview_path>${input.previewPath}</preview_path>`,
231
+ "<role>You are an opinionated staff design engineer inside an impeccable `live` session. The workflow owns the poll loop; handle exactly this one event and stop.</role>",
232
+ ];
233
+ if (input.event.type === "generate") {
234
+ return [
235
+ ...shared,
236
+ [
237
+ "<instructions>",
238
+ "Follow the live contract for a `generate` event:",
239
+ "1. Reuse `event.scaffold` when present and read the annotation screenshot when one is attached.",
240
+ "2. Extract the page identity FIRST, then produce three DISTINCT on-brand variants and publish them for the user to preview.",
241
+ "3. Apply the craft floors by construction as you write. Do not screenshot, re-render, or QA between generate and accept; the overlay preview is the verification channel.",
242
+ "Do not poll, do not reply, and do not exit the session: the workflow does that. Stop as soon as the variants are published.",
243
+ "</instructions>",
244
+ ].join("\n"),
245
+ ].join("\n\n");
246
+ }
247
+ if (input.event.type === "steer") {
248
+ return [
249
+ ...shared,
250
+ [
251
+ "<instructions>",
252
+ "Follow the live contract for a `steer` event: read the message and pageUrl, then do the work — page edits, navigation help, or a short answer.",
253
+ "Do not poll, do not reply, and do not exit the session: the workflow does that. Stop when the steer is handled.",
254
+ "</instructions>",
255
+ ].join("\n"),
256
+ ].join("\n\n");
257
+ }
258
+ if (input.event.type === "variant_mount_failed") {
259
+ return [
260
+ ...shared,
261
+ [
262
+ "<instructions>",
263
+ "The browser could not mount the published variant. Inspect the reported variant source/module, fix the compile or runtime failure, and stop after the repair.",
264
+ "Do not poll, do not reply, and do not exit the session: the workflow does that.",
265
+ ].join("\n"),
266
+ ].join("\n\n");
267
+ }
268
+ return [
269
+ ...shared,
270
+ [
271
+ "<instructions>",
272
+ "Apply this manual edit event per the live contract, then stop. Do not poll, reply, or exit; the workflow does that.",
273
+ "</instructions>",
274
+ ].join("\n"),
275
+ ].join("\n\n");
276
+ }
277
+
278
+ /** Prompt for the stage that boots the session and hands the loop back to the workflow. */
279
+ export function buildLiveSessionStartPrompt(input: {
280
+ readonly previewPath: string;
281
+ readonly previewFileUrl: string;
282
+ readonly browserBootstrapRules: string;
283
+ readonly round: number;
284
+ }): string {
285
+ return [
286
+ `<preview_path>${input.previewPath}</preview_path>`,
287
+ `<preview_file_url>${input.previewFileUrl}</preview_file_url>`,
288
+ `<browser_use_guidelines>${input.browserBootstrapRules}</browser_use_guidelines>`,
289
+ "<role>You are an opinionated staff design engineer opening an impeccable `live` review session.</role>",
290
+ [
291
+ "<objective>",
292
+ `Start review session ${input.round}: boot live against the static preview and open it in the user's browser. Then STOP.`,
293
+ "</objective>",
294
+ ].join("\n"),
295
+ [
296
+ "<instructions>",
297
+ "1. Drive `/skill:impeccable live` against the static preview: run `live.mjs` with `--target` pointed at the preview file, or the equivalent `.impeccable/live/config.json` entry, and open the URL that serves it.",
298
+ "2. Print the live `http://` review URL in plain text, plus the preview file URL as the manual fallback, so anyone attaching to this run can find the review.",
299
+ "3. Directly under the URL, print how the user ends the review, in plain text: click exit in the Impeccable overlay, close the browser tab, or say `exit live`. State that the review waits indefinitely until they do, and that ending it exports the design as it then stands, with no further round.",
300
+ "4. Do NOT start a poll loop. The workflow owns polling and will call you back for each event that needs you. Ending your turn does not end the review.",
301
+ "</instructions>",
302
+ ].join("\n"),
303
+ "<output_format>Under 150 words: the live review URL, the manual fallback path, how to end the review, and whether the browser opened.</output_format>",
304
+ ].join("\n\n");
305
+ }
@@ -6,17 +6,16 @@ import {
6
6
  taggedPrompt,
7
7
  } from "./open-claude-design-utils.js";
8
8
  import {
9
- assertUserAnnotationsThreaded,
10
- hasMeaningfulFeedback,
11
- persistPreviewFeedback,
12
- toPreviewFeedback,
13
- userAnnotationsBlock,
14
- type PreviewFeedback,
15
- } from "./open-claude-design-feedback.js";
9
+ buildLiveEventPrompt,
10
+ buildLiveSessionStartPrompt,
11
+ needsModel,
12
+ pollLiveEvent,
13
+ replyLiveEvent,
14
+ replyTokenFor,
15
+ } from "./open-claude-design-live-protocol.js";
16
16
  import {
17
17
  LIVE_REVIEW_GATE_OPTIONS,
18
18
  buildLiveReviewGateMessage,
19
- buildLivePreviewDisplayPrompt,
20
19
  isUiUnavailableRejection,
21
20
  type LiveReviewGateUi,
22
21
  } from "./open-claude-design-setup.js";
@@ -27,6 +26,8 @@ const GROUNDED_REPORTING =
27
26
  type DesignContext = {
28
27
  task(name: string, options: object): Promise<WorkflowTaskResult>;
29
28
  parallel(steps: readonly object[], options: { readonly task: string }): Promise<WorkflowTaskResult[]>;
29
+ /** Durable tool node; the live review loop is built from these. */
30
+ tool<T>(name: string, args: object, fn: (handle: { readonly signal: AbortSignal }) => Promise<T>): Promise<T>;
30
31
  };
31
32
 
32
33
  type ModelConfig = Record<string, object | string | readonly string[]>;
@@ -48,10 +49,8 @@ type RefineOptions = {
48
49
  readonly designContext: DesignContext;
49
50
  readonly prompt: string;
50
51
  readonly outputType: string;
51
- readonly maxRefinements: number;
52
52
  readonly previewPath: string;
53
53
  readonly previewFileUrl: string;
54
- readonly artifactDir: string;
55
54
  readonly browserBootstrapRules: string;
56
55
  /** Path to the persisted design-context.md artifact (issue #2121). */
57
56
  readonly designContextFile: string;
@@ -63,117 +62,116 @@ type RefineOptions = {
63
62
  readonly ui: LiveReviewGateUi;
64
63
  };
65
64
 
66
- export async function refineOpenClaudeDesign(options: RefineOptions): Promise<{ readonly latestDesign: string; readonly approvedForExport: boolean; readonly refinementCount: number; }> {
67
- const { designContext, prompt, outputType, maxRefinements, previewPath, previewFileUrl, artifactDir, browserBootstrapRules, designContextFile, referencesFile, designModelConfig, workflowCwd } = options;
65
+ /**
66
+ * Generate a design, then review it in one live session.
67
+ *
68
+ * The live session is itself unbounded: the user picks elements, accepts
69
+ * on-brand variants written into `preview.html` in place, and steers, until
70
+ * they leave. The preview is exported as it stands when the session ends.
71
+ */
72
+ export async function refineOpenClaudeDesign(options: RefineOptions): Promise<{ readonly latestDesign: string }> {
73
+ const { designContext, prompt, outputType, previewPath, previewFileUrl, browserBootstrapRules, designContextFile, referencesFile, designModelConfig, workflowCwd } = options;
68
74
  const importContext = options.importContext ?? "";
69
- let latestDesign = "";
70
- let latestGenerateSessionFile: string | undefined;
71
- let latestUserFeedbackSessionFile: string | undefined;
72
- let pendingFeedback: PreviewFeedback | undefined;
73
- let approvedForExport = false;
74
- let refinementCount = 0;
75
75
 
76
- for (let iteration = 1; iteration <= maxRefinements; iteration += 1) {
77
- const generateStageName = `generate-${iteration}`;
78
- const generatePrompt = pendingFeedback === undefined
79
- ? buildInitialGeneratePrompt({
80
- prompt,
81
- outputType,
82
- previewPath,
83
- designContextFile,
84
- referencesFile,
85
- importContext,
86
- })
87
- : buildGenerateRevisionPrompt({
88
- prompt,
89
- outputType,
90
- previewPath,
91
- designContextFile,
92
- referencesFile,
93
- latestDesign,
94
- importContext,
95
- feedback: pendingFeedback,
96
- });
97
- if (pendingFeedback !== undefined) {
98
- assertUserAnnotationsThreaded(generatePrompt, [pendingFeedback], generateStageName);
99
- }
76
+ // Large research context travels by artifact file (`reads` + explicit read
77
+ // instructions in the prompt), not as an inline payload (issue #2121).
78
+ const generated = await designContext.task("generate-1", {
79
+ prompt: buildInitialGeneratePrompt({
80
+ prompt,
81
+ outputType,
82
+ previewPath,
83
+ designContextFile,
84
+ referencesFile,
85
+ importContext,
86
+ }),
87
+ reads: [designContextFile, referencesFile],
88
+ ...designModelConfig,
89
+ });
100
90
 
101
- // Large research context travels by artifact file (`reads` + explicit
102
- // read instructions in the prompt), not as an inline `previous` payload,
103
- // so a single oversized research result cannot become a single oversized
104
- // prompt message (issue #2121). Only the revision loop threads the small,
105
- // word-capped prior design summary inline.
106
- const generated = await designContext.task(generateStageName, {
107
- prompt: generatePrompt,
108
- reads: [designContextFile, referencesFile],
109
- ...(pendingFeedback === undefined
110
- ? {}
111
- : { previous: { name: "current-design", text: latestDesign } }),
112
- ...designModelConfig,
113
- ...forkContinuationOptions(latestGenerateSessionFile),
91
+ // The browser review waits on a long-poll rather than an awaiting-input
92
+ // stage, so raise the run-level prompt before opening the session. Only the
93
+ // executor's unavailable-UI rejection degrades to running the review;
94
+ // lifecycle failures must propagate and stop the workflow.
95
+ const gateChoice = await options.ui
96
+ .select(
97
+ buildLiveReviewGateMessage({ round: 1, previewPath, previewFileUrl }),
98
+ LIVE_REVIEW_GATE_OPTIONS,
99
+ )
100
+ .catch((error: unknown) => {
101
+ if (isUiUnavailableRejection(error)) return LIVE_REVIEW_GATE_OPTIONS[0];
102
+ throw error;
114
103
  });
115
- latestDesign = generated.text;
116
- latestGenerateSessionFile = generated.sessionFile ?? latestGenerateSessionFile;
117
- refinementCount = iteration;
104
+ if (gateChoice === LIVE_REVIEW_GATE_OPTIONS[0]) {
105
+ await runLiveReviewSession({
106
+ designContext,
107
+ round: 1,
108
+ reviewStageName: "user-feedback-1",
109
+ previewPath,
110
+ previewFileUrl,
111
+ browserBootstrapRules,
112
+ designModelConfig,
113
+ workflowCwd,
114
+ });
115
+ }
118
116
 
119
- // Deterministic live-review gate (issue #2060): the user-feedback stage
120
- // waits on a browser long-poll that never sets `awaiting_input`, so raise
121
- // a run-level `ctx.ui` prompt first. It fires the needs-attention badge,
122
- // names the preview URL, and syncs the review to the user's presence.
123
- // Only the executor's unavailable-UI rejection (headless / no adapter)
124
- // degrades to running the review; lifecycle failures such as interruption
125
- // or a failed durable checkpoint must propagate and stop the workflow.
126
- const gateChoice = await options.ui
127
- .select(
128
- buildLiveReviewGateMessage({ iteration, maxRefinements, previewPath, previewFileUrl }),
129
- LIVE_REVIEW_GATE_OPTIONS,
130
- )
131
- .catch((error: unknown) => {
132
- if (isUiUnavailableRejection(error)) return LIVE_REVIEW_GATE_OPTIONS[0];
133
- throw error;
134
- });
135
- if (gateChoice === LIVE_REVIEW_GATE_OPTIONS[1]) {
136
- approvedForExport = true;
137
- break;
138
- }
117
+ return { latestDesign: generated.text };
118
+ }
139
119
 
140
- // A rejected feedback stage propagates and fails the run (issue #2123;
141
- // the #1499 catch-then-approve path). Browser/tooling trouble never
142
- // rejects: playwright-cli is auto-installed up front, the runner exits
143
- // early when the browser is unavailable, and the stage prompt requires a
144
- // degraded non-empty report instead of failing. What rejects here is
145
- // model/infra failure — provider errors, fallback exhaustion, broken
146
- // session forks — and that must never be laundered into approval. Only a
147
- // resolved result with no meaningful notes means the user approved.
148
- const userFeedbackResult = await designContext.task(`user-feedback-${iteration}`, {
149
- prompt: buildLivePreviewDisplayPrompt({
150
- previewPath,
151
- previewFileUrl,
152
- browserBootstrapRules,
153
- iteration,
154
- maxRefinements,
155
- }),
156
- ...designModelConfig,
157
- ...forkContinuationOptions(latestUserFeedbackSessionFile),
158
- });
120
+ type LiveReviewSessionOptions = {
121
+ readonly designContext: DesignContext;
122
+ readonly round: number;
123
+ readonly reviewStageName: string;
124
+ readonly previewPath: string;
125
+ readonly previewFileUrl: string;
126
+ readonly browserBootstrapRules: string;
127
+ readonly designModelConfig: ModelConfig;
128
+ readonly workflowCwd: string;
129
+ };
159
130
 
160
- latestUserFeedbackSessionFile =
161
- userFeedbackResult.sessionFile ?? latestUserFeedbackSessionFile;
162
- const feedback = toPreviewFeedback({
163
- iteration,
164
- stageName: `user-feedback-${iteration}`,
165
- result: userFeedbackResult,
166
- });
167
- persistPreviewFeedback({ artifactDir, workflowCwd, feedback });
131
+ /**
132
+ * Run one live review session until the helper emits its terminal `exit` event.
133
+ *
134
+ * The workflow owns the poll loop: `ctx.tool` polls and replies, and the model
135
+ * is called back only for the events that need it. Termination is the helper's
136
+ * `exit` event rather than a model's judgment that a review looked finished,
137
+ * which is what prevents a poll timeout from ending an active review.
138
+ */
139
+ async function runLiveReviewSession(options: LiveReviewSessionOptions): Promise<void> {
140
+ const { designContext, round, reviewStageName, previewPath, previewFileUrl, browserBootstrapRules, designModelConfig, workflowCwd } = options;
141
+ let sessionFile: string | undefined;
168
142
 
169
- if (!hasMeaningfulFeedback(feedback)) {
170
- approvedForExport = true;
171
- break;
172
- }
173
- pendingFeedback = feedback;
174
- }
143
+ const start = await designContext.task(`${reviewStageName}-start`, {
144
+ prompt: buildLiveSessionStartPrompt({ previewPath, previewFileUrl, browserBootstrapRules, round }),
145
+ ...designModelConfig,
146
+ });
147
+ sessionFile = start.sessionFile;
175
148
 
176
- return { latestDesign, approvedForExport, refinementCount };
149
+ for (let index = 1; ; index += 1) {
150
+ // `timeout` is absorbed inside the poll, so an idle hour costs no nodes and
151
+ // never looks like an ending.
152
+ const event = await designContext.tool(`live-poll-${round}-${index}`, { round, index }, async ({ signal }) =>
153
+ pollLiveEvent({ workflowCwd, signal }),
154
+ );
155
+ if (event.type === "exit") break;
156
+ // `variant_mounted` is journal-only. All other non-model events are
157
+ // acknowledged by the helper itself and do not mint a model stage.
158
+ if (!needsModel(event)) continue;
159
+ if (event.id === undefined || event.id.length === 0) {
160
+ throw new Error(`Live ${event.type} event is missing its id`);
161
+ }
162
+ const response = await designContext.task(`live-${event.type}-${round}-${index}`, {
163
+ prompt: buildLiveEventPrompt({ event, previewPath }),
164
+ ...designModelConfig,
165
+ ...forkContinuationOptions(sessionFile),
166
+ });
167
+ sessionFile = response.sessionFile ?? sessionFile;
168
+ const status = replyTokenFor(event);
169
+ await designContext.tool(
170
+ `live-reply-${round}-${index}`,
171
+ { round, index, eventId: event.id, status },
172
+ async ({ signal }) => replyLiveEvent({ workflowCwd, event, status, signal }),
173
+ );
174
+ }
177
175
  }
178
176
 
179
177
  function buildInitialGeneratePrompt(args: {
@@ -231,60 +229,6 @@ function buildInitialGeneratePrompt(args: {
231
229
  ]);
232
230
  }
233
231
 
234
- function buildGenerateRevisionPrompt(args: {
235
- readonly prompt: string;
236
- readonly outputType: string;
237
- readonly previewPath: string;
238
- readonly designContextFile: string;
239
- readonly referencesFile: string;
240
- readonly latestDesign: string;
241
- readonly importContext: string;
242
- readonly feedback: PreviewFeedback;
243
- }): string {
244
- const annotations = userAnnotationsBlock([args.feedback]);
245
- return taggedPrompt([
246
- [
247
- "design_context_file",
248
- `Read the file at ${args.designContextFile} for the project design context (PRODUCT.md/DESIGN.md summary) and the ds-* design-system evidence.`,
249
- ],
250
- [
251
- "reference_inspiration_file",
252
- `Read the file at ${args.referencesFile} for the curated reference inspiration.`,
253
- ],
254
- ["reference_context", args.importContext],
255
- ["reference_precedence", REFERENCE_PRECEDENCE],
256
- ["preview_artifact_path", args.previewPath],
257
- ["user_feedback", annotations.text],
258
- ["current_design_summary", args.latestDesign],
259
- ["html_rules", HTML_PREVIEW_RULES],
260
- ["anti_design_slop_rules", ANTI_SLOP_RULES],
261
- ["role", "You are an opinionated staff design engineer."],
262
- [
263
- "objective",
264
- `Revise the ${args.outputType} for: ${args.prompt}. Update the preview in place from only the latest live-review feedback, applying impeccable \`craft\` and \`polish\` with restraint rather than adding an internal critique.`,
265
- ],
266
- [
267
- "instructions",
268
- [
269
- "Read the current HTML at preview_artifact_path. Treat <user_feedback> as the only refinement brief; do not invent critique, screenshot, audit, or gate findings.",
270
- "Address every user note and accepted live change visibly, or identify its DESIGN.md/reference-precedence conflict in the summary.",
271
- `Overwrite ${args.previewPath} with one revised self-contained HTML file; do not branch or create extra previews.`,
272
- "Preserve strong decisions unless feedback requires change; add no unrelated features or abstractions.",
273
- ].join("\n"),
274
- ],
275
- [
276
- "output_format",
277
- [
278
- "In at most 400 words, return Markdown, not the HTML body:",
279
- "1. Revised artifact (path only)",
280
- "2. User feedback addressed (each note/live change and its application or conflict)",
281
- "3. Changes applied",
282
- "4. Trade-offs / unresolved user feedback",
283
- GROUNDED_REPORTING,
284
- ].join("\n"),
285
- ],
286
- ]);
287
- }
288
232
 
289
233
  type ExportOptions = {
290
234
  readonly designContext: DesignContext;
@@ -316,7 +260,7 @@ export async function exportOpenClaudeDesign(options: ExportOptions): Promise<{
316
260
  ],
317
261
  [
318
262
  "reference_inspiration_file",
319
- `Read the file at ${referencesFile} for the curated reference research that informed the approved design; use it wherever the spec cites visual direction or reference provenance.`,
263
+ `Read the file at ${referencesFile} for the curated reference research that informed the final design; use it wherever the spec cites visual direction or reference provenance.`,
320
264
  ],
321
265
  ["preview_artifact_path", previewPath],
322
266
  ["spec_artifact_path", specPath],
@@ -326,12 +270,12 @@ export async function exportOpenClaudeDesign(options: ExportOptions): Promise<{
326
270
  ["role", "You are an opinionated staff design engineer."],
327
271
  [
328
272
  "objective",
329
- `Export the final ${outputType} for "${prompt}" as a rich browser-readable HTML spec. Apply impeccable \`document\` and embed or link the approved preview so implementation reviewers see the agreed design.`,
273
+ `Export the final ${outputType} for "${prompt}" as a rich browser-readable HTML spec. Apply impeccable \`document\` and embed or link the final preview so implementation reviewers see the design as exported.`,
330
274
  ],
331
275
  [
332
276
  "instructions",
333
277
  [
334
- "First read the design-context file named above, then read preview_artifact_path as the canonical approved design, and use the Write tool to create one self-contained HTML5 file at spec_artifact_path.",
278
+ "First read the design-context file named above, then read preview_artifact_path as the canonical final design, and use the Write tool to create one self-contained HTML5 file at spec_artifact_path.",
335
279
  "In order, include: sticky header with title/status/run id; Executive Summary; Live Preview embedding the full preview via `<iframe srcdoc=\"...\">` or a side-by-side rendered copy in `<article class=\"preview-frame\">`; the six DESIGN.md sections (Overview, Colors, Typography, Elevation, Components, Do's and Don'ts) rendered with swatches, tables, and code blocks; Implementation handoff (Recommended files + components, Implementation steps, Usage example, Accessibility & responsive checklist, Validation commands, Known limitations); and an appendix linking the raw preview path.",
336
280
  "Use dense legible typography, generous whitespace, monospaced code, rendered hex/oklch swatches, and copy-to-clipboard hints in HTML comments.",
337
281
  `Show the absolute preview path (${previewPath}) and file URL (${previewFileUrl}) prominently. Preserve assumptions and limitations; introduce no requirement absent from the final design or DESIGN.md.`,
@@ -375,8 +319,8 @@ export async function exportOpenClaudeDesign(options: ExportOptions): Promise<{
375
319
  "instructions",
376
320
  [
377
321
  `Use the bootstrap rules, run \`playwright-cli open ${specFileUrl}\`, and if a browser executable is missing follow those rules and retry once before \`playwright-cli snapshot\`.`,
378
- "Do not run `show --annotate` or invite changes because no refinement pass remains.",
379
- `Prominently print the manual paths:\n- Final spec: ${specPath}\n- Approved preview: ${previewPath}`,
322
+ "Do not run `show --annotate` or invite changes because the review session has ended.",
323
+ `Prominently print the manual paths:\n- Final spec: ${specPath}\n- Preview: ${previewPath}`,
380
324
  "Unavailable tooling must not block the workflow; return the structured summary.",
381
325
  ].join("\n"),
382
326
  ],