@bastani/atomic 0.9.13 → 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 (762) hide show
  1. package/CHANGELOG.md +58 -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 +57 -0
  112. package/dist/builtin/workflows/README.md +39 -8
  113. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  114. package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
  115. package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
  116. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
  117. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  118. package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
  119. package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
  120. package/dist/builtin/workflows/builtin/goal.ts +4 -0
  121. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  122. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  123. package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
  124. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  125. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  126. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
  127. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  128. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  129. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  130. package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
  131. package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
  132. package/dist/builtin/workflows/builtin/ralph.ts +4 -0
  133. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  134. package/dist/builtin/workflows/builtin/tournament.ts +4 -0
  135. package/dist/builtin/workflows/package.json +2 -2
  136. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  137. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  138. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  139. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  140. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  141. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  142. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  143. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  144. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  146. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  147. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  148. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  149. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  150. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  151. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  152. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  153. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  154. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  155. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  156. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  157. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  158. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  159. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  160. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  161. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  162. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  163. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  164. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  165. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  166. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  167. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  173. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  181. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  183. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  189. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  190. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  191. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  192. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  193. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  194. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  226. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  227. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  228. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  229. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  230. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  231. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  232. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  233. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  234. package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
  235. package/dist/builtin/workflows/src/authoring.d.ts +3 -0
  236. package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
  237. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  238. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  239. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  240. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  241. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  242. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  243. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  244. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  245. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  246. package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
  247. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
  248. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  249. package/dist/builtin/workflows/src/engine/run.ts +1 -0
  250. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  251. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  252. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  253. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  254. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
  255. package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
  256. package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
  257. package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
  258. package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
  259. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  260. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  261. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  262. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  263. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  264. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
  265. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  270. package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
  273. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  274. package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
  275. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  276. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  277. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  278. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  279. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  280. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  282. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  283. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  284. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  285. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
  286. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
  287. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  288. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  289. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  290. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  291. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  292. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  293. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  294. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  295. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  296. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  297. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  298. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  299. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  300. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  301. package/dist/cli/args.d.ts +1 -0
  302. package/dist/cli/args.d.ts.map +1 -1
  303. package/dist/cli/args.js +11 -0
  304. package/dist/cli/args.js.map +1 -1
  305. package/dist/cli/auth-check.d.ts +1 -1
  306. package/dist/cli/auth-check.js.map +1 -1
  307. package/dist/cli/credential-print.d.ts +1 -1
  308. package/dist/cli/credential-print.js.map +1 -1
  309. package/dist/cli/list-models.d.ts +1 -1
  310. package/dist/cli/list-models.js.map +1 -1
  311. package/dist/cli/startup-ui.d.ts +9 -0
  312. package/dist/cli/startup-ui.d.ts.map +1 -1
  313. package/dist/cli/startup-ui.js +7 -1
  314. package/dist/cli/startup-ui.js.map +1 -1
  315. package/dist/core/agent-session-custom-message-commit.js +2 -2
  316. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  317. package/dist/core/agent-session-export.d.ts +6 -1
  318. package/dist/core/agent-session-export.d.ts.map +1 -1
  319. package/dist/core/agent-session-export.js +6 -3
  320. package/dist/core/agent-session-export.js.map +1 -1
  321. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  322. package/dist/core/agent-session-extension-bindings.js +6 -4
  323. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  324. package/dist/core/agent-session-methods.d.ts +5 -2
  325. package/dist/core/agent-session-methods.d.ts.map +1 -1
  326. package/dist/core/agent-session-methods.js.map +1 -1
  327. package/dist/core/agent-session-prompt.d.ts +12 -1
  328. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  329. package/dist/core/agent-session-prompt.js +31 -10
  330. package/dist/core/agent-session-prompt.js.map +1 -1
  331. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  332. package/dist/core/agent-session-services.d.ts +1 -1
  333. package/dist/core/agent-session-services.js.map +1 -1
  334. package/dist/core/agent-session-skill-block.d.ts +1 -0
  335. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  336. package/dist/core/agent-session-skill-block.js +18 -2
  337. package/dist/core/agent-session-skill-block.js.map +1 -1
  338. package/dist/core/agent-session-state.d.ts.map +1 -1
  339. package/dist/core/agent-session-state.js +2 -1
  340. package/dist/core/agent-session-state.js.map +1 -1
  341. package/dist/core/agent-session-types.d.ts +2 -1
  342. package/dist/core/agent-session-types.d.ts.map +1 -1
  343. package/dist/core/agent-session-types.js.map +1 -1
  344. package/dist/core/agent-session.d.ts +1 -1
  345. package/dist/core/agent-session.js.map +1 -1
  346. package/dist/core/atomic-guide-command.js +2 -2
  347. package/dist/core/atomic-guide-command.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +0 -6
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  352. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  353. package/dist/core/cloudflare-gateway-binding.js +11 -0
  354. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  355. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  356. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  357. package/dist/core/codex-fast-mode-transport.js +130 -0
  358. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  359. package/dist/core/codex-fast-mode.d.ts +20 -6
  360. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  361. package/dist/core/codex-fast-mode.js +111 -3
  362. package/dist/core/codex-fast-mode.js.map +1 -1
  363. package/dist/core/diagnostics.d.ts +4 -0
  364. package/dist/core/diagnostics.d.ts.map +1 -1
  365. package/dist/core/diagnostics.js.map +1 -1
  366. package/dist/core/event-bus.d.ts +12 -0
  367. package/dist/core/event-bus.d.ts.map +1 -1
  368. package/dist/core/event-bus.js +22 -0
  369. package/dist/core/event-bus.js.map +1 -1
  370. package/dist/core/experimental.d.ts +25 -0
  371. package/dist/core/experimental.d.ts.map +1 -1
  372. package/dist/core/experimental.js +24 -0
  373. package/dist/core/experimental.js.map +1 -1
  374. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  375. package/dist/core/export-html/template.js +4 -3
  376. package/dist/core/extension-session-state.d.ts +28 -0
  377. package/dist/core/extension-session-state.d.ts.map +1 -0
  378. package/dist/core/extension-session-state.js +55 -0
  379. package/dist/core/extension-session-state.js.map +1 -0
  380. package/dist/core/extensions/api-types.d.ts +6 -0
  381. package/dist/core/extensions/api-types.d.ts.map +1 -1
  382. package/dist/core/extensions/api-types.js.map +1 -1
  383. package/dist/core/extensions/context-types.d.ts +4 -0
  384. package/dist/core/extensions/context-types.d.ts.map +1 -1
  385. package/dist/core/extensions/context-types.js.map +1 -1
  386. package/dist/core/extensions/index.d.ts +1 -0
  387. package/dist/core/extensions/index.d.ts.map +1 -1
  388. package/dist/core/extensions/index.js +1 -0
  389. package/dist/core/extensions/index.js.map +1 -1
  390. package/dist/core/extensions/loader-api.d.ts +1 -1
  391. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  392. package/dist/core/extensions/loader-api.js +16 -10
  393. package/dist/core/extensions/loader-api.js.map +1 -1
  394. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  395. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  396. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  397. package/dist/core/extensions/runner-context.d.ts +2 -0
  398. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  399. package/dist/core/extensions/runner-context.js +8 -0
  400. package/dist/core/extensions/runner-context.js.map +1 -1
  401. package/dist/core/extensions/runner.d.ts +1 -0
  402. package/dist/core/extensions/runner.d.ts.map +1 -1
  403. package/dist/core/extensions/runner.js +3 -0
  404. package/dist/core/extensions/runner.js.map +1 -1
  405. package/dist/core/extensions/runtime-types.d.ts +3 -0
  406. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  407. package/dist/core/extensions/runtime-types.js.map +1 -1
  408. package/dist/core/extensions/ui-types.d.ts +26 -0
  409. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  410. package/dist/core/extensions/ui-types.js +17 -1
  411. package/dist/core/extensions/ui-types.js.map +1 -1
  412. package/dist/core/http-dispatcher.d.ts.map +1 -1
  413. package/dist/core/http-dispatcher.js +5 -0
  414. package/dist/core/http-dispatcher.js.map +1 -1
  415. package/dist/core/keybindings.d.ts +24 -0
  416. package/dist/core/keybindings.d.ts.map +1 -1
  417. package/dist/core/keybindings.js +6 -0
  418. package/dist/core/keybindings.js.map +1 -1
  419. package/dist/core/model-config.d.ts +5 -0
  420. package/dist/core/model-config.d.ts.map +1 -1
  421. package/dist/core/model-config.js +1 -0
  422. package/dist/core/model-config.js.map +1 -1
  423. package/dist/core/model-registry.d.ts +1 -1
  424. package/dist/core/model-registry.js.map +1 -1
  425. package/dist/core/model-resolver-cli.d.ts +1 -1
  426. package/dist/core/model-resolver-cli.js.map +1 -1
  427. package/dist/core/model-resolver-defaults.js +3 -3
  428. package/dist/core/model-resolver-defaults.js.map +1 -1
  429. package/dist/core/model-resolver-initial.d.ts +1 -1
  430. package/dist/core/model-resolver-initial.js.map +1 -1
  431. package/dist/core/model-resolver-scope.d.ts +1 -1
  432. package/dist/core/model-resolver-scope.js.map +1 -1
  433. package/dist/core/model-runtime.d.ts +54 -0
  434. package/dist/core/model-runtime.d.ts.map +1 -1
  435. package/dist/core/model-runtime.js +96 -13
  436. package/dist/core/model-runtime.js.map +1 -1
  437. package/dist/core/oauth-login.js.map +1 -1
  438. package/dist/core/project-trust.d.ts +10 -0
  439. package/dist/core/project-trust.d.ts.map +1 -1
  440. package/dist/core/project-trust.js +12 -0
  441. package/dist/core/project-trust.js.map +1 -1
  442. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  443. package/dist/core/resource-loader-assets.js +14 -5
  444. package/dist/core/resource-loader-assets.js.map +1 -1
  445. package/dist/core/resource-loader-core.d.ts +3 -0
  446. package/dist/core/resource-loader-core.d.ts.map +1 -1
  447. package/dist/core/resource-loader-core.js +5 -0
  448. package/dist/core/resource-loader-core.js.map +1 -1
  449. package/dist/core/resource-loader-internals.d.ts +2 -0
  450. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  451. package/dist/core/resource-loader-internals.js.map +1 -1
  452. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  453. package/dist/core/resource-loader-reload.js +2 -0
  454. package/dist/core/resource-loader-reload.js.map +1 -1
  455. package/dist/core/resource-loader-types.d.ts +2 -0
  456. package/dist/core/resource-loader-types.d.ts.map +1 -1
  457. package/dist/core/resource-loader-types.js.map +1 -1
  458. package/dist/core/resource-loader.d.ts +2 -0
  459. package/dist/core/resource-loader.d.ts.map +1 -1
  460. package/dist/core/resource-loader.js +1 -0
  461. package/dist/core/resource-loader.js.map +1 -1
  462. package/dist/core/sdk-types.d.ts +7 -6
  463. package/dist/core/sdk-types.d.ts.map +1 -1
  464. package/dist/core/sdk-types.js.map +1 -1
  465. package/dist/core/sdk.d.ts.map +1 -1
  466. package/dist/core/sdk.js +17 -6
  467. package/dist/core/sdk.js.map +1 -1
  468. package/dist/core/session-manager-core.d.ts +7 -1
  469. package/dist/core/session-manager-core.d.ts.map +1 -1
  470. package/dist/core/session-manager-core.js +11 -2
  471. package/dist/core/session-manager-core.js.map +1 -1
  472. package/dist/core/session-manager-entries.d.ts +2 -2
  473. package/dist/core/session-manager-entries.d.ts.map +1 -1
  474. package/dist/core/session-manager-entries.js +6 -4
  475. package/dist/core/session-manager-entries.js.map +1 -1
  476. package/dist/core/session-manager-list.d.ts.map +1 -1
  477. package/dist/core/session-manager-list.js +5 -1
  478. package/dist/core/session-manager-list.js.map +1 -1
  479. package/dist/core/session-manager-types.d.ts +25 -2
  480. package/dist/core/session-manager-types.d.ts.map +1 -1
  481. package/dist/core/session-manager-types.js.map +1 -1
  482. package/dist/core/session-manager.d.ts +1 -1
  483. package/dist/core/session-manager.d.ts.map +1 -1
  484. package/dist/core/session-manager.js.map +1 -1
  485. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  486. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  487. package/dist/core/settings-manager-basic-accessors.js +8 -0
  488. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  489. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  490. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  491. package/dist/core/settings-manager-ui-accessors.js +9 -0
  492. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  493. package/dist/core/settings-manager.d.ts +1 -1
  494. package/dist/core/settings-manager.d.ts.map +1 -1
  495. package/dist/core/settings-manager.js.map +1 -1
  496. package/dist/core/settings-types.d.ts +4 -0
  497. package/dist/core/settings-types.d.ts.map +1 -1
  498. package/dist/core/settings-types.js.map +1 -1
  499. package/dist/core/skill-catalog.d.ts +35 -0
  500. package/dist/core/skill-catalog.d.ts.map +1 -0
  501. package/dist/core/skill-catalog.js +264 -0
  502. package/dist/core/skill-catalog.js.map +1 -0
  503. package/dist/core/skills-async.d.ts.map +1 -1
  504. package/dist/core/skills-async.js +12 -6
  505. package/dist/core/skills-async.js.map +1 -1
  506. package/dist/core/skills.d.ts +2 -0
  507. package/dist/core/skills.d.ts.map +1 -1
  508. package/dist/core/skills.js +8 -5
  509. package/dist/core/skills.js.map +1 -1
  510. package/dist/core/slash-commands.d.ts.map +1 -1
  511. package/dist/core/slash-commands.js +1 -5
  512. package/dist/core/slash-commands.js.map +1 -1
  513. package/dist/core/system-prompt.js +2 -2
  514. package/dist/core/system-prompt.js.map +1 -1
  515. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
  516. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  517. package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
  518. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  519. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
  520. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
  521. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  522. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
  523. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
  524. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  525. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  526. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
  527. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  528. package/dist/core/tools/bash.d.ts.map +1 -1
  529. package/dist/core/tools/bash.js +2 -0
  530. package/dist/core/tools/bash.js.map +1 -1
  531. package/dist/core/tools/edit.d.ts.map +1 -1
  532. package/dist/core/tools/edit.js +2 -0
  533. package/dist/core/tools/edit.js.map +1 -1
  534. package/dist/core/tools/find.d.ts.map +1 -1
  535. package/dist/core/tools/find.js +3 -1
  536. package/dist/core/tools/find.js.map +1 -1
  537. package/dist/core/tools/grep.js +1 -1
  538. package/dist/core/tools/grep.js.map +1 -1
  539. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  540. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  541. package/dist/core/tools/hashline-engine/format.js +4 -2
  542. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  543. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  544. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  545. package/dist/core/tools/hashline-engine/messages.js +4 -2
  546. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  547. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  548. package/dist/core/tools/hashline-engine/parser.js +16 -4
  549. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  550. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  551. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  552. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  553. package/dist/core/tools/hashline.d.ts.map +1 -1
  554. package/dist/core/tools/hashline.js +8 -2
  555. package/dist/core/tools/hashline.js.map +1 -1
  556. package/dist/core/tools/ls.d.ts.map +1 -1
  557. package/dist/core/tools/ls.js +2 -0
  558. package/dist/core/tools/ls.js.map +1 -1
  559. package/dist/core/tools/read.d.ts.map +1 -1
  560. package/dist/core/tools/read.js +8 -1
  561. package/dist/core/tools/read.js.map +1 -1
  562. package/dist/core/tools/search.d.ts.map +1 -1
  563. package/dist/core/tools/search.js +2 -0
  564. package/dist/core/tools/search.js.map +1 -1
  565. package/dist/core/tools/todos.d.ts +3 -12
  566. package/dist/core/tools/todos.d.ts.map +1 -1
  567. package/dist/core/tools/todos.js +19 -4
  568. package/dist/core/tools/todos.js.map +1 -1
  569. package/dist/core/tools/write.d.ts.map +1 -1
  570. package/dist/core/tools/write.js +2 -0
  571. package/dist/core/tools/write.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js +1 -1
  575. package/dist/index-extensions.js.map +1 -1
  576. package/dist/index.d.ts +8 -5
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +6 -2
  579. package/dist/index.js.map +1 -1
  580. package/dist/main-runtime-api-key.d.ts +1 -1
  581. package/dist/main-runtime-api-key.js.map +1 -1
  582. package/dist/main-session-options.d.ts +1 -1
  583. package/dist/main-session-options.js.map +1 -1
  584. package/dist/main.d.ts.map +1 -1
  585. package/dist/main.js +10 -2
  586. package/dist/main.js.map +1 -1
  587. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  588. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  589. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  590. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  592. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  593. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  594. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  596. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  598. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  600. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  601. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  602. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  604. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/model-selector.js +2 -1
  606. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  607. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  608. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  609. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
  610. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
  612. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
  613. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  614. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  616. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  617. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  619. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  620. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  622. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  623. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  624. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  626. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/tool-execution.js +12 -1
  628. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  634. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  635. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  636. package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
  637. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  638. package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
  639. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  640. package/dist/modes/interactive/interactive-mode-base.js +80 -11
  641. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  642. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  644. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  646. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  648. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  649. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  651. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  652. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  653. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  654. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  655. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  656. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  657. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  658. package/dist/modes/interactive/interactive-selectors.js +7 -3
  659. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  660. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  661. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  662. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  663. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  664. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  665. package/dist/modes/interactive/interactive-startup.js +34 -9
  666. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  667. package/dist/modes/interactive/interactive-tui.d.ts +21 -1
  668. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-tui.js +140 -38
  670. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  671. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  672. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  673. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  674. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  675. package/dist/modes/interactive/theme/dark.json +2 -0
  676. package/dist/modes/interactive/theme/light.json +2 -0
  677. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  678. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  679. package/dist/modes/interactive/theme/theme-class.js +6 -1
  680. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  681. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  682. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  683. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  684. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  685. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  686. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  687. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  688. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  689. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  691. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  692. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  693. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  694. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  695. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  696. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  697. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  698. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  699. package/dist/modes/interactive-engine/protocol.js +1 -0
  700. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  701. package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
  702. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  703. package/dist/modes/interactive-engine/remote-component.js +3 -2
  704. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  705. package/dist/modes/json-event.d.ts +6 -1
  706. package/dist/modes/json-event.d.ts.map +1 -1
  707. package/dist/modes/json-event.js +17 -2
  708. package/dist/modes/json-event.js.map +1 -1
  709. package/dist/modes/rpc/rpc-client.js.map +1 -1
  710. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  711. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  712. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  713. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  714. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  715. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  716. package/dist/modes/rpc/rpc-types.js.map +1 -1
  717. package/dist/package-manager-cli.js.map +1 -1
  718. package/dist/server/create-harness.d.ts.map +1 -1
  719. package/dist/server/create-harness.js +11 -0
  720. package/dist/server/create-harness.js.map +1 -1
  721. package/dist/utils/abort.d.ts +9 -0
  722. package/dist/utils/abort.d.ts.map +1 -0
  723. package/dist/utils/abort.js +19 -0
  724. package/dist/utils/abort.js.map +1 -0
  725. package/dist/utils/tools-manager.d.ts +16 -1
  726. package/dist/utils/tools-manager.d.ts.map +1 -1
  727. package/dist/utils/tools-manager.js +19 -19
  728. package/dist/utils/tools-manager.js.map +1 -1
  729. package/docs/custom-provider.md +9 -8
  730. package/docs/development.md +0 -1
  731. package/docs/docs.json +0 -1
  732. package/docs/environment-variables.md +3 -0
  733. package/docs/extensions.md +100 -2
  734. package/docs/json.md +3 -1
  735. package/docs/keybindings.md +8 -3
  736. package/docs/models/artificial-analysis-index.md +2 -2
  737. package/docs/models/model-selection.md +32 -23
  738. package/docs/models/pareto-efficiency.md +25 -24
  739. package/docs/providers.md +95 -2
  740. package/docs/quickstart.md +4 -2
  741. package/docs/rpc.md +21 -7
  742. package/docs/sdk.md +26 -1
  743. package/docs/session-format.md +5 -2
  744. package/docs/settings.md +34 -3
  745. package/docs/skills.md +16 -1
  746. package/docs/terminal-setup.md +15 -2
  747. package/docs/themes.md +22 -4
  748. package/docs/tools.md +3 -1
  749. package/docs/tui.md +2 -0
  750. package/docs/usage.md +5 -4
  751. package/docs/workflows.md +96 -19
  752. package/npm-shrinkwrap.json +211 -232
  753. package/package.json +8 -8
  754. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  755. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  756. package/dist/builtin/i-have-adhd/README.md +0 -18
  757. package/dist/builtin/i-have-adhd/index.ts +0 -238
  758. package/dist/builtin/i-have-adhd/package.json +0 -56
  759. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  760. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  761. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  762. package/docs/i-have-adhd.md +0 -36
