@bastani/atomic 0.9.13 → 0.9.14-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (762) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/package.json +3 -3
  5. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  6. package/dist/builtin/subagents/README.md +6 -4
  7. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  8. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  10. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  13. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  14. package/dist/builtin/subagents/agents/debugger.md +1 -1
  15. package/dist/builtin/subagents/agents/worker.md +1 -1
  16. package/dist/builtin/subagents/package.json +6 -5
  17. package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
  18. package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
  19. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
  20. package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
  21. package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
  22. package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
  23. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  24. package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
  25. package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
  26. package/dist/builtin/subagents/src/agents/agents.ts +7 -5
  27. package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
  28. package/dist/builtin/subagents/src/agents/identity.ts +1 -1
  29. package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
  30. package/dist/builtin/subagents/src/agents/skills.ts +64 -6
  31. package/dist/builtin/subagents/src/extension/config.ts +1 -1
  32. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
  33. package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
  34. package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
  35. package/dist/builtin/subagents/src/extension/index.ts +23 -23
  36. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  37. package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
  38. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
  39. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
  40. package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
  41. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
  42. package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
  43. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  44. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
  45. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
  46. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
  47. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
  49. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
  50. package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
  51. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
  52. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
  53. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
  54. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
  55. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
  56. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
  57. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
  58. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
  59. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
  60. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
  61. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
  62. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
  63. package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
  64. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
  65. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
  66. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
  67. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
  68. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
  69. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
  70. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
  71. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
  72. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
  73. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
  74. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
  75. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  76. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
  77. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
  78. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
  79. package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
  80. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  81. package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
  82. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
  83. package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
  84. package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
  85. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
  86. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  87. package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
  88. package/dist/builtin/subagents/src/shared/settings.ts +4 -4
  89. package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
  90. package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
  91. package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
  92. package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
  93. package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
  94. package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
  95. package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
  96. package/dist/builtin/subagents/src/shared/types.ts +6 -6
  97. package/dist/builtin/subagents/src/shared/utils.ts +3 -3
  98. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
  99. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
  101. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
  102. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  103. package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
  104. package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
  105. package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
  106. package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
  107. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  108. package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
  109. package/dist/builtin/subagents/src/tui/render.ts +4 -4
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/workflows/CHANGELOG.md +57 -0
  112. package/dist/builtin/workflows/README.md +39 -8
  113. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  114. package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
  115. package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
  116. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
  117. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  118. package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
  119. package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
  120. package/dist/builtin/workflows/builtin/goal.ts +4 -0
  121. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  122. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  123. package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
  124. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  125. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  126. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
  127. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  128. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  129. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  130. package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
  131. package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
  132. package/dist/builtin/workflows/builtin/ralph.ts +4 -0
  133. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  134. package/dist/builtin/workflows/builtin/tournament.ts +4 -0
  135. package/dist/builtin/workflows/package.json +2 -2
  136. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  137. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  138. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  139. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  140. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  141. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  142. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  143. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  144. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  146. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  147. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  148. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  149. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  150. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  151. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  152. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  153. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  154. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  155. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  156. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  157. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  158. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  159. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  160. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  161. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  162. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  163. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  164. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  165. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  166. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  167. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  173. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  181. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  183. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  189. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  190. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  191. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  192. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  193. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  194. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  226. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  227. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  228. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  229. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  230. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  231. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  232. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  233. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  234. package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
  235. package/dist/builtin/workflows/src/authoring.d.ts +3 -0
  236. package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
  237. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  238. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  239. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  240. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  241. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  242. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  243. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  244. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  245. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  246. package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
  247. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
  248. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  249. package/dist/builtin/workflows/src/engine/run.ts +1 -0
  250. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  251. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  252. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  253. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  254. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
  255. package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
  256. package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
  257. package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
  258. package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
  259. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  260. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  261. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  262. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  263. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  264. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
  265. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  270. package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
  273. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  274. package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
  275. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  276. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  277. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  278. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  279. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  280. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  282. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  283. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  284. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  285. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
  286. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
  287. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  288. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  289. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  290. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  291. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  292. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  293. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  294. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  295. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  296. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  297. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  298. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  299. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  300. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  301. package/dist/cli/args.d.ts +1 -0
  302. package/dist/cli/args.d.ts.map +1 -1
  303. package/dist/cli/args.js +11 -0
  304. package/dist/cli/args.js.map +1 -1
  305. package/dist/cli/auth-check.d.ts +1 -1
  306. package/dist/cli/auth-check.js.map +1 -1
  307. package/dist/cli/credential-print.d.ts +1 -1
  308. package/dist/cli/credential-print.js.map +1 -1
  309. package/dist/cli/list-models.d.ts +1 -1
  310. package/dist/cli/list-models.js.map +1 -1
  311. package/dist/cli/startup-ui.d.ts +9 -0
  312. package/dist/cli/startup-ui.d.ts.map +1 -1
  313. package/dist/cli/startup-ui.js +7 -1
  314. package/dist/cli/startup-ui.js.map +1 -1
  315. package/dist/core/agent-session-custom-message-commit.js +2 -2
  316. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  317. package/dist/core/agent-session-export.d.ts +6 -1
  318. package/dist/core/agent-session-export.d.ts.map +1 -1
  319. package/dist/core/agent-session-export.js +6 -3
  320. package/dist/core/agent-session-export.js.map +1 -1
  321. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  322. package/dist/core/agent-session-extension-bindings.js +6 -4
  323. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  324. package/dist/core/agent-session-methods.d.ts +5 -2
  325. package/dist/core/agent-session-methods.d.ts.map +1 -1
  326. package/dist/core/agent-session-methods.js.map +1 -1
  327. package/dist/core/agent-session-prompt.d.ts +12 -1
  328. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  329. package/dist/core/agent-session-prompt.js +31 -10
  330. package/dist/core/agent-session-prompt.js.map +1 -1
  331. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  332. package/dist/core/agent-session-services.d.ts +1 -1
  333. package/dist/core/agent-session-services.js.map +1 -1
  334. package/dist/core/agent-session-skill-block.d.ts +1 -0
  335. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  336. package/dist/core/agent-session-skill-block.js +18 -2
  337. package/dist/core/agent-session-skill-block.js.map +1 -1
  338. package/dist/core/agent-session-state.d.ts.map +1 -1
  339. package/dist/core/agent-session-state.js +2 -1
  340. package/dist/core/agent-session-state.js.map +1 -1
  341. package/dist/core/agent-session-types.d.ts +2 -1
  342. package/dist/core/agent-session-types.d.ts.map +1 -1
  343. package/dist/core/agent-session-types.js.map +1 -1
  344. package/dist/core/agent-session.d.ts +1 -1
  345. package/dist/core/agent-session.js.map +1 -1
  346. package/dist/core/atomic-guide-command.js +2 -2
  347. package/dist/core/atomic-guide-command.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +0 -6
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  352. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  353. package/dist/core/cloudflare-gateway-binding.js +11 -0
  354. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  355. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  356. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  357. package/dist/core/codex-fast-mode-transport.js +130 -0
  358. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  359. package/dist/core/codex-fast-mode.d.ts +20 -6
  360. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  361. package/dist/core/codex-fast-mode.js +111 -3
  362. package/dist/core/codex-fast-mode.js.map +1 -1
  363. package/dist/core/diagnostics.d.ts +4 -0
  364. package/dist/core/diagnostics.d.ts.map +1 -1
  365. package/dist/core/diagnostics.js.map +1 -1
  366. package/dist/core/event-bus.d.ts +12 -0
  367. package/dist/core/event-bus.d.ts.map +1 -1
  368. package/dist/core/event-bus.js +22 -0
  369. package/dist/core/event-bus.js.map +1 -1
  370. package/dist/core/experimental.d.ts +25 -0
  371. package/dist/core/experimental.d.ts.map +1 -1
  372. package/dist/core/experimental.js +24 -0
  373. package/dist/core/experimental.js.map +1 -1
  374. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  375. package/dist/core/export-html/template.js +4 -3
  376. package/dist/core/extension-session-state.d.ts +28 -0
  377. package/dist/core/extension-session-state.d.ts.map +1 -0
  378. package/dist/core/extension-session-state.js +55 -0
  379. package/dist/core/extension-session-state.js.map +1 -0
  380. package/dist/core/extensions/api-types.d.ts +6 -0
  381. package/dist/core/extensions/api-types.d.ts.map +1 -1
  382. package/dist/core/extensions/api-types.js.map +1 -1
  383. package/dist/core/extensions/context-types.d.ts +4 -0
  384. package/dist/core/extensions/context-types.d.ts.map +1 -1
  385. package/dist/core/extensions/context-types.js.map +1 -1
  386. package/dist/core/extensions/index.d.ts +1 -0
  387. package/dist/core/extensions/index.d.ts.map +1 -1
  388. package/dist/core/extensions/index.js +1 -0
  389. package/dist/core/extensions/index.js.map +1 -1
  390. package/dist/core/extensions/loader-api.d.ts +1 -1
  391. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  392. package/dist/core/extensions/loader-api.js +16 -10
  393. package/dist/core/extensions/loader-api.js.map +1 -1
  394. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  395. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  396. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  397. package/dist/core/extensions/runner-context.d.ts +2 -0
  398. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  399. package/dist/core/extensions/runner-context.js +8 -0
  400. package/dist/core/extensions/runner-context.js.map +1 -1
  401. package/dist/core/extensions/runner.d.ts +1 -0
  402. package/dist/core/extensions/runner.d.ts.map +1 -1
  403. package/dist/core/extensions/runner.js +3 -0
  404. package/dist/core/extensions/runner.js.map +1 -1
  405. package/dist/core/extensions/runtime-types.d.ts +3 -0
  406. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  407. package/dist/core/extensions/runtime-types.js.map +1 -1
  408. package/dist/core/extensions/ui-types.d.ts +26 -0
  409. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  410. package/dist/core/extensions/ui-types.js +17 -1
  411. package/dist/core/extensions/ui-types.js.map +1 -1
  412. package/dist/core/http-dispatcher.d.ts.map +1 -1
  413. package/dist/core/http-dispatcher.js +5 -0
  414. package/dist/core/http-dispatcher.js.map +1 -1
  415. package/dist/core/keybindings.d.ts +24 -0
  416. package/dist/core/keybindings.d.ts.map +1 -1
  417. package/dist/core/keybindings.js +6 -0
  418. package/dist/core/keybindings.js.map +1 -1
  419. package/dist/core/model-config.d.ts +5 -0
  420. package/dist/core/model-config.d.ts.map +1 -1
  421. package/dist/core/model-config.js +1 -0
  422. package/dist/core/model-config.js.map +1 -1
  423. package/dist/core/model-registry.d.ts +1 -1
  424. package/dist/core/model-registry.js.map +1 -1
  425. package/dist/core/model-resolver-cli.d.ts +1 -1
  426. package/dist/core/model-resolver-cli.js.map +1 -1
  427. package/dist/core/model-resolver-defaults.js +3 -3
  428. package/dist/core/model-resolver-defaults.js.map +1 -1
  429. package/dist/core/model-resolver-initial.d.ts +1 -1
  430. package/dist/core/model-resolver-initial.js.map +1 -1
  431. package/dist/core/model-resolver-scope.d.ts +1 -1
  432. package/dist/core/model-resolver-scope.js.map +1 -1
  433. package/dist/core/model-runtime.d.ts +54 -0
  434. package/dist/core/model-runtime.d.ts.map +1 -1
  435. package/dist/core/model-runtime.js +96 -13
  436. package/dist/core/model-runtime.js.map +1 -1
  437. package/dist/core/oauth-login.js.map +1 -1
  438. package/dist/core/project-trust.d.ts +10 -0
  439. package/dist/core/project-trust.d.ts.map +1 -1
  440. package/dist/core/project-trust.js +12 -0
  441. package/dist/core/project-trust.js.map +1 -1
  442. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  443. package/dist/core/resource-loader-assets.js +14 -5
  444. package/dist/core/resource-loader-assets.js.map +1 -1
  445. package/dist/core/resource-loader-core.d.ts +3 -0
  446. package/dist/core/resource-loader-core.d.ts.map +1 -1
  447. package/dist/core/resource-loader-core.js +5 -0
  448. package/dist/core/resource-loader-core.js.map +1 -1
  449. package/dist/core/resource-loader-internals.d.ts +2 -0
  450. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  451. package/dist/core/resource-loader-internals.js.map +1 -1
  452. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  453. package/dist/core/resource-loader-reload.js +2 -0
  454. package/dist/core/resource-loader-reload.js.map +1 -1
  455. package/dist/core/resource-loader-types.d.ts +2 -0
  456. package/dist/core/resource-loader-types.d.ts.map +1 -1
  457. package/dist/core/resource-loader-types.js.map +1 -1
  458. package/dist/core/resource-loader.d.ts +2 -0
  459. package/dist/core/resource-loader.d.ts.map +1 -1
  460. package/dist/core/resource-loader.js +1 -0
  461. package/dist/core/resource-loader.js.map +1 -1
  462. package/dist/core/sdk-types.d.ts +7 -6
  463. package/dist/core/sdk-types.d.ts.map +1 -1
  464. package/dist/core/sdk-types.js.map +1 -1
  465. package/dist/core/sdk.d.ts.map +1 -1
  466. package/dist/core/sdk.js +17 -6
  467. package/dist/core/sdk.js.map +1 -1
  468. package/dist/core/session-manager-core.d.ts +7 -1
  469. package/dist/core/session-manager-core.d.ts.map +1 -1
  470. package/dist/core/session-manager-core.js +11 -2
  471. package/dist/core/session-manager-core.js.map +1 -1
  472. package/dist/core/session-manager-entries.d.ts +2 -2
  473. package/dist/core/session-manager-entries.d.ts.map +1 -1
  474. package/dist/core/session-manager-entries.js +6 -4
  475. package/dist/core/session-manager-entries.js.map +1 -1
  476. package/dist/core/session-manager-list.d.ts.map +1 -1
  477. package/dist/core/session-manager-list.js +5 -1
  478. package/dist/core/session-manager-list.js.map +1 -1
  479. package/dist/core/session-manager-types.d.ts +25 -2
  480. package/dist/core/session-manager-types.d.ts.map +1 -1
  481. package/dist/core/session-manager-types.js.map +1 -1
  482. package/dist/core/session-manager.d.ts +1 -1
  483. package/dist/core/session-manager.d.ts.map +1 -1
  484. package/dist/core/session-manager.js.map +1 -1
  485. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  486. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  487. package/dist/core/settings-manager-basic-accessors.js +8 -0
  488. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  489. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  490. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  491. package/dist/core/settings-manager-ui-accessors.js +9 -0
  492. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  493. package/dist/core/settings-manager.d.ts +1 -1
  494. package/dist/core/settings-manager.d.ts.map +1 -1
  495. package/dist/core/settings-manager.js.map +1 -1
  496. package/dist/core/settings-types.d.ts +4 -0
  497. package/dist/core/settings-types.d.ts.map +1 -1
  498. package/dist/core/settings-types.js.map +1 -1
  499. package/dist/core/skill-catalog.d.ts +35 -0
  500. package/dist/core/skill-catalog.d.ts.map +1 -0
  501. package/dist/core/skill-catalog.js +264 -0
  502. package/dist/core/skill-catalog.js.map +1 -0
  503. package/dist/core/skills-async.d.ts.map +1 -1
  504. package/dist/core/skills-async.js +12 -6
  505. package/dist/core/skills-async.js.map +1 -1
  506. package/dist/core/skills.d.ts +2 -0
  507. package/dist/core/skills.d.ts.map +1 -1
  508. package/dist/core/skills.js +8 -5
  509. package/dist/core/skills.js.map +1 -1
  510. package/dist/core/slash-commands.d.ts.map +1 -1
  511. package/dist/core/slash-commands.js +1 -5
  512. package/dist/core/slash-commands.js.map +1 -1
  513. package/dist/core/system-prompt.js +2 -2
  514. package/dist/core/system-prompt.js.map +1 -1
  515. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
  516. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  517. package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
  518. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  519. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
  520. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
  521. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  522. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
  523. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
  524. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  525. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  526. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
  527. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  528. package/dist/core/tools/bash.d.ts.map +1 -1
  529. package/dist/core/tools/bash.js +2 -0
  530. package/dist/core/tools/bash.js.map +1 -1
  531. package/dist/core/tools/edit.d.ts.map +1 -1
  532. package/dist/core/tools/edit.js +2 -0
  533. package/dist/core/tools/edit.js.map +1 -1
  534. package/dist/core/tools/find.d.ts.map +1 -1
  535. package/dist/core/tools/find.js +3 -1
  536. package/dist/core/tools/find.js.map +1 -1
  537. package/dist/core/tools/grep.js +1 -1
  538. package/dist/core/tools/grep.js.map +1 -1
  539. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  540. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  541. package/dist/core/tools/hashline-engine/format.js +4 -2
  542. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  543. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  544. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  545. package/dist/core/tools/hashline-engine/messages.js +4 -2
  546. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  547. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  548. package/dist/core/tools/hashline-engine/parser.js +16 -4
  549. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  550. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  551. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  552. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  553. package/dist/core/tools/hashline.d.ts.map +1 -1
  554. package/dist/core/tools/hashline.js +8 -2
  555. package/dist/core/tools/hashline.js.map +1 -1
  556. package/dist/core/tools/ls.d.ts.map +1 -1
  557. package/dist/core/tools/ls.js +2 -0
  558. package/dist/core/tools/ls.js.map +1 -1
  559. package/dist/core/tools/read.d.ts.map +1 -1
  560. package/dist/core/tools/read.js +8 -1
  561. package/dist/core/tools/read.js.map +1 -1
  562. package/dist/core/tools/search.d.ts.map +1 -1
  563. package/dist/core/tools/search.js +2 -0
  564. package/dist/core/tools/search.js.map +1 -1
  565. package/dist/core/tools/todos.d.ts +3 -12
  566. package/dist/core/tools/todos.d.ts.map +1 -1
  567. package/dist/core/tools/todos.js +19 -4
  568. package/dist/core/tools/todos.js.map +1 -1
  569. package/dist/core/tools/write.d.ts.map +1 -1
  570. package/dist/core/tools/write.js +2 -0
  571. package/dist/core/tools/write.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js +1 -1
  575. package/dist/index-extensions.js.map +1 -1
  576. package/dist/index.d.ts +8 -5
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +6 -2
  579. package/dist/index.js.map +1 -1
  580. package/dist/main-runtime-api-key.d.ts +1 -1
  581. package/dist/main-runtime-api-key.js.map +1 -1
  582. package/dist/main-session-options.d.ts +1 -1
  583. package/dist/main-session-options.js.map +1 -1
  584. package/dist/main.d.ts.map +1 -1
  585. package/dist/main.js +10 -2
  586. package/dist/main.js.map +1 -1
  587. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  588. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  589. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  590. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  592. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  593. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  594. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  596. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  598. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  600. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  601. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  602. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  604. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/model-selector.js +2 -1
  606. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  607. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  608. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  609. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
  610. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
  612. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
  613. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  614. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  616. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  617. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  619. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  620. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  622. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  623. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  624. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  626. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/tool-execution.js +12 -1
  628. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  634. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  635. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  636. package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
  637. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  638. package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
  639. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  640. package/dist/modes/interactive/interactive-mode-base.js +80 -11
  641. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  642. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  644. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  646. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  648. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  649. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  651. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  652. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  653. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  654. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  655. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  656. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  657. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  658. package/dist/modes/interactive/interactive-selectors.js +7 -3
  659. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  660. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  661. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  662. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  663. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  664. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  665. package/dist/modes/interactive/interactive-startup.js +34 -9
  666. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  667. package/dist/modes/interactive/interactive-tui.d.ts +21 -1
  668. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-tui.js +140 -38
  670. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  671. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  672. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  673. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  674. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  675. package/dist/modes/interactive/theme/dark.json +2 -0
  676. package/dist/modes/interactive/theme/light.json +2 -0
  677. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  678. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  679. package/dist/modes/interactive/theme/theme-class.js +6 -1
  680. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  681. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  682. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  683. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  684. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  685. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  686. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  687. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  688. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  689. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  691. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  692. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  693. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  694. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  695. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  696. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  697. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  698. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  699. package/dist/modes/interactive-engine/protocol.js +1 -0
  700. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  701. package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
  702. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  703. package/dist/modes/interactive-engine/remote-component.js +3 -2
  704. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  705. package/dist/modes/json-event.d.ts +6 -1
  706. package/dist/modes/json-event.d.ts.map +1 -1
  707. package/dist/modes/json-event.js +17 -2
  708. package/dist/modes/json-event.js.map +1 -1
  709. package/dist/modes/rpc/rpc-client.js.map +1 -1
  710. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  711. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  712. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  713. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  714. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  715. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  716. package/dist/modes/rpc/rpc-types.js.map +1 -1
  717. package/dist/package-manager-cli.js.map +1 -1
  718. package/dist/server/create-harness.d.ts.map +1 -1
  719. package/dist/server/create-harness.js +11 -0
  720. package/dist/server/create-harness.js.map +1 -1
  721. package/dist/utils/abort.d.ts +9 -0
  722. package/dist/utils/abort.d.ts.map +1 -0
  723. package/dist/utils/abort.js +19 -0
  724. package/dist/utils/abort.js.map +1 -0
  725. package/dist/utils/tools-manager.d.ts +16 -1
  726. package/dist/utils/tools-manager.d.ts.map +1 -1
  727. package/dist/utils/tools-manager.js +19 -19
  728. package/dist/utils/tools-manager.js.map +1 -1
  729. package/docs/custom-provider.md +9 -8
  730. package/docs/development.md +0 -1
  731. package/docs/docs.json +0 -1
  732. package/docs/environment-variables.md +3 -0
  733. package/docs/extensions.md +100 -2
  734. package/docs/json.md +3 -1
  735. package/docs/keybindings.md +8 -3
  736. package/docs/models/artificial-analysis-index.md +2 -2
  737. package/docs/models/model-selection.md +32 -23
  738. package/docs/models/pareto-efficiency.md +25 -24
  739. package/docs/providers.md +95 -2
  740. package/docs/quickstart.md +4 -2
  741. package/docs/rpc.md +21 -7
  742. package/docs/sdk.md +26 -1
  743. package/docs/session-format.md +5 -2
  744. package/docs/settings.md +34 -3
  745. package/docs/skills.md +16 -1
  746. package/docs/terminal-setup.md +15 -2
  747. package/docs/themes.md +22 -4
  748. package/docs/tools.md +3 -1
  749. package/docs/tui.md +2 -0
  750. package/docs/usage.md +5 -4
  751. package/docs/workflows.md +96 -19
  752. package/npm-shrinkwrap.json +211 -232
  753. package/package.json +8 -8
  754. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  755. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  756. package/dist/builtin/i-have-adhd/README.md +0 -18
  757. package/dist/builtin/i-have-adhd/index.ts +0 -238
  758. package/dist/builtin/i-have-adhd/package.json +0 -56
  759. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  760. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  761. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  762. package/docs/i-have-adhd.md +0 -36
