@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,270 @@
1
+ #!/usr/bin/env node
2
+ // Embed a generation prompt into an image so the intent travels with the file,
3
+ // across harnesses and machines. Read it back with --read.
4
+ //
5
+ // node embed-prompt.mjs <image> --prompt "the prompt text"
6
+ // node embed-prompt.mjs <image> --prompt-file prompt.txt
7
+ // node embed-prompt.mjs <image> --read
8
+ //
9
+ // Formats: PNG (tEXt chunk, keyword "impeccable:prompt"), JPEG (COM segment),
10
+ // and a JSON sidecar fallback for other formats. Paths are deliberately scoped
11
+ // to the active Git/project root because this command writes its input asset.
12
+
13
+ import fs from 'node:fs';
14
+ import crypto from 'node:crypto';
15
+ import path from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+ import zlib from 'node:zlib';
18
+
19
+ const KEYWORD = 'impeccable:prompt';
20
+ const PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
21
+ const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f]/u;
22
+
23
+ function findProjectRoot(startDir) {
24
+ let current = fs.realpathSync(startDir);
25
+ while (true) {
26
+ try {
27
+ if (fs.lstatSync(path.join(current, '.git'))) return current;
28
+ } catch {
29
+ // Keep walking; a missing .git entry is normal above a project root.
30
+ }
31
+ const parent = path.dirname(current);
32
+ if (parent === current) return fs.realpathSync(startDir);
33
+ current = parent;
34
+ }
35
+ }
36
+
37
+ function assertSafeRelativePath(value, label) {
38
+ if (typeof value !== 'string' || value.length === 0 || CONTROL_CHARACTERS.test(value)) {
39
+ throw new Error(`${label} must be a safe project-relative path`);
40
+ }
41
+ if (path.isAbsolute(value) || /^[A-Za-z]:/u.test(value) || value.startsWith('\\')) {
42
+ throw new Error(`${label} must be project-relative`);
43
+ }
44
+ if (value.split(/[\\/]+/u).includes('..')) {
45
+ throw new Error(`${label} must not contain traversal segments`);
46
+ }
47
+ }
48
+
49
+ function isInside(candidate, root) {
50
+ const relative = path.relative(root, candidate);
51
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
52
+ }
53
+
54
+ function existingRegularPath(root, value, label) {
55
+ assertSafeRelativePath(value, label);
56
+ const absolute = path.resolve(root, value);
57
+ let stat;
58
+ try {
59
+ stat = fs.statSync(absolute);
60
+ } catch (error) {
61
+ if (error?.code === 'ENOENT') throw new Error(`${label} does not exist`);
62
+ throw error;
63
+ }
64
+ if (!stat.isFile()) throw new Error(`${label} must be a regular file`);
65
+ const realRoot = fs.realpathSync(root);
66
+ const realPath = fs.realpathSync(absolute);
67
+ if (!isInside(realPath, realRoot)) throw new Error(`${label} resolves outside the project root`);
68
+ return realPath;
69
+ }
70
+
71
+ function sidecarPath(root, file) {
72
+ const candidate = `${file}.json`;
73
+ const absolute = path.resolve(root, candidate);
74
+ const realRoot = fs.realpathSync(root);
75
+ if (!isInside(absolute, realRoot)) throw new Error('sidecar path resolves outside the project root');
76
+ try {
77
+ const stat = fs.lstatSync(absolute);
78
+ if (stat.isSymbolicLink()) throw new Error('sidecar path must not be a symbolic link');
79
+ if (!stat.isFile()) throw new Error('sidecar path must be a regular file');
80
+ if (!isInside(fs.realpathSync(absolute), realRoot)) throw new Error('sidecar path resolves outside the project root');
81
+ } catch (error) {
82
+ if (error?.code !== 'ENOENT') throw error;
83
+ }
84
+ return absolute;
85
+ }
86
+
87
+ /** Resolve an existing project-relative file and reject symlink escapes. */
88
+ export function resolveInputPath(value, { cwd = process.cwd() } = {}) {
89
+ const root = findProjectRoot(cwd);
90
+ return existingRegularPath(root, value, 'image path');
91
+ }
92
+
93
+ /** Write through a sibling temporary file, then atomically replace the target. */
94
+ export function writeAtomic(filePath, contents) {
95
+ const directory = path.dirname(filePath);
96
+ let targetStat = null;
97
+ try {
98
+ targetStat = fs.lstatSync(filePath);
99
+ if (targetStat.isSymbolicLink()) throw new Error('refusing to replace a symbolic link');
100
+ if (!targetStat.isFile()) throw new Error('target must be a regular file');
101
+ } catch (error) {
102
+ if (error?.code !== 'ENOENT') throw error;
103
+ }
104
+ const mode = targetStat ? targetStat.mode & 0o777 : 0o644;
105
+ const temporary = path.join(directory, `.${path.basename(filePath)}.tmp-${process.pid}-${crypto.randomBytes(8).toString('hex')}`);
106
+ let descriptor;
107
+ try {
108
+ descriptor = fs.openSync(temporary, 'wx', mode);
109
+ const buffer = Buffer.isBuffer(contents) ? contents : Buffer.from(contents);
110
+ fs.writeFileSync(descriptor, buffer);
111
+ fs.fsyncSync(descriptor);
112
+ fs.closeSync(descriptor);
113
+ descriptor = undefined;
114
+ fs.renameSync(temporary, filePath);
115
+ } catch (error) {
116
+ if (descriptor !== undefined) fs.closeSync(descriptor);
117
+ try { fs.unlinkSync(temporary); } catch { /* best effort cleanup */ }
118
+ throw error;
119
+ }
120
+ }
121
+
122
+ const crcTable = (() => {
123
+ const table = new Uint32Array(256);
124
+ for (let n = 0; n < 256; n++) {
125
+ let value = n;
126
+ for (let bit = 0; bit < 8; bit++) value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
127
+ table[n] = value >>> 0;
128
+ }
129
+ return table;
130
+ })();
131
+
132
+ const crc32 = (data) => {
133
+ let value = 0xffffffff;
134
+ for (const byte of data) value = crcTable[(value ^ byte) & 0xff] ^ (value >>> 8);
135
+ return (value ^ 0xffffffff) >>> 0;
136
+ };
137
+
138
+ function pngChunk(type, data) {
139
+ const output = Buffer.alloc(12 + data.length);
140
+ output.writeUInt32BE(data.length, 0);
141
+ output.write(type, 4, 'ascii');
142
+ data.copy(output, 8);
143
+ output.writeUInt32BE(crc32(Buffer.concat([Buffer.from(type, 'ascii'), data])), 8 + data.length);
144
+ return output;
145
+ }
146
+
147
+ function parsePngChunks(buffer) {
148
+ if (buffer.length < PNG_SIGNATURE.length || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) throw new Error('malformed PNG');
149
+ const chunks = [];
150
+ let offset = 8;
151
+ while (offset + 12 <= buffer.length) {
152
+ const length = buffer.readUInt32BE(offset);
153
+ const end = offset + 12 + length;
154
+ if (end > buffer.length) throw new Error('malformed PNG chunk');
155
+ const type = buffer.toString('ascii', offset + 4, offset + 8);
156
+ chunks.push({ type, data: buffer.subarray(offset + 8, offset + 8 + length), raw: buffer.subarray(offset, end) });
157
+ offset = end;
158
+ if (type === 'IEND') return { chunks, iendOffset: offset - chunks.at(-1).raw.length };
159
+ }
160
+ throw new Error('malformed PNG: missing IEND');
161
+ }
162
+
163
+ export function readPngText(buffer) {
164
+ try {
165
+ for (const { type, data } of parsePngChunks(buffer).chunks) {
166
+ if (type !== 'tEXt' && type !== 'zTXt') continue;
167
+ const separator = data.indexOf(0);
168
+ if (separator === -1 || data.toString('latin1', 0, separator) !== KEYWORD) continue;
169
+ if (type === 'tEXt') return data.toString('utf8', separator + 1);
170
+ if (data[separator + 1] !== 0) continue;
171
+ try { return zlib.inflateSync(data.subarray(separator + 2)).toString('utf8'); } catch { return null; }
172
+ }
173
+ } catch {
174
+ return null;
175
+ }
176
+ return null;
177
+ }
178
+
179
+ export function readJpegCom(buffer) {
180
+ let offset = 2;
181
+ while (offset + 4 <= buffer.length && buffer[offset] === 0xff) {
182
+ const marker = buffer[offset + 1];
183
+ if (marker === 0xda) break;
184
+ const length = buffer.readUInt16BE(offset + 2);
185
+ const end = offset + 2 + length;
186
+ if (length < 2 || end > buffer.length) break;
187
+ if (marker === 0xfe) {
188
+ const text = buffer.toString('utf8', offset + 4, end);
189
+ if (text.startsWith(`${KEYWORD}\0`)) return text.slice(KEYWORD.length + 1);
190
+ }
191
+ offset = end;
192
+ }
193
+ return null;
194
+ }
195
+
196
+ function argumentValue(args, name) {
197
+ const index = args.indexOf(name);
198
+ return index === -1 ? null : args[index + 1] || null;
199
+ }
200
+
201
+ function main(args = process.argv.slice(2), cwd = process.cwd()) {
202
+ const fileArgument = args.find((arg) => !arg.startsWith('--'));
203
+ if (!fileArgument) throw new Error('image file required');
204
+ const root = findProjectRoot(cwd);
205
+ const file = existingRegularPath(root, fileArgument, 'image path');
206
+ const sidecar = sidecarPath(root, file);
207
+ const buffer = fs.readFileSync(file);
208
+ const isPng = buffer.length >= 8 && buffer.subarray(0, 8).equals(PNG_SIGNATURE);
209
+ const isJpeg = buffer.length > 3 && buffer[0] === 0xff && buffer[1] === 0xd8;
210
+
211
+ if (args.includes('--read')) {
212
+ let prompt = isPng ? readPngText(buffer) : isJpeg ? readJpegCom(buffer) : null;
213
+ if (prompt == null) {
214
+ try { prompt = JSON.parse(fs.readFileSync(sidecar, 'utf8')).prompt ?? null; } catch { /* fall through */ }
215
+ }
216
+ if (prompt == null) throw Object.assign(new Error('no embedded prompt found'), { exitCode: 2 });
217
+ console.log(prompt);
218
+ return;
219
+ }
220
+
221
+ const promptFile = argumentValue(args, '--prompt-file');
222
+ const prompt = argumentValue(args, '--prompt') ?? (promptFile ? fs.readFileSync(existingRegularPath(root, promptFile, 'prompt file'), 'utf8') : null);
223
+ if (!prompt) throw new Error('--prompt or --prompt-file required');
224
+
225
+ if (isPng) {
226
+ const parsed = parsePngChunks(buffer);
227
+ const body = parsed.chunks
228
+ .filter(({ type, data }) => {
229
+ if (type !== 'tEXt' && type !== 'zTXt') return type !== 'IEND';
230
+ const separator = data.indexOf(0);
231
+ return separator === -1 || data.toString('latin1', 0, separator) !== KEYWORD;
232
+ })
233
+ .map(({ raw }) => raw);
234
+ const output = Buffer.concat([
235
+ PNG_SIGNATURE,
236
+ ...body,
237
+ pngChunk('tEXt', Buffer.concat([Buffer.from(KEYWORD, 'latin1'), Buffer.from([0]), Buffer.from(prompt, 'utf8')])),
238
+ pngChunk('IEND', Buffer.alloc(0)),
239
+ ]);
240
+ writeAtomic(file, output);
241
+ console.log(`EMBEDDED: ${fileArgument} (png tEXt, ${prompt.length} chars)`);
242
+ return;
243
+ }
244
+
245
+ if (isJpeg) {
246
+ const segment = Buffer.from(`${KEYWORD}\0${prompt}`, 'utf8');
247
+ if (segment.length + 2 > 0xffff) throw new Error('prompt too long for a JPEG segment');
248
+ const comment = Buffer.alloc(4 + segment.length);
249
+ comment[0] = 0xff;
250
+ comment[1] = 0xfe;
251
+ comment.writeUInt16BE(segment.length + 2, 2);
252
+ segment.copy(comment, 4);
253
+ writeAtomic(file, Buffer.concat([buffer.subarray(0, 2), comment, buffer.subarray(2)]));
254
+ console.log(`EMBEDDED: ${fileArgument} (jpeg COM, ${prompt.length} chars)`);
255
+ return;
256
+ }
257
+
258
+ writeAtomic(sidecar, JSON.stringify({ prompt, createdAt: new Date().toISOString() }, null, 2));
259
+ console.log(`EMBEDDED: ${fileArgument}.json (sidecar fallback for this format)`);
260
+ }
261
+
262
+ const runningPath = process.argv[1] ? path.resolve(process.argv[1]) : null;
263
+ if (runningPath === path.resolve(fileURLToPath(import.meta.url))) {
264
+ try {
265
+ main();
266
+ } catch (error) {
267
+ console.error(`embed-prompt: ${error.message}`);
268
+ process.exit(error?.exitCode || 1);
269
+ }
270
+ }
@@ -10,6 +10,11 @@
10
10
  *