@@ -1,8 +1,13 @@
1
1
  import crypto from 'node:crypto';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { CONCEPT_STATUSES, normalizeConceptForm } from './concept-catalog.mjs';
4
+ // Defined in roll-selection.mjs for the same reason WELL_TIERS is: this file
5
+ // reads the filesystem, and the roll API imports the taxonomy to validate its
6
+ // grain and platform parameters. Re-exported so importers have one place to look.
7
+ import { COMPOSITION_GRAINS, COMPOSITION_PLATFORMS, isGrain, isPlatform } from './roll-selection.mjs';
8
+ export { COMPOSITION_GRAINS, COMPOSITION_PLATFORMS, isGrain, isPlatform };
4
9
 
5
- // Catalog B: stagings rather than styles. A composition organizes attention,
10
+ // Catalog B: compositions rather than styles. A composition organizes attention,
6
11
  // sequence, or manipulation on a surface and must survive being dressed in
7
12
  // any committed visual identity; it deliberately carries no palette or type
8
13
  // half. Surface-scope seeds draw from here (plus catalog A duals); direction
@@ -15,10 +20,11 @@ export const COMPOSITION_GRAMMAR_PREFIXES = [
15
20
  'Adaptation:',
16
21
  ];
17
22
 
18
- // Surfaces align with the skill's modes: a persuade staging and an operate
19
- // staging are different species, and read/experience surfaces get their own.
23
+ // Surfaces align with the skill's modes: a persuade composition and an operate
24
+ // composition are different species, and read/experience surfaces get their own.
20
25
  export const COMPOSITION_SURFACES = new Set(['persuade', 'operate', 'read', 'experience']);
