@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
@@ -0,0 +1,670 @@
1
+ /**
2
+ * Live root resolution: the single place that decides which directories a live
3
+ * session operates on. Every live entry script resolves this once at startup
4
+ * (see enterLiveRoot) instead of trusting its ambient cwd, which is how a
5
+ * `cd` used to silently fork the whole system into a second, empty project.
6
+ *
7
+ * Four distinct roots travel together as one manifest:
8
+ *
9
+ * appRoot what the dev server serves; where live session state,
10
+ * injected adapters, and preview modules live.
11
+ * repoRoot the git boundary (falls back to appRoot outside git).
12
+ * contextRoot the nearest directory from appRoot up to repoRoot carrying
13
+ * PRODUCT.md / DESIGN.md (canonical spot or a fallback dir).
14
+ * sessionRoot <appRoot>/.impeccable/live — durable live state.
15
+ *
16
+ * appRoot detection keys on dev-server config presence (vite/svelte/next/
17
+ * astro/nuxt/... config files), not on monorepo brand markers. A nested
18
+ * website/ with vite.config.js wins over a repo root that merely has a
19
+ * package.json. Workspace declarations are one input, not the gatekeeper.
20
+ *
21
+ * The resolved manifest is persisted at <appRoot>/.impeccable/live/roots.json
22
+ * plus a pointer at <repoRoot>/.impeccable/live/app-root.json when the two
23
+ * differ, so a helper invoked from anywhere inside the repo finds the same
24
+ * roots the boot decided on. When several apps in one repo run live, the
25
+ * pointer follows the most recent boot; per-app roots.json files stay put.
26
+ */
27
+ import fs from 'node:fs';
28
+ import os from 'node:os';
29
+ import path from 'node:path';
30
+ import { execFileSync } from 'node:child_process';
31
+ import { resolveProjectRoot } from '../context.mjs';
32
+
33
+ const ROOTS_MANIFEST_VERSION = 1;
34
+ const ROOTS_FILE = 'roots.json';
35
+ const POINTER_FILE = 'app-root.json';
36
+
37
+ const PRODUCT_NAMES = ['PRODUCT.md', 'Product.md', 'product.md'];
38
+ const DESIGN_NAMES = ['DESIGN.md', 'Design.md', 'design.md'];
39
+ const CONTEXT_FALLBACK_DIRS = ['.agents/context', 'docs'];
40
+
41
+ // Presence of any of these marks a directory as a dev-served app root.
42
+ const DEV_CONFIG_MARKERS = [
43
+ 'vite.config.js', 'vite.config.ts', 'vite.config.mjs', 'vite.config.mts', 'vite.config.cjs',
44
+ 'svelte.config.js', 'svelte.config.mjs', 'svelte.config.ts',
45
+ 'next.config.js', 'next.config.mjs', 'next.config.ts',
46
+ 'astro.config.mjs', 'astro.config.js', 'astro.config.ts', 'astro.config.cjs',
47
+ 'nuxt.config.ts', 'nuxt.config.js', 'nuxt.config.mjs',
48
+ 'remix.config.js', 'react-router.config.ts',
49
+ 'angular.json',
50
+ 'webpack.config.js', 'webpack.config.ts',
51
+ ];
52
+
53
+ const CANDIDATE_SCAN_IGNORED = new Set([
54
+ 'node_modules', '.git', 'dist', 'build', 'coverage', 'vendor', 'vendors',
55
+ '.next', '.nuxt', '.svelte-kit', '.astro', '.turbo', '.cache', '.vercel',
56
+ ]);
57
+ const CANDIDATE_SCAN_DEPTH = 2;
58
+
59
+ function exists(p) {
60
+ try { fs.statSync(p); return true; } catch { return false; }
61
+ }
62
+
63
+ function isDir(p) {
64
+ try { return fs.statSync(p).isDirectory(); } catch { return false; }
65
+ }
66
+
67
+ function firstExisting(dir, names) {
68
+ for (const name of names) {
69
+ const abs = path.join(dir, name);
70
+ if (exists(abs)) return abs;
71
+ }
72
+ return null;
73
+ }
74
+
75
+ function hasDevConfig(dir) {
76
+ if (DEV_CONFIG_MARKERS.some((name) => exists(path.join(dir, name)))) return true;
77
+ // A plain Vite app can run with zero config: index.html + package.json.
78
+ return exists(path.join(dir, 'index.html')) && exists(path.join(dir, 'package.json'));
79
+ }
80
+
81
+ function isAppRoot(dir) {
82
+ // A directory already configured for live IS an app root, dev config or not
83
+ // (plain static multi-page projects have no bundler config).
84
+ return hasDevConfig(dir) || exists(path.join(dir, '.impeccable', 'live', 'config.json'));
85
+ }
86
+
87
+ function findContextFile(dir, names) {
88
+ const direct = firstExisting(dir, names);
89
+ if (direct) return direct;
90
+ for (const rel of CONTEXT_FALLBACK_DIRS) {
91
+ const nested = firstExisting(path.join(dir, rel), names);
92
+ if (nested) return nested;
93
+ }
94
+ return null;
95
+ }
96
+
97
+ export function findGitRoot(startDir) {
98
+ let dir = path.resolve(startDir);
99
+ const home = path.resolve(os.homedir());
100
+ while (true) {
101
+ if (dir === home) return null;
102
+ if (exists(path.join(dir, '.git'))) return dir;
103
+ const parent = path.dirname(dir);
104
+ if (parent === dir) return null;
105
+ dir = parent;
106
+ }
107
+ }
108
+
109
+ function walkUp(startDir, upperBound, visit) {
110
+ let dir = path.resolve(startDir);
111
+ const stop = path.resolve(upperBound);
112
+ const home = path.resolve(os.homedir());
113
+ while (true) {
114
+ if (dir === home) return null;
115
+ const hit = visit(dir);
116
+ if (hit) return hit;
117
+ if (dir === stop) return null;
118
+ const parent = path.dirname(dir);
119
+ if (parent === dir) return null;
120
+ dir = parent;
121
+ }
122
+ }
123
+
124
+ function insideOrEqual(candidate, root) {
125
+ const rel = path.relative(path.resolve(root), path.resolve(candidate));
126
+ return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
127
+ }
128
+
129
+ function isSymlink(target) {
130
+ try { return fs.lstatSync(target).isSymbolicLink(); } catch { return false; }
131
+ }
132
+
133
+ function nearestExistingPath(target) {
134
+ let current = path.resolve(target);
135
+ const missing = [];
136
+ while (true) {
137
+ try {
138
+ return path.join(fs.realpathSync(current), ...missing);
139
+ } catch (error) {
140
+ if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR') throw error;
141
+ const parent = path.dirname(current);
142
+ if (parent === current) throw error;
143
+ missing.unshift(path.basename(current));
144
+ current = parent;
145
+ }
146
+ }
147
+ }
148
+
149
+ function assertNoSymlinkComponents(target, root, label) {
150
+ const absoluteRoot = path.resolve(root);
151
+ const absoluteTarget = path.resolve(target);
152
+ if (!insideOrEqual(absoluteTarget, absoluteRoot)) throw new Error(`${label} is outside its governing root`);
153
+ let cursor = absoluteRoot;
154
+ if (isSymlink(cursor)) throw new Error(`${label} governing root must not be a symlink`);
155
+ const relative = path.relative(absoluteRoot, absoluteTarget);
156
+ for (const segment of relative ? relative.split(path.sep) : []) {
157
+ cursor = path.join(cursor, segment);
158
+ if (isSymlink(cursor)) throw new Error(`${label} must not contain symlink components`);
159
+ }
160
+ }
161
+
162
+ function assertContainedPath(target, root, label, { allowMissing = false } = {}) {
163
+ if (typeof target !== 'string' || target.length === 0) throw new Error(`${label} is missing`);
164
+ const absoluteRoot = path.resolve(root);
165
+ const absoluteTarget = path.resolve(target);
166
+ const realRoot = fs.realpathSync(absoluteRoot);
167
+ const realTarget = nearestExistingPath(absoluteTarget);
168
+ if (!insideOrEqual(realTarget, realRoot)) throw new Error(`${label} resolves outside its governing root`);
169
+ if (insideOrEqual(absoluteTarget, absoluteRoot)) assertNoSymlinkComponents(absoluteTarget, absoluteRoot, label);
170
+ if (isSymlink(absoluteTarget)) throw new Error(`${label} must not be a symbolic link`);
171
+ if (!allowMissing && !exists(absoluteTarget)) throw new Error(`${label} does not exist`);
172
+ return realTarget;
173
+ }
174
+
175
+ function requireAbsolutePath(value, label) {
176
+ if (typeof value !== 'string' || value.length === 0) throw new Error(`${label} is missing`);
177
+ if (!path.isAbsolute(value)) throw new Error(`${label} must be absolute`);
178
+ return value;
179
+ }
180
+
181
+ function requireDirectory(target, label, { allowMissing = false } = {}) {
182
+ if (!allowMissing && !exists(target)) throw new Error(`${label} does not exist`);
183
+ if (exists(target) && !isDir(target)) throw new Error(`${label} must be a directory`);
184
+ return target;
185
+ }
186
+
187
+ /** Validate persisted roots before they can influence chdir or filesystem writes. */
188
+ export function validateRootsManifest(manifest, { expectedAppRoot = null } = {}) {
189
+ if (!manifest || typeof manifest !== 'object' || manifest.version !== ROOTS_MANIFEST_VERSION) {
190
+ throw new Error('malformed live roots manifest');
191
+ }
192
+ const appRootValue = requireAbsolutePath(manifest.appRoot, 'live roots manifest appRoot');
193
+ const repoRootValue = requireAbsolutePath(manifest.repoRoot, 'live roots manifest repoRoot');
194
+ if (isSymlink(appRootValue)) throw new Error('live roots manifest appRoot is invalid');
195
+ if (isSymlink(repoRootValue)) throw new Error('live roots manifest repoRoot is invalid');
196
+ if (insideOrEqual(appRootValue, repoRootValue)) assertNoSymlinkComponents(appRootValue, repoRootValue, 'appRoot');
197
+ const appRoot = fs.realpathSync(path.resolve(appRootValue));
198
+ if (expectedAppRoot && appRoot !== fs.realpathSync(path.resolve(expectedAppRoot))) return null;
199
+ requireDirectory(appRoot, 'live roots manifest appRoot');
200
+
201
+ const discoveredRepoRoot = findGitRoot(appRoot) || appRoot;
202
+ let repoRoot;
203
+ try {
204
+ repoRoot = fs.realpathSync(path.resolve(repoRootValue));
205
+ } catch (error) {
206
+ throw new Error('live roots manifest repoRoot does not match the governing Git boundary', { cause: error });
207
+ }
208
+ if (repoRoot !== fs.realpathSync(discoveredRepoRoot)) {
209
+ throw new Error('live roots manifest repoRoot does not match the governing Git boundary');
210
+ }
211
+ assertContainedPath(appRoot, repoRoot, 'appRoot');
212
+
213
+ const sessionRootValue = requireAbsolutePath(manifest.sessionRoot, 'sessionRoot');
214
+ const sessionRoot = assertContainedPath(sessionRootValue, appRoot, 'sessionRoot', { allowMissing: true });
215
+ requireDirectory(sessionRoot, 'sessionRoot', { allowMissing: true });
216
+ const contextRoot = manifest.contextRoot == null
217
+ ? null
218
+ : requireDirectory(assertContainedPath(requireAbsolutePath(manifest.contextRoot, 'contextRoot'), repoRoot, 'contextRoot'), 'contextRoot');
219
+ const validateContextFile = (value, label) => {
220
+ if (value == null) return null;
221
+ const file = assertContainedPath(requireAbsolutePath(value, label), repoRoot, label, { allowMissing: true });
222
+ if (!exists(file)) return file;
223
+ let stat;
224
+ try { stat = fs.statSync(file); } catch { throw new Error(`${label} is unreadable`); }
225
+ if (!stat.isFile()) throw new Error(`${label} must be a regular file`);
226
+ return file;
227
+ };
228
+ return {
229
+ ...manifest,
230
+ appRoot,
231
+ repoRoot,
232
+ contextRoot,
233
+ sessionRoot,
234
+ productPath: validateContextFile(manifest.productPath, 'productPath'),
235
+ designPath: validateContextFile(manifest.designPath, 'designPath'),
236
+ };
237
+ }
238
+
239
+ /**
240
+ * Scan downward (bounded depth) for directories carrying a dev-server config.
241
+ * Used when live boots from a directory that is not itself an app root and no
242
+ * --target narrows the choice: one candidate is auto-picked, several become a
243
+ * selection prompt.
244
+ */
245
+ export function discoverAppCandidates(rootDir, depth = CANDIDATE_SCAN_DEPTH) {
246
+ const found = [];
247
+ const scan = (dir, remaining) => {
248
+ let entries;
249
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
250
+ for (const entry of entries) {
251
+ if (!entry.isDirectory()) continue;
252
+ if (entry.name.startsWith('.') || CANDIDATE_SCAN_IGNORED.has(entry.name)) continue;
253
+ const abs = path.join(dir, entry.name);
254
+ // Same criterion as the upward walk (isAppRoot): a live-configured
255
+ // plain-static site with no bundler markers is still an app, and
256
+ // missing it here would silently fall back to the wrong root.
257
+ if (isAppRoot(abs)) {
258
+ found.push(abs);
259
+ continue; // nested apps below an app root are that app's business
260
+ }
261
+ if (remaining > 1) scan(abs, remaining - 1);
262
+ }
263
+ };
264
+ scan(path.resolve(rootDir), depth);
265
+ return found.sort();
266
+ }
267
+
268
+ /**
269
+ * Fresh root resolution. Never reads a persisted manifest.
270
+ *
271
+ * Returns { manifest } on success or { selection } when several candidate
272
+ * apps exist and nothing disambiguates.
273
+ */
274
+ export function resolveRoots({ cwd = process.cwd(), targetPath = null } = {}) {
275
+ const absCwd = path.resolve(cwd);
276
+ const absTarget = targetPath
277
+ ? (path.isAbsolute(targetPath) ? targetPath : path.resolve(absCwd, targetPath))
278
+ : null;
279
+ const targetDir = absTarget
280
+ ? (isDir(absTarget) ? absTarget : path.dirname(absTarget))
281
+ : absCwd;
282
+
283
+ // The walk bound must be an ancestor of the target: a git root found from
284
+ // the CWD is only usable when the target actually lives inside it,
285
+ // otherwise the walk would climb out of both trees.
286
+ const targetGitRoot = findGitRoot(targetDir);
287
+ const cwdGitRoot = targetGitRoot ? null : findGitRoot(absCwd);
288
+ const repoRoot = targetGitRoot
289
+ || (cwdGitRoot && insideOrEqual(targetDir, cwdGitRoot) ? cwdGitRoot : null);
290
+ // Without a git boundary, never ascend above the starting directory: the
291
+ // filesystem above an unversioned project is not ours to interpret.
292
+ const upperBound = repoRoot || targetDir;
293
+
294
+ // The workspace-aware legacy resolution (context.mjs) still decides two
295
+ // things: the fallback when no app marker exists, and how far the marker
296
+ // walk may ascend when an explicit target selected a workspace child. A
297
+ // root-level live config must never shadow a child the target picked.
298
+ const legacyRoot = resolveProjectRoot(absCwd, absTarget ? { targetPath: absTarget } : {});
299
+ const markerBound = absTarget && insideOrEqual(targetDir, legacyRoot) && insideOrEqual(legacyRoot, upperBound)
300
+ ? legacyRoot
301
+ : upperBound;
302
+
303
+ let appRoot = walkUp(targetDir, markerBound, (dir) => (isAppRoot(dir) ? dir : null));
304
+ let resolvedFrom = appRoot
305
+ ? (absTarget ? `target:${path.relative(absCwd, absTarget) || '.'}` : 'cwd')
306
+ : null;
307
+
308
+ if (!appRoot && !absTarget) {
309
+ const candidates = discoverAppCandidates(absCwd);
310
+ if (candidates.length === 1) {
311
+ appRoot = candidates[0];
312
+ resolvedFrom = `candidate:${path.relative(absCwd, appRoot)}`;
313
+ } else if (candidates.length > 1) {
314
+ return {
315
+ selection: {
316
+ candidates: candidates.map((abs) => ({
317
+ name: path.basename(abs),
318
+ path: path.relative(absCwd, abs).split(path.sep).join('/'),
319
+ })),
320
+ },
321
+ };
322
+ }
323
+ }
324
+
325
+ if (!appRoot) {
326
+ // No app marker anywhere: defer to the workspace-aware legacy resolution
327
+ // (workspace child for a targeted monorepo path, cwd otherwise). Never
328
+ // adopt an arbitrary ancestor just because it has a package.json, and
329
+ // never adopt a root that does not even contain the target.
330
+ appRoot = insideOrEqual(targetDir, legacyRoot) ? legacyRoot : targetDir;
331
+ resolvedFrom = 'fallback';
332
+ }
333
+
334
+ const effectiveRepoRoot = repoRoot && insideOrEqual(appRoot, repoRoot) ? repoRoot : appRoot;
335
+
336
+ // Each context file resolves independently: a child app may carry its own
337
+ // PRODUCT.md while inheriting DESIGN.md from the repo root (or vice versa).
338
+ const productPath = walkUp(appRoot, effectiveRepoRoot, (dir) => findContextFile(dir, PRODUCT_NAMES));
339
+ const designPath = walkUp(appRoot, effectiveRepoRoot, (dir) => findContextFile(dir, DESIGN_NAMES));
340
+ const contextRoot = productPath
341
+ ? path.dirname(productPath)
342
+ : designPath
343
+ ? path.dirname(designPath)
344
+ : null;
345
+
346
+ const manifest = validateRootsManifest({
347
+ version: ROOTS_MANIFEST_VERSION,
348
+ appRoot,
349
+ repoRoot: effectiveRepoRoot,
350
+ contextRoot,
351
+ sessionRoot: path.join(appRoot, '.impeccable', 'live'),
352
+ productPath,
353
+ designPath,
354
+ resolvedFrom,
355
+ });
356
+ return { manifest };
357
+ }
358
+
359
+ function rootsFilePath(appRoot) {
360
+ return path.join(appRoot, '.impeccable', 'live', ROOTS_FILE);
361
+ }
362
+
363
+ function pointerFilePath(repoRoot) {
364
+ return path.join(repoRoot, '.impeccable', 'live', POINTER_FILE);
365
+ }
366
+
367
+ function ensureSafeDirectory(target, root, label) {
368
+ const absoluteRoot = assertContainedPath(root, root, `${label} root`);
369
+ const absoluteTarget = assertContainedPath(target, absoluteRoot, label, { allowMissing: true });
370
+ const relative = path.relative(absoluteRoot, absoluteTarget);
371
+ let current = absoluteRoot;
372
+ for (const segment of relative ? relative.split(path.sep) : []) {
373
+ current = path.join(current, segment);
374
+ try {
375
+ const stat = fs.lstatSync(current);
376
+ if (stat.isSymbolicLink()) throw new Error(`${label} contains a symlink`);
377
+ if (!stat.isDirectory()) throw new Error(`${label} parent is not a directory`);
378
+ } catch (error) {
379
+ if (error?.code !== 'ENOENT') throw error;
380
+ fs.mkdirSync(current);
381
+ }
382
+ }
383
+ return absoluteTarget;
384
+ }
385
+
386
+ function writeManifestFile(file, root, text) {
387
+ assertContainedPath(file, root, 'manifest file', { allowMissing: true });
388
+ if (isSymlink(file)) throw new Error('manifest file must not be a symbolic link');
389
+ fs.writeFileSync(file, text, { mode: 0o644 });
390
+ }
391
+
392
+ export function writeRootsManifest(manifest) {
393
+ const safeManifest = validateRootsManifest(manifest);
394
+ const file = rootsFilePath(safeManifest.appRoot);
395
+ ensureSafeDirectory(path.dirname(file), safeManifest.appRoot, 'app roots directory');
396
+ writeManifestFile(file, safeManifest.appRoot, JSON.stringify(safeManifest, null, 2));
397
+ if (path.resolve(safeManifest.repoRoot) !== path.resolve(safeManifest.appRoot)) {
398
+ const pointer = pointerFilePath(safeManifest.repoRoot);
399
+ ensureSafeDirectory(path.dirname(pointer), safeManifest.repoRoot, 'repo roots directory');
400
+ // The pointer records EVERY app that has booted live in this repo, most
401
+ // recent first. A single last-boot-wins value made a helper run from the
402
+ // repo root silently target whichever app booted last, even while an
403
+ // earlier app's session was the one still live.
404
+ const entries = readPointerEntries(safeManifest.repoRoot)
405
+ .map((entry) => ({ ...entry, appRoot: validatePointerAppRoot(entry.appRoot, safeManifest.repoRoot) }))
406
+ .filter((entry) => path.resolve(entry.appRoot) !== path.resolve(safeManifest.appRoot));
407
+ entries.unshift({ appRoot: safeManifest.appRoot, bootedAt: new Date().toISOString() });
408
+ writeManifestFile(pointer, safeManifest.repoRoot, JSON.stringify({ version: 2, appRoots: entries }));
409
+ }
410
+ return file;
411
+ }
412
+
413
+ function readPointerEntries(repoRoot) {
414
+ const pointer = pointerFilePath(repoRoot);
415
+ assertContainedPath(pointer, fs.realpathSync(repoRoot), 'live roots pointer', { allowMissing: true });
416
+ try {
417
+ if (isSymlink(pointer)) throw new Error('live roots pointer must not be a symbolic link');
418
+ const raw = JSON.parse(fs.readFileSync(pointer, 'utf-8'));
419
+ if (Array.isArray(raw?.appRoots)) {
420
+ if (raw.version !== 2 || raw.appRoots.some((entry) => !entry || typeof entry.appRoot !== 'string')) {
421
+ throw new Error('malformed live roots pointer');
422
+ }
423
+ return raw.appRoots;
424
+ }
425
+ if (raw && typeof raw.appRoot === 'string' && (raw.version == null || raw.version === 1)) return [{ appRoot: raw.appRoot }];
426
+ throw new Error('malformed live roots pointer');
427
+ } catch (error) {
428
+ if (error?.code === 'ENOENT') return [];
429
+ if (error instanceof SyntaxError) throw new Error('malformed live roots pointer');
430
+ throw error;
431
+ }
432
+ }
433
+
434
+ function validatePointerAppRoot(value, repoRoot) {
435
+ const appRoot = requireAbsolutePath(value, 'live roots pointer appRoot');
436
+ return assertContainedPath(appRoot, repoRoot, 'live roots pointer appRoot', { allowMissing: true });
437
+ }
438
+
439
+ /**
440
+ * True when the app's live helper server is recorded and its pid is alive.
441
+ * A liveness signal alone misclassifies a REUSED pid (helper died without
442
+ * removing server.json, the OS handed the pid to something else), so the
443
+ * process's command line must also look like a node process; that removes
444
+ * reuse by arbitrary processes. A pid reused by another node process remains
445
+ * a residual false positive, which the multi-app warning and --target
446
+ * escape hatch cover.
447
+ */
448
+ function hasLiveServer(appRoot) {
449
+ let pid;
450
+ let port;
451
+ let token;
452
+ try {
453
+ const info = JSON.parse(fs.readFileSync(path.join(appRoot, '.impeccable', 'live', 'server.json'), 'utf-8'));
454
+ if (!info || typeof info.pid !== 'number') return false;
455
+ pid = info.pid;
456
+ port = Number(info.port);
457
+ token = typeof info.token === 'string' ? info.token : null;
458
+ process.kill(pid, 0);
459
+ } catch (error) {
460
+ // EPERM: the process exists but is not signalable by this user.
461
+ if (error?.code !== 'EPERM') return false;
462
+ }
463
+ // Liveness alone misclassifies a REUSED pid, and a bare TCP connect
464
+ // misclassifies a coincidental listener on a reused port. The decisive
465
+ // signal is IDENTITY: the helper answers its authenticated /status
466
+ // endpoint with the token server.json records; nothing else on that port
467
+ // can. The probe is a spawned node one-liner so it works identically on
468
+ // every platform.
469
+ if (Number.isInteger(port) && port > 0 && token) {
470
+ try {
471
+ execFileSync(process.execPath, ['-e', [
472
+ "const req = require('node:http').get({ host: '127.0.0.1', port: Number(process.argv[1]), path: '/status?token=' + encodeURIComponent(process.argv[2]), timeout: 1200 }, (res) => { res.resume(); process.exit(res.statusCode === 200 ? 0 : 1); });",
473
+ "req.on('timeout', () => { req.destroy(); process.exit(1); });",
474
+ "req.on('error', () => process.exit(1));",
475
+ ].join(''), String(port), token], { timeout: 4000, stdio: 'ignore' });
476
+ return true;
477
+ } catch {
478
+ return false;
479
+ }
480
+ }
481
+ // Every server.json this codebase has ever written records port + token
482
+ // (see writeLiveServerInfo). A record without them is malformed or foreign
483
+ // and cannot be authenticated, so it does not count as a live helper;
484
+ // resolution falls to the durable-session tier, which is the correct
485
+ // recovery path for a stopped or crashed helper anyway.
486
+ return false;
487
+ }
488
+
489
+ const TERMINAL_SESSION_PHASES = new Set(['completed', 'discarded']);
490
+
491
+ /**
492
+ * True when the app's durable session store holds a session that is not
493
+ * terminal. With every helper server stopped, this is what distinguishes
494
+ * "the app whose interrupted session the user is trying to recover" from an
495
+ * app that merely booted more recently.
496
+ */
497
+ function hasActiveDurableSession(appRoot) {
498
+ const dir = path.join(appRoot, '.impeccable', 'live', 'sessions');
499
+ let entries;
500
+ try {
501
+ entries = fs.readdirSync(dir);
502
+ } catch {
503
+ return false;
504
+ }
505
+ for (const name of entries) {
506
+ if (!name.endsWith('.snapshot.json')) continue;
507
+ try {
508
+ const snapshot = JSON.parse(fs.readFileSync(path.join(dir, name), 'utf-8'));
509
+ if (snapshot?.phase && !TERMINAL_SESSION_PHASES.has(snapshot.phase)) return true;
510
+ } catch { /* skip unreadable snapshots */ }
511
+ }
512
+ return false;
513
+ }
514
+
515
+ function readManifestAt(appRoot) {
516
+ if (isSymlink(appRoot)) throw new Error('live roots manifest appRoot must not be a symbolic link');
517
+ if (!exists(appRoot)) return null;
518
+ const file = rootsFilePath(appRoot);
519
+ assertContainedPath(file, fs.realpathSync(appRoot), 'live roots manifest', { allowMissing: true });
520
+ if (isSymlink(file)) throw new Error('live roots manifest must not be a symbolic link');
521
+ let raw;
522
+ try {
523
+ raw = JSON.parse(fs.readFileSync(file, 'utf-8'));
524
+ } catch (error) {
525
+ if (error?.code === 'ENOENT') return null;
526
+ if (error instanceof SyntaxError) throw new Error('malformed live roots manifest');
527
+ throw error;
528
+ }
529
+ if (!raw || typeof raw.appRoot !== 'string') throw new Error('malformed live roots manifest');
530
+ // A manifest is only trusted where it claims to live; anything else is a
531
+ // copied or stale file. Compare canonical paths so `/var` and `/private/var`
532
+ // aliases on macOS do not make a valid manifest look stale.
533
+ if (path.resolve(raw.appRoot) !== path.resolve(appRoot)) {
534
+ try {
535
+ if (fs.realpathSync(raw.appRoot) !== fs.realpathSync(appRoot)) return null;
536
+ } catch { return null; }
537
+ }
538
+ return validateRootsManifest(raw, { expectedAppRoot: appRoot });
539
+ }
540
+
541
+ /**
542
+ * Resolve the roots for the live session governing `cwd`, preferring a
543
+ * persisted manifest (written by the boot) over fresh detection:
544
+ *
545
+ * 1. Walk up from cwd looking for .impeccable/live/roots.json.
546
+ * 2. At the git root, follow .impeccable/live/app-root.json to the app.
547
+ * 3. Fresh resolveRoots().
548
+ *
549
+ * Fresh results are NOT persisted here; only the boot (live.mjs / server
550
+ * startup) writes manifests, so ad-hoc helper invocations cannot mint
551
+ * conflicting truth.
552
+ */
553
+ export function resolveLiveRoots(cwd = process.cwd(), { targetPath = null } = {}) {
554
+ const absCwd = path.resolve(cwd);
555
+
556
+ if (!targetPath) {
557
+ const gitRoot = findGitRoot(absCwd);
558
+ const persisted = walkUp(absCwd, gitRoot || absCwd, (dir) => readManifestAt(dir));
559
+ if (persisted) return { manifest: persisted, source: 'persisted' };
560
+
561
+ if (gitRoot) {
562
+ // Several apps in one repo may have booted live. Preference order:
563
+ // a running helper server, then an app whose durable store still holds
564
+ // a non-terminal session (the stopped session the user is recovering),
565
+ // then the most recent boot. A stale pointer entry must never redirect
566
+ // status/poll/accept onto the wrong app's session store.
567
+ const pointerRoot = fs.realpathSync(gitRoot);
568
+ const candidates = readPointerEntries(pointerRoot)
569
+ .map((entry) => readManifestAt(validatePointerAppRoot(entry.appRoot, pointerRoot)))
570
+ .filter(Boolean);
571
+ if (candidates.length > 0) {
572
+ const liveApps = candidates.filter((manifest) => hasLiveServer(manifest.appRoot));
573
+ const recoveringApps = liveApps.length > 0
574
+ ? liveApps
575
+ : candidates.filter((manifest) => hasActiveDurableSession(manifest.appRoot));
576
+ const tier = recoveringApps.length > 0 ? recoveringApps : candidates;
577
+ // Multiple apps qualifying at the same tier is inherent ambiguity:
578
+ // intent is unknowable from the repo root. The choice stays
579
+ // deterministic (most recent boot first), but it must be LOUD, not
580
+ // silent, so the agent can re-anchor when it meant the other app.
581
+ if (tier.length > 1) {
582
+ const chosen = tier[0].appRoot;
583
+ const others = tier.slice(1).map((manifest) => manifest.appRoot).join(', ');
584
+ process.stderr.write(
585
+ `[impeccable live] Multiple apps in this repo have live state; using ${chosen}. `
586
+ + `Other candidate(s): ${others}. Run from the app directory (or pass --target) to address a specific app.\n`,
587
+ );
588
+ }
589
+ return { manifest: tier[0], source: 'pointer' };
590
+ }
591
+ }
592
+ }
593
+
594
+ const fresh = resolveRoots({ cwd: absCwd, targetPath });
595
+ if (fresh.selection) return { selection: fresh.selection, source: 'fresh' };
596
+ return { manifest: fresh.manifest, source: 'fresh' };
597
+ }
598
+
599
+ /**
600
+ * Consume a `--target <path>` / `--target=<path>` pair from an argv array,
601
+ * returning the value and removing the tokens so downstream flag parsers
602
+ * (which do not know the option) never see them.
603
+ */
604
+ export function consumeTargetArg(argv = process.argv) {
605
+ for (let i = 0; i < argv.length; i++) {
606
+ const arg = argv[i];
607
+ if (arg === '--target') {
608
+ const value = argv[i + 1];
609
+ // A --target with no usable value must not degrade into implicit root
610
+ // selection: these helpers mutate session state, and "the most recent
611
+ // app" is exactly what the caller was trying NOT to get.
612
+ if (typeof value !== 'string' || value === '' || value.startsWith('--')) {
613
+ throw new Error('--target requires a path value (use --target <path> or --target=<path>)');
614
+ }
615
+ argv.splice(i, 2);
616
+ return value;
617
+ }
618
+ if (typeof arg === 'string' && arg.startsWith('--target=')) {
619
+ const value = arg.slice('--target='.length);
620
+ if (value === '') {
621
+ throw new Error('--target requires a path value (use --target <path> or --target=<path>)');
622
+ }
623
+ argv.splice(i, 1);
624
+ return value;
625
+ }
626
+ }
627
+ return null;
628
+ }
629
+
630
+ /**
631
+ * Entry-point guard for live CLI scripts: resolve the governing roots and
632
+ * make appRoot the process cwd so every downstream path derivation agrees
633
+ * with the boot. An explicit `--target <path>` on the helper's command line
634
+ * overrides pointer resolution, which is what disambiguates a repo with
635
+ * several live apps (the multi-app warning names this escape hatch, so it
636
+ * has to actually work on every helper). Returns the manifest. On selection
637
+ * ambiguity it stays in the current directory (the boot flow handles
638
+ * prompting); a malformed --target exits with an error instead of silently
639
+ * falling back to implicit selection, which could mutate the wrong app.
640
+ */
641
+ export function enterLiveRoot(cwd = process.cwd()) {
642
+ let targetPath;
643
+ try {
644
+ targetPath = consumeTargetArg(process.argv);
645
+ } catch (err) {
646
+ console.error(`[impeccable live] ${err.message}`);
647
+ process.exit(1);
648
+ }
649
+ const resolved = resolveLiveRoots(cwd, targetPath ? { targetPath } : {});
650
+ if (!resolved.manifest) return null;
651
+ const appRoot = resolved.manifest.appRoot;
652
+ if (path.resolve(cwd) !== path.resolve(appRoot)) {
653
+ // Failing to land on the resolved appRoot must be fatal: a helper that
654
+ // silently keeps its ambient cwd derives server, session, and source
655
+ // paths from a different project and mutates the wrong state. A manifest
656
+ // pointing at a deleted directory is stale ambient truth, not a reason
657
+ // to guess.
658
+ if (!isDir(appRoot)) {
659
+ console.error(`[impeccable live] resolved app root does not exist: ${appRoot} (stale roots manifest? re-run the live boot, or pass --target <path>)`);
660
+ process.exit(1);
661
+ }
662
+ try {
663
+ process.chdir(appRoot);
664
+ } catch (err) {
665
+ console.error(`[impeccable live] could not enter app root ${appRoot}: ${err.message}`);
666
+ process.exit(1);
667
+ }
668
+ }
669
+ return resolved.manifest;
670
+ }