11
11
  * node generate-image.mjs --prompt "..." --out mock.png [--size 1536x1024] [--quality medium]
12
12
  * node generate-image.mjs --prompt-file prompt.txt --out mock.png
13
+ * node generate-image.mjs --prompt "..." --out mock.png --ref screenshot.png [--ref more.png]
14
+ *
15
+ * --ref anchors generation on input image(s) via the edits endpoint: pass a
16
+ * captured screenshot of a representative existing page when comping a new
17
+ * surface for an established world, so the identity comes from the real UI.
13
18
  */
14
19
  import fs from 'node:fs';
15
20
  import zlib from 'node:zlib';
@@ -212,12 +217,44 @@ if (!prompt || !out) {
212
217
  }
213
218
  const size = arg('size', '1536x1024');
214
219
  const quality = arg('quality', 'medium');
220
+ // Reference images (--ref, repeatable): route through the edits endpoint,
221
+ // which accepts input images. This is how a comp for an established world
222
+ // inherits the real UI's identity from a captured screenshot instead of a
223
+ // prose paraphrase of it; the prompt then describes the NEW surface and the
224
+ // reference carries palette, type, and component character.
225
+ const refs = (() => {
226
+ const found = [];
227
+ for (let i = 0; i < process.argv.length; i += 1) {
228
+ if (process.argv[i] === '--ref' && process.argv[i + 1] && !process.argv[i + 1].startsWith('--')) found.push(process.argv[i + 1]);
229
+ }
230
+ return found;
231
+ })();
215
232
 