21
26
 
27
+
22
28
  export function compositionContentHash(composition) {
23
29
  const payload = [
24
30
  composition?.form ?? '',
@@ -57,6 +63,26 @@ export function validateCompositionEntry(composition, { existingForms = new Map(
57
63
  if (!COMPOSITION_SURFACES.has(composition?.surface)) {
58
64
  errors.push(`composition ${id} needs a surface of ${[...COMPOSITION_SURFACES].join(', ')}`);
59
65
  }
66
+ // Grain: how much of the product this composes. Optional, and absence means
67
+ // eligible at any grain, so nothing needs backfilling.
68
+ if (composition?.grain !== undefined && composition.grain !== null && !isGrain(composition.grain)) {
69
+ errors.push(`composition ${id} grain "${composition.grain}" must be one of ${COMPOSITION_GRAINS.join(', ')}`);
70
+ }
71
+ // Platforms this composition survives. Absence means all of them, so listing
72
+ // every platform is the same as omitting the field and is rejected in favour of
73
+ // leaving it out; an empty array would exclude the entry from every roll.
74
+ if (composition?.platforms !== undefined && composition.platforms !== null) {
75
+ const list = composition.platforms;
76
+ if (!Array.isArray(list) || list.length === 0) {
77
+ errors.push(`composition ${id} platforms must be a non-empty array, or omitted to allow every platform`);
78
+ } else if (list.some(entry => !isPlatform(entry))) {
79
+ errors.push(`composition ${id} platforms may only contain ${COMPOSITION_PLATFORMS.join(', ')}`);
80
+ } else if (new Set(list).size !== list.length) {
81
+ errors.push(`composition ${id} platforms must not repeat a platform`);
82
+ } else if (list.length === COMPOSITION_PLATFORMS.length) {
83
+ errors.push(`composition ${id} platforms lists every platform; omit the field instead`);
84
+ }
85
+ }
60
86
  if (!Array.isArray(composition?.tags)
61
87
  || composition.tags.length !== 3
62
88
  || composition.tags.some(tag => typeof tag !== 'string' || !tag.trim())) {
@@ -149,6 +175,15 @@ export function validateCompositionCatalog(catalog, reviewData, { minimumTotal }
149
175
  errors.push(`composition review ${id} is stale: content changed since review`);
150
176
  }
151
177
  }
178
+ // Mirrors the concept catalog: an optional 1-3 grade on approved entries
179
+ // only, read as a calibration signal and used to weight challenger draws.
180
+ if (review?.rating !== undefined) {
181
+ if (![1, 2, 3].includes(review.rating)) {
182
+ errors.push(`review ${id} rating must be 1, 2, or 3`);
183
+ } else if (review.status !== 'approved') {
184
+ errors.push(`review ${id} rating only applies to approved compositions`);
185
+ }
186
+ }
152
187
  if (review?.note !== undefined && (typeof review.note !== 'string' || !review.note.trim() || review.note.length > 500)) {
153
188
  errors.push(`composition review ${id} note must be a non-empty string of 500 characters or fewer`);
154
189
  }
@@ -1,11 +1,12 @@
1
1
  import crypto from 'node:crypto';
2
2
  import { readFileSync } from 'node:fs';
3
+ import { WELL_TIERS } from './roll-selection.mjs';
3
4
 
4
5
  export const CONCEPT_STATUSES = new Set(['approved', 'rejected']);
5
6
 
6
7
  // What a concept is actually strong at. Worlds carry a durable visual
7
8
  // identity (their palette/type half is the magnet); compositions carry a
8
- // staging or interaction idea (their topology half is the magnet) that can be
9
+ // composition or interaction idea (their topology half is the magnet) that can be
9
10
  // dressed in any committed identity; duals fuse both inseparably. Direction
10
11
  // seeds draw world|dual, surface seeds draw composition|dual.
11
12
  export const CONCEPT_STRENGTHS = new Set(['world', 'composition', 'dual']);
@@ -15,7 +16,20 @@ export const CONCEPT_STRENGTHS = new Set(['world', 'composition', 'dual']);
15
16
  // atmosphere worlds need the largest translation step. Every seed roll draws
16
17
  // one challenger from each tier so at least one directly-usable graphic
17
18
  // system is always on the table.
18
- export const WELL_TIERS = ['graphic', 'interaction', 'atmosphere'];
19
+ // Defined in roll-selection.mjs, the dependency-free leaf both the seeder and
20
+ // the roll API import. It cannot depend on this file: this one reads the
21
+ // filesystem, and a Pages Function must not pull node:fs into its bundle.
22
+ // Imported and re-exported rather than re-exported alone: a bare
23
+ // `export { X } from` does not bind X in this module's own scope, and
24
+ // validateConceptCatalog needs it.
25
+ export { WELL_TIERS };
26
+
27
+ // Reviewer axes that gate the challenger draw without touching approval.
28
+ export const CONCEPT_BREADTHS = new Set(['general', 'niche']);
29
+ // The registers of work a roll can be asked for. Kept here beside the review
30
+ // validation that uses it; roll-selection.mjs filters on it and the seeder
31
+ // validates the --mode flag against the same four.
32
+ export const SEED_MODES = new Set(['persuade', 'operate', 'read', 'experience']);
19
33
 
20
34
  const WEB_LEVERAGE_RE = /(?:\b3d\b|\badaptive\b|\banimat(?:e|ed|ion)\b|\bapi\b|\baria\b|\baudio\b|\bautomated?\b|\bbarcode\b|\bbroadcastchannel\b|\bbrowser\b|\bcamera\b|canvas\b|\bcaption\b|\bcollaborat(?:e|ive|ion)\b|\bcompar(?:e|ison)\b|\bcomput(?:e|ed|ation)\b|\bcomputer[- ]vision\b|\bconstraint[- ]solving\b|\bcryptographic?\b|\bcss\b|\bdeep[- ]link(?:ing)?\b|\bdirect manipulation\b|\bdom\b|\bdrag\b|\bfilter\b|\bfocus\b|\bgenerative\b|\bgeolocat(?:e|ed|ion)\b|\bgesture\b|\bgpu\b|\bgraph\b|\bhistory\b|\bindexeddb\b|\binteractive\b|\bintersectionobserver\b|\bkeyboard\b|\blive\b|\blocal\b|\bmicrophone\b|\bmotion\b|\bmultiplayer\b|\bnative\b|\bnotification\b|\boffline\b|\bpersonaliz(?:e|ed|ation)\b|\bplayable\b|\bpointer\b|\bprocedural\b|\bprovenance\b|\breal[- ]?time\b|\bresizeobserver\b|\bresponsive\b|\breveal\b|\bscrub\b|\bsearch\b|\bsearchparams\b|\bsensor\b|\bserver[- ]sent\b|\bservice worker\b|\bshader\b|\bsimulat(?:e|ed|ion|or)\b|\bspatial\b|\bstate\b|\bstream(?:ing)?\b|\bsvg\b|\bsynchroniz(?:e|ed|ation)\b|\btimeline\b|\btouch\b|\burl|\bvideo\b|\bweb(?:gl|socket|vtt)?\b|\bworker\b|\bzoom\b)/i;
21
35
  export const SYSTEM_PREFIXES = [
@@ -36,9 +50,36 @@ export function normalizeConceptForm(value) {
36
50
  .trim();
37
51
  }
38
52
 
39
- export function validateConceptEntry(concept, { existingForms = new Map() } = {}) {
53
+ export function validateConceptEntry(concept, { existingForms = new Map(), axes = null } = {}) {
40
54
  const errors = [];
41
55
  const id = concept?.id || '(unknown)';
56
+
57
+ // Recorded aesthetic axis values. Optional, and absent means the value is
58
+ // inferred from the system rules instead. Some axes cannot be inferred at all:
59
+ // depth's keyword probe matched worlds that said "no cast shadow anywhere",
60
+ // and motion and colour strategy describe properties the rules never state, so
61
+ // a wave that assigns those has to record them or the assignment is lost.
62
+ // Validated against the axes definition when the caller supplies it, because a
63
+ // typo would read as "unrecorded" and silently fall back to a probe that is
64
+ // known not to work.
65
+ if (concept?.axes !== undefined && concept.axes !== null) {
66
+ if (typeof concept.axes !== 'object' || Array.isArray(concept.axes)) {
67
+ errors.push(`concept ${id} axes must be an object of axis id to value id`);
68
+ } else if (axes) {
69
+ const byId = new Map((axes.axes || []).map(axis => [axis.id, axis]));
70
+ for (const [axisId, valueId] of Object.entries(concept.axes)) {
71
+ const axis = byId.get(axisId);
72
+ if (!axis) {
73
+ errors.push(`concept ${id} names unknown axis "${axisId}"`);
74
+ } else if (!(axis.values || []).some(value => value.id === valueId)) {
75
+ errors.push(
76
+ `concept ${id} axis "${axisId}" has unknown value "${valueId}" `
77
+ + `(expected one of ${(axis.values || []).map(v => v.id).join(', ')})`
78
+ );
79
+ }
80
+ }
81
+ }
82
+ }
42
83
  if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(concept?.id || '')) {
43
84
  errors.push(`invalid concept id: ${String(concept?.id)}`);
44
85
  }
@@ -68,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map() } = {}
68
109
  || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) {
69
110
  errors.push(`concept ${id} must have exactly three structural tags`);
70
111
  }
112
+ // The slop this world in particular is at risk of. Optional, because 541
113
+ // entries predate it and none of them are wrong for lacking it. A world built
114
+ // from posters is at risk of shouting and one built from instruments is at
115
+ // risk of dead greys; a global detector cannot know which, and the author can.
116
+ if (concept?.avoid !== undefined) {
117
+ if (!Array.isArray(concept.avoid)
118
+ || concept.avoid.length < 2
119
+ || concept.avoid.length > 3
120
+ || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) {
121
+ errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`);
122
+ }
123
+ }
71
124
  if (!Array.isArray(concept?.system)
72
125
  || concept.system.length !== SYSTEM_PREFIXES.length
73
126
  || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) {
@@ -282,6 +335,27 @@ export function validateConceptCatalog(catalog, reviewData, {
282
335
  errors.push(`review ${id} rating only applies to approved concepts`);
283
336
  }
284
337
  }
338
+ // Breadth: a world too narrow to serve an arbitrary build keeps its approval
339
+ // and leaves the challenger pool. Selection has honoured this for a while but
340
+ // nothing validated it, so a typo would silently read as "general".
341
+ if (review?.breadth !== undefined && !CONCEPT_BREADTHS.has(review.breadth)) {
342
+ errors.push(`review ${id} breadth must be one of ${[...CONCEPT_BREADTHS].join(', ')}`);
343
+ }
344
+ // Mode eligibility: which registers of work this world can carry. Absent
345
+ // means all of them, which is why it needs no backfill. Listing every mode
346
+ // is the same as omitting it, and an empty list would deal nothing, so both
347
+ // are rejected in favour of leaving the field out.
348
+ if (review?.allowedModes !== undefined) {
349
+ if (!Array.isArray(review.allowedModes) || review.allowedModes.length === 0) {
350
+ errors.push(`review ${id} allowedModes must be a non-empty array, or omitted to allow every mode`);
351
+ } else if (review.allowedModes.some(mode => !SEED_MODES.has(mode))) {
352
+ errors.push(`review ${id} allowedModes may only contain ${[...SEED_MODES].join(', ')}`);
353
+ } else if (new Set(review.allowedModes).size !== review.allowedModes.length) {
354
+ errors.push(`review ${id} allowedModes must not repeat a mode`);
355
+ } else if (review.allowedModes.length === SEED_MODES.size) {
356
+ errors.push(`review ${id} allowedModes lists every mode; omit the field instead`);
357
+ }
358
+ }
285
359
  }
286
360
 
287
361
  const wellTierById = new Map((catalog?.wells || []).map(well => [well.id, well.tier]));
@@ -319,11 +393,3 @@ export function approvedPoolRevision(concepts) {
319
393
  .join('\n');
320
394
  return crypto.createHash('sha256').update(payload).digest('hex').slice(0, 12);
321
395
  }
322
-
323
- export function deterministicRank(items, input, idFor = item => item.id) {
324
- return [...items].sort((a, b) => {
325
- const scoreA = crypto.createHash('sha256').update(`${input}:${idFor(a)}`).digest('hex');
326
- const scoreB = crypto.createHash('sha256').update(`${input}:${idFor(b)}`).digest('hex');
327
- return scoreB.localeCompare(scoreA) || idFor(a).localeCompare(idFor(b));
328
- });
329
- }
@@ -2,15 +2,20 @@
2
2
  // the live-mode design-system panel can render. Deterministic, dependency-free.
3
3
  //
4
4
  // Two-layer: YAML frontmatter (machine-readable tokens) + markdown body
5
- // (prose with six canonical H2 sections). When frontmatter is present, it's
5
+ // (prose with eight canonical H2 sections). When frontmatter is present, it's
6
6
  // exposed on `model.frontmatter` alongside the prose-scraped sections;
7
7
  // consumers can prefer frontmatter values and fall back to prose.
8
8
 
9
+ // Array order is also match precedence: matchCanonicalSection's keyword-contained
10
+ // pass returns the first entry a heading contains, so reordering this changes
11
+ // which section an ambiguous heading resolves to.
9
12
  const CANONICAL_SECTIONS = [
10
13
  'Overview',
11
14
  'Colors',
12
15
  'Typography',
16
+ 'Layout',
13
17
  'Elevation',
18
+ 'Shapes',
14
19
  'Components',
15
20
  "Do's and Don'ts",
16
21
  ];
@@ -115,10 +120,71 @@ function stripInlineYamlComment(s) {
115
120
  return s;
116
121
  }
117
122
 
123
+ // YAML double-quoted scalars process backslash escapes. Stripping the outer
124
+ // quotes without unescaping leaves them in place, so a nested font family like
125
+ // fontFamily: "\"IBM Plex Sans\", system-ui, sans-serif"
126
+ // keeps its literal backslashes and never matches the same family in CSS.
127
+ // The full YAML 1.2 double-quote escape set (spec section 5.7).
128
+ const YAML_SIMPLE_ESCAPES = {
129
+ '0': '\0',
130
+ a: '\x07',
131
+ b: '\b',
132
+ t: '\t',
133
+ n: '\n',
134
+ v: '\v',
135
+ f: '\f',
136
+ r: '\r',
137
+ e: '\x1b',
138
+ ' ': ' ',
139
+ '"': '"',
140
+ '/': '/',
141
+ '\\': '\\',
142
+ N: '\u0085',
143
+ _: '\u00a0',
144
+ L: '\u2028',
145
+ P: '\u2029',
146
+ };
147
+ const YAML_HEX_ESCAPE_LENGTHS = { x: 2, u: 4, U: 8 };
148
+
149
+ function unescapeYamlDoubleQuoted(body) {
150
+ let out = '';
151
+ for (let i = 0; i < body.length; i++) {
152
+ const ch = body[i];
153
+ if (ch !== '\\' || i === body.length - 1) {
154
+ out += ch;
155
+ continue;
156
+ }
157
+ const next = body[i + 1];
158
+ if (Object.prototype.hasOwnProperty.call(YAML_SIMPLE_ESCAPES, next)) {
159
+ out += YAML_SIMPLE_ESCAPES[next];
160
+ i++;
161
+ continue;
162
+ }
163
+ // \xNN, \uNNNN, \UNNNNNNNN. Malformed or out-of-range sequences stay
164
+ // literal rather than corrupting the rest of the scalar.
165
+ const hexLen = YAML_HEX_ESCAPE_LENGTHS[next];
166
+ if (hexLen) {
167
+ const hex = body.slice(i + 2, i + 2 + hexLen);
168
+ const codePoint = hex.length === hexLen && /^[0-9a-fA-F]+$/.test(hex) ? parseInt(hex, 16) : -1;
169
+ if (codePoint >= 0 && codePoint <= 0x10ffff) {
170
+ out += String.fromCodePoint(codePoint);
171
+ i += 1 + hexLen;
172
+ continue;
173
+ }
174
+ }
175
+ out += ch;
176
+ }
177
+ return out;
178
+ }
179
+
118
180
  function parseScalar(raw) {
119
181
  const s = raw.trim();
120
- if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
121
- return s.slice(1, -1);
182
+ if (s.length >= 2 && s.startsWith('"') && s.endsWith('"')) {
183
+ return unescapeYamlDoubleQuoted(s.slice(1, -1));
184
+ }
185
+ // Single-quoted YAML escapes only the quote itself, by doubling it.
186
+ if (s.length >= 2 && s.startsWith("'") && s.endsWith("'")) {
187
+ return s.slice(1, -1).split("''").join("'");
122
188
  }
123
189
  if (s === 'true') return true;
124
190
  if (s === 'false') return false;
@@ -330,17 +396,16 @@ function extractOverview(section) {
330
396
  if (!section) return null;
331
397
  const text = section.lines.join('\n');
332
398
  const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/);
333
- const keyChars = [];
334
399
  const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/);
335
- if (keyCharMatch) {
336
- for (const line of keyCharMatch[1].split('\n')) {
337
- const m = line.match(/^\s*[-*]\s+(.+)$/);
338
- if (m) keyChars.push(stripBold(m[1].trim()));
339
- }
340
- }
400
+ const keyChars = keyCharMatch
401
+ ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim()))
402
+ : [];
403
+ const prose = keyCharMatch
404
+ ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length)
405
+ : text;
341
406
 
342
407
  // Philosophy paragraphs: everything that isn't a rule header or key-char block
343
- const paragraphs = collectParagraphs(section.lines).filter(
408
+ const paragraphs = collectParagraphs(prose.split('\n')).filter(
344
409
  (p) =>
345
410
  !p.startsWith('**Creative North Star') &&
346
411
  !p.startsWith('**Key Characteristics')
@@ -602,11 +667,19 @@ function parseTypeBullet(bullet) {
602
667
  };
603
668
  }
604
669
 
605
- function extractElevation(section) {
670
+ function extractGuidance(section) {
606
671
  if (!section) return null;
607
672
  const subs = splitSubsections(section.lines);
673
+ return {
674
+ subtitle: section.subtitle,
675
+ description: collectParagraphs(subs[0].lines).join(' ') || null,
676
+ rules: extractNamedRules(section.lines),
677
+ };
678
+ }
608
679
 
609
- const description = collectParagraphs(subs[0].lines).join(' ') || null;
680
+ function extractElevation(section) {
681
+ const guidance = extractGuidance(section);
682
+ if (!guidance) return null;
610
683
 
611
684
  const shadows = [];
612
685
  const seen = new Set();
@@ -631,12 +704,7 @@ function extractElevation(section) {
631
704
  for (const inline of extractInlineShadows(b)) dedupe(inline);
632
705
  }
633
706
 
634
- return {
635
- subtitle: section.subtitle,
636
- description,
637
- shadows,
638
- rules: extractNamedRules(section.lines),
639
- };
707
+ return { ...guidance, shadows };
640
708
  }
641
709
 
642
710
  function extractInlineShadows(text) {
@@ -768,6 +836,15 @@ function extractDosDonts(section) {
768
836
 
769
837
  // ---------- Coverage assessment ----------
770
838
 
839
+ // Sections whose model is description-plus-rules only (see extractGuidance).
840
+ const guidanceCoverage = (guidance) =>
841
+ guidance
842
+ ? {
843
+ description: Boolean(guidance.description),
844
+ rules: guidance.rules.length,
845
+ }
846
+ : 'missing';
847
+
771
848
  function assessCoverage(model) {
772
849
  const report = {};
773
850
 
@@ -796,6 +873,8 @@ function assessCoverage(model) {
796
873
  }
797
874
  : 'missing';
798
875
 
876
+ report.layout = guidanceCoverage(model.layout);
877
+
799
878
  report.elevation = model.elevation
800
879
  ? {
801
880
  shadows: model.elevation.shadows.length,
@@ -804,6 +883,8 @@ function assessCoverage(model) {
804
883
  }
805
884
  : 'missing';
806
885
 
886
+ report.shapes = guidanceCoverage(model.shapes);
887
+
807
888
  report.components = model.components
808
889
  ? {
809
890
  count: model.components.components.length,
@@ -833,7 +914,9 @@ export function parseDesignMd(md) {
833
914
  overview: extractOverview(sections['Overview']),
834
915
  colors: extractColors(sections['Colors']),
835
916
  typography: extractTypography(sections['Typography']),
917
+ layout: extractGuidance(sections['Layout']),
836
918
  elevation: extractElevation(sections['Elevation']),
919
+ shapes: extractGuidance(sections['Shapes']),
837
920
  components: extractComponents(sections['Components']),
838
921
  dosDonts: extractDosDonts(sections["Do's and Don'ts"]),
839
922
  };
@@ -206,10 +206,10 @@ function parseIgnoreColor(value) {
206
206
  if (rgb) {
207
207
  const parts = splitColorArgs(rgb[1]);
208
208
  if (parts.length < 3 || parts.length > 4) return null;
209
- const r = parseRgbChannel(parts[0]);
210
- const g = parseRgbChannel(parts[1]);
211
- const b = parseRgbChannel(parts[2]);
212
- const a = parts[3] === undefined ? 1 : parseAlphaChannel(parts[3]);
209
+ const r = parseColorChannel(parts[0], COLOR_CHANNEL_FORMATS.rgb);
210
+ const g = parseColorChannel(parts[1], COLOR_CHANNEL_FORMATS.rgb);
211
+ const b = parseColorChannel(parts[2], COLOR_CHANNEL_FORMATS.rgb);
212
+ const a = parts[3] === undefined ? 1 : parseColorChannel(parts[3], COLOR_CHANNEL_FORMATS.alpha);
213
213
  if ([r, g, b, a].some((v) => v === null)) return null;
214
214
  return { r, g, b, a };
215
215
  }
@@ -218,10 +218,10 @@ function parseIgnoreColor(value) {
218
218
  if (hsl) {
219
219
  const parts = splitColorArgs(hsl[1]);
220
220
  if (parts.length < 3 || parts.length > 4) return null;
221
- const h = parseHueChannel(parts[0]);
222
- const s = parsePercentChannel(parts[1]);
223
- const l = parsePercentChannel(parts[2]);
224
- const a = parts[3] === undefined ? 1 : parseAlphaChannel(parts[3]);
221
+ const h = parseColorChannel(parts[0], COLOR_CHANNEL_FORMATS.hue);
222
+ const s = parseColorChannel(parts[1], COLOR_CHANNEL_FORMATS.percent);
223
+ const l = parseColorChannel(parts[2], COLOR_CHANNEL_FORMATS.percent);
224
+ const a = parts[3] === undefined ? 1 : parseColorChannel(parts[3], COLOR_CHANNEL_FORMATS.alpha);
225
225
  if ([h, s, l, a].some((v) => v === null)) return null;
226
226
  return hslToRgb(h, s, l, a);
227
227
  }
@@ -230,18 +230,13 @@ function parseIgnoreColor(value) {
230
230
  }
231
231
 
232
232
  function parseHexIgnoreColor(hex) {
233
- if (hex.length === 3 || hex.length === 4) {
234
- const r = parseInt(hex[0] + hex[0], 16);
235
- const g = parseInt(hex[1] + hex[1], 16);
236
- const b = parseInt(hex[2] + hex[2], 16);
237
- const a = hex.length === 4 ? parseInt(hex[3] + hex[3], 16) / 255 : 1;
238
- return { r, g, b, a };
239
- }
240
- const r = parseInt(hex.slice(0, 2), 16);
241
- const g = parseInt(hex.slice(2, 4), 16);
242
- const b = parseInt(hex.slice(4, 6), 16);
243
- const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;
244
- return { r, g, b, a };
233
+ const expanded = hex.length <= 4
234
+ ? [...hex].map((digit) => digit.repeat(2)).join('')
235
+ : hex;
236
+ const [r, g, b, alpha = 255] = expanded
237
+ .match(/../g)
238
+ .map((channel) => Number.parseInt(channel, 16));
239
+ return { r, g, b, a: alpha / 255 };
245
240
  }
246
241
 
247
242
  function splitColorArgs(body) {
@@ -259,47 +254,34 @@ function splitColorArgs(body) {
259
254
  return text.replace(/\s*\/\s*/g, ' / ').split(/\s+/).filter((part) => part && part !== '/');
260
255
  }
261
256
 
262
- function parseRgbChannel(raw) {
263
- const text = String(raw || '').trim();
264
- const match = text.match(/^(-?\d*\.?\d+)(%)?$/);
265
- if (!match) return null;
266
- const value = Number.parseFloat(match[1]);
267
- if (!Number.isFinite(value)) return null;
268
- const scaled = match[2] ? value * 2.55 : value;
269
- if (scaled < 0 || scaled > 255) return null;
270
- return Math.round(scaled);
271
- }
272
-
273
- function parseAlphaChannel(raw) {
257
+ const CSS_NUMBER_RE = /^(-?\d*\.?\d+)(%|deg|rad|turn|grad)?$/;
258
+ const identity = (value) => value;
259
+ const COLOR_CHANNEL_FORMATS = {
260
+ rgb: { units: { '': identity, '%': (value) => value * 2.55 }, min: 0, max: 255, round: true },
261
+ alpha: { units: { '': identity, '%': (value) => value / 100 }, min: 0, max: 1 },
262
+ hue: {
263
+ units: {
264
+ '': identity,
265
+ deg: identity,
266
+ rad: (value) => value * (180 / Math.PI),
267
+ turn: (value) => value * 360,
268
+ grad: (value) => value * 0.9,
269
+ },
270
+ },
271
+ percent: { units: { '%': (value) => value / 100 }, min: 0, max: 1 },
272
+ };
273
+
274
+ function parseColorChannel(raw, { units, min = -Infinity, max = Infinity, round = false }) {
274
275
  const text = String(raw || '').trim();
275
- const match = text.match(/^(-?\d*\.?\d+)(%)?$/);
276
+ const match = text.match(CSS_NUMBER_RE);
276
277
  if (!match) return null;
277
- const value = Number.parseFloat(match[1]);
278
- if (!Number.isFinite(value)) return null;
279
- const alpha = match[2] ? value / 100 : value;
280
- return alpha >= 0 && alpha <= 1 ? alpha : null;
281
- }
282
-
283
- function parseHueChannel(raw) {
284
- const text = String(raw || '').trim();
285
- const match = text.match(/^(-?\d*\.?\d+)(deg|rad|turn|grad)?$/);
286
- if (!match) return null;
287
- const value = Number.parseFloat(match[1]);
288
- if (!Number.isFinite(value)) return null;
289
- const unit = match[2] || 'deg';
290
- if (unit === 'turn') return value * 360;
291
- if (unit === 'rad') return value * (180 / Math.PI);
292
- if (unit === 'grad') return value * 0.9;
293
- return value;
294
- }
295
-
296
- function parsePercentChannel(raw) {
297
- const text = String(raw || '').trim();
298
- const match = text.match(/^(-?\d*\.?\d+)%$/);
299
- if (!match) return null;
300
- const value = Number.parseFloat(match[1]);
301
- if (!Number.isFinite(value)) return null;
302
- return value >= 0 && value <= 100 ? value / 100 : null;
278
+ const convert = units[match[2] || ''];
279
+ if (!convert) return null;
280
+ const number = Number.parseFloat(match[1]);
281
+ if (!Number.isFinite(number)) return null;
282
+ const value = convert(number);
283
+ if (value < min || value > max) return null;
284
+ return round ? Math.round(value) : value;
303
285
  }
304
286
 
305
287
  function hslToRgb(hue, saturation, lightness, alpha) {
@@ -529,6 +511,9 @@ function extractFindingIgnoreValueRaw(finding, rule = normalizeIgnoreRule(findin
529
511
  const primary = text.match(/Primary font:\s*([^()\n;]+)/i);
530
512
  if (primary) return cleanIgnoreValueDisplay(primary[1]);
531
513
 
514
+ const googleLabel = text.match(/Google Fonts:\s*([^()\n;]+)/i);
515
+ if (googleLabel) return cleanIgnoreValueDisplay(googleLabel[1]);
516
+
532
517
  const family = text.match(/font-family\s*:\s*["']?([^'",;\n]+)/i);
533
518
  if (family) return cleanIgnoreValueDisplay(family[1]);
534
519
 
@@ -41,6 +41,9 @@ export function isGeneratedFile(filePath, options = {}) {
41
41
 
42
42
  function isGitIgnored(absPath, cwd) {
43
43
  try {
44
+ // argv form, never a shell: this runs on every file the live-mode source
45
+ // walk reaches, so a hostile filename embedding $(...) or backticks must
46
+ // not be interpretable (issue #476). JSON.stringify is not shell quoting.
44
47
  execFileSync('git', ['check-ignore', '--quiet', '--', absPath], {
45
48
  cwd,
46
49
  stdio: 'ignore',
@@ -0,0 +1,57 @@
1
+ import { spawn } from 'node:child_process';
2
+
3
+ const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
4
+ const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]/u;
5
+
6
+ /**
7
+ * Validate the URL before handing it to an operating-system browser opener.
8
+ * The opener is only used for local question/review pages; accepting a remote
9
+ * URL here would turn a convenience helper into an outbound navigation sink.
10
+ */
11
+ export function validateBrowserUrl(value) {
12
+ if (typeof value !== 'string' || value.length === 0 || CONTROL_CHARACTERS.test(value)) return null;
13
+ let parsed;
14
+ try {
15
+ parsed = new URL(value);
16
+ } catch {
17
+ return null;
18
+ }
19
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;
20
+ if (parsed.username || parsed.password) return null;
21
+ if (!LOOPBACK_HOSTS.has(parsed.hostname.toLowerCase())) return null;
22
+ return parsed;
23
+ }
24
+
25
+ export function browserOpenCommand(url, { platform = process.platform } = {}) {
26
+ if (!validateBrowserUrl(url)) return null;
27
+ if (platform === 'darwin') return { command: 'open', args: [url] };
28
+ // `start` is a cmd.exe built-in and would expose the URL to shell parsing.
29
+ // Explorer accepts a URL as an argv value and is a fixed non-shell target.
30
+ if (platform === 'win32') return { command: 'explorer.exe', args: [url] };
31
+ return { command: 'xdg-open', args: [url] };
32
+ }
33
+
34
+ /**
35
+ * Open a validated loopback URL with a fixed executable and argv. Synchronous
36
+ * spawn failures return false; asynchronous child failures are consumed so a
37
+ * browser that is unavailable cannot crash the serving question process.
38
+ */
39
+ export function openSystemBrowser(url, {
40
+ platform = process.platform,
41
+ spawnImpl = spawn,
42
+ } = {}) {
43
+ const command = browserOpenCommand(url, { platform });
44
+ if (!command) return false;
45
+ try {
46
+ const child = spawnImpl(command.command, command.args, {
47
+ stdio: 'ignore',
48
+ detached: true,
49
+ shell: false,
50
+ });
51
+ child.once('error', () => {});
52
+ if (typeof child.unref === 'function') child.unref();
53
+ return true;
54
+ } catch {
55
+ return false;
56
+ }
57
+ }