@@ -1,6 +1,6 @@
1
1
  import { GRAPH_SCROLL_STEP_COLS } from "./graph-view-constants.js";
2
2
  import { GraphViewRenderer } from "./graph-view-render.js";
3
- import { isKeybindingsLike, type KeybindingsLike } from "./keybindings-adapter.js";
3
+ import { APP_ACTION, isKeybindingsLike, type KeybindingsLike, matchesAction } from "./keybindings-adapter.js";
4
4
  import { isTerminalLeftMousePress, parseTerminalMouseInput, terminalMouseWheelDirection } from "./mouse-input.js";
5
5
  import { defaultResponseFor, handlePromptCardInput } from "./prompt-card.js";
6
6
  import { filterStages, type SwitcherState } from "./switcher.js";
@@ -12,11 +12,14 @@ interface MouseWheelDelta {
12
12
  }
13
13
 
14
14
  const GRAPH_SCROLL_WHEEL_LINES = 4;
15
+ /** Raw Ctrl+O is only a compatibility fallback for hosts without keybindings. */
16
+ const TOOL_EXPAND_FALLBACK = "\x0f";
15
17
 
16
18
  /** Keyboard, mouse, switcher, prompt, and focus navigation handling. */
17
19
  export abstract class GraphViewInputController extends GraphViewRenderer {
18
20
  /** Returns true if consumed. */
19
21
  handleInput(data: string): boolean {
22
+ if (this.toolDetail !== null) return this._handleToolDetailInput(data);
20
23
  if (this._isReturnToMainChatInput(data)) {
21
24
  this._returnToMainChat();
22
25
  return true;
@@ -35,10 +38,89 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
35
38
  return this._handleGraphInput(data);
36
39
  }
37
40
 
41
+ private _handleToolDetailInput(data: string): boolean {
42
+ if (this.graphLayout.handleScrollbarInput(data)) {
43
+ this.pendingEnsureFocusedVisible = false;
44
+ return true;
45
+ }
46
+ const wheelDelta = this._mouseWheelDelta(data);
47
+ if (wheelDelta) {
48
+ if (wheelDelta.rows !== 0) this._scrollGraphVertically(wheelDelta.rows);
49
+ return true;
50
+ }
51
+ if (this._matchesToolExpandInput(data)) {
52
+ this.toolDetailExpanded = !this.toolDetailExpanded;
53
+ this.pendingEnsureFocusedVisible = true;
54
+ return true;
55
+ }
56
+ if (this._isReturnToMainChatInput(data) || matchesKey(data, Key.escape)) {
57
+ this._closeToolDetail();
58
+ return true;
59
+ }
60
+ if (matchesKey(data, Key.ctrl("c"))) {
61
+ this.onClose?.();
62
+ return true;
63
+ }
64
+ if (matchesKey(data, "h") && this.onHide) {
65
+ this.onHide();
66
+ return true;
67
+ }
68
+ // A capped payload still renders far more rows than a terminal shows, so
69
+ // the detail must be readable without a mouse: these keys drive the same
70
+ // vertical scroll the wheel and scrollbar drive.
71
+ if (matchesKey(data, Key.down)) {
72
+ this._scrollGraphVertically(1);
73
+ return true;
74
+ }
75
+ if (matchesKey(data, Key.up)) {
76
+ this._scrollGraphVertically(-1);
77
+ return true;
78
+ }
79
+ if (matchesKey(data, Key.pageDown)) {
80
+ this._scrollGraphVertically(this._toolDetailPageRows());
81
+ return true;
82
+ }
83
+ if (matchesKey(data, Key.pageUp)) {
84
+ this._scrollGraphVertically(-this._toolDetailPageRows());
85
+ return true;
86
+ }
87
+ if (matchesKey(data, Key.home)) {
88
+ this.pendingEnsureFocusedVisible = false;
89
+ this.graphLayout.scrollView.scrollToStart();
90
+ return true;
91
+ }
92
+ if (matchesKey(data, Key.end)) {
93
+ this.pendingEnsureFocusedVisible = false;
94
+ this.graphLayout.scrollView.scrollToEnd();
95
+ return true;
96
+ }
97
+ if (
98
+ matchesKey(data, Key.enter) ||
99
+ matchesKey(data, Key.left) ||
100
+ matchesKey(data, Key.right) ||
101
+ matchesKey(data, "/") ||
102
+ parseTerminalMouseInput(data) !== null
103
+ )
104
+ return true;
105
+ return false;
106
+ }
107
+
108
+ /** One page is the visible body, less a row of overlap for continuity. */
109
+ private _toolDetailPageRows(): number {
110
+ return Math.max(1, this.graphLayout.viewportRows - 1);
111
+ }
112
+
38
113
  private _promptKeybindings(): KeybindingsLike | undefined {
39
114
  return isKeybindingsLike(this.piKeybindings) ? this.piKeybindings : undefined;
40
115
  }
41
116
 
117
+ private _matchesToolExpandInput(data: string): boolean {
118
+ const keybindings = this._promptKeybindings();
119
+ // Do not run a raw fallback beside a host manager: a user remap must win,
120
+ // and an explicitly unbound action must remain unbound.
121
+ return keybindings ? matchesAction(keybindings, data, APP_ACTION.toolsExpand) : data === TOOL_EXPAND_FALLBACK;
122
+ }
123
+
42
124
  private _isReturnToMainChatInput(data: string): boolean {
43
125
  return matchesKey(data, Key.ctrl("x"));
44
126
  }
@@ -151,11 +233,13 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
151
233
  const idx = this.cachedLayout.findIndex((n) => n.stage.id === selected.id);
152
234
  if (idx !== -1) {
153
235
  this._setFocusedIndex(idx);
154
- // Selecting from the `/` switcher should complete the same
155
- // action as pressing Enter on a graph node: jump straight
156
- // into that stage's chat when the attach shell is present.
236
+ // Selecting from the switcher opens tool detail or preserves the
237
+ // existing stage attach path; stages without an attach callback
238
+ // retain their historical no-op behavior.
157
239
  this.switcherOpen = false;
158
- if (this._attachFocusedStage()) return true;
240
+ if (this.cachedLayout[idx]?.stage.nodeKind === "tool") this._openFocusedToolDetail();
241
+ else this._attachFocusedStage();
242
+ return true;
159
243
  }
160
244
  }
161
245
  this.switcherOpen = false;
@@ -241,6 +325,9 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
241
325
  }