216
- const response = await fetch('https://api.openai.com/v1/images/generations', {
217
- method: 'POST',
218
- headers: { Authorization: `Bearer ${key}`, 'content-type': 'application/json' },
219
- body: JSON.stringify({ model: 'gpt-image-2', prompt, size, quality, n: 1 }),
220
- });
233
+ let response;
234
+ if (refs.length) {
235
+ const form = new FormData();
236
+ form.append('model', 'gpt-image-2');
237
+ form.append('prompt', prompt);
238
+ form.append('size', size);
239
+ form.append('quality', quality);
240
+ form.append('n', '1');
241
+ for (const ref of refs) {
242
+ const bytes = fs.readFileSync(ref);
243
+ const type = ref.endsWith('.png') ? 'image/png' : ref.endsWith('.webp') ? 'image/webp' : 'image/jpeg';
244
+ form.append('image[]', new Blob([bytes], { type }), ref.split('/').pop());
245
+ }
246
+ response = await fetch('https://api.openai.com/v1/images/edits', {
247
+ method: 'POST',
248
+ headers: { Authorization: `Bearer ${key}` },
249
+ body: form,
250
+ });
251
+ } else {
252
+ response = await fetch('https://api.openai.com/v1/images/generations', {
253
+ method: 'POST',
254
+ headers: { Authorization: `Bearer ${key}`, 'content-type': 'application/json' },
255
+ body: JSON.stringify({ model: 'gpt-image-2', prompt, size, quality, n: 1 }),
256
+ });
257
+ }
221
258
  if (!response.ok) {
222
259
  console.error(`generate-image: API error ${response.status}: ${(await response.text()).slice(0, 300)}`);
223
260
  process.exit(1);
@@ -229,4 +266,12 @@ if (!b64) {
229
266
  process.exit(1);
230
267
  }
231
268
  fs.writeFileSync(out, Buffer.from(b64, 'base64'));
232
- console.log(`IMAGE: ${out} (${size}, ${quality}, gpt-image-2, billed to your OpenAI key)`);
269
+ // The prompt travels with the asset: embedded in the file itself (EXIF-class
270
+ // metadata via embed-prompt.mjs) so intent survives copies across harnesses,
271
+ // plus a sidecar for anything that indexes rather than opens the image.
272
+ try {
273
+ const { spawnSync } = await import('node:child_process');
274
+ spawnSync(process.execPath, [new URL('./embed-prompt.mjs', import.meta.url).pathname, out, '--prompt', prompt], { stdio: 'ignore' });
275
+ fs.writeFileSync(`${out}.json`, JSON.stringify({ prompt, createdAt: new Date().toISOString(), tool: 'generate-image.mjs', model: 'gpt-image-2', ...(refs.length ? { refs } : {}) }, null, 2));
276
+ } catch { /* embedding is best-effort */ }
277
+ console.log(`IMAGE: ${out} (${size}, ${quality}, gpt-image-2, billed to your OpenAI key); prompt embedded + sidecar at ${out}.json`);
@@ -10,7 +10,7 @@
10
10
  * node hook-admin.mjs off # set enabled: false
11
11
  * node hook-admin.mjs ignore-rule <rule-id> # append to ignoreRules
12
12
  * node hook-admin.mjs ignore-rule overused-font --all-values
13
- * node hook-admin.mjs ignore-file <glob> # append to ignoreFiles
13
+ * node hook-admin.mjs ignore-file <glob> [--shared|--local] # append to ignoreFiles
14
14
  * node hook-admin.mjs ignore-value <rule> <value> # append to shared ignoreValues
15
15
  * node hook-admin.mjs ignore-value <rule> <value> --local
16
16
  * node hook-admin.mjs ignore-value <rule> "*" --file <glob> # rule off in <glob> only
@@ -148,7 +148,7 @@ function readRawConfigFile(filePath) {
148
148
  }
149
149
  }