242
326
 
243
327
  private _activateFocusedNode(): void {
328
+ // Tool nodes open a read-only snapshot detail; they never enter the
329
+ // stage-chat attach path even though they share the graph card shape.
330
+ if (this._openFocusedToolDetail()) return;
244
331
  // Enter and direct node clicks attach the popup interior to the focused
245
332
  // stage. The attach shell swaps in the stage-chat view without remounting
246
333
  // the overlay; without a callback, fall back to the legacy expand/collapse
@@ -309,10 +396,18 @@ export abstract class GraphViewInputController extends GraphViewRenderer {
309
396
  if (direction === "right") return { cols: GRAPH_SCROLL_STEP_COLS, rows: 0 };
310
397
  return null;
311
398
  }
399
+
312
400
  get _graphScrollbarGeometry() {
313
401
  return this.graphLayout.scrollbarGeometry;
314
402
  }
315
403
 
404
+ get _toolDetail(): typeof this.toolDetail {
405
+ return this.toolDetail;
406
+ }
407
+ get _toolDetailExpanded(): boolean {
408
+ return this.toolDetailExpanded;
409
+ }
410
+
316
411
  // ---- test seams ----
317
412
  get _focusedIndex(): number {
318
413
  return this.focusedIndex;
@@ -85,6 +85,7 @@ export class GraphViewLayout {
85
85
  private readonly callbacks: GraphViewLayoutCallbacks;
86
86
  private bodyViewportRows = 0;
87
87
  private bodyContentRows = 0;
88
+ private lastBodyWidth: number | undefined;
88
89
  private scrollbar: ScrollbarGeometry | undefined;
89
90
  private draggingScrollbar: { grabOffset: number } | undefined;
90
91
 
@@ -93,7 +94,12 @@ export class GraphViewLayout {
93
94
 
94
95
  const margin = new CallbackComponent(() => [""]);
95
96
  const header = new CallbackComponent((width) => this.callbacks.renderHeader(width));
96
- const body = new CallbackComponent((width) => this.renderBody(width));
97
+ const body = new CallbackComponent((width) => {
98
+ // The ScrollView reserves its scrollbar column from the width it hands
99
+ // the body, so this is the only place the real body width is known.
100
+ this.lastBodyWidth = width;
101
+ return this.renderBody(width);
102
+ });
97
103
  const footer = new CallbackComponent((width) => this.callbacks.renderFooter(width));
98
104
  this.scrollView = new ScrollView(body, {
99
105
  axis: "vertical",
@@ -117,16 +123,20 @@ export class GraphViewLayout {
117
123
  const safeHeight = Math.max(1, Math.floor(height));
118
124
  const marginRows = graphLayoutMarginRows(safeHeight);
119
125
  this.bodyViewportRows = graphLayoutBodyRows(safeHeight);
120
- this.bodyContentRows = Math.max(
121
- 0,
122
- Math.floor(this.callbacks.bodyContentHeight(safeWidth, this.bodyViewportRows)),
123
- );
124
- const requestRender = this.callbacks.requestRender ?? EMPTY_RENDER;
125
- this.scrollView.updateLayout(this.bodyContentRows, this.bodyViewportRows, requestRender);
126
- this.scrollView.setScrollbar(this.bodyContentRows > this.bodyViewportRows ? "always" : "hidden");
127
- this.callbacks.beforeFrame?.(this.scrollView, this.bodyViewportRows, this.bodyContentRows, safeWidth);
128
-
129
- const frame = renderLayoutFrame(this.root, safeWidth, safeHeight, requestRender);
126
+ // Content height can depend on the width the body is laid out at, and that
127
+ // is narrower than the frame whenever the ScrollView reserves its
128
+ // scrollbar column. Measuring at the frame width clamps the scroll range
129
+ // to a height the body never produced, which strands its tail rows for
130
+ // every input path. Measure at the width the body actually received last
131
+ // time, then reconcile if this frame disagrees; when no column is
132
+ // reserved the two are already the same width and nothing re-runs.
133
+ const requestedTop = this.scrollView.scrollTop;
134
+ const expectedWidth = this.lastBodyWidth ?? safeWidth;
135
+ let frame = this.renderPass(safeWidth, safeHeight, expectedWidth);
136
+ const measuredWidth = this.lastBodyWidth ?? safeWidth;
137
+ if (measuredWidth !== expectedWidth && this.contentRowsFor(measuredWidth) !== this.bodyContentRows) {
138
+ frame = this.renderPass(safeWidth, safeHeight, measuredWidth, requestedTop);
139
+ }
130
140
  const bodyBox = getScrollViewBox(frame, this.scrollView);
131
141
  this.scrollbar = bodyBox ? getScrollbarGeometry(bodyBox) : undefined;
132
142
  if (!this.scrollbar) this.draggingScrollbar = undefined;
@@ -142,6 +152,27 @@ export class GraphViewLayout {
142
152
  };
143
153
  }
144
154
 
155
+ private contentRowsFor(width: number): number {
156
+ return Math.max(0, Math.floor(this.callbacks.bodyContentHeight(width, this.bodyViewportRows)));
157
+ }
158
+
159
+ /**
160
+ * One full layout pass whose scroll range is measured at `measureWidth`.
161
+ *
162
+ * `restoreTop` re-applies a scroll position that a previous pass' stale,
163
+ * shorter content height clamped away, so reconciling never scrolls the
164
+ * user back up a frame.
165
+ */
166
+ private renderPass(safeWidth: number, safeHeight: number, measureWidth: number, restoreTop?: number): LayoutFrame {
167
+ const requestRender = this.callbacks.requestRender ?? EMPTY_RENDER;
168
+ this.bodyContentRows = this.contentRowsFor(measureWidth);
169
+ this.scrollView.updateLayout(this.bodyContentRows, this.bodyViewportRows, requestRender);
170
+ if (restoreTop !== undefined && this.scrollView.scrollTop < restoreTop) this.scrollView.scrollTo(restoreTop);
171
+ this.scrollView.setScrollbar(this.bodyContentRows > this.bodyViewportRows ? "always" : "hidden");
172
+ this.callbacks.beforeFrame?.(this.scrollView, this.bodyViewportRows, this.bodyContentRows, safeWidth);
173
+ return renderLayoutFrame(this.root, safeWidth, safeHeight, requestRender);
174
+ }
175
+
145
176
  /** Repaint the thumb after overlays that cover the body rows. */
146
177
  paintScrollbar(lines: string[], width: number): void {
147
178
  const geometry = this.scrollbar;
@@ -1,12 +1,27 @@
1
1
  import { BOLD, hexBg, hexToAnsi, RESET } from "./color-utils.js";
2
2
  import type { GraphCanvas } from "./graph-canvas.js";
3
- import { COMPACT_HINT_KEYS, HINT_KEYS, MODE_PILL_LABEL } from "./graph-view-constants.js";
3
+ import {
4
+ COMPACT_HINT_KEYS,
5
+ COMPACT_TOOL_DETAIL_HINT_KEYS,
6
+ HINT_KEYS,
7
+ MODE_PILL_LABEL,
8
+ TOOL_DETAIL_HINT_KEYS,
9
+ } from "./graph-view-constants.js";
4
10
  import { GraphViewState } from "./graph-view-state.js";
5
11
  import { renderOutlinePill } from "./header.js";
12
+ import { APP_ACTION, isKeybindingsLike } from "./keybindings-adapter.js";
6
13
  import { NODE_H, NODE_W } from "./layout.js";
7
14
  import { sliceColumns, truncateToWidth, visibleWidth } from "./text-helpers.js";
8
15
  import { OVERLAY_HIDDEN_STATUS_KEYS, WORKFLOW_STATUS_KEY } from "./workflow-status.js";
9
16
 
17
+ export function toolExpandKey(piKeybindings: unknown): string {
18
+ const keybindings = isKeybindingsLike(piKeybindings) ? piKeybindings : undefined;
19
+ const keys = keybindings?.getKeys?.(APP_ACTION.toolsExpand);
20
+ // Missing manager → default. Empty list → explicitly unbound; do not
21
+ // invent a keyless `expand` label the way `"".join` used to.
22
+ if (keys === undefined) return "ctrl+o";
23
+ return keys.filter((key) => key.length > 0).join("/");
24
+ }
10
25
  /** Low-level overlay geometry, chrome, ANSI canvas, and edge helpers. */
11
26
  export abstract class GraphViewRenderHelpers extends GraphViewState {
12
27
  /**
@@ -45,13 +60,47 @@ export abstract class GraphViewRenderHelpers extends GraphViewState {
45
60
  const rightEdgePad = 2;
46
61
  const hintsBudget = Math.max(0, width - leftEdgePad - pillW - rightEdgePad);
47
62
  const fullHierarchyHint = "ctrl+x return to main chat";
63
+ // A focused tool node has no stage chat, but Enter now opens its read-only
64
+ // detail, so it keeps an activation hint of its own instead of losing the
65
+ // `↵` affordance entirely the way an unfocusable node does. Both lookups
66
+ // resolve once per frame: the two hint lists below are built eagerly, and
67
+ // re-resolving focus inside each would double this frame's layout reads.
68
+ const chatTarget = this.toolDetail === null ? this._focusedStageChatTarget() : undefined;
69
+ const focusedToolNode = this.toolDetail === null && this._focusedTool() !== undefined;
70
+ const relabelActivation = (
71
+ keys: ReadonlyArray<{ key: string; label: string }>,
72
+ label: string,
73
+ ): Array<{ key: string; label: string }> =>
74
+ keys.map((hint) => (hint.key === "↵" ? { key: hint.key, label } : hint));
75
+ const toolDetailExpandKey = toolExpandKey(this.piKeybindings);
76
+ const expandHint =
77
+ toolDetailExpandKey.length > 0
78
+ ? [{ key: toolDetailExpandKey, label: this.toolDetailExpanded ? "collapse" : "expand" }]
79
+ : [];
80
+ const toolDetailHintKeys = this.toolDetail === null ? [] : [...TOOL_DETAIL_HINT_KEYS, ...expandHint];
81
+ const compactToolDetailHintKeys =
82
+ this.toolDetail === null ? [] : [...COMPACT_TOOL_DETAIL_HINT_KEYS, ...expandHint];
48
83
  const availableHintKeys =
49
- this._focusedStageChatTarget() === undefined ? HINT_KEYS.filter(({ key }) => key !== "↵") : HINT_KEYS;
84
+ this.toolDetail !== null
85
+ ? toolDetailHintKeys
86
+ : focusedToolNode
87
+ ? relabelActivation(HINT_KEYS, "open tool detail")
88
+ : chatTarget === undefined
89
+ ? HINT_KEYS.filter(({ key }) => key !== "↵")
90
+ : HINT_KEYS;
50
91
  const availableCompactHintKeys =
51
- this._focusedStageChatTarget() === undefined
52
- ? COMPACT_HINT_KEYS.filter(({ key }) => key !== "↵")
53
- : COMPACT_HINT_KEYS;
54
- const hintKeys = hintsBudget >= visibleWidth(fullHierarchyHint) ? availableHintKeys : availableCompactHintKeys;
92
+ this.toolDetail !== null
93
+ ? compactToolDetailHintKeys
94
+ : focusedToolNode
95
+ ? relabelActivation(COMPACT_HINT_KEYS, "tool detail")
96
+ : chatTarget === undefined
97
+ ? COMPACT_HINT_KEYS.filter(({ key }) => key !== "↵")
98
+ : COMPACT_HINT_KEYS;
99
+ const fullHintWidth =
100
+ this.toolDetail !== null
101
+ ? toolDetailHintKeys.map(({ key, label }) => `${key} ${label}`).join(" · ")
102
+ : fullHierarchyHint;
103
+ const hintKeys = hintsBudget >= visibleWidth(fullHintWidth) ? availableHintKeys : availableCompactHintKeys;
55
104
  const statusText = this._externalStatusText();
56
105
  const statusSegment = statusText ? [`${accent}${statusText}${RESET}${chromeBg}`] : [];
57
106
  const hintSegments = hintKeys.map(
@@ -2,12 +2,15 @@ import type { RunSnapshot } from "../shared/store-types.js";
2
2
  import { hexBg, hexToAnsi, RESET } from "./color-utils.js";
3
3
  import { GraphViewGraphRenderer } from "./graph-view-graph-render.js";
4
4
  import { GRAPH_HEADER_ROWS, GraphViewLayout, graphLayoutNaturalHeight } from "./graph-view-layout.js";
5
+ import { toolExpandKey } from "./graph-view-render-helpers.js";
5
6
  import type { GraphViewOpts } from "./graph-view-types.js";
6
7
  import { renderHeader, renderOutlinePill } from "./header.js";
8
+ import { isKeybindingsLike } from "./keybindings-adapter.js";
7
9
  import { NODE_H } from "./layout.js";
8
10
  import { renderPromptCard } from "./prompt-card.js";
9
11
  import { renderSwitcher } from "./switcher.js";
10
12
  import { truncateToWidth, visibleWidth } from "./text-helpers.js";
13
+ import { renderToolDetailLines } from "./tool-detail.js";
11
14
 
12
15
  /**
13
16
  * `renderLayoutFrame` wraps each painted row with its segment reset. The
@@ -23,20 +26,28 @@ function stripLayoutWrapper(line: string): string {
23
26
  const end = endsWithWrapper ? line.length - LAYOUT_OSC_RESET.length : line.length;
24
27
  return line.slice(start, Math.max(start, end));
25
28
  }
29
+ /** One frame's tool-message geometry, derived once and shared by both callbacks. */
30
+ interface ToolDetailFrame {
31
+ readonly width: number;
32
+ readonly blockWidth: number;
33
+ readonly leftPad: number;
34
+ readonly lines: readonly string[];
35
+ }
36
+
26
37
  /** Overlay/widget rendering orchestration for GraphView. */
27
38
  export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
28
39
  protected readonly graphLayout: GraphViewLayout;
29
40
  private lastOverlayFrameHeight = 0;
30
41
  private hasReportedViewportRows = false;
31
42
  private renderRun: RunSnapshot | null | undefined;
32
-
43
+ private detailFrame: ToolDetailFrame | null = null;
33
44
  constructor(opts: GraphViewOpts) {
34
45
  super(opts);
35
46
  this.graphLayout = new GraphViewLayout({
36
47
  renderHeader: (width) => this._renderHeader(width),
37
48
  renderBody: (width, top, rows, contentRows) => this._renderBody(width, top, rows, contentRows),
38
49
  renderFooter: (width) => this._renderStatusline(width),
39
- bodyContentHeight: (_width, viewportRows) => this._graphBodyContentHeight(viewportRows),
50
+ bodyContentHeight: (width, viewportRows) => this._graphBodyContentHeight(width, viewportRows),
40
51
  beforeFrame: (scrollView, viewportRows, contentRows, width) =>
41
52
  this._prepareGraphScroll(scrollView, viewportRows, contentRows, width),
42
53
  requestRender: () => this.requestRender?.(),
@@ -77,6 +88,10 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
77
88
  const frameWidth = Math.max(40, width);
78
89
  const run = this._getCurrentRun();
79
90
  this.renderRun = run;
91
+ // One frame, one detail layout: the scroll clamp and the painted rows
92
+ // must come from the same line array, and a running node's timing must
93
+ // still advance between frames.
94
+ this.detailFrame = null;
80
95
  try {
81
96
  const frameHeight = this._overlayFrameHeight(run);
82
97
  const layoutFrame = this.graphLayout.render(frameWidth, frameHeight);
@@ -91,9 +106,14 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
91
106
  const bodyStart = layoutFrame.bodyBox?.rect.y ?? layoutFrame.topMarginRows + GRAPH_HEADER_ROWS;
92
107
  const bodyRows = layoutFrame.bodyBox?.rect.height ?? this.graphLayout.viewportRows;
93
108
  if (run) {
94
- this._recordGraphNodeHitRects(bodyStart + this.lastGraphTopPad, this.lastGraphVisibleRows);
95
- this._renderSwitcherOverlay(lines, run, frameWidth, bodyStart, bodyRows);
96
- this._renderPromptOverlay(lines, frameWidth, bodyStart, bodyRows);
109
+ if (this.toolDetail !== null) {
110
+ this.graphNodeHitRects = [];
111
+ this.lastGraphViewport = null;
112
+ } else {
113
+ this._recordGraphNodeHitRects(bodyStart + this.lastGraphTopPad, this.lastGraphVisibleRows);
114
+ this._renderSwitcherOverlay(lines, run, frameWidth, bodyStart, bodyRows);
115
+ this._renderPromptOverlay(lines, frameWidth, bodyStart, bodyRows);
116
+ }
97
117
  } else {
98
118
  this.graphNodeHitRects = [];
99
119
  this.lastGraphViewport = null;
@@ -127,8 +147,42 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
127
147
  return this.renderRun !== undefined ? this.renderRun : this._getCurrentRun();
128
148
  }
129
149
 
130
- private _graphBodyContentHeight(viewportRows: number): number {
150
+ /**
151
+ * Lay the tool message block out once per frame width.
152
+ *
153
+ * The height callback and the body callback are invoked separately by the
154
+ * layout, and the body may be handed a narrower width when the ScrollView
155
+ * reserves its scrollbar column. Both go through here, so the rows the
156
+ * scroll range is clamped to are the rows that were actually produced.
157
+ */
158
+ private _toolDetailFrame(node: NonNullable<GraphViewRenderer["toolDetail"]>, width: number): ToolDetailFrame {
159
+ const safeWidth = Math.max(1, Math.floor(width));
160
+ const cached = this.detailFrame;
161
+ if (cached !== null && cached.width === safeWidth) return cached;
162
+ // Match the flat message surface used by agent tool calls. The one-cell
163
+ // leading inset gives the block the same breathing room without drawing a
164
+ // standalone rounded panel or hiding content behind a border.
165
+ const blockWidth = Math.max(1, safeWidth - 1);
166
+ const frame: ToolDetailFrame = {
167
+ width: safeWidth,
168
+ blockWidth,
169
+ leftPad: safeWidth > 1 ? 1 : 0,
170
+ lines: renderToolDetailLines(node, {
171
+ theme: this.graphTheme,
172
+ width: blockWidth,
173
+ expanded: this.toolDetailExpanded,
174
+ expandKey: toolExpandKey(isKeybindingsLike(this.piKeybindings) ? this.piKeybindings : undefined),
175
+ }),
176
+ };
177
+ this.detailFrame = frame;
178
+ return frame;
179
+ }
180
+
181
+ private _graphBodyContentHeight(width: number, viewportRows: number): number {
131
182
  const rows = Math.max(0, Math.floor(viewportRows));
183
+ if (this.toolDetail !== null) {
184
+ return Math.max(rows, this._toolDetailFrame(this.toolDetail, width).lines.length);
185
+ }
132
186
  if (!this._currentRenderRun() || this.cachedRenderGeometry.totalRows <= 0) return rows;
133
187
  return Math.max(rows, this.cachedRenderGeometry.totalRows);
134
188
  }
@@ -141,6 +195,11 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
141
195
  ): void {
142
196
  const run = this._currentRenderRun();
143
197
  if (viewportRows <= 0) return;
198
+ if (this.toolDetail !== null) {
199
+ if (this.pendingEnsureFocusedVisible) scrollView.scrollToStart();
200
+ this.pendingEnsureFocusedVisible = false;
201
+ return;
202
+ }
144
203
  if (!run || this.cachedRenderGeometry.totalRows <= 0) {
145
204
  scrollView.scrollToStart();
146
205
  this.pendingEnsureFocusedVisible = false;
@@ -188,6 +247,12 @@ export abstract class GraphViewRenderer extends GraphViewGraphRenderer {
188
247
  }
189
248
 
190
249
  private _renderBody(width: number, top: number, rows: number, _contentRows: number): string[] {
250
+ if (this.toolDetail !== null) {
251
+ const detail = this._toolDetailFrame(this.toolDetail, width);
252
+ return detail.lines
253
+ .slice(top, top + rows)
254
+ .map((line) => this._canvasRow(`${" ".repeat(detail.leftPad)}${line}`, width));
255
+ }
191
256
  const run = this._currentRenderRun();
192
257
  const raw = run ? this._renderGraph(width, top, rows, run) : this._renderEmptyBody(width, rows);
193
258
  return raw.map((line) => this._canvasRow(line, width));
@@ -3,6 +3,7 @@ import {
3
3
  type ExpandedWorkflowGraph,
4
4
  type ExpandedWorkflowStage,
5
5
  type ExpandedWorkflowStageTarget,
6
+ type ExpandedWorkflowTool,
6
7
  expandedStageTarget,
7
8
  expandWorkflowGraph,
8
9
  refreshExpandedWorkflowGraph,
@@ -103,6 +104,10 @@ export abstract class GraphViewState {
103
104
  targets: new Map(),
104
105
  };
105
106
  protected currentSnapshot: StoreSnapshot | null = null;
107
+ /** Selected read-only tool detail; tool nodes never become stage chats. */
108
+ protected toolDetail: ExpandedWorkflowTool | null = null;
109
+ /** Tool message blocks open collapsed and own expansion independently of graph cards. */
110
+ protected toolDetailExpanded = false;
106
111
  protected abstract _graphScrollTop(): number;
107
112
  protected graphScrollColOffset = 0;
108
113
  protected graphNodeHitRects: GraphNodeHitRect[] = [];
@@ -192,6 +197,7 @@ export abstract class GraphViewState {
192
197
  this.lastGraphViewport = null;
193
198
  this.pendingEnsureFocusedVisible = true;
194
199
  this.promptState = null;
200
+ this.toolDetail = null;
195
201
  this.topologySnapshot = this.currentSnapshot;
196
202
  this.hasAnimatingStages = false;
197
203
  this.lastBuiltSnapshotVersion = version;
@@ -219,6 +225,7 @@ export abstract class GraphViewState {
219
225
  (stage) => stage.status === "running" || stage.status === "awaiting_input",
220
226
  );
221
227
  this._finalizeFocusAndPrompt(run, previousFocusedStageId, true);
228
+ this._syncToolDetail();
222
229
  this.lastBuiltSnapshotVersion = version;
223
230
  return;
224
231
  }
@@ -233,6 +240,7 @@ export abstract class GraphViewState {
233
240
  this.graphNodeHitRects = [];
234
241
  this.lastGraphViewport = null;
235
242
  this._finalizeFocusAndPrompt(run, previousFocusedStageId, false);
243
+ this._syncToolDetail();
236
244
  this.lastBuiltSnapshotVersion = version;
237
245
  }
238
246
 
@@ -434,6 +442,41 @@ export abstract class GraphViewState {
434
442
  if (!stage || stage.nodeKind === "tool") return undefined;
435
443
  return expandedStageTarget(this.expandedGraph, stage.id);
436
444
  }
445
+ /** Resolve the focused graph projection back to its full tool snapshot. */
446
+ protected _focusedTool(): ExpandedWorkflowTool | undefined {
447
+ const stage = this.cachedLayout[this.focusedIndex]?.stage;
448
+ if (stage?.nodeKind !== "tool") return undefined;
449
+ return this.expandedGraph.tools.find((tool) => tool.id === stage.id);
450
+ }
451
+
452
+ protected _openFocusedToolDetail(): boolean {
453
+ const tool = this._focusedTool();
454
+ if (tool === undefined) return false;
455
+ this.toolDetail = tool;
456
+ this.toolDetailExpanded = false;
457
+ this.graphLayoutInvalidateForDetail();
458
+ return true;
459
+ }
460
+
461
+ protected _closeToolDetail(): boolean {
462
+ if (this.toolDetail === null) return false;
463
+ this.toolDetail = null;
464
+ this.toolDetailExpanded = false;
465
+ this.graphLayoutInvalidateForDetail();
466
+ return true;
467
+ }
468
+
469
+ private _syncToolDetail(): void {
470
+ if (this.toolDetail === null) return;
471
+ this.toolDetail = this.expandedGraph.tools.find((tool) => tool.id === this.toolDetail?.id) ?? null;
472
+ }
473
+
474
+ /** Let the renderer discard any cached body frame after a detail transition. */
475
+ private graphLayoutInvalidateForDetail(): void {
476
+ this.pendingEnsureFocusedVisible = true;
477
+ this.graphNodeHitRects = [];
478
+ this.lastGraphViewport = null;
479
+ }
437
480
 
438
481
  /**
439
482
  * Pending queued messages for a rendered node. Tool nodes own no session, and
@@ -36,6 +36,8 @@
36
36
  */
37
37
  export interface KeybindingsLike {
38
38
  matches(data: string, action: string): boolean;
39
+ /** Optional host display lookup; structural test doubles may omit it. */
40
+ getKeys?(action: string): readonly string[];
39
41
  }
40
42
 
41
43
  export const APP_ACTION = {
@@ -272,9 +272,13 @@ export function renderNodeCard(stage: StageSnapshot, opts: NodeCardOpts): string
272
272
  const top = `${bg}${bc}╭${topMiddle}╮${RESET}`;
273
273
  const bottom = `${bg}${bc}╰${"─".repeat(innerWidth)}╯${RESET}`;
274
274
 
275
+ // A tool card is a fixed-size graph node, not a result preview: the read-only
276
+ // detail view owns args, result, error, and timing. The body is constant in
277
+ // every state so the card stops competing with it, while the status, meta,
278
+ // and dependency rows below keep their own content.
275
279
  const bodyText =
276
280
  stage.nodeKind === "tool"
277
- ? (stage.error ?? stage.result ?? "durable tool")
281
+ ? "durable tool"
278
282
  : stage.status === "blocked"
279
283
  ? blockedBadgeText(stage, opts.stages, innerWidth)
280
284
  : durationText(stage);
@@ -33,6 +33,12 @@ function postMortemUnavailableMessage(reason: StageChatViewContext["postMortemUn
33
33
  }
34
34
  }
35
35
 
36
+ /**
37
+ * `renderTranscript` paints the archived chat rows into the budget it is given.
38
+ * `StageChatView` passes the search-aware painter so an open find box searches
39
+ * and highlights a read-only archive exactly as it does a live chat; the
40
+ * default keeps this function usable on its own.
41
+ */
36
42
  export function renderReadOnlyArchiveBody(
37
43
  ctx: StageChatViewContext,
38
44
  width: number,
@@ -40,6 +46,7 @@ export function renderReadOnlyArchiveBody(
40
46
  stage: StageSnapshot | undefined,
41
47
  indicatorLines: readonly string[] = [],
42
48
  renderIndicator: () => readonly string[] = () => indicatorLines,
49
+ renderTranscript: (rows: number) => string[] = (rows) => ctx.chatHost.renderBody(width, rows),
43
50
  ): string[] {
44
51
  if (stage?.promptFootprint) {
45
52
  return renderReadOnlyPromptArchiveBody(ctx, width, budget, stage);
@@ -74,7 +81,7 @@ export function renderReadOnlyArchiveBody(
74
81
  const reservedIndicatorRows =
75
82
  indicatorLines.length > 0 && transcriptBudget > indicatorLines.length ? indicatorLines.length : 0;
76
83
  const transcriptRows = transcriptBudget - reservedIndicatorRows;
77
- const lines = transcriptRows > 0 ? ctx.chatHost.renderBody(width, transcriptRows) : [];
84
+ const lines = transcriptRows > 0 ? renderTranscript(transcriptRows) : [];
78
85
  const visibleIndicatorLines =
79
86
  reservedIndicatorRows > 0 ? [...renderIndicator().slice(0, reservedIndicatorRows)] : [];
80
87
  while (visibleIndicatorLines.length < reservedIndicatorRows) visibleIndicatorLines.push(blankLine(width));
@@ -171,12 +178,14 @@ function formatReadOnlyPromptAnswer(value: unknown, kind: PendingPrompt["kind"])
171
178
  }
172
179
  }
173
180
 
181
+ /** `renderTranscript` as in `renderReadOnlyArchiveBody`: a paused chat is searchable too. */
174
182
  export function renderPausedBody(
175
183
  ctx: StageChatViewContext,
176
184
  width: number,
177
185
  budget: number,
178
186
  indicatorLines: readonly string[] = [],
179
187
  renderIndicator: () => readonly string[] = () => indicatorLines,
188
+ renderTranscript: (rows: number) => string[] = (rows) => ctx.chatHost.renderBody(width, rows),
180
189
  ): string[] {
181
190
  const t = ctx.theme;
182
191
  const callout: string[] = [];
@@ -194,7 +203,7 @@ export function renderPausedBody(
194
203
  const reservedIndicatorRows =
195
204
  indicatorLines.length > 0 && transcriptBudget > indicatorLines.length ? indicatorLines.length : 0;
196
205
  const transcriptRows = transcriptBudget - reservedIndicatorRows;
197
- const lines = transcriptRows > 0 ? ctx.chatHost.renderBody(width, transcriptRows) : [];
206
+ const lines = transcriptRows > 0 ? renderTranscript(transcriptRows) : [];
198
207
  const visibleIndicatorLines =
199
208
  reservedIndicatorRows > 0 ? [...renderIndicator().slice(0, reservedIndicatorRows)] : [];
200
209
  while (visibleIndicatorLines.length < reservedIndicatorRows) visibleIndicatorLines.push(blankLine(width));