150
150
 
151
- const DETECTOR_CONFIG_KEYS = new Set(['ignoreRules', 'ignoreFiles', 'ignoreValues', 'designSystem']);
151
+ const DETECTOR_CONFIG_KEYS = new Set(['ignoreRules', 'ignoreFiles', 'ignoreValues', 'designSystem', 'advisoryRules']);
152
152
 
153
153
  function hookSection(unified) {
154
154
  return unified && typeof unified === 'object' && !Array.isArray(unified) && unified.hook && typeof unified.hook === 'object' && !Array.isArray(unified.hook)
@@ -182,6 +182,15 @@ function stripDetectorKeys(raw) {
182
182
  return out;
183
183
  }
184
184
 
185
+ function pickDetectorKeys(raw) {
186
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};
187
+ const out = {};
188
+ for (const [key, value] of Object.entries(raw)) {
189
+ if (DETECTOR_CONFIG_KEYS.has(key)) out[key] = value;
190
+ }
191
+ return out;
192
+ }
193
+
185
194
  // Write hook runtime config under `hook`, leaving detector filters in
186
195
  // `detector` and preserving sibling keys such as updateCheck.
187
196
  function writeHookConfig(cwd, hookConfig, opts = {}) {
@@ -189,10 +198,19 @@ function writeHookConfig(cwd, hookConfig, opts = {}) {
189
198
  if (opts.local) ensureHookGitExcludes(cwd);
190
199
  const existingRaw = readRawConfigFile(filePath).raw;
191
200
  const existing = existingRaw && typeof existingRaw === 'object' && !Array.isArray(existingRaw) ? existingRaw : {};
192
- const existingHook = stripDetectorKeys(hookSection(existing));
201
+ const existingHookSection = hookSection(existing);
202
+ const existingHook = stripDetectorKeys(existingHookSection);
203
+ const legacyDetector = pickDetectorKeys(existingHookSection);
193
204
  // Merge over the existing hook object so fields the merge helpers don't manage
194
205
  // (consent, quiet, auditLog) survive an Impeccable hooks edit.
195
206
  const next = { ...existing, hook: { ...existingHook, ...hookConfig } };
207
+ if (Object.keys(legacyDetector).length > 0) {
208
+ const existingDetector = detectorSection(existing) || {};
209
+ next.detector = {
210
+ ...existingDetector,
211
+ ...mergeDetectorConfig(existingDetector, mergeDetectorConfig(legacyDetector)),
212
+ };
213
+ }
196
214
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
197
215
  fs.writeFileSync(filePath, JSON.stringify(next, null, 2) + '\n');
198
216
  return filePath;
@@ -204,10 +222,14 @@ function writeDetectorConfig(cwd, detectorConfig, opts = {}) {
204
222
  const existingRaw = readRawConfigFile(filePath).raw;
205
223
  const existing = existingRaw && typeof existingRaw === 'object' && !Array.isArray(existingRaw) ? existingRaw : {};
206
224
  const nextHook = stripDetectorKeys(hookSection(existing));
207
- const existingDetector = mergeDetectorConfig(detectorSection(existing));
225
+ const existingDetectorSection = detectorSection(existing) || {};
226
+ const existingDetector = mergeDetectorConfig(existingDetectorSection);
208
227
  const next = {
209
228
  ...existing,
210
- detector: mergeDetectorConfig(detectorConfig, existingDetector),
229
+ detector: {
230
+ ...existingDetectorSection,
231
+ ...mergeDetectorConfig(detectorConfig, existingDetector),
232
+ },
211
233
  };
212
234
  if (Object.keys(nextHook).length > 0) next.hook = nextHook;
213
235
  else delete next.hook;
@@ -241,12 +263,18 @@ function mergeDetectorConfig(existing, seed = null) {
241
263
  if (seed?.designSystem && typeof seed.designSystem === 'object' && !Array.isArray(seed.designSystem)) {
242
264
  out.designSystem = { ...seed.designSystem };
243
265
  }
266
+ if (seed?.advisoryRules === 'include' || seed?.advisoryRules === 'exclude') {
267
+ out.advisoryRules = seed.advisoryRules;
268
+ }
244
269
  if (base.designSystem && typeof base.designSystem === 'object' && !Array.isArray(base.designSystem)) {
245
270
  out.designSystem = {
246
271
  ...(out.designSystem || {}),
247
272
  enabled: base.designSystem.enabled === false ? false : true,
248
273
  };
249
274
  }
275
+ if (base.advisoryRules === 'include' || base.advisoryRules === 'exclude') {
276
+ out.advisoryRules = base.advisoryRules;
277
+ }
250
278
  if (Array.isArray(base.ignoreRules)) {
251
279
  out.ignoreRules = Array.from(new Set([...out.ignoreRules, ...base.ignoreRules.map(String)]));
252
280
  }
@@ -540,12 +568,44 @@ function addIgnoreRule(cwd, args) {
540
568
  return `Added "${rule}" to detector.ignoreRules. Current: ${config.ignoreRules.join(', ')}`;
541
569
  }
542
570
 
543
- function addIgnoreFile(cwd, glob) {
571
+ function parseIgnoreFileArgs(args) {
572
+ const positionals = [];
573
+ let shared = false;
574
+ let local = false;
575
+
576
+ for (const raw of args) {
577
+ const arg = String(raw || '');
578
+ if (arg === '--shared') {
579
+ shared = true;
580
+ } else if (arg === '--local') {
581
+ local = true;
582
+ } else if (arg === '--reason' || arg.startsWith('--reason=')) {
583
+ throw new Error('--reason is not supported for ignore-file because detector.ignoreFiles stores globs only; use ignore-value when a documented rule-specific exception fits');
584
+ } else if (arg.startsWith('--')) {
585
+ throw new Error(`Unknown ignore-file flag: ${arg}`);
586
+ } else {
587
+ positionals.push(arg);
588
+ }
589
+ }
590
+
591
+ if (shared && local) throw new Error('Pass only one scope flag: --shared or --local');
592
+ if (positionals.length > 1) throw new Error('Pass exactly one glob to ignore-file');
593
+
594
+ return {
595
+ glob: positionals[0],
596
+ local,
597
+ };
598
+ }
599
+
600
+ function addIgnoreFile(cwd, args) {
601
+ const parsed = parseIgnoreFileArgs(args);
602
+ const glob = parsed.glob;
544
603
  if (!glob) throw new Error(`Pass a glob, e.g. ${IMPECCABLE_COMMAND} hooks ignore-file "src/legacy/**"`);
545
- const config = mergeDetectorConfig(readRawDetectorConfig(cwd));
604
+ const config = mergeDetectorConfig(readRawDetectorConfig(cwd, { local: parsed.local }));
546
605
  if (!config.ignoreFiles.includes(glob)) config.ignoreFiles.push(glob);
547
- writeDetectorConfig(cwd, config);
548
- return `Added "${glob}" to detector.ignoreFiles. Current: ${config.ignoreFiles.join(', ')}`;
606
+ const target = writeDetectorConfig(cwd, config, { local: parsed.local });
607
+ const scope = parsed.local ? 'local detector.ignoreFiles' : 'shared detector.ignoreFiles';
608
+ return `Added "${glob}" to ${scope} (${path.relative(cwd, target) || target}). Current: ${config.ignoreFiles.join(', ')}`;
549
609
  }
550
610
 
551
611
  // An empty glob used to be dropped by filter(Boolean), so `--file=` reported
@@ -709,7 +769,7 @@ function main() {
709
769
  case 'on': out = setEnabled(cwd, true); break;
710
770
  case 'off': out = setEnabled(cwd, false); break;
711
771
  case 'ignore-rule': out = addIgnoreRule(cwd, rest); break;
712
- case 'ignore-file': out = addIgnoreFile(cwd, rest[0]); break;
772
+ case 'ignore-file': out = addIgnoreFile(cwd, rest); break;
713
773
  case 'ignore-value': out = addIgnoreValue(cwd, rest); break;
714
774
  case 'reset': out = reset(cwd); break;
715
775
  }