@bastani/atomic 0.7.17-1 → 0.8.0-0

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 (1233) hide show
  1. package/CHANGELOG.md +4183 -0
  2. package/README.md +655 -0
  3. package/dist/builtin/intercom/CHANGELOG.md +195 -0
  4. package/dist/builtin/intercom/LICENSE +21 -0
  5. package/dist/builtin/intercom/README.md +484 -0
  6. package/dist/builtin/intercom/broker/broker.ts +346 -0
  7. package/dist/builtin/intercom/broker/client.ts +535 -0
  8. package/dist/builtin/intercom/broker/framing.ts +57 -0
  9. package/dist/builtin/intercom/broker/paths.ts +21 -0
  10. package/dist/builtin/intercom/broker/spawn.ts +308 -0
  11. package/dist/builtin/intercom/config.ts +109 -0
  12. package/dist/builtin/intercom/index.ts +1780 -0
  13. package/dist/builtin/intercom/package.json +59 -0
  14. package/dist/builtin/intercom/reply-tracker.ts +102 -0
  15. package/dist/builtin/intercom/skills/intercom/SKILL.md +513 -0
  16. package/dist/builtin/intercom/types.ts +46 -0
  17. package/dist/builtin/intercom/ui/compose.ts +139 -0
  18. package/dist/builtin/intercom/ui/inline-message.ts +76 -0
  19. package/dist/builtin/intercom/ui/session-list.ts +162 -0
  20. package/dist/builtin/mcp/CHANGELOG.md +346 -0
  21. package/dist/builtin/mcp/LICENSE +21 -0
  22. package/dist/builtin/mcp/OAUTH.md +324 -0
  23. package/dist/builtin/mcp/README.md +373 -0
  24. package/dist/builtin/mcp/agent-dir.ts +21 -0
  25. package/dist/builtin/mcp/app-bridge.bundle.js +67 -0
  26. package/dist/builtin/mcp/cli.js +186 -0
  27. package/dist/builtin/mcp/commands.ts +420 -0
  28. package/dist/builtin/mcp/config.ts +667 -0
  29. package/dist/builtin/mcp/consent-manager.ts +64 -0
  30. package/dist/builtin/mcp/direct-tools.ts +427 -0
  31. package/dist/builtin/mcp/errors.ts +219 -0
  32. package/dist/builtin/mcp/glimpse-ui.ts +80 -0
  33. package/dist/builtin/mcp/host-html-template.ts +427 -0
  34. package/dist/builtin/mcp/index.ts +334 -0
  35. package/dist/builtin/mcp/init.ts +336 -0
  36. package/dist/builtin/mcp/lifecycle.ts +93 -0
  37. package/dist/builtin/mcp/logger.ts +169 -0
  38. package/dist/builtin/mcp/mcp-auth-flow.ts +362 -0
  39. package/dist/builtin/mcp/mcp-auth.ts +297 -0
  40. package/dist/builtin/mcp/mcp-callback-server.ts +284 -0
  41. package/dist/builtin/mcp/mcp-oauth-provider.ts +302 -0
  42. package/dist/builtin/mcp/mcp-panel.ts +826 -0
  43. package/dist/builtin/mcp/mcp-setup-panel.ts +577 -0
  44. package/dist/builtin/mcp/metadata-cache.ts +201 -0
  45. package/dist/builtin/mcp/npx-resolver.ts +424 -0
  46. package/dist/builtin/mcp/oauth-handler.ts +60 -0
  47. package/dist/builtin/mcp/onboarding-state.ts +68 -0
  48. package/dist/builtin/mcp/package.json +61 -0
  49. package/dist/builtin/mcp/proxy-modes.ts +803 -0
  50. package/dist/builtin/mcp/resource-tools.ts +17 -0
  51. package/dist/builtin/mcp/sampling-handler.ts +268 -0
  52. package/dist/builtin/mcp/server-manager.ts +375 -0
  53. package/dist/builtin/mcp/state.ts +41 -0
  54. package/dist/builtin/mcp/tool-metadata.ts +152 -0
  55. package/dist/builtin/mcp/tool-registrar.ts +46 -0
  56. package/dist/builtin/mcp/tool-result-renderer.ts +65 -0
  57. package/dist/builtin/mcp/types.ts +441 -0
  58. package/dist/builtin/mcp/ui-resource-handler.ts +145 -0
  59. package/dist/builtin/mcp/ui-server.ts +623 -0
  60. package/dist/builtin/mcp/ui-session.ts +384 -0
  61. package/dist/builtin/mcp/ui-stream-types.ts +89 -0
  62. package/dist/builtin/mcp/utils.ts +129 -0
  63. package/dist/builtin/subagents/CHANGELOG.md +1019 -0
  64. package/dist/builtin/subagents/README.md +991 -0
  65. package/dist/builtin/subagents/agents/code-simplifier.md +84 -0
  66. package/dist/builtin/subagents/agents/codebase-analyzer.md +158 -0
  67. package/dist/builtin/subagents/agents/codebase-locator.md +113 -0
  68. package/dist/builtin/subagents/agents/codebase-online-researcher.md +317 -0
  69. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +236 -0
  70. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +181 -0
  71. package/dist/builtin/subagents/agents/codebase-research-locator.md +146 -0
  72. package/dist/builtin/subagents/agents/debugger.md +92 -0
  73. package/dist/builtin/subagents/package.json +67 -0
  74. package/dist/builtin/subagents/prompts/gather-context-and-clarify.md +20 -0
  75. package/dist/builtin/subagents/prompts/parallel-cleanup.md +60 -0
  76. package/dist/builtin/subagents/prompts/parallel-context-build.md +55 -0
  77. package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +77 -0
  78. package/dist/builtin/subagents/prompts/parallel-research.md +58 -0
  79. package/dist/builtin/subagents/prompts/parallel-review.md +52 -0
  80. package/dist/builtin/subagents/prompts/review-loop.md +48 -0
  81. package/dist/builtin/subagents/skills/subagent/SKILL.md +734 -0
  82. package/dist/builtin/subagents/src/agents/agent-management.ts +644 -0
  83. package/dist/builtin/subagents/src/agents/agent-scope.ts +6 -0
  84. package/dist/builtin/subagents/src/agents/agent-selection.ts +23 -0
  85. package/dist/builtin/subagents/src/agents/agent-serializer.ts +84 -0
  86. package/dist/builtin/subagents/src/agents/agents.ts +809 -0
  87. package/dist/builtin/subagents/src/agents/chain-serializer.ts +137 -0
  88. package/dist/builtin/subagents/src/agents/frontmatter.ts +29 -0
  89. package/dist/builtin/subagents/src/agents/identity.ts +30 -0
  90. package/dist/builtin/subagents/src/agents/skills.ts +630 -0
  91. package/dist/builtin/subagents/src/extension/control-notices.ts +92 -0
  92. package/dist/builtin/subagents/src/extension/doctor.ts +199 -0
  93. package/dist/builtin/subagents/src/extension/index.ts +586 -0
  94. package/dist/builtin/subagents/src/extension/schemas.ts +168 -0
  95. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +378 -0
  96. package/dist/builtin/subagents/src/intercom/result-intercom.ts +269 -0
  97. package/dist/builtin/subagents/src/runs/background/async-execution.ts +612 -0
  98. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +267 -0
  99. package/dist/builtin/subagents/src/runs/background/async-resume.ts +332 -0
  100. package/dist/builtin/subagents/src/runs/background/async-status.ts +295 -0
  101. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +63 -0
  102. package/dist/builtin/subagents/src/runs/background/notify.ts +108 -0
  103. package/dist/builtin/subagents/src/runs/background/parallel-groups.ts +45 -0
  104. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +250 -0
  105. package/dist/builtin/subagents/src/runs/background/run-status.ts +193 -0
  106. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +291 -0
  107. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +1760 -0
  108. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +13 -0
  109. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +1333 -0
  110. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +932 -0
  111. package/dist/builtin/subagents/src/runs/foreground/execution.ts +902 -0
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +2231 -0
  113. package/dist/builtin/subagents/src/runs/shared/completion-guard.ts +125 -0
  114. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +175 -0
  115. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +103 -0
  116. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +108 -0
  117. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +163 -0
  118. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +115 -0
  119. package/dist/builtin/subagents/src/runs/shared/run-history.ts +56 -0
  120. package/dist/builtin/subagents/src/runs/shared/single-output.ts +154 -0
  121. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +226 -0
  122. package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +152 -0
  123. package/dist/builtin/subagents/src/runs/shared/worktree.ts +577 -0
  124. package/dist/builtin/subagents/src/shared/artifacts.ts +99 -0
  125. package/dist/builtin/subagents/src/shared/atomic-json.ts +16 -0
  126. package/dist/builtin/subagents/src/shared/file-coalescer.ts +40 -0
  127. package/dist/builtin/subagents/src/shared/fork-context.ts +76 -0
  128. package/dist/builtin/subagents/src/shared/formatters.ts +133 -0
  129. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +81 -0
  130. package/dist/builtin/subagents/src/shared/model-info.ts +78 -0
  131. package/dist/builtin/subagents/src/shared/post-exit-stdio-guard.ts +85 -0
  132. package/dist/builtin/subagents/src/shared/session-identity.ts +10 -0
  133. package/dist/builtin/subagents/src/shared/session-tokens.ts +44 -0
  134. package/dist/builtin/subagents/src/shared/settings.ts +397 -0
  135. package/dist/builtin/subagents/src/shared/status-format.ts +49 -0
  136. package/dist/builtin/subagents/src/shared/types.ts +732 -0
  137. package/dist/builtin/subagents/src/shared/utils.ts +440 -0
  138. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +397 -0
  139. package/dist/builtin/subagents/src/slash/slash-bridge.ts +174 -0
  140. package/dist/builtin/subagents/src/slash/slash-commands.ts +528 -0
  141. package/dist/builtin/subagents/src/slash/slash-live-state.ts +292 -0
  142. package/dist/builtin/subagents/src/tui/render-helpers.ts +80 -0
  143. package/dist/builtin/subagents/src/tui/render.ts +1257 -0
  144. package/dist/builtin/web-access/CHANGELOG.md +387 -0
  145. package/dist/builtin/web-access/LICENSE +21 -0
  146. package/dist/builtin/web-access/README.md +346 -0
  147. package/dist/builtin/web-access/activity.ts +101 -0
  148. package/dist/builtin/web-access/chrome-cookies.ts +322 -0
  149. package/dist/builtin/web-access/code-search.ts +107 -0
  150. package/dist/builtin/web-access/curator-page.ts +3359 -0
  151. package/dist/builtin/web-access/curator-server.ts +605 -0
  152. package/dist/builtin/web-access/exa.ts +521 -0
  153. package/dist/builtin/web-access/extract.ts +701 -0
  154. package/dist/builtin/web-access/gemini-api.ts +113 -0
  155. package/dist/builtin/web-access/gemini-search.ts +362 -0
  156. package/dist/builtin/web-access/gemini-url-context.ts +126 -0
  157. package/dist/builtin/web-access/gemini-web-config.ts +54 -0
  158. package/dist/builtin/web-access/gemini-web.ts +396 -0
  159. package/dist/builtin/web-access/github-api.ts +196 -0
  160. package/dist/builtin/web-access/github-extract.ts +635 -0
  161. package/dist/builtin/web-access/index.ts +2347 -0
  162. package/dist/builtin/web-access/package.json +54 -0
  163. package/dist/builtin/web-access/pdf-extract.ts +192 -0
  164. package/dist/builtin/web-access/perplexity.ts +196 -0
  165. package/dist/builtin/web-access/rsc-extract.ts +338 -0
  166. package/dist/builtin/web-access/storage.ts +72 -0
  167. package/dist/builtin/web-access/summary-review.ts +276 -0
  168. package/dist/builtin/web-access/utils.ts +44 -0
  169. package/dist/builtin/web-access/video-extract.ts +379 -0
  170. package/dist/builtin/web-access/youtube-extract.ts +311 -0
  171. package/dist/builtin/workflows/CHANGELOG.md +20 -0
  172. package/dist/builtin/workflows/README.md +323 -0
  173. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +567 -0
  174. package/dist/builtin/workflows/builtin/index.ts +10 -0
  175. package/dist/builtin/workflows/builtin/open-claude-design.ts +985 -0
  176. package/dist/builtin/workflows/builtin/ralph.ts +613 -0
  177. package/dist/builtin/workflows/package.json +89 -0
  178. package/dist/builtin/workflows/skills/create-spec/SKILL.md +247 -0
  179. package/dist/builtin/workflows/skills/impeccable/SKILL.md +173 -0
  180. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +190 -0
  181. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +175 -0
  182. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +133 -0
  183. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +113 -0
  184. package/dist/builtin/workflows/skills/impeccable/reference/brand.md +118 -0
  185. package/dist/builtin/workflows/skills/impeccable/reference/clarify.md +174 -0
  186. package/dist/builtin/workflows/skills/impeccable/reference/codex.md +105 -0
  187. package/dist/builtin/workflows/skills/impeccable/reference/cognitive-load.md +106 -0
  188. package/dist/builtin/workflows/skills/impeccable/reference/color-and-contrast.md +105 -0
  189. package/dist/builtin/workflows/skills/impeccable/reference/colorize.md +154 -0
  190. package/dist/builtin/workflows/skills/impeccable/reference/craft.md +123 -0
  191. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +261 -0
  192. package/dist/builtin/workflows/skills/impeccable/reference/delight.md +302 -0
  193. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +111 -0
  194. package/dist/builtin/workflows/skills/impeccable/reference/document.md +427 -0
  195. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +69 -0
  196. package/dist/builtin/workflows/skills/impeccable/reference/harden.md +347 -0
  197. package/dist/builtin/workflows/skills/impeccable/reference/heuristics-scoring.md +234 -0
  198. package/dist/builtin/workflows/skills/impeccable/reference/interaction-design.md +195 -0
  199. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +141 -0
  200. package/dist/builtin/workflows/skills/impeccable/reference/live.md +622 -0
  201. package/dist/builtin/workflows/skills/impeccable/reference/motion-design.md +109 -0
  202. package/dist/builtin/workflows/skills/impeccable/reference/onboard.md +234 -0
  203. package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +258 -0
  204. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +130 -0
  205. package/dist/builtin/workflows/skills/impeccable/reference/personas.md +179 -0
  206. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +242 -0
  207. package/dist/builtin/workflows/skills/impeccable/reference/product.md +62 -0
  208. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +99 -0
  209. package/dist/builtin/workflows/skills/impeccable/reference/responsive-design.md +114 -0
  210. package/dist/builtin/workflows/skills/impeccable/reference/shape.md +165 -0
  211. package/dist/builtin/workflows/skills/impeccable/reference/spatial-design.md +100 -0
  212. package/dist/builtin/workflows/skills/impeccable/reference/teach.md +156 -0
  213. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +124 -0
  214. package/dist/builtin/workflows/skills/impeccable/reference/typography.md +159 -0
  215. package/dist/builtin/workflows/skills/impeccable/reference/ux-writing.md +107 -0
  216. package/dist/builtin/workflows/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  217. package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +94 -0
  218. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +226 -0
  219. package/dist/builtin/workflows/skills/impeccable/scripts/design-parser.mjs +820 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/detect-csp.mjs +198 -0
  221. package/dist/builtin/workflows/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  222. package/dist/builtin/workflows/skills/impeccable/scripts/is-generated.mjs +69 -0
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +646 -0
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +123 -0
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +4865 -0
  226. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +75 -0
  227. package/dist/builtin/workflows/skills/impeccable/scripts/live-completion.mjs +18 -0
  228. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +446 -0
  229. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +200 -0
  230. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +48 -0
  231. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +847 -0
  232. package/dist/builtin/workflows/skills/impeccable/scripts/live-session-store.mjs +254 -0
  233. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +47 -0
  234. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +632 -0
  235. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +247 -0
  236. package/dist/builtin/workflows/skills/impeccable/scripts/load-context.mjs +141 -0
  237. package/dist/builtin/workflows/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  238. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +214 -0
  239. package/dist/builtin/workflows/skills/playwright-cli/SKILL.md +392 -0
  240. package/dist/builtin/workflows/skills/playwright-cli/references/element-attributes.md +23 -0
  241. package/dist/builtin/workflows/skills/playwright-cli/references/playwright-tests.md +39 -0
  242. package/dist/builtin/workflows/skills/playwright-cli/references/request-mocking.md +87 -0
  243. package/dist/builtin/workflows/skills/playwright-cli/references/running-code.md +241 -0
  244. package/dist/builtin/workflows/skills/playwright-cli/references/session-management.md +225 -0
  245. package/dist/builtin/workflows/skills/playwright-cli/references/spec-driven-testing.md +305 -0
  246. package/dist/builtin/workflows/skills/playwright-cli/references/storage-state.md +275 -0
  247. package/dist/builtin/workflows/skills/playwright-cli/references/test-generation.md +134 -0
  248. package/dist/builtin/workflows/skills/playwright-cli/references/tracing.md +139 -0
  249. package/dist/builtin/workflows/skills/playwright-cli/references/video-recording.md +143 -0
  250. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +263 -0
  251. package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +271 -0
  252. package/dist/builtin/workflows/skills/prompt-engineer/references/core_prompting.md +137 -0
  253. package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +193 -0
  254. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +226 -0
  255. package/dist/builtin/workflows/skills/tdd/SKILL.md +109 -0
  256. package/dist/builtin/workflows/skills/tdd/deep-modules.md +33 -0
  257. package/dist/builtin/workflows/skills/tdd/interface-design.md +31 -0
  258. package/dist/builtin/workflows/skills/tdd/mocking.md +59 -0
  259. package/dist/builtin/workflows/skills/tdd/refactoring.md +10 -0
  260. package/dist/builtin/workflows/skills/tdd/tests.md +61 -0
  261. package/dist/builtin/workflows/skills/workflow/SKILL.md +255 -0
  262. package/dist/builtin/workflows/skills/workflow/references/context-engineering/advanced-evaluation.md +404 -0
  263. package/dist/builtin/workflows/skills/workflow/references/context-engineering/bdi-mental-states.md +313 -0
  264. package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-compression.md +274 -0
  265. package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-degradation.md +208 -0
  266. package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-fundamentals.md +203 -0
  267. package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-optimization.md +197 -0
  268. package/dist/builtin/workflows/skills/workflow/references/context-engineering/evaluation.md +253 -0
  269. package/dist/builtin/workflows/skills/workflow/references/context-engineering/filesystem-context.md +289 -0
  270. package/dist/builtin/workflows/skills/workflow/references/context-engineering/hosted-agents.md +262 -0
  271. package/dist/builtin/workflows/skills/workflow/references/context-engineering/memory-systems.md +221 -0
  272. package/dist/builtin/workflows/skills/workflow/references/context-engineering/multi-agent-patterns.md +259 -0
  273. package/dist/builtin/workflows/skills/workflow/references/context-engineering/project-development.md +293 -0
  274. package/dist/builtin/workflows/skills/workflow/references/context-engineering/tool-design.md +273 -0
  275. package/dist/builtin/workflows/skills/workflow/references/context-engineering.md +23 -0
  276. package/dist/builtin/workflows/skills/workflow/references/design-checklist.md +79 -0
  277. package/dist/builtin/workflows/skills/workflow/references/running-workflows.md +107 -0
  278. package/dist/builtin/workflows/skills/workflow/references/sdk-authoring.md +140 -0
  279. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +168 -0
  280. package/dist/builtin/workflows/src/extension/companions.ts +210 -0
  281. package/dist/builtin/workflows/src/extension/config-loader.ts +493 -0
  282. package/dist/builtin/workflows/src/extension/discovery.ts +501 -0
  283. package/dist/builtin/workflows/src/extension/dispatcher.ts +173 -0
  284. package/dist/builtin/workflows/src/extension/index.ts +2143 -0
  285. package/dist/builtin/workflows/src/extension/mcp.ts +110 -0
  286. package/dist/builtin/workflows/src/extension/render-call.ts +39 -0
  287. package/dist/builtin/workflows/src/extension/render-result.ts +214 -0
  288. package/dist/builtin/workflows/src/extension/renderers.ts +87 -0
  289. package/dist/builtin/workflows/src/extension/runtime.ts +360 -0
  290. package/dist/builtin/workflows/src/extension/status-writer.ts +167 -0
  291. package/dist/builtin/workflows/src/extension/wiring.ts +555 -0
  292. package/dist/builtin/workflows/src/extension/workflow-schema.ts +102 -0
  293. package/dist/builtin/workflows/src/index.ts +25 -0
  294. package/dist/builtin/workflows/src/intercom/intercom-bridge.ts +93 -0
  295. package/dist/builtin/workflows/src/intercom/intercom-routing.ts +125 -0
  296. package/dist/builtin/workflows/src/intercom/result-intercom.ts +240 -0
  297. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +113 -0
  298. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +81 -0
  299. package/dist/builtin/workflows/src/runs/background/runner.ts +152 -0
  300. package/dist/builtin/workflows/src/runs/background/status.ts +354 -0
  301. package/dist/builtin/workflows/src/runs/foreground/executor.ts +1522 -0
  302. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +233 -0
  303. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +712 -0
  304. package/dist/builtin/workflows/src/runs/shared/concurrency.ts +76 -0
  305. package/dist/builtin/workflows/src/runs/shared/graph-inference.ts +69 -0
  306. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +293 -0
  307. package/dist/builtin/workflows/src/runs/shared/validate-inputs.ts +83 -0
  308. package/dist/builtin/workflows/src/runs/shared/workflow-runner.ts +170 -0
  309. package/dist/builtin/workflows/src/runs/shared/worktree.ts +577 -0
  310. package/dist/builtin/workflows/src/shared/persistence-compaction-policy.ts +72 -0
  311. package/dist/builtin/workflows/src/shared/persistence-restore.ts +257 -0
  312. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +145 -0
  313. package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +196 -0
  314. package/dist/builtin/workflows/src/shared/store-types.ts +160 -0
  315. package/dist/builtin/workflows/src/shared/store.ts +579 -0
  316. package/dist/builtin/workflows/src/shared/types.ts +566 -0
  317. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +224 -0
  318. package/dist/builtin/workflows/src/tui/chat-surface.ts +511 -0
  319. package/dist/builtin/workflows/src/tui/color-utils.ts +64 -0
  320. package/dist/builtin/workflows/src/tui/connectors.ts +88 -0
  321. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +307 -0
  322. package/dist/builtin/workflows/src/tui/edge.ts +24 -0
  323. package/dist/builtin/workflows/src/tui/graph-canvas.ts +108 -0
  324. package/dist/builtin/workflows/src/tui/graph-theme.ts +283 -0
  325. package/dist/builtin/workflows/src/tui/graph-view.ts +1217 -0
  326. package/dist/builtin/workflows/src/tui/header.ts +172 -0
  327. package/dist/builtin/workflows/src/tui/inline-form-card.ts +421 -0
  328. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +638 -0
  329. package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +326 -0
  330. package/dist/builtin/workflows/src/tui/inline-form-store.ts +78 -0
  331. package/dist/builtin/workflows/src/tui/inputs-overlay.ts +163 -0
  332. package/dist/builtin/workflows/src/tui/inputs-picker.ts +888 -0
  333. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +154 -0
  334. package/dist/builtin/workflows/src/tui/layout.ts +153 -0
  335. package/dist/builtin/workflows/src/tui/node-card.ts +274 -0
  336. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +277 -0
  337. package/dist/builtin/workflows/src/tui/prompt-card.ts +501 -0
  338. package/dist/builtin/workflows/src/tui/renderers.ts +15 -0
  339. package/dist/builtin/workflows/src/tui/run-detail.ts +339 -0
  340. package/dist/builtin/workflows/src/tui/session-confirm.ts +202 -0
  341. package/dist/builtin/workflows/src/tui/session-list.ts +32 -0
  342. package/dist/builtin/workflows/src/tui/session-overlays.ts +239 -0
  343. package/dist/builtin/workflows/src/tui/session-picker.ts +399 -0
  344. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +1873 -0
  345. package/dist/builtin/workflows/src/tui/status-helpers.ts +73 -0
  346. package/dist/builtin/workflows/src/tui/status-list.ts +361 -0
  347. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +206 -0
  348. package/dist/builtin/workflows/src/tui/switcher.ts +121 -0
  349. package/dist/builtin/workflows/src/tui/text-helpers.ts +31 -0
  350. package/dist/builtin/workflows/src/tui/toast.ts +106 -0
  351. package/dist/builtin/workflows/src/tui/widget.ts +348 -0
  352. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +285 -0
  353. package/dist/builtin/workflows/src/tui/workflow-list.ts +224 -0
  354. package/dist/builtin/workflows/src/workflows/define-workflow.ts +150 -0
  355. package/dist/builtin/workflows/src/workflows/identity.ts +39 -0
  356. package/dist/builtin/workflows/src/workflows/registry.ts +113 -0
  357. package/dist/bun/cli.d.ts +3 -0
  358. package/dist/bun/cli.d.ts.map +1 -0
  359. package/dist/bun/cli.js +9 -0
  360. package/dist/bun/cli.js.map +1 -0
  361. package/dist/bun/register-bedrock.d.ts +2 -0
  362. package/dist/bun/register-bedrock.d.ts.map +1 -0
  363. package/dist/bun/register-bedrock.js +4 -0
  364. package/dist/bun/register-bedrock.js.map +1 -0
  365. package/dist/bun/restore-sandbox-env.d.ts +13 -0
  366. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  367. package/dist/bun/restore-sandbox-env.js +32 -0
  368. package/dist/bun/restore-sandbox-env.js.map +1 -0
  369. package/dist/cli/args.d.ts +53 -0
  370. package/dist/cli/args.d.ts.map +1 -0
  371. package/dist/cli/args.js +341 -0
  372. package/dist/cli/args.js.map +1 -0
  373. package/dist/cli/config-selector.d.ts +14 -0
  374. package/dist/cli/config-selector.d.ts.map +1 -0
  375. package/dist/cli/config-selector.js +31 -0
  376. package/dist/cli/config-selector.js.map +1 -0
  377. package/dist/cli/file-processor.d.ts +15 -0
  378. package/dist/cli/file-processor.d.ts.map +1 -0
  379. package/dist/cli/file-processor.js +83 -0
  380. package/dist/cli/file-processor.js.map +1 -0
  381. package/dist/cli/initial-message.d.ts +18 -0
  382. package/dist/cli/initial-message.d.ts.map +1 -0
  383. package/dist/cli/initial-message.js +22 -0
  384. package/dist/cli/initial-message.js.map +1 -0
  385. package/dist/cli/list-models.d.ts +9 -0
  386. package/dist/cli/list-models.d.ts.map +1 -0
  387. package/dist/cli/list-models.js +98 -0
  388. package/dist/cli/list-models.js.map +1 -0
  389. package/dist/cli/session-picker.d.ts +9 -0
  390. package/dist/cli/session-picker.d.ts.map +1 -0
  391. package/dist/cli/session-picker.js +35 -0
  392. package/dist/cli/session-picker.js.map +1 -0
  393. package/dist/cli.d.ts +3 -0
  394. package/dist/cli.d.ts.map +1 -0
  395. package/dist/cli.js +20 -0
  396. package/dist/cli.js.map +1 -0
  397. package/dist/config.d.ts +102 -0
  398. package/dist/config.d.ts.map +1 -0
  399. package/dist/config.js +411 -0
  400. package/dist/config.js.map +1 -0
  401. package/dist/core/agent-session-runtime.d.ts +117 -0
  402. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  403. package/dist/core/agent-session-runtime.js +292 -0
  404. package/dist/core/agent-session-runtime.js.map +1 -0
  405. package/dist/core/agent-session-services.d.ts +86 -0
  406. package/dist/core/agent-session-services.d.ts.map +1 -0
  407. package/dist/core/agent-session-services.js +117 -0
  408. package/dist/core/agent-session-services.js.map +1 -0
  409. package/dist/core/agent-session.d.ts +595 -0
  410. package/dist/core/agent-session.d.ts.map +1 -0
  411. package/dist/core/agent-session.js +2518 -0
  412. package/dist/core/agent-session.js.map +1 -0
  413. package/dist/core/auth-guidance.d.ts +5 -0
  414. package/dist/core/auth-guidance.d.ts.map +1 -0
  415. package/dist/core/auth-guidance.js +21 -0
  416. package/dist/core/auth-guidance.js.map +1 -0
  417. package/dist/core/auth-storage.d.ts +141 -0
  418. package/dist/core/auth-storage.d.ts.map +1 -0
  419. package/dist/core/auth-storage.js +437 -0
  420. package/dist/core/auth-storage.js.map +1 -0
  421. package/dist/core/bash-executor.d.ts +32 -0
  422. package/dist/core/bash-executor.d.ts.map +1 -0
  423. package/dist/core/bash-executor.js +111 -0
  424. package/dist/core/bash-executor.js.map +1 -0
  425. package/dist/core/builtin-packages.d.ts +14 -0
  426. package/dist/core/builtin-packages.d.ts.map +1 -0
  427. package/dist/core/builtin-packages.js +113 -0
  428. package/dist/core/builtin-packages.js.map +1 -0
  429. package/dist/core/compaction/branch-summarization.d.ts +88 -0
  430. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  431. package/dist/core/compaction/branch-summarization.js +243 -0
  432. package/dist/core/compaction/branch-summarization.js.map +1 -0
  433. package/dist/core/compaction/compaction.d.ts +121 -0
  434. package/dist/core/compaction/compaction.d.ts.map +1 -0
  435. package/dist/core/compaction/compaction.js +615 -0
  436. package/dist/core/compaction/compaction.js.map +1 -0
  437. package/dist/core/compaction/index.d.ts +7 -0
  438. package/dist/core/compaction/index.d.ts.map +1 -0
  439. package/dist/core/compaction/index.js +7 -0
  440. package/dist/core/compaction/index.js.map +1 -0
  441. package/dist/core/compaction/utils.d.ts +38 -0
  442. package/dist/core/compaction/utils.d.ts.map +1 -0
  443. package/dist/core/compaction/utils.js +153 -0
  444. package/dist/core/compaction/utils.js.map +1 -0
  445. package/dist/core/defaults.d.ts +3 -0
  446. package/dist/core/defaults.d.ts.map +1 -0
  447. package/dist/core/defaults.js +2 -0
  448. package/dist/core/defaults.js.map +1 -0
  449. package/dist/core/diagnostics.d.ts +15 -0
  450. package/dist/core/diagnostics.d.ts.map +1 -0
  451. package/dist/core/diagnostics.js +2 -0
  452. package/dist/core/diagnostics.js.map +1 -0
  453. package/dist/core/event-bus.d.ts +9 -0
  454. package/dist/core/event-bus.d.ts.map +1 -0
  455. package/dist/core/event-bus.js +25 -0
  456. package/dist/core/event-bus.js.map +1 -0
  457. package/dist/core/exec.d.ts +29 -0
  458. package/dist/core/exec.d.ts.map +1 -0
  459. package/dist/core/exec.js +75 -0
  460. package/dist/core/exec.js.map +1 -0
  461. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  462. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  463. package/dist/core/export-html/ansi-to-html.js +249 -0
  464. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  465. package/dist/core/export-html/index.d.ts +37 -0
  466. package/dist/core/export-html/index.d.ts.map +1 -0
  467. package/dist/core/export-html/index.js +224 -0
  468. package/dist/core/export-html/index.js.map +1 -0
  469. package/dist/core/export-html/template.css +1066 -0
  470. package/dist/core/export-html/template.html +55 -0
  471. package/dist/core/export-html/template.js +1834 -0
  472. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  473. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  474. package/dist/core/export-html/tool-renderer.js +108 -0
  475. package/dist/core/export-html/tool-renderer.js.map +1 -0
  476. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  477. package/dist/core/export-html/vendor/marked.min.js +6 -0
  478. package/dist/core/extensions/index.d.ts +12 -0
  479. package/dist/core/extensions/index.d.ts.map +1 -0
  480. package/dist/core/extensions/index.js +9 -0
  481. package/dist/core/extensions/index.js.map +1 -0
  482. package/dist/core/extensions/loader.d.ts +24 -0
  483. package/dist/core/extensions/loader.d.ts.map +1 -0
  484. package/dist/core/extensions/loader.js +501 -0
  485. package/dist/core/extensions/loader.js.map +1 -0
  486. package/dist/core/extensions/runner.d.ts +159 -0
  487. package/dist/core/extensions/runner.d.ts.map +1 -0
  488. package/dist/core/extensions/runner.js +817 -0
  489. package/dist/core/extensions/runner.js.map +1 -0
  490. package/dist/core/extensions/types.d.ts +1173 -0
  491. package/dist/core/extensions/types.d.ts.map +1 -0
  492. package/dist/core/extensions/types.js +45 -0
  493. package/dist/core/extensions/types.js.map +1 -0
  494. package/dist/core/extensions/wrapper.d.ts +20 -0
  495. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  496. package/dist/core/extensions/wrapper.js +22 -0
  497. package/dist/core/extensions/wrapper.js.map +1 -0
  498. package/dist/core/footer-data-provider.d.ts +52 -0
  499. package/dist/core/footer-data-provider.d.ts.map +1 -0
  500. package/dist/core/footer-data-provider.js +309 -0
  501. package/dist/core/footer-data-provider.js.map +1 -0
  502. package/dist/core/index.d.ts +12 -0
  503. package/dist/core/index.d.ts.map +1 -0
  504. package/dist/core/index.js +12 -0
  505. package/dist/core/index.js.map +1 -0
  506. package/dist/core/keybindings.d.ts +353 -0
  507. package/dist/core/keybindings.d.ts.map +1 -0
  508. package/dist/core/keybindings.js +294 -0
  509. package/dist/core/keybindings.js.map +1 -0
  510. package/dist/core/messages.d.ts +77 -0
  511. package/dist/core/messages.d.ts.map +1 -0
  512. package/dist/core/messages.js +123 -0
  513. package/dist/core/messages.js.map +1 -0
  514. package/dist/core/model-registry.d.ts +150 -0
  515. package/dist/core/model-registry.d.ts.map +1 -0
  516. package/dist/core/model-registry.js +726 -0
  517. package/dist/core/model-registry.js.map +1 -0
  518. package/dist/core/model-resolver.d.ts +110 -0
  519. package/dist/core/model-resolver.d.ts.map +1 -0
  520. package/dist/core/model-resolver.js +493 -0
  521. package/dist/core/model-resolver.js.map +1 -0
  522. package/dist/core/output-guard.d.ts +6 -0
  523. package/dist/core/output-guard.d.ts.map +1 -0
  524. package/dist/core/output-guard.js +59 -0
  525. package/dist/core/output-guard.js.map +1 -0
  526. package/dist/core/package-manager.d.ts +198 -0
  527. package/dist/core/package-manager.d.ts.map +1 -0
  528. package/dist/core/package-manager.js +1970 -0
  529. package/dist/core/package-manager.js.map +1 -0
  530. package/dist/core/prompt-templates.d.ts +52 -0
  531. package/dist/core/prompt-templates.d.ts.map +1 -0
  532. package/dist/core/prompt-templates.js +250 -0
  533. package/dist/core/prompt-templates.js.map +1 -0
  534. package/dist/core/provider-display-names.d.ts +2 -0
  535. package/dist/core/provider-display-names.d.ts.map +1 -0
  536. package/dist/core/provider-display-names.js +33 -0
  537. package/dist/core/provider-display-names.js.map +1 -0
  538. package/dist/core/resolve-config-value.d.ts +23 -0
  539. package/dist/core/resolve-config-value.d.ts.map +1 -0
  540. package/dist/core/resolve-config-value.js +126 -0
  541. package/dist/core/resolve-config-value.js.map +1 -0
  542. package/dist/core/resource-loader.d.ts +196 -0
  543. package/dist/core/resource-loader.d.ts.map +1 -0
  544. package/dist/core/resource-loader.js +698 -0
  545. package/dist/core/resource-loader.js.map +1 -0
  546. package/dist/core/sdk.d.ts +107 -0
  547. package/dist/core/sdk.d.ts.map +1 -0
  548. package/dist/core/sdk.js +291 -0
  549. package/dist/core/sdk.js.map +1 -0
  550. package/dist/core/session-cwd.d.ts +19 -0
  551. package/dist/core/session-cwd.d.ts.map +1 -0
  552. package/dist/core/session-cwd.js +37 -0
  553. package/dist/core/session-cwd.js.map +1 -0
  554. package/dist/core/session-manager.d.ts +333 -0
  555. package/dist/core/session-manager.d.ts.map +1 -0
  556. package/dist/core/session-manager.js +1118 -0
  557. package/dist/core/session-manager.js.map +1 -0
  558. package/dist/core/settings-manager.d.ts +261 -0
  559. package/dist/core/settings-manager.d.ts.map +1 -0
  560. package/dist/core/settings-manager.js +773 -0
  561. package/dist/core/settings-manager.js.map +1 -0
  562. package/dist/core/skills.d.ts +60 -0
  563. package/dist/core/skills.d.ts.map +1 -0
  564. package/dist/core/skills.js +404 -0
  565. package/dist/core/skills.js.map +1 -0
  566. package/dist/core/slash-commands.d.ts +14 -0
  567. package/dist/core/slash-commands.d.ts.map +1 -0
  568. package/dist/core/slash-commands.js +25 -0
  569. package/dist/core/slash-commands.js.map +1 -0
  570. package/dist/core/source-info.d.ts +18 -0
  571. package/dist/core/source-info.d.ts.map +1 -0
  572. package/dist/core/source-info.js +19 -0
  573. package/dist/core/source-info.js.map +1 -0
  574. package/dist/core/system-prompt.d.ts +28 -0
  575. package/dist/core/system-prompt.d.ts.map +1 -0
  576. package/dist/core/system-prompt.js +120 -0
  577. package/dist/core/system-prompt.js.map +1 -0
  578. package/dist/core/telemetry.d.ts +3 -0
  579. package/dist/core/telemetry.d.ts.map +1 -0
  580. package/dist/core/telemetry.js +10 -0
  581. package/dist/core/telemetry.js.map +1 -0
  582. package/dist/core/timings.d.ts +8 -0
  583. package/dist/core/timings.d.ts.map +1 -0
  584. package/dist/core/timings.js +32 -0
  585. package/dist/core/timings.js.map +1 -0
  586. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +10 -0
  587. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -0
  588. package/dist/core/tools/ask-user-question/ask-user-question.js +82 -0
  589. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -0
  590. package/dist/core/tools/ask-user-question/config.d.ts +11 -0
  591. package/dist/core/tools/ask-user-question/config.d.ts.map +1 -0
  592. package/dist/core/tools/ask-user-question/config.js +34 -0
  593. package/dist/core/tools/ask-user-question/config.js.map +1 -0
  594. package/dist/core/tools/ask-user-question/index.d.ts +19 -0
  595. package/dist/core/tools/ask-user-question/index.d.ts.map +1 -0
  596. package/dist/core/tools/ask-user-question/index.js +19 -0
  597. package/dist/core/tools/ask-user-question/index.js.map +1 -0
  598. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +36 -0
  599. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts.map +1 -0
  600. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +213 -0
  601. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -0
  602. package/dist/core/tools/ask-user-question/state/key-router.d.ts +53 -0
  603. package/dist/core/tools/ask-user-question/state/key-router.d.ts.map +1 -0
  604. package/dist/core/tools/ask-user-question/state/key-router.js +240 -0
  605. package/dist/core/tools/ask-user-question/state/key-router.js.map +1 -0
  606. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +61 -0
  607. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -0
  608. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +147 -0
  609. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -0
  610. package/dist/core/tools/ask-user-question/state/row-intent.d.ts +91 -0
  611. package/dist/core/tools/ask-user-question/state/row-intent.d.ts.map +1 -0
  612. package/dist/core/tools/ask-user-question/state/row-intent.js +91 -0
  613. package/dist/core/tools/ask-user-question/state/row-intent.js.map +1 -0
  614. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts +21 -0
  615. package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts.map +1 -0
  616. package/dist/core/tools/ask-user-question/state/selectors/contract.js +2 -0
  617. package/dist/core/tools/ask-user-question/state/selectors/contract.js.map +1 -0
  618. package/dist/core/tools/ask-user-question/state/selectors/derivations.d.ts +44 -0
  619. package/dist/core/tools/ask-user-question/state/selectors/derivations.d.ts.map +1 -0
  620. package/dist/core/tools/ask-user-question/state/selectors/derivations.js +76 -0
  621. package/dist/core/tools/ask-user-question/state/selectors/derivations.js.map +1 -0
  622. package/dist/core/tools/ask-user-question/state/selectors/focus.d.ts +15 -0
  623. package/dist/core/tools/ask-user-question/state/selectors/focus.d.ts.map +1 -0
  624. package/dist/core/tools/ask-user-question/state/selectors/focus.js +18 -0
  625. package/dist/core/tools/ask-user-question/state/selectors/focus.js.map +1 -0
  626. package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts +16 -0
  627. package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts.map +1 -0
  628. package/dist/core/tools/ask-user-question/state/selectors/projections.js +71 -0
  629. package/dist/core/tools/ask-user-question/state/selectors/projections.js.map +1 -0
  630. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts +44 -0
  631. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -0
  632. package/dist/core/tools/ask-user-question/state/state-reducer.js +239 -0
  633. package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -0
  634. package/dist/core/tools/ask-user-question/state/state.d.ts +42 -0
  635. package/dist/core/tools/ask-user-question/state/state.d.ts.map +1 -0
  636. package/dist/core/tools/ask-user-question/state/state.js +2 -0
  637. package/dist/core/tools/ask-user-question/state/state.js.map +1 -0
  638. package/dist/core/tools/ask-user-question/tool/format-answer.d.ts +30 -0
  639. package/dist/core/tools/ask-user-question/tool/format-answer.d.ts.map +1 -0
  640. package/dist/core/tools/ask-user-question/tool/format-answer.js +39 -0
  641. package/dist/core/tools/ask-user-question/tool/format-answer.js.map +1 -0
  642. package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts +29 -0
  643. package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts.map +1 -0
  644. package/dist/core/tools/ask-user-question/tool/response-envelope.js +46 -0
  645. package/dist/core/tools/ask-user-question/tool/response-envelope.js.map +1 -0
  646. package/dist/core/tools/ask-user-question/tool/types.d.ts +113 -0
  647. package/dist/core/tools/ask-user-question/tool/types.d.ts.map +1 -0
  648. package/dist/core/tools/ask-user-question/tool/types.js +81 -0
  649. package/dist/core/tools/ask-user-question/tool/types.js.map +1 -0
  650. package/dist/core/tools/ask-user-question/tool/validate-questionnaire.d.ts +21 -0
  651. package/dist/core/tools/ask-user-question/tool/validate-questionnaire.d.ts.map +1 -0
  652. package/dist/core/tools/ask-user-question/tool/validate-questionnaire.js +49 -0
  653. package/dist/core/tools/ask-user-question/tool/validate-questionnaire.js.map +1 -0
  654. package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts +18 -0
  655. package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts.map +1 -0
  656. package/dist/core/tools/ask-user-question/view/body-residual-spacer.js +21 -0
  657. package/dist/core/tools/ask-user-question/view/body-residual-spacer.js.map +1 -0
  658. package/dist/core/tools/ask-user-question/view/component-binding.d.ts +23 -0
  659. package/dist/core/tools/ask-user-question/view/component-binding.d.ts.map +1 -0
  660. package/dist/core/tools/ask-user-question/view/component-binding.js +16 -0
  661. package/dist/core/tools/ask-user-question/view/component-binding.js.map +1 -0
  662. package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts +40 -0
  663. package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts.map +1 -0
  664. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +31 -0
  665. package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -0
  666. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts +35 -0
  667. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -0
  668. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +91 -0
  669. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -0
  670. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts +43 -0
  671. package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts.map +1 -0
  672. package/dist/core/tools/ask-user-question/view/components/option-list-view.js +37 -0
  673. package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -0
  674. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts +36 -0
  675. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts.map +1 -0
  676. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js +66 -0
  677. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -0
  678. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +46 -0
  679. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -0
  680. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +69 -0
  681. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -0
  682. package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.d.ts +39 -0
  683. package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.d.ts.map +1 -0
  684. package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.js +76 -0
  685. package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.js.map +1 -0
  686. package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.d.ts +116 -0
  687. package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.d.ts.map +1 -0
  688. package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.js +173 -0
  689. package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.js.map +1 -0
  690. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.d.ts +66 -0
  691. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.d.ts.map +1 -0
  692. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js +124 -0
  693. package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js.map +1 -0
  694. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts +37 -0
  695. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -0
  696. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +44 -0
  697. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -0
  698. package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts +32 -0
  699. package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts.map +1 -0
  700. package/dist/core/tools/ask-user-question/view/components/tab-bar.js +33 -0
  701. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -0
  702. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts +122 -0
  703. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -0
  704. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +161 -0
  705. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -0
  706. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +66 -0
  707. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -0
  708. package/dist/core/tools/ask-user-question/view/dialog-builder.js +85 -0
  709. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -0
  710. package/dist/core/tools/ask-user-question/view/props-adapter.d.ts +58 -0
  711. package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -0
  712. package/dist/core/tools/ask-user-question/view/props-adapter.js +67 -0
  713. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -0
  714. package/dist/core/tools/ask-user-question/view/stateful-view.d.ts +24 -0
  715. package/dist/core/tools/ask-user-question/view/stateful-view.d.ts.map +1 -0
  716. package/dist/core/tools/ask-user-question/view/stateful-view.js +2 -0
  717. package/dist/core/tools/ask-user-question/view/stateful-view.js.map +1 -0
  718. package/dist/core/tools/ask-user-question/view/tab-components.d.ts +15 -0
  719. package/dist/core/tools/ask-user-question/view/tab-components.d.ts.map +1 -0
  720. package/dist/core/tools/ask-user-question/view/tab-components.js +2 -0
  721. package/dist/core/tools/ask-user-question/view/tab-components.js.map +1 -0
  722. package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts +71 -0
  723. package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts.map +1 -0
  724. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +129 -0
  725. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -0
  726. package/dist/core/tools/bash.d.ts +68 -0
  727. package/dist/core/tools/bash.d.ts.map +1 -0
  728. package/dist/core/tools/bash.js +338 -0
  729. package/dist/core/tools/bash.js.map +1 -0
  730. package/dist/core/tools/edit-diff.d.ts +85 -0
  731. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  732. package/dist/core/tools/edit-diff.js +338 -0
  733. package/dist/core/tools/edit-diff.js.map +1 -0
  734. package/dist/core/tools/edit.d.ts +49 -0
  735. package/dist/core/tools/edit.d.ts.map +1 -0
  736. package/dist/core/tools/edit.js +324 -0
  737. package/dist/core/tools/edit.js.map +1 -0
  738. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  739. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  740. package/dist/core/tools/file-mutation-queue.js +37 -0
  741. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  742. package/dist/core/tools/find.d.ts +35 -0
  743. package/dist/core/tools/find.d.ts.map +1 -0
  744. package/dist/core/tools/find.js +298 -0
  745. package/dist/core/tools/find.js.map +1 -0
  746. package/dist/core/tools/grep.d.ts +37 -0
  747. package/dist/core/tools/grep.d.ts.map +1 -0
  748. package/dist/core/tools/grep.js +304 -0
  749. package/dist/core/tools/grep.js.map +1 -0
  750. package/dist/core/tools/index.d.ts +42 -0
  751. package/dist/core/tools/index.d.ts.map +1 -0
  752. package/dist/core/tools/index.js +139 -0
  753. package/dist/core/tools/index.js.map +1 -0
  754. package/dist/core/tools/ls.d.ts +37 -0
  755. package/dist/core/tools/ls.d.ts.map +1 -0
  756. package/dist/core/tools/ls.js +169 -0
  757. package/dist/core/tools/ls.js.map +1 -0
  758. package/dist/core/tools/output-accumulator.d.ts +50 -0
  759. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  760. package/dist/core/tools/output-accumulator.js +172 -0
  761. package/dist/core/tools/output-accumulator.js.map +1 -0
  762. package/dist/core/tools/path-utils.d.ts +8 -0
  763. package/dist/core/tools/path-utils.d.ts.map +1 -0
  764. package/dist/core/tools/path-utils.js +81 -0
  765. package/dist/core/tools/path-utils.js.map +1 -0
  766. package/dist/core/tools/read.d.ts +35 -0
  767. package/dist/core/tools/read.d.ts.map +1 -0
  768. package/dist/core/tools/read.js +289 -0
  769. package/dist/core/tools/read.js.map +1 -0
  770. package/dist/core/tools/render-utils.d.ts +21 -0
  771. package/dist/core/tools/render-utils.d.ts.map +1 -0
  772. package/dist/core/tools/render-utils.js +49 -0
  773. package/dist/core/tools/render-utils.js.map +1 -0
  774. package/dist/core/tools/todos.d.ts +35 -0
  775. package/dist/core/tools/todos.d.ts.map +1 -0
  776. package/dist/core/tools/todos.js +906 -0
  777. package/dist/core/tools/todos.js.map +1 -0
  778. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  779. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  780. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  781. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  782. package/dist/core/tools/truncate.d.ts +70 -0
  783. package/dist/core/tools/truncate.d.ts.map +1 -0
  784. package/dist/core/tools/truncate.js +205 -0
  785. package/dist/core/tools/truncate.js.map +1 -0
  786. package/dist/core/tools/write.d.ts +26 -0
  787. package/dist/core/tools/write.d.ts.map +1 -0
  788. package/dist/core/tools/write.js +212 -0
  789. package/dist/core/tools/write.js.map +1 -0
  790. package/dist/index.d.ts +28 -0
  791. package/dist/index.d.ts.map +1 -0
  792. package/dist/index.js +41 -0
  793. package/dist/index.js.map +1 -0
  794. package/dist/main.d.ts +13 -0
  795. package/dist/main.d.ts.map +1 -0
  796. package/dist/main.js +586 -0
  797. package/dist/main.js.map +1 -0
  798. package/dist/migrations.d.ts +33 -0
  799. package/dist/migrations.d.ts.map +1 -0
  800. package/dist/migrations.js +281 -0
  801. package/dist/migrations.js.map +1 -0
  802. package/dist/modes/index.d.ts +9 -0
  803. package/dist/modes/index.d.ts.map +1 -0
  804. package/dist/modes/index.js +8 -0
  805. package/dist/modes/index.js.map +1 -0
  806. package/dist/modes/interactive/assets/clankolas.png +3 -0
  807. package/dist/modes/interactive/components/armin.d.ts +34 -0
  808. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  809. package/dist/modes/interactive/components/armin.js +329 -0
  810. package/dist/modes/interactive/components/armin.js.map +1 -0
  811. package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
  812. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  813. package/dist/modes/interactive/components/assistant-message.js +116 -0
  814. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  815. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  816. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  817. package/dist/modes/interactive/components/bash-execution.js +170 -0
  818. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  819. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  820. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  821. package/dist/modes/interactive/components/bordered-loader.js +51 -0
  822. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  823. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  824. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  825. package/dist/modes/interactive/components/branch-summary-message.js +42 -0
  826. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  827. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  828. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  829. package/dist/modes/interactive/components/compaction-summary-message.js +43 -0
  830. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  831. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  832. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  833. package/dist/modes/interactive/components/config-selector.js +496 -0
  834. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  835. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  836. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  837. package/dist/modes/interactive/components/countdown-timer.js +28 -0
  838. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  839. package/dist/modes/interactive/components/custom-editor.d.ts +29 -0
  840. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  841. package/dist/modes/interactive/components/custom-editor.js +113 -0
  842. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  843. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  844. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  845. package/dist/modes/interactive/components/custom-message.js +74 -0
  846. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  847. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  848. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  849. package/dist/modes/interactive/components/daxnuts.js +138 -0
  850. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  851. package/dist/modes/interactive/components/diff.d.ts +12 -0
  852. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  853. package/dist/modes/interactive/components/diff.js +151 -0
  854. package/dist/modes/interactive/components/diff.js.map +1 -0
  855. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  856. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  857. package/dist/modes/interactive/components/dynamic-border.js +20 -0
  858. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  859. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  860. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  861. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  862. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  863. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  864. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  865. package/dist/modes/interactive/components/extension-editor.js +106 -0
  866. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  867. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  868. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  869. package/dist/modes/interactive/components/extension-input.js +55 -0
  870. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  871. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  872. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  873. package/dist/modes/interactive/components/extension-selector.js +75 -0
  874. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  875. package/dist/modes/interactive/components/footer.d.ts +27 -0
  876. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  877. package/dist/modes/interactive/components/footer.js +199 -0
  878. package/dist/modes/interactive/components/footer.js.map +1 -0
  879. package/dist/modes/interactive/components/index.d.ts +32 -0
  880. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  881. package/dist/modes/interactive/components/index.js +33 -0
  882. package/dist/modes/interactive/components/index.js.map +1 -0
  883. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  884. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  885. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  886. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  887. package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
  888. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  889. package/dist/modes/interactive/components/login-dialog.js +158 -0
  890. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  891. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  892. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  893. package/dist/modes/interactive/components/model-selector.js +266 -0
  894. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  895. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  896. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  897. package/dist/modes/interactive/components/oauth-selector.js +156 -0
  898. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  899. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  900. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  901. package/dist/modes/interactive/components/scoped-models-selector.js +286 -0
  902. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  903. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  904. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  905. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  906. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  907. package/dist/modes/interactive/components/session-selector.d.ts +96 -0
  908. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  909. package/dist/modes/interactive/components/session-selector.js +836 -0
  910. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  911. package/dist/modes/interactive/components/settings-selector.d.ts +67 -0
  912. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  913. package/dist/modes/interactive/components/settings-selector.js +371 -0
  914. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  915. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  916. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  917. package/dist/modes/interactive/components/show-images-selector.js +38 -0
  918. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  919. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  920. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  921. package/dist/modes/interactive/components/skill-invocation-message.js +45 -0
  922. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  923. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  924. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  925. package/dist/modes/interactive/components/theme-selector.js +48 -0
  926. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  927. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  928. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  929. package/dist/modes/interactive/components/thinking-selector.js +50 -0
  930. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  931. package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  932. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  933. package/dist/modes/interactive/components/tool-execution.js +280 -0
  934. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  935. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  936. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  937. package/dist/modes/interactive/components/tree-selector.js +1079 -0
  938. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  939. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  940. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  941. package/dist/modes/interactive/components/user-message-selector.js +111 -0
  942. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  943. package/dist/modes/interactive/components/user-message.d.ts +10 -0
  944. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  945. package/dist/modes/interactive/components/user-message.js +28 -0
  946. package/dist/modes/interactive/components/user-message.js.map +1 -0
  947. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  948. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  949. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  950. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  951. package/dist/modes/interactive/interactive-mode.d.ts +369 -0
  952. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  953. package/dist/modes/interactive/interactive-mode.js +4709 -0
  954. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  955. package/dist/modes/interactive/theme/catppuccin-frappe.json +90 -0
  956. package/dist/modes/interactive/theme/catppuccin-latte.json +90 -0
  957. package/dist/modes/interactive/theme/catppuccin-macchiato.json +90 -0
  958. package/dist/modes/interactive/theme/catppuccin-mocha.json +90 -0
  959. package/dist/modes/interactive/theme/dark.json +85 -0
  960. package/dist/modes/interactive/theme/light.json +84 -0
  961. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  962. package/dist/modes/interactive/theme/theme.d.ts +81 -0
  963. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  964. package/dist/modes/interactive/theme/theme.js +970 -0
  965. package/dist/modes/interactive/theme/theme.js.map +1 -0
  966. package/dist/modes/interactive/whimsical-messages.d.ts +5 -0
  967. package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -0
  968. package/dist/modes/interactive/whimsical-messages.js +464 -0
  969. package/dist/modes/interactive/whimsical-messages.js.map +1 -0
  970. package/dist/modes/print-mode.d.ts +28 -0
  971. package/dist/modes/print-mode.d.ts.map +1 -0
  972. package/dist/modes/print-mode.js +131 -0
  973. package/dist/modes/print-mode.js.map +1 -0
  974. package/dist/modes/rpc/jsonl.d.ts +17 -0
  975. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  976. package/dist/modes/rpc/jsonl.js +49 -0
  977. package/dist/modes/rpc/jsonl.js.map +1 -0
  978. package/dist/modes/rpc/rpc-client.d.ts +224 -0
  979. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  980. package/dist/modes/rpc/rpc-client.js +409 -0
  981. package/dist/modes/rpc/rpc-client.js.map +1 -0
  982. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  983. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  984. package/dist/modes/rpc/rpc-mode.js +601 -0
  985. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  986. package/dist/modes/rpc/rpc-types.d.ts +419 -0
  987. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  988. package/dist/modes/rpc/rpc-types.js +8 -0
  989. package/dist/modes/rpc/rpc-types.js.map +1 -0
  990. package/dist/package-manager-cli.d.ts +4 -0
  991. package/dist/package-manager-cli.d.ts.map +1 -0
  992. package/dist/package-manager-cli.js +460 -0
  993. package/dist/package-manager-cli.js.map +1 -0
  994. package/dist/utils/ansi.d.ts +2 -0
  995. package/dist/utils/ansi.d.ts.map +1 -0
  996. package/dist/utils/ansi.js +52 -0
  997. package/dist/utils/ansi.js.map +1 -0
  998. package/dist/utils/changelog.d.ts +21 -0
  999. package/dist/utils/changelog.d.ts.map +1 -0
  1000. package/dist/utils/changelog.js +87 -0
  1001. package/dist/utils/changelog.js.map +1 -0
  1002. package/dist/utils/child-process.d.ts +12 -0
  1003. package/dist/utils/child-process.d.ts.map +1 -0
  1004. package/dist/utils/child-process.js +86 -0
  1005. package/dist/utils/child-process.js.map +1 -0
  1006. package/dist/utils/clipboard-image.d.ts +11 -0
  1007. package/dist/utils/clipboard-image.d.ts.map +1 -0
  1008. package/dist/utils/clipboard-image.js +245 -0
  1009. package/dist/utils/clipboard-image.js.map +1 -0
  1010. package/dist/utils/clipboard-native.d.ts +8 -0
  1011. package/dist/utils/clipboard-native.d.ts.map +1 -0
  1012. package/dist/utils/clipboard-native.js +14 -0
  1013. package/dist/utils/clipboard-native.js.map +1 -0
  1014. package/dist/utils/clipboard.d.ts +2 -0
  1015. package/dist/utils/clipboard.d.ts.map +1 -0
  1016. package/dist/utils/clipboard.js +117 -0
  1017. package/dist/utils/clipboard.js.map +1 -0
  1018. package/dist/utils/exif-orientation.d.ts +5 -0
  1019. package/dist/utils/exif-orientation.d.ts.map +1 -0
  1020. package/dist/utils/exif-orientation.js +158 -0
  1021. package/dist/utils/exif-orientation.js.map +1 -0
  1022. package/dist/utils/frontmatter.d.ts +8 -0
  1023. package/dist/utils/frontmatter.d.ts.map +1 -0
  1024. package/dist/utils/frontmatter.js +26 -0
  1025. package/dist/utils/frontmatter.js.map +1 -0
  1026. package/dist/utils/fs-watch.d.ts +5 -0
  1027. package/dist/utils/fs-watch.d.ts.map +1 -0
  1028. package/dist/utils/fs-watch.js +25 -0
  1029. package/dist/utils/fs-watch.js.map +1 -0
  1030. package/dist/utils/git.d.ts +26 -0
  1031. package/dist/utils/git.d.ts.map +1 -0
  1032. package/dist/utils/git.js +163 -0
  1033. package/dist/utils/git.js.map +1 -0
  1034. package/dist/utils/html.d.ts +7 -0
  1035. package/dist/utils/html.d.ts.map +1 -0
  1036. package/dist/utils/html.js +40 -0
  1037. package/dist/utils/html.js.map +1 -0
  1038. package/dist/utils/image-convert.d.ts +9 -0
  1039. package/dist/utils/image-convert.d.ts.map +1 -0
  1040. package/dist/utils/image-convert.js +39 -0
  1041. package/dist/utils/image-convert.js.map +1 -0
  1042. package/dist/utils/image-resize.d.ts +36 -0
  1043. package/dist/utils/image-resize.d.ts.map +1 -0
  1044. package/dist/utils/image-resize.js +137 -0
  1045. package/dist/utils/image-resize.js.map +1 -0
  1046. package/dist/utils/mime.d.ts +3 -0
  1047. package/dist/utils/mime.d.ts.map +1 -0
  1048. package/dist/utils/mime.js +69 -0
  1049. package/dist/utils/mime.js.map +1 -0
  1050. package/dist/utils/paths.d.ts +16 -0
  1051. package/dist/utils/paths.d.ts.map +1 -0
  1052. package/dist/utils/paths.js +50 -0
  1053. package/dist/utils/paths.js.map +1 -0
  1054. package/dist/utils/photon.d.ts +21 -0
  1055. package/dist/utils/photon.d.ts.map +1 -0
  1056. package/dist/utils/photon.js +121 -0
  1057. package/dist/utils/photon.js.map +1 -0
  1058. package/dist/utils/pi-user-agent.d.ts +2 -0
  1059. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  1060. package/dist/utils/pi-user-agent.js +5 -0
  1061. package/dist/utils/pi-user-agent.js.map +1 -0
  1062. package/dist/utils/shell.d.ts +30 -0
  1063. package/dist/utils/shell.d.ts.map +1 -0
  1064. package/dist/utils/shell.js +190 -0
  1065. package/dist/utils/shell.js.map +1 -0
  1066. package/dist/utils/sleep.d.ts +5 -0
  1067. package/dist/utils/sleep.d.ts.map +1 -0
  1068. package/dist/utils/sleep.js +17 -0
  1069. package/dist/utils/sleep.js.map +1 -0
  1070. package/dist/utils/syntax-highlight.d.ts +12 -0
  1071. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  1072. package/dist/utils/syntax-highlight.js +118 -0
  1073. package/dist/utils/syntax-highlight.js.map +1 -0
  1074. package/dist/utils/tools-manager.d.ts +3 -0
  1075. package/dist/utils/tools-manager.d.ts.map +1 -0
  1076. package/dist/utils/tools-manager.js +325 -0
  1077. package/dist/utils/tools-manager.js.map +1 -0
  1078. package/dist/utils/version-check.d.ts +14 -0
  1079. package/dist/utils/version-check.d.ts.map +1 -0
  1080. package/dist/utils/version-check.js +76 -0
  1081. package/dist/utils/version-check.js.map +1 -0
  1082. package/docs/compaction.md +394 -0
  1083. package/docs/custom-provider.md +646 -0
  1084. package/docs/development.md +71 -0
  1085. package/docs/docs.json +148 -0
  1086. package/docs/extensions.md +2596 -0
  1087. package/docs/images/doom-extension.png +0 -0
  1088. package/docs/images/exy.png +3 -0
  1089. package/docs/images/interactive-mode.png +0 -0
  1090. package/docs/images/tree-view.png +0 -0
  1091. package/docs/index.md +70 -0
  1092. package/docs/json.md +82 -0
  1093. package/docs/keybindings.md +197 -0
  1094. package/docs/models.md +474 -0
  1095. package/docs/packages.md +223 -0
  1096. package/docs/prompt-templates.md +88 -0
  1097. package/docs/providers.md +243 -0
  1098. package/docs/quickstart.md +142 -0
  1099. package/docs/rpc.md +1407 -0
  1100. package/docs/sdk.md +1129 -0
  1101. package/docs/session-format.md +412 -0
  1102. package/docs/sessions.md +137 -0
  1103. package/docs/settings.md +279 -0
  1104. package/docs/shell-aliases.md +13 -0
  1105. package/docs/skills.md +232 -0
  1106. package/docs/terminal-setup.md +106 -0
  1107. package/docs/termux.md +127 -0
  1108. package/docs/themes.md +299 -0
  1109. package/docs/tmux.md +61 -0
  1110. package/docs/tui.md +918 -0
  1111. package/docs/usage.md +277 -0
  1112. package/docs/windows.md +17 -0
  1113. package/examples/README.md +25 -0
  1114. package/examples/extensions/README.md +208 -0
  1115. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  1116. package/examples/extensions/bash-spawn-hook.ts +30 -0
  1117. package/examples/extensions/bookmark.ts +50 -0
  1118. package/examples/extensions/border-status-editor.ts +150 -0
  1119. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  1120. package/examples/extensions/claude-rules.ts +86 -0
  1121. package/examples/extensions/commands.ts +72 -0
  1122. package/examples/extensions/confirm-destructive.ts +59 -0
  1123. package/examples/extensions/custom-compaction.ts +127 -0
  1124. package/examples/extensions/custom-footer.ts +64 -0
  1125. package/examples/extensions/custom-header.ts +73 -0
  1126. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  1127. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  1128. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  1129. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  1130. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  1131. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  1132. package/examples/extensions/dirty-repo-guard.ts +56 -0
  1133. package/examples/extensions/doom-overlay/README.md +46 -0
  1134. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  1135. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  1136. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  1137. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  1138. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  1139. package/examples/extensions/doom-overlay/index.ts +74 -0
  1140. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  1141. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  1142. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  1143. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  1144. package/examples/extensions/dynamic-resources/index.ts +15 -0
  1145. package/examples/extensions/dynamic-tools.ts +74 -0
  1146. package/examples/extensions/event-bus.ts +43 -0
  1147. package/examples/extensions/file-trigger.ts +41 -0
  1148. package/examples/extensions/git-checkpoint.ts +53 -0
  1149. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  1150. package/examples/extensions/handoff.ts +191 -0
  1151. package/examples/extensions/hello.ts +26 -0
  1152. package/examples/extensions/hidden-thinking-label.ts +53 -0
  1153. package/examples/extensions/inline-bash.ts +94 -0
  1154. package/examples/extensions/input-transform.ts +43 -0
  1155. package/examples/extensions/interactive-shell.ts +196 -0
  1156. package/examples/extensions/mac-system-theme.ts +47 -0
  1157. package/examples/extensions/message-renderer.ts +59 -0
  1158. package/examples/extensions/minimal-mode.ts +426 -0
  1159. package/examples/extensions/modal-editor.ts +85 -0
  1160. package/examples/extensions/model-status.ts +31 -0
  1161. package/examples/extensions/notify.ts +55 -0
  1162. package/examples/extensions/overlay-qa-tests.ts +1348 -0
  1163. package/examples/extensions/overlay-test.ts +150 -0
  1164. package/examples/extensions/permission-gate.ts +34 -0
  1165. package/examples/extensions/pirate.ts +47 -0
  1166. package/examples/extensions/plan-mode/README.md +65 -0
  1167. package/examples/extensions/plan-mode/index.ts +340 -0
  1168. package/examples/extensions/plan-mode/utils.ts +168 -0
  1169. package/examples/extensions/preset.ts +430 -0
  1170. package/examples/extensions/prompt-customizer.ts +97 -0
  1171. package/examples/extensions/protected-paths.ts +30 -0
  1172. package/examples/extensions/provider-payload.ts +18 -0
  1173. package/examples/extensions/qna.ts +122 -0
  1174. package/examples/extensions/question.ts +264 -0
  1175. package/examples/extensions/questionnaire.ts +427 -0
  1176. package/examples/extensions/rainbow-editor.ts +88 -0
  1177. package/examples/extensions/reload-runtime.ts +37 -0
  1178. package/examples/extensions/rpc-demo.ts +118 -0
  1179. package/examples/extensions/sandbox/index.ts +321 -0
  1180. package/examples/extensions/sandbox/package-lock.json +92 -0
  1181. package/examples/extensions/sandbox/package.json +19 -0
  1182. package/examples/extensions/send-user-message.ts +97 -0
  1183. package/examples/extensions/session-name.ts +27 -0
  1184. package/examples/extensions/shutdown-command.ts +63 -0
  1185. package/examples/extensions/snake.ts +343 -0
  1186. package/examples/extensions/space-invaders.ts +560 -0
  1187. package/examples/extensions/ssh.ts +220 -0
  1188. package/examples/extensions/status-line.ts +32 -0
  1189. package/examples/extensions/structured-output.ts +65 -0
  1190. package/examples/extensions/subagent/README.md +172 -0
  1191. package/examples/extensions/subagent/agents/planner.md +37 -0
  1192. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1193. package/examples/extensions/subagent/agents/scout.md +50 -0
  1194. package/examples/extensions/subagent/agents/worker.md +24 -0
  1195. package/examples/extensions/subagent/agents.ts +126 -0
  1196. package/examples/extensions/subagent/index.ts +987 -0
  1197. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1198. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1199. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1200. package/examples/extensions/summarize.ts +206 -0
  1201. package/examples/extensions/system-prompt-header.ts +17 -0
  1202. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1203. package/examples/extensions/timed-confirm.ts +70 -0
  1204. package/examples/extensions/titlebar-spinner.ts +58 -0
  1205. package/examples/extensions/todo.ts +297 -0
  1206. package/examples/extensions/tool-override.ts +144 -0
  1207. package/examples/extensions/tools.ts +141 -0
  1208. package/examples/extensions/trigger-compact.ts +50 -0
  1209. package/examples/extensions/truncated-tool.ts +195 -0
  1210. package/examples/extensions/widget-placement.ts +9 -0
  1211. package/examples/extensions/with-deps/index.ts +32 -0
  1212. package/examples/extensions/with-deps/package-lock.json +31 -0
  1213. package/examples/extensions/with-deps/package.json +22 -0
  1214. package/examples/extensions/working-indicator.ts +123 -0
  1215. package/examples/extensions/working-message-test.ts +25 -0
  1216. package/examples/rpc-extension-ui.ts +632 -0
  1217. package/examples/sdk/01-minimal.ts +26 -0
  1218. package/examples/sdk/02-custom-model.ts +53 -0
  1219. package/examples/sdk/03-custom-prompt.ts +75 -0
  1220. package/examples/sdk/04-skills.ts +55 -0
  1221. package/examples/sdk/05-tools.ts +48 -0
  1222. package/examples/sdk/06-extensions.ts +99 -0
  1223. package/examples/sdk/07-context-files.ts +47 -0
  1224. package/examples/sdk/08-prompt-templates.ts +51 -0
  1225. package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
  1226. package/examples/sdk/10-settings.ts +53 -0
  1227. package/examples/sdk/11-sessions.ts +52 -0
  1228. package/examples/sdk/12-full-control.ts +77 -0
  1229. package/examples/sdk/13-session-runtime.ts +67 -0
  1230. package/examples/sdk/README.md +144 -0
  1231. package/package.json +94 -19
  1232. package/bin/atomic +0 -82
  1233. /package/{LICENSE → dist/builtin/workflows/LICENSE} +0 -0
@@ -0,0 +1,1217 @@
1
+ /**
2
+ * GraphView — orchestrator overlay rendered as a pi-tui Component.
3
+ *
4
+ * Visual contract (DESIGN.md):
5
+ * - No manual ASCII frame. `pi.ui.custom({ overlay: true })` provides the
6
+ * popup chrome; this renderer paints content on the canvas (`bg`) with
7
+ * full-width chrome rows for the header (top) and hints (bottom).
8
+ * - Section labels use the `▎ LABEL` pattern: mauve glyph + `textMuted`
9
+ * bold caps.
10
+ * - Hints follow `<key> <label>` separated by ` · ` in `dim`, active key
11
+ * letters in `text`, labels in `textMuted`.
12
+ * - No decorative progress bar. Counts live in the header pills.
13
+ *
14
+ * cross-ref:
15
+ * - github.com/flora131/atomic packages/atomic-sdk/src/components/session-graph-panel.tsx
16
+ * - DESIGN.md §4 (Elevation), §5 (Components)
17
+ */
18
+ import type { Component } from "@earendil-works/pi-tui";
19
+ import {
20
+ matchesKey,
21
+ truncateToWidth,
22
+ visibleWidth,
23
+ } from "./text-helpers.js";
24
+ import type { Store } from "../shared/store.js";
25
+ import type {
26
+ PendingPrompt,
27
+ StageSnapshot,
28
+ StoreSnapshot,
29
+ RunSnapshot,
30
+ } from "../shared/store-types.js";
31
+ import type { GraphTheme } from "./graph-theme.js";
32
+ import type { SwitcherState } from "./switcher.js";
33
+ import type { LayoutNode } from "./layout.js";
34
+ import { computeLayout, NODE_W, NODE_H } from "./layout.js";
35
+ import { renderHeader, renderOutlinePill } from "./header.js";
36
+ import { renderNodeCard } from "./node-card.js";
37
+ import { renderSwitcher, filterStages } from "./switcher.js";
38
+ import { renderToasts, createToastManager } from "./toast.js";
39
+ import { hexToAnsi, hexBg, RESET, BOLD } from "./color-utils.js";
40
+ import { fmtDuration, statusIcon, statusColor } from "./status-helpers.js";
41
+ import { GraphCanvas } from "./graph-canvas.js";
42
+ import {
43
+ createPromptCardState,
44
+ defaultResponseFor,
45
+ handlePromptCardInput,
46
+ renderPromptCard,
47
+ type PromptCardState,
48
+ } from "./prompt-card.js";
49
+
50
+ export type GraphViewMode = "overlay" | "widget";
51
+
52
+ export interface GraphViewOpts {
53
+ mode: GraphViewMode;
54
+ runId: string | null;
55
+ store: Store;
56
+ graphTheme: GraphTheme;
57
+ onClose?: () => void;
58
+ /**
59
+ * Invoked when the user presses `q` inside the pane on an in-flight
60
+ * run. Fires immediately (no confirm) per the toggle-driven UX:
61
+ * `h` hides without quitting; `q` is reserved for terminating the
62
+ * current run.
63
+ */
64
+ onKill?: (runId: string) => void;
65
+ /**
66
+ * Invoked when the user presses `h` inside the pane. Hides without
67
+ * unmounting (overlay-adapter calls `setHidden(true)`). Re-open via
68
+ * `F2` or `/workflow connect <id>`.
69
+ */
70
+ onHide?: () => void;
71
+ /**
72
+ * Invoked when the user submits (or skips) a HIL prompt rendered inside
73
+ * the pane. The callback typically calls `store.resolvePendingPrompt`;
74
+ * GraphView itself stays UI-only.
75
+ */
76
+ onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
77
+ /**
78
+ * Invoked when the user presses Enter on a focused graph node — the
79
+ * parent attach shell swaps the popup interior to that stage's chat
80
+ * pane. When unset, Enter is a no-op (preserves graph mode).
81
+ */
82
+ onStageAttach?: (runId: string, stageId: string) => void;
83
+ /**
84
+ * Invoked when the user presses `Ctrl+D` while in graph mode. Mirrors
85
+ * the in-chat back affordance: detaches the whole popup (host calls
86
+ * `setHidden(true)`). Falls back to `onHide` when unset.
87
+ */
88
+ onDetach?: () => void;
89
+ /**
90
+ * When provided, GraphView restores focus to this stage on construction
91
+ * — used by the attach shell so returning from the chat lands the
92
+ * cursor on the same node the user just attached to.
93
+ */
94
+ initialFocusedStageId?: string;
95
+ /**
96
+ * Optional accessor returning the current terminal row count. When
97
+ * present in overlay mode the renderer expands the frame to roughly
98
+ * `viewportRows` lines (clamped to at least the header + statusline
99
+ * budget) so the popup fills the terminal under pi-tui's
100
+ * `width: "100%" / maxHeight: "100%"` geometry. Returning `undefined`
101
+ * falls back to the constant `OVERLAY_LINE_COUNT` rectangle.
102
+ */
103
+ getViewportRows?: () => number | undefined;
104
+ /**
105
+ * Invoked on each animation tick (~10 FPS) so the host can call
106
+ * `tui.requestRender()`. Only wired in `overlay` mode; supplying it
107
+ * starts the tick loop in the constructor so duration counters and
108
+ * the running-stage border pulse refresh without requiring a key
109
+ * press. The host is responsible for gating the underlying
110
+ * `requestRender` on overlay visibility / focus (see
111
+ * `overlay-adapter.ts`).
112
+ */
113
+ requestRender?: () => void;
114
+ }
115
+
116
+ const HINT_KEYS: Array<{ key: string; label: string }> = [
117
+ { key: "↑↓←→", label: "navigate" },
118
+ { key: "↵", label: "attach" },
119
+ { key: "/", label: "stages" },
120
+ { key: "ctrl+d", label: "detach" },
121
+ { key: "q", label: "quit" },
122
+ ];
123
+
124
+ /**
125
+ * Bottom mode pill. The status bar mirrors the top header band: a
126
+ * three-row chrome strip with an outlined pill flush-left and hints
127
+ * flowing right of it on the centre row.
128
+ */
129
+ const MODE_PILL_LABEL = "GRAPH";
130
+
131
+ /**
132
+ * Fixed line count emitted by `_renderOverlay`. pi-tui paints the
133
+ * overlay in the same buffer as the chat, so a *variable* line count
134
+ * causes the chat to scroll every time the focused-stage section grows
135
+ * or shrinks — that's exactly the duplicate-rows bug we hit when
136
+ * navigating with j/k. Padding to a constant height keeps the overlay
137
+ * a stable rectangle that pi-tui can diff cell-by-cell.
138
+ *
139
+ * Mirrors the doom-overlay reference extension, which always emits the
140
+ * same number of lines per frame regardless of game state.
141
+ */
142
+ const OVERLAY_LINE_COUNT = 32;
143
+
144
+ /**
145
+ * Animation tick period. Overlay re-renders fire on this cadence so
146
+ * duration counters (rendered from `Date.now() - stage.startedAt`)
147
+ * tick and the running-stage border lerps between `borderDim` and
148
+ * `warning` without a key press. The host-supplied `requestRender`
149
+ * gate prevents work while the overlay is hidden or unfocused.
150
+ */
151
+ const ANIMATION_TICK_MS = 100;
152
+
153
+ /**
154
+ * Full lerp period of `pulseT` for running-stage borders, in ms.
155
+ * `pulsePhase ∈ [0, 1)` cycles every `PULSE_PERIOD_MS` so the sine
156
+ * eased lerp inside `pickBorder` traces one full breath per cycle.
157
+ */
158
+ const PULSE_PERIOD_MS = 2000;
159
+
160
+ export class GraphView implements Component {
161
+ private mode: GraphViewMode;
162
+ private runId: string | null;
163
+ private store: Store;
164
+ private graphTheme: GraphTheme;
165
+ private onClose?: () => void;
166
+ private onKill?: (runId: string) => void;
167
+ private onHide?: () => void;
168
+ private onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
169
+ private onStageAttach?: (runId: string, stageId: string) => void;
170
+ private onDetach?: () => void;
171
+ private initialFocusedStageId?: string;
172
+ private getViewportRows?: () => number | undefined;
173
+ private requestRender?: () => void;
174
+
175
+ /** Active HIL prompt state, set when `_rebuildLayout` sees a new prompt id. */
176
+ private promptState: PromptCardState | null = null;
177
+
178
+ private focusedIndex = 0;
179
+ private switcherOpen = false;
180
+ private switcherState: SwitcherState = { query: "", selectedIndex: 0 };
181
+ private toastManager = createToastManager();
182
+ private detailsExpanded = true;
183
+ private cachedLayout: LayoutNode[] = [];
184
+ private currentSnapshot: StoreSnapshot | null = null;
185
+
186
+ private _intervalId: ReturnType<typeof setInterval> | null = null;
187
+ private _lastGTime: number | null = null;
188
+ private _unsubscribe: (() => void) | null = null;
189
+
190
+ constructor(opts: GraphViewOpts) {
191
+ this.mode = opts.mode;
192
+ this.runId = opts.runId;
193
+ this.store = opts.store;
194
+ this.graphTheme = opts.graphTheme;
195
+ this.onClose = opts.onClose;
196
+ this.onKill = opts.onKill;
197
+ this.onHide = opts.onHide;
198
+ this.onPromptResolve = opts.onPromptResolve;
199
+ this.onStageAttach = opts.onStageAttach;
200
+ this.onDetach = opts.onDetach;
201
+ this.initialFocusedStageId = opts.initialFocusedStageId;
202
+ this.getViewportRows = opts.getViewportRows;
203
+ this.requestRender = opts.requestRender;
204
+
205
+ this._unsubscribe = this.store.subscribe((snap) => {
206
+ this.currentSnapshot = snap;
207
+ this._rebuildLayout();
208
+ });
209
+ this.currentSnapshot = this.store.snapshot();
210
+ this._rebuildLayout();
211
+
212
+ // Animation tick: while the overlay is mounted, fire a render
213
+ // request every `ANIMATION_TICK_MS` so the duration counter on
214
+ // each running stage advances and the border-pulse lerp animates
215
+ // even when the user isn't pressing keys. Only overlay mode owns
216
+ // visible animations; widget mode renders a single status line
217
+ // that never needs a steady cadence. The host's `requestRender`
218
+ // is responsible for gating on overlay visibility / focus — see
219
+ // `overlay-adapter.ts` and `workflow-attach-pane.ts`. With that
220
+ // gate in place the previous tmux scrollback "ghost overlay"
221
+ // failure mode does not apply: pi-tui owns the screen buffer
222
+ // and diff-blits frames in place.
223
+ if (this.mode === "overlay" && this.requestRender) {
224
+ this._intervalId = setInterval(() => {
225
+ this.requestRender?.();
226
+ }, ANIMATION_TICK_MS);
227
+ }
228
+ }
229
+
230
+ private _rebuildLayout(): void {
231
+ const run = this._getCurrentRun();
232
+ if (!run) {
233
+ this.cachedLayout = [];
234
+ this.promptState = null;
235
+ return;
236
+ }
237
+ this.cachedLayout = computeLayout(run.stages, { orientation: "vertical" });
238
+ // One-shot: if the host passed `initialFocusedStageId`, snap the
239
+ // cursor to that stage now that the layout exists. The attach shell
240
+ // uses this when swapping back from chat mode so the focus lands on
241
+ // the same node the user just attached to.
242
+ if (this.initialFocusedStageId !== undefined) {
243
+ const idx = this.cachedLayout.findIndex(
244
+ (n) => n.stage.id === this.initialFocusedStageId,
245
+ );
246
+ if (idx >= 0) this.focusedIndex = idx;
247
+ this.initialFocusedStageId = undefined;
248
+ }
249
+ this._syncPromptState(run.pendingPrompt);
250
+ }
251
+
252
+ /**
253
+ * Mirror the run's `pendingPrompt` into a UI working state. A new prompt
254
+ * id resets the state (caret + buffer); a cleared prompt drops the state
255
+ * so the card disappears.
256
+ */
257
+ private _syncPromptState(prompt: PendingPrompt | undefined): void {
258
+ if (!prompt) {
259
+ this.promptState = null;
260
+ return;
261
+ }
262
+ if (!this.promptState || this.promptState.prompt.id !== prompt.id) {
263
+ this.promptState = createPromptCardState(prompt);
264
+ }
265
+ }
266
+
267
+ private _getCurrentRun(): RunSnapshot | null {
268
+ if (!this.currentSnapshot) return null;
269
+ // Pin to the first run we see so a completed run stays visible after
270
+ // `activeRunId()` clears. Caller can still pass an explicit runId.
271
+ if (this.runId == null) {
272
+ const activeId = this.store.activeRunId();
273
+ if (activeId != null) {
274
+ this.runId = activeId;
275
+ }
276
+ }
277
+ if (this.runId == null) return null;
278
+ return this.currentSnapshot.runs.find((r) => r.id === this.runId) ?? null;
279
+ }
280
+
281
+ /** Render to string lines. width = terminal columns. */
282
+ render(width: number): string[] {
283
+ if (this.mode === "widget") {
284
+ return this._renderWidget(width);
285
+ }
286
+ return this._renderOverlay(width);
287
+ }
288
+
289
+ private _renderWidget(width: number): string[] {
290
+ const run = this._getCurrentRun();
291
+ if (!run) {
292
+ return [`${hexToAnsi(this.graphTheme.dim)}no active workflow${RESET}`];
293
+ }
294
+ const headerLines = renderHeader(run, { width, theme: this.graphTheme });
295
+ const counts = this._counts(run);
296
+ const trailer =
297
+ `${hexToAnsi(this.graphTheme.dim)}` +
298
+ `${counts.completed}/${run.stages.length} done` +
299
+ (counts.running > 0 ? ` · ${counts.running} running` : "") +
300
+ (counts.failed > 0 ? ` · ${counts.failed} failed` : "") +
301
+ (counts.blocked > 0 ? ` · ${counts.blocked} blocked` : "") +
302
+ RESET;
303
+ return [...headerLines, ` ${trailer}`];
304
+ }
305
+
306
+ /**
307
+ * Number of rows the overlay frame must paint. Pi-tui anchors the
308
+ * overlay vertically by counting rendered lines, so to truly fill the
309
+ * terminal under `maxHeight: "100%"` the component must emit
310
+ * approximately `terminal.rows` lines. We clamp to at least
311
+ * `OVERLAY_LINE_COUNT` so a tiny terminal or a host that doesn't
312
+ * surface terminal dimensions keeps the previous stable rectangle.
313
+ */
314
+ private _overlayLineCount(): number {
315
+ const reported = this.getViewportRows?.();
316
+ if (typeof reported !== "number" || !Number.isFinite(reported)) {
317
+ return OVERLAY_LINE_COUNT;
318
+ }
319
+ // Header (3) + statusline (3) is the absolute minimum; anything
320
+ // smaller would underflow the body band.
321
+ return Math.max(OVERLAY_LINE_COUNT, Math.floor(reported));
322
+ }
323
+
324
+ /** Rows available for the graph body (between header and statusline). */
325
+ private _overlayBodyRows(lineCount: number): number {
326
+ return Math.max(1, lineCount - 3 /* header */ - 3 /* statusline */);
327
+ }
328
+
329
+ private _renderOverlay(width: number): string[] {
330
+ const frameWidth = Math.max(40, width);
331
+ const lines: string[] = [];
332
+ const run = this._getCurrentRun();
333
+
334
+ if (!run) {
335
+ return this._renderEmptyState(frameWidth);
336
+ }
337
+
338
+ // 1. Header chrome (3 rows: outline pill + session name + counts).
339
+ lines.push(
340
+ ...renderHeader(run, { width: frameWidth, theme: this.graphTheme }),
341
+ );
342
+
343
+ // 2. Graph occupies the full body. No section labels, no focused-
344
+ // stage panel — status colour on each card carries that signal.
345
+ const graphLines = this._renderGraph(frameWidth);
346
+ const bodyTarget = this._overlayBodyRows(this._overlayLineCount());
347
+ // Vertically centre the graph in the body band.
348
+ const topPad = Math.max(
349
+ 0,
350
+ Math.floor((bodyTarget - graphLines.length) / 2),
351
+ );
352
+ for (let i = 0; i < topPad; i++) lines.push(this._blankRow(frameWidth));
353
+ for (const line of graphLines) {
354
+ lines.push(this._canvasRow(line, frameWidth));
355
+ }
356
+ while (lines.length < 3 + bodyTarget)
357
+ lines.push(this._blankRow(frameWidth));
358
+ if (lines.length > 3 + bodyTarget) lines.length = 3 + bodyTarget;
359
+
360
+ // 3. Switcher overlay — floats over the body when open.
361
+ if (this.switcherOpen) {
362
+ const switcherWidth = Math.min(56, frameWidth - 4);
363
+ const switcherLines = renderSwitcher(run.stages, this.switcherState, {
364
+ width: switcherWidth,
365
+ theme: this.graphTheme,
366
+ });
367
+ const insertAt = 4; // beneath the header chrome band
368
+ for (let i = 0; i < switcherLines.length; i++) {
369
+ const lineIdx = insertAt + i;
370
+ const padded = this._padCanvas(switcherLines[i]!, frameWidth);
371
+ if (lineIdx < lines.length) lines[lineIdx] = padded;
372
+ else lines.push(padded);
373
+ }
374
+ }
375
+
376
+ // 4. Pending HIL prompt — floats over the graph body, centred. The
377
+ // chat editor remains free regardless: the overlay is the only
378
+ // surface that interacts with the prompt.
379
+ if (this.promptState) {
380
+ const cardWidth = Math.min(72, Math.max(40, frameWidth - 6));
381
+ const cardLines = renderPromptCard({
382
+ state: this.promptState,
383
+ theme: this.graphTheme,
384
+ width: cardWidth,
385
+ cursorOn: ((Date.now() / 530) | 0) % 2 === 0,
386
+ });
387
+ const bodyStart = 3;
388
+ const bodyEnd = 3 + bodyTarget;
389
+ const slot = Math.max(
390
+ bodyStart,
391
+ bodyStart + Math.floor((bodyTarget - cardLines.length) / 2),
392
+ );
393
+ const leftPad = Math.max(0, Math.floor((frameWidth - cardWidth) / 2));
394
+ for (let i = 0; i < cardLines.length; i++) {
395
+ const lineIdx = slot + i;
396
+ if (lineIdx >= bodyEnd) break;
397
+ const base = lines[lineIdx] ?? this._blankRow(frameWidth);
398
+ lines[lineIdx] = this._overlayCard(base, cardLines[i]!, leftPad, frameWidth);
399
+ }
400
+ }
401
+
402
+ // 4. Toast overlay — top-right of header band.
403
+ const toastLines = renderToasts(this.toastManager.active(), {
404
+ theme: this.graphTheme,
405
+ });
406
+ if (toastLines.length > 0) {
407
+ for (let i = 0; i < toastLines.length && i < lines.length; i++) {
408
+ const existing = lines[i] ?? "";
409
+ const merged = `${existing} ${toastLines[i]}`;
410
+ lines[i] = truncateToWidth(merged, frameWidth, "", true);
411
+ }
412
+ }
413
+
414
+ // 5. Three-row statusline pinned to the bottom.
415
+ lines.push(...this._renderStatusline(frameWidth));
416
+
417
+ return lines;
418
+ }
419
+
420
+ private _renderEmptyState(width: number): string[] {
421
+ const t = this.graphTheme;
422
+ const muted = hexToAnsi(t.textMuted);
423
+ const dim = hexToAnsi(t.dim);
424
+ const accent = hexToAnsi(t.accent);
425
+ const chromeBg = hexBg(t.backgroundPanel);
426
+
427
+ const {
428
+ top,
429
+ mid,
430
+ bot,
431
+ visibleWidth: pillW,
432
+ } = renderOutlinePill("ORCHESTRATOR", t.accent, chromeBg);
433
+ const idleLabel = ` ${muted}idle${RESET}`;
434
+ const fillerVisible = Math.max(0, width - 1 - pillW - 6 /* " idle" */ - 2);
435
+ const filler = " ".repeat(fillerVisible);
436
+ const lines: string[] = [
437
+ `${chromeBg} ${RESET}${top}${chromeBg}${" ".repeat(6 + fillerVisible)}${" ".repeat(2)}${RESET}`,
438
+ `${chromeBg} ${RESET}${mid}${chromeBg}${idleLabel}${filler}${" ".repeat(2)}${RESET}`,
439
+ `${chromeBg} ${RESET}${bot}${chromeBg}${" ".repeat(6 + fillerVisible)}${" ".repeat(2)}${RESET}`,
440
+ ];
441
+ const bodyTarget = this._overlayBodyRows(this._overlayLineCount());
442
+ const body: string[] = [
443
+ this._canvasRow(` ${muted}No active workflow run.${RESET}`, width),
444
+ this._canvasRow(
445
+ ` ${dim}Start one with ${accent}/workflow <name>${RESET}${dim} or press ${accent}F2${RESET}${dim} on an active run.${RESET}`,
446
+ width,
447
+ ),
448
+ ];
449
+ const topPad = Math.max(0, Math.floor((bodyTarget - body.length) / 2));
450
+ for (let i = 0; i < topPad; i++) lines.push(this._blankRow(width));
451
+ for (const l of body) lines.push(l);
452
+ while (lines.length < 3 + bodyTarget) lines.push(this._blankRow(width));
453
+ lines.push(...this._renderStatusline(width));
454
+ return lines;
455
+ }
456
+
457
+ private _renderGraph(width: number): string[] {
458
+ const run = this._getCurrentRun();
459
+ if (!run || this.cachedLayout.length === 0) {
460
+ const dim = hexToAnsi(this.graphTheme.dim);
461
+ return [` ${dim}waiting for stage events…${RESET}`];
462
+ }
463
+
464
+ const graphInner = Math.max(1, width - 4);
465
+ const canvasWidth = this.cachedLayout.reduce(
466
+ (max, node) => Math.max(max, node.x + NODE_W),
467
+ 0,
468
+ );
469
+ if (canvasWidth > graphInner || this.cachedLayout.length > 12) {
470
+ return this._renderCompactGraph(run.stages, graphInner);
471
+ }
472
+
473
+ // Centre the whole graph horizontally in the available canvas.
474
+ const leftMargin = Math.max(2, Math.floor((graphInner - canvasWidth) / 2));
475
+
476
+ // Pulse phase ∈ [0, 1) derived from wall-clock time so cards lerp
477
+ // their border colour on the same beat regardless of how often
478
+ // render() fires. The animation tick (`ANIMATION_TICK_MS`) only
479
+ // controls render cadence — it does not advance the phase.
480
+ const pulsePhase = (Date.now() % PULSE_PERIOD_MS) / PULSE_PERIOD_MS;
481
+
482
+ // 1. Plot parent → child edges into a sparse char canvas so they
483
+ // survive crisp through column gaps. Node-card bodies overwrite
484
+ // edge cells per-row when we compose the final output below.
485
+ const edgeCanvas = new GraphCanvas();
486
+ const edgeColor = this.graphTheme.borderDim;
487
+ const nodeByStageId = new Map(
488
+ this.cachedLayout.map((n) => [n.stage.id, n]),
489
+ );
490
+ for (const node of this.cachedLayout) {
491
+ for (const parentId of node.stage.parentIds) {
492
+ const parent = nodeByStageId.get(parentId);
493
+ if (!parent) continue;
494
+ this._plotEdge(
495
+ edgeCanvas,
496
+ parent.x,
497
+ parent.y,
498
+ node.x,
499
+ node.y,
500
+ edgeColor,
501
+ );
502
+ }
503
+ }
504
+ const edgeLines = edgeCanvas.toLines();
505
+
506
+ // 2. Render each node card and record its row span / start column.
507
+ interface Placement {
508
+ startCol: number;
509
+ width: number;
510
+ line: string;
511
+ }
512
+ const placements: Map<number, Placement[]> = new Map();
513
+ for (let ni = 0; ni < this.cachedLayout.length; ni++) {
514
+ const node = this.cachedLayout[ni]!;
515
+ const focused = ni === this.focusedIndex;
516
+ const cardLines = renderNodeCard(node.stage, {
517
+ width: NODE_W,
518
+ height: NODE_H,
519
+ focused,
520
+ pulsePhase,
521
+ theme: this.graphTheme,
522
+ stages: run.stages,
523
+ });
524
+ for (let li = 0; li < cardLines.length; li++) {
525
+ const rowIdx = node.y + li;
526
+ let bucket = placements.get(rowIdx);
527
+ if (!bucket) {
528
+ bucket = [];
529
+ placements.set(rowIdx, bucket);
530
+ }
531
+ bucket.push({ startCol: node.x, width: NODE_W, line: cardLines[li]! });
532
+ }
533
+ }
534
+
535
+ // 3. Compose each output row by interleaving edge segments with the
536
+ // card placements at their assigned columns.
537
+ const totalRows = Math.max(
538
+ edgeLines.length,
539
+ ...this.cachedLayout.map((n) => n.y + NODE_H),
540
+ );
541
+ const composed: string[] = [];
542
+ for (let rowIdx = 0; rowIdx < totalRows; rowIdx++) {
543
+ const edgeRowChars = this._edgeRowToCells(edgeLines[rowIdx] ?? "");
544
+ const cards = placements.get(rowIdx) ?? [];
545
+ composed.push(this._composeRow(edgeRowChars, cards, edgeColor));
546
+ }
547
+
548
+ // Pad each row out to the full overlay width with the body bg so
549
+ // nothing leaks through to the terminal default — cards/edges only
550
+ // paint the cells they occupy; everywhere else needs explicit bg.
551
+ const bg = hexBg(this.graphTheme.bg);
552
+ const leftPad = `${bg}${" ".repeat(leftMargin)}${RESET}`;
553
+ return composed.map((line) => {
554
+ const inner = this._padCanvas(line, width - leftMargin);
555
+ return `${leftPad}${inner}`;
556
+ });
557
+ }
558
+
559
+ /**
560
+ * Plot a parent → child edge for the vertical orientation. The edge
561
+ * exits from the parent's bottom-centre, runs through a horizontal
562
+ * spine half-way down the gap, and re-enters from the child's
563
+ * top-centre. Corners at the spine are upgraded to T-junctions when
564
+ * a second edge crosses the same cell so fan-out and fan-in render
565
+ * cleanly as a single rule with stubs.
566
+ */
567
+ private _plotEdge(
568
+ canvas: GraphCanvas,
569
+ px: number,
570
+ py: number,
571
+ cx: number,
572
+ cy: number,
573
+ color: string,
574
+ ): void {
575
+ const parentCol = px + Math.floor(NODE_W / 2);
576
+ const childCol = cx + Math.floor(NODE_W / 2);
577
+ const parentExitRow = py + NODE_H; // first row below parent's bottom border
578
+ const childEntryRow = cy - 1; // last row above child's top border
579
+ if (childEntryRow < parentExitRow) return;
580
+
581
+ if (parentCol === childCol) {
582
+ canvas.vline(parentCol, parentExitRow, childEntryRow, color);
583
+ return;
584
+ }
585
+
586
+ const spineRow = Math.max(
587
+ parentExitRow,
588
+ Math.min(childEntryRow, Math.floor((parentExitRow + childEntryRow) / 2)),
589
+ );
590
+
591
+ // Down stub from parent into the spine row — only when there's
592
+ // a non-zero gap, otherwise vline would paint the spineRow corner
593
+ // cell before we get to set it.
594
+ if (spineRow > parentExitRow) {
595
+ canvas.vline(parentCol, parentExitRow, spineRow - 1, color);
596
+ }
597
+ // Corner where the parent stub meets the spine. Upgrade to a
598
+ // T-down (`┬`) when another edge has already crossed this cell.
599
+ this._placeCornerOrTee(
600
+ canvas,
601
+ spineRow,
602
+ parentCol,
603
+ childCol > parentCol ? "╰" : "╯",
604
+ color,
605
+ );
606
+ // Horizontal spine segment.
607
+ const hloCol = Math.min(parentCol, childCol) + 1;
608
+ const hhiCol = Math.max(parentCol, childCol) - 1;
609
+ if (hhiCol >= hloCol) {
610
+ canvas.hline(spineRow, hloCol, hhiCol, color);
611
+ }
612
+ // Corner where the spine drops into the child stub.
613
+ this._placeCornerOrTee(
614
+ canvas,
615
+ spineRow,
616
+ childCol,
617
+ childCol > parentCol ? "╮" : "╭",
618
+ color,
619
+ );
620
+ // Down stub from spine into child — same zero-gap guard.
621
+ if (childEntryRow > spineRow) {
622
+ canvas.vline(childCol, spineRow + 1, childEntryRow, color);
623
+ }
624
+ }
625
+
626
+ /**
627
+ * Place a corner glyph at `(row, col)`. When the target cell already
628
+ * holds a glyph from a previous edge, upgrade to the correct
629
+ * box-drawing junction so fan-out / fan-in points read as a single
630
+ * rule rather than two stacked corners.
631
+ *
632
+ * Junction table (existing ⊕ new → result):
633
+ * | ⊕ ╰ → ├ | ⊕ ╮ → ┤ | ⊕ ╯ → ┤ | ⊕ ╭ → ├
634
+ * ─ ⊕ ╭ → ┬ ─ ⊕ ╮ → ┬ ─ ⊕ ╰ → ┴ ─ ⊕ ╯ → ┴
635
+ * ╰ ⊕ ╮ → ┴ ╭ ⊕ ╯ → ┴ ╭ ⊕ ╮ → ┬ etc.
636
+ *
637
+ * The full table is small; we collapse it to: "existing-direction-set
638
+ * ∪ new-direction-set → best matching junction".
639
+ */
640
+ private _placeCornerOrTee(
641
+ canvas: GraphCanvas,
642
+ row: number,
643
+ col: number,
644
+ corner: string,
645
+ color: string,
646
+ ): void {
647
+ const existing = (
648
+ canvas as unknown as { rows: Map<number, Map<number, { ch: string }>> }
649
+ ).rows
650
+ .get(row)
651
+ ?.get(col)?.ch;
652
+ if (existing == null || existing === corner) {
653
+ canvas.setCell(row, col, corner, color);
654
+ return;
655
+ }
656
+ const dirs = (ch: string): Set<"u" | "d" | "l" | "r"> => {
657
+ switch (ch) {
658
+ case "│":
659
+ return new Set(["u", "d"]);
660
+ case "─":
661
+ return new Set(["l", "r"]);
662
+ case "╭":
663
+ return new Set(["d", "r"]);
664
+ case "╮":
665
+ return new Set(["d", "l"]);
666
+ case "╰":
667
+ return new Set(["u", "r"]);
668
+ case "╯":
669
+ return new Set(["u", "l"]);
670
+ case "├":
671
+ return new Set(["u", "d", "r"]);
672
+ case "┤":
673
+ return new Set(["u", "d", "l"]);
674
+ case "┬":
675
+ return new Set(["d", "l", "r"]);
676
+ case "┴":
677
+ return new Set(["u", "l", "r"]);
678
+ case "┼":
679
+ return new Set(["u", "d", "l", "r"]);
680
+ default:
681
+ return new Set();
682
+ }
683
+ };
684
+ const merged = new Set<"u" | "d" | "l" | "r">([
685
+ ...dirs(existing),
686
+ ...dirs(corner),
687
+ ]);
688
+ const has = (...want: Array<"u" | "d" | "l" | "r">) =>
689
+ want.every((d) => merged.has(d));
690
+ let glyph = corner;
691
+ if (has("u", "d", "l", "r")) glyph = "┼";
692
+ else if (has("u", "d", "r")) glyph = "├";
693
+ else if (has("u", "d", "l")) glyph = "┤";
694
+ else if (has("d", "l", "r")) glyph = "┬";
695
+ else if (has("u", "l", "r")) glyph = "┴";
696
+ canvas.setCell(row, col, glyph, color);
697
+ }
698
+
699
+ /**
700
+ * Split the canvas-rendered edge row at card boundaries into spans of
701
+ * `{ startCol, visibleWidth, content }` so the composer can interleave
702
+ * cards without colliding.
703
+ */
704
+ private _edgeRowToCells(line: string): string {
705
+ return line;
706
+ }
707
+
708
+ /**
709
+ * Interleave a single edge row with the node cards that cross it.
710
+ * Cards take precedence at their column ranges; edge characters fill
711
+ * the gaps. Returns one composed line padded with spaces.
712
+ */
713
+ private _composeRow(
714
+ edgeRow: string,
715
+ cards: Array<{ startCol: number; width: number; line: string }>,
716
+ _edgeColor: string,
717
+ ): string {
718
+ const bg = hexBg(this.graphTheme.bg);
719
+ const sorted = cards.slice().sort((a, b) => a.startCol - b.startCol);
720
+ const edgeVisible = this._splitVisible(edgeRow);
721
+ let cursor = 0;
722
+ let out = "";
723
+ for (const card of sorted) {
724
+ if (card.startCol > cursor) {
725
+ // Edge segment up to card start — prepend bg so empty cells
726
+ // in this stretch keep the body bg instead of falling back
727
+ // to the terminal default once any prior RESET fired.
728
+ out += `${bg}${this._sliceVisible(edgeVisible, cursor, card.startCol)}`;
729
+ cursor = card.startCol;
730
+ }
731
+ out += card.line;
732
+ cursor += card.width;
733
+ }
734
+ // Trailing edge tail — same bg re-priming.
735
+ out += `${bg}${this._sliceVisible(edgeVisible, cursor, edgeVisible.length)}`;
736
+ return out;
737
+ }
738
+
739
+ /**
740
+ * Split a styled ANSI string into per-cell entries, each carrying the
741
+ * style prefix that should apply when rendering that cell. Used by
742
+ * `_sliceVisible` so we can cut the edge line at arbitrary columns
743
+ * without breaking ANSI sequences.
744
+ */
745
+ private _splitVisible(line: string): Array<{ prefix: string; ch: string }> {
746
+ const cells: Array<{ prefix: string; ch: string }> = [];
747
+ let i = 0;
748
+ let pending = "";
749
+ while (i < line.length) {
750
+ const ch = line[i]!;
751
+ if (ch === "\x1b" && line[i + 1] === "[") {
752
+ const end = line.indexOf("m", i);
753
+ if (end === -1) break;
754
+ pending += line.slice(i, end + 1);
755
+ i = end + 1;
756
+ continue;
757
+ }
758
+ cells.push({ prefix: pending, ch });
759
+ pending = "";
760
+ i += 1;
761
+ }
762
+ return cells;
763
+ }
764
+
765
+ private _sliceVisible(
766
+ cells: Array<{ prefix: string; ch: string }>,
767
+ fromCol: number,
768
+ toCol: number,
769
+ ): string {
770
+ if (fromCol >= toCol) return "";
771
+ let out = "";
772
+ let lastPrefix = "";
773
+ for (let c = fromCol; c < toCol; c++) {
774
+ const cell = cells[c];
775
+ if (cell) {
776
+ if (cell.prefix && cell.prefix !== lastPrefix) {
777
+ out += cell.prefix;
778
+ lastPrefix = cell.prefix;
779
+ }
780
+ out += cell.ch;
781
+ } else {
782
+ if (lastPrefix !== "") {
783
+ out += RESET;
784
+ lastPrefix = "";
785
+ }
786
+ out += " ";
787
+ }
788
+ }
789
+ if (lastPrefix !== "") out += RESET;
790
+ return out;
791
+ }
792
+
793
+ private _renderCompactGraph(
794
+ stages: readonly StageSnapshot[],
795
+ width: number,
796
+ ): string[] {
797
+ const t = this.graphTheme;
798
+ const dim = hexToAnsi(t.dim);
799
+ const muted = hexToAnsi(t.textMuted);
800
+ const accent = hexToAnsi(t.accent);
801
+ const byId = new Map(stages.map((stage) => [stage.id, stage]));
802
+
803
+ const lines: string[] = [];
804
+ for (let i = 0; i < this.cachedLayout.length; i++) {
805
+ const node = this.cachedLayout[i]!;
806
+ const stage = node.stage;
807
+ const focused = i === this.focusedIndex;
808
+ const parents = stage.parentIds
809
+ .map((id) => byId.get(id)?.name ?? id)
810
+ .filter((name) => name.length > 0);
811
+ const parentLabel = parents.length > 0 ? ` ← ${parents.join(", ")}` : "";
812
+ const blockedBy = stage.blockedByStageId
813
+ ? (byId.get(stage.blockedByStageId)?.name ?? stage.blockedByStageId)
814
+ : "";
815
+ const blockedLabel = blockedBy ? ` · blocked by ${blockedBy}` : "";
816
+ const dur = this._duration(stage);
817
+ const cursor = focused ? `${accent}❯${RESET}` : ` `;
818
+ const sc = hexToAnsi(statusColor(stage.status, t));
819
+ const nameStyled = focused
820
+ ? `${accent}${BOLD}${stage.name}${RESET}`
821
+ : `${hexToAnsi(t.text)}${stage.name}${RESET}`;
822
+ const meta = `${dim}${stage.status}${dur ? ` · ${dur}` : ""}${blockedLabel}${parentLabel}${RESET}`;
823
+ const line = ` ${cursor} ${sc}${statusIcon(stage.status)}${RESET} ${nameStyled} ${meta}`;
824
+ lines.push(truncateToWidth(line, width, "…", true));
825
+ }
826
+ if (lines.length === 0) {
827
+ lines.push(` ${muted}(no stages)${RESET}`);
828
+ }
829
+ return lines;
830
+ }
831
+
832
+ // -------------------------------------------------------------------------
833
+ // Chrome / canvas / section helpers
834
+ // -------------------------------------------------------------------------
835
+
836
+ /**
837
+ * Three-row statusline pinned to the bottom of the overlay. Mirrors
838
+ * the header band: `backgroundPanel` chrome, outlined accent pill
839
+ * flush-left, hints flowing right on the centre row.
840
+ */
841
+ private _renderStatusline(width: number): string[] {
842
+ const t = this.graphTheme;
843
+ const chromeBg = hexBg(t.backgroundPanel);
844
+ const text = hexToAnsi(t.text);
845
+ const muted = hexToAnsi(t.textMuted);
846
+ const dim = hexToAnsi(t.dim);
847
+
848
+ const {
849
+ top,
850
+ mid,
851
+ bot,
852
+ visibleWidth: pillW,
853
+ } = renderOutlinePill(MODE_PILL_LABEL, t.accent, chromeBg);
854
+
855
+ // Hints — `<key> <label>` separated by ` · `.
856
+ const sep = `${chromeBg} ${dim}·${RESET}${chromeBg} `;
857
+ const segments = HINT_KEYS.map(
858
+ ({ key, label }) =>
859
+ `${text}${BOLD}${key}${RESET}${chromeBg} ${muted}${label}${RESET}${chromeBg}`,
860
+ );
861
+ const hintsStyled = segments.join(sep);
862
+ const hintsVisibleLen =
863
+ HINT_KEYS.reduce((sum, h) => sum + h.key.length + 1 + h.label.length, 0) +
864
+ (HINT_KEYS.length - 1) * 5; // " · "
865
+
866
+ const leftEdgePad = 1;
867
+ const rightEdgePad = 2;
868
+ const fillerVisible = Math.max(
869
+ 2,
870
+ width - leftEdgePad - pillW - hintsVisibleLen - rightEdgePad,
871
+ );
872
+ const filler = " ".repeat(fillerVisible);
873
+ const blankAcross = " ".repeat(
874
+ fillerVisible + hintsVisibleLen + rightEdgePad,
875
+ );
876
+
877
+ return [
878
+ `${chromeBg} ${RESET}${top}${chromeBg}${blankAcross}${RESET}`,
879
+ `${chromeBg} ${RESET}${mid}${chromeBg}${filler}${hintsStyled}${chromeBg}${" ".repeat(rightEdgePad)}${RESET}`,
880
+ `${chromeBg} ${RESET}${bot}${chromeBg}${blankAcross}${RESET}`,
881
+ ];
882
+ }
883
+
884
+ /** Blank canvas row — single line of `bg`. */
885
+ private _blankRow(width: number): string {
886
+ return `${hexBg(this.graphTheme.bg)}${" ".repeat(width)}${RESET}`;
887
+ }
888
+
889
+ /** Wrap content in a canvas-bg row, padded to `width`. Re-emits the
890
+ * bg ANSI right before the trailing fill so any internal `RESET`
891
+ * from cards/edges doesn't let the terminal default bleed through. */
892
+ private _canvasRow(content: string, width: number): string {
893
+ const bg = hexBg(this.graphTheme.bg);
894
+ const truncated = truncateToWidth(content, width, "…", true);
895
+ const padLen = Math.max(0, width - visibleWidth(truncated));
896
+ return `${bg}${truncated}${bg}${" ".repeat(padLen)}${RESET}`;
897
+ }
898
+
899
+ /** Pad pre-styled content out to canvas width without truncation.
900
+ * Re-emits the body bg ANSI right before the trailing fill so any
901
+ * internal RESET inside `content` doesn't leak the terminal default. */
902
+ private _padCanvas(content: string, width: number): string {
903
+ const bg = hexBg(this.graphTheme.bg);
904
+ const padLen = Math.max(0, width - visibleWidth(content));
905
+ return `${bg}${content}${bg}${" ".repeat(padLen)}${RESET}`;
906
+ }
907
+
908
+ /**
909
+ * Compose a pre-styled card line over a canvas row at `leftPad` columns.
910
+ * The base row keeps its `bg` (so background colour matches canvas);
911
+ * the card slice replaces the cells starting at `leftPad`, and the
912
+ * residual columns to the right are repainted with bg.
913
+ *
914
+ * We don't try to keep the parts of `base` that fall *under* the card
915
+ * — pi-tui paints flat lines, not z-buffered cells, so the card's panel
916
+ * background winning is fine.
917
+ */
918
+ private _overlayCard(
919
+ _base: string,
920
+ cardLine: string,
921
+ leftPad: number,
922
+ totalWidth: number,
923
+ ): string {
924
+ const bg = hexBg(this.graphTheme.bg);
925
+ const cardW = visibleWidth(cardLine);
926
+ const rightPadLen = Math.max(0, totalWidth - leftPad - cardW);
927
+ return `${bg}${" ".repeat(leftPad)}${RESET}${cardLine}${bg}${" ".repeat(rightPadLen)}${RESET}`;
928
+ }
929
+
930
+ private _duration(stage: StageSnapshot): string {
931
+ if (stage.durationMs != null) return fmtDuration(stage.durationMs);
932
+ if (stage.startedAt != null)
933
+ return fmtDuration(Date.now() - stage.startedAt);
934
+ return "";
935
+ }
936
+
937
+ private _counts(run: RunSnapshot): {
938
+ pending: number;
939
+ running: number;
940
+ awaiting_input: number;
941
+ paused: number;
942
+ blocked: number;
943
+ completed: number;
944
+ failed: number;
945
+ } {
946
+ const c = {
947
+ pending: 0,
948
+ running: 0,
949
+ awaiting_input: 0,
950
+ paused: 0,
951
+ blocked: 0,
952
+ completed: 0,
953
+ failed: 0,
954
+ };
955
+ for (const s of run.stages) c[s.status]++;
956
+ return c;
957
+ }
958
+
959
+ // -------------------------------------------------------------------------
960
+ // Input handling
961
+ // -------------------------------------------------------------------------
962
+
963
+ /** Returns true if consumed. */
964
+ handleInput(data: string): boolean {
965
+ // Pending HIL prompt owns input — once a prompt is active, every key
966
+ // routes to it until the user submits or skips. This is what keeps
967
+ // the chat editor free: the workflow author called ctx.ui.editor()
968
+ // long ago in a background promise; only the overlay handles the
969
+ // response. The graph nav resumes after `_resolvePrompt` clears
970
+ // `promptState` (mirrored from the store via `_syncPromptState`).
971
+ if (this.promptState) {
972
+ return this._handlePromptInput(data);
973
+ }
974
+ if (this.switcherOpen) {
975
+ return this._handleSwitcherInput(data);
976
+ }
977
+ return this._handleGraphInput(data);
978
+ }
979
+
980
+ private _handlePromptInput(data: string): boolean {
981
+ const state = this.promptState;
982
+ if (!state) return false;
983
+ const action = handlePromptCardInput(data, state);
984
+ if (action.kind === "noop") return true;
985
+ const runId = this.runId;
986
+ if (!runId) return true;
987
+ const response =
988
+ action.kind === "cancel" ? defaultResponseFor(state.prompt) : action.response;
989
+ this._resolvePrompt(runId, state.prompt.id, response);
990
+ return true;
991
+ }
992
+
993
+ private _resolvePrompt(runId: string, promptId: string, response: unknown): void {
994
+ // Clear local state immediately so the card disappears even if the
995
+ // host doesn't re-emit a store snapshot between resolve and render.
996
+ this.promptState = null;
997
+ if (this.onPromptResolve) {
998
+ this.onPromptResolve(runId, promptId, response);
999
+ return;
1000
+ }
1001
+ // Fallback path used by callers that wire GraphView directly without
1002
+ // injecting onPromptResolve. Best-effort — if the store rejects (stale
1003
+ // id) we already cleared local state, so we don't try to re-arm.
1004
+ this.store.resolvePendingPrompt(runId, promptId, response);
1005
+ }
1006
+
1007
+ private _handleGraphInput(data: string): boolean {
1008
+ const stageCount = this.cachedLayout.length;
1009
+
1010
+ // Vertical-graph navigation: up/down step between depth levels
1011
+ // (col), left/right step between siblings at the same depth (row).
1012
+ // j/k preserved as a flat-order fallback for muscle memory.
1013
+ if (matchesKey(data, "down") || data === "\x1b[B")
1014
+ return this._moveByDepth(+1);
1015
+ if (matchesKey(data, "up") || data === "\x1b[A")
1016
+ return this._moveByDepth(-1);
1017
+ if (matchesKey(data, "right") || data === "\x1b[C")
1018
+ return this._moveBySibling(+1);
1019
+ if (matchesKey(data, "left") || data === "\x1b[D")
1020
+ return this._moveBySibling(-1);
1021
+ if (matchesKey(data, "j")) {
1022
+ this.focusedIndex = Math.min(this.focusedIndex + 1, stageCount - 1);
1023
+ return true;
1024
+ }
1025
+ if (matchesKey(data, "k")) {
1026
+ this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
1027
+ return true;
1028
+ }
1029
+ if (matchesKey(data, "g")) {
1030
+ const now = Date.now();
1031
+ if (this._lastGTime != null && now - this._lastGTime < 500) {
1032
+ this.focusedIndex = 0;
1033
+ this._lastGTime = null;
1034
+ } else {
1035
+ this._lastGTime = now;
1036
+ }
1037
+ return true;
1038
+ }
1039
+ if (data === "/") {
1040
+ this.switcherOpen = true;
1041
+ this.switcherState = { query: "", selectedIndex: 0 };
1042
+ return true;
1043
+ }
1044
+ if (matchesKey(data, "enter") || data === "\r" || data === "\n") {
1045
+ // Enter attaches the popup interior to the focused stage. The
1046
+ // attach shell swaps in the stage-chat view without remounting
1047
+ // the overlay; without a callback, fall back to the legacy
1048
+ // expand/collapse toggle so non-attach hosts still work.
1049
+ if (this.onStageAttach) {
1050
+ const node = this.cachedLayout[this.focusedIndex];
1051
+ const run = this._getCurrentRun();
1052
+ if (node && run) {
1053
+ this.onStageAttach(run.id, node.stage.id);
1054
+ return true;
1055
+ }
1056
+ }
1057
+ this.detailsExpanded = !this.detailsExpanded;
1058
+ return true;
1059
+ }
1060
+ // `ctrl+d` detaches the whole popup (host hides the overlay). This
1061
+ // is the graph-mode counterpart of the in-chat back affordance.
1062
+ if (data === "\x04") {
1063
+ if (this.onDetach) {
1064
+ this.onDetach();
1065
+ } else if (this.onHide) {
1066
+ this.onHide();
1067
+ }
1068
+ return true;
1069
+ }
1070
+ // `q` kills the active run (no confirm). `h` hides the pane via
1071
+ // the overlay's setHidden() flag (not unmount); Escape closes.
1072
+ if (matchesKey(data, "q")) {
1073
+ const run = this._getCurrentRun();
1074
+ if (run && run.endedAt === undefined && this.onKill) {
1075
+ this.onKill(run.id);
1076
+ }
1077
+ this.onClose?.();
1078
+ return true;
1079
+ }
1080
+ if (matchesKey(data, "h") && this.onHide) {
1081
+ this.onHide();
1082
+ return true;
1083
+ }
1084
+ if (matchesKey(data, "escape") || data === "\x1b") {
1085
+ this.onClose?.();
1086
+ return true;
1087
+ }
1088
+ return false;
1089
+ }
1090
+
1091
+ private _handleSwitcherInput(data: string): boolean {
1092
+ const run = this._getCurrentRun();
1093
+ const stages = run?.stages ?? [];
1094
+
1095
+ if (matchesKey(data, "escape") || data === "\x1b") {
1096
+ this.switcherOpen = false;
1097
+ return true;
1098
+ }
1099
+ if (matchesKey(data, "enter") || data === "\r" || data === "\n") {
1100
+ const filtered = filterStages(stages, this.switcherState.query);
1101
+ const selected = filtered[this.switcherState.selectedIndex];
1102
+ if (selected) {
1103
+ const idx = this.cachedLayout.findIndex(
1104
+ (n) => n.stage.id === selected.id,
1105
+ );
1106
+ if (idx !== -1) this.focusedIndex = idx;
1107
+ }
1108
+ this.switcherOpen = false;
1109
+ return true;
1110
+ }
1111
+ if (matchesKey(data, "down") || data === "\x1b[B") {
1112
+ const filtered = filterStages(stages, this.switcherState.query);
1113
+ this.switcherState = {
1114
+ ...this.switcherState,
1115
+ selectedIndex: Math.min(
1116
+ this.switcherState.selectedIndex + 1,
1117
+ filtered.length - 1,
1118
+ ),
1119
+ };
1120
+ return true;
1121
+ }
1122
+ if (matchesKey(data, "up") || data === "\x1b[A") {
1123
+ this.switcherState = {
1124
+ ...this.switcherState,
1125
+ selectedIndex: Math.max(this.switcherState.selectedIndex - 1, 0),
1126
+ };
1127
+ return true;
1128
+ }
1129
+ if (data === "\x7f" || data === "\b") {
1130
+ this.switcherState = {
1131
+ query: this.switcherState.query.slice(0, -1),
1132
+ selectedIndex: 0,
1133
+ };
1134
+ return true;
1135
+ }
1136
+ if (data.length === 1 && data >= " ") {
1137
+ this.switcherState = {
1138
+ query: this.switcherState.query + data,
1139
+ selectedIndex: 0,
1140
+ };
1141
+ return true;
1142
+ }
1143
+ return false;
1144
+ }
1145
+
1146
+ dispose(): void {
1147
+ if (this._intervalId != null) {
1148
+ clearInterval(this._intervalId);
1149
+ this._intervalId = null;
1150
+ }
1151
+ if (this._unsubscribe) {
1152
+ this._unsubscribe();
1153
+ this._unsubscribe = null;
1154
+ }
1155
+ }
1156
+
1157
+ invalidate(): void {
1158
+ this._rebuildLayout();
1159
+ }
1160
+
1161
+ /**
1162
+ * Move focus to the nearest node `step` depth-levels away (↑/↓).
1163
+ * Picks the sibling with the closest `row` to the current node so
1164
+ * navigation feels spatially continuous in the vertical layout.
1165
+ */
1166
+ private _moveByDepth(step: number): boolean {
1167
+ const cur = this.cachedLayout[this.focusedIndex];
1168
+ if (!cur) return true;
1169
+ const targetCol = cur.col + step;
1170
+ const candidates = this.cachedLayout
1171
+ .map((n, i) => ({ n, i }))
1172
+ .filter(({ n }) => n.col === targetCol);
1173
+ if (candidates.length === 0) return true;
1174
+ let best = candidates[0]!;
1175
+ let bestDist = Math.abs(best.n.row - cur.row);
1176
+ for (const c of candidates) {
1177
+ const d = Math.abs(c.n.row - cur.row);
1178
+ if (d < bestDist) {
1179
+ best = c;
1180
+ bestDist = d;
1181
+ }
1182
+ }
1183
+ this.focusedIndex = best.i;
1184
+ return true;
1185
+ }
1186
+
1187
+ /**
1188
+ * Move focus to the next sibling at the same depth (←/→). Clamps
1189
+ * at the band edges — no wrap, so the user always knows when they
1190
+ * hit a boundary.
1191
+ */
1192
+ private _moveBySibling(step: number): boolean {
1193
+ const cur = this.cachedLayout[this.focusedIndex];
1194
+ if (!cur) return true;
1195
+ const siblings = this.cachedLayout
1196
+ .map((n, i) => ({ n, i }))
1197
+ .filter(({ n }) => n.col === cur.col)
1198
+ .sort((a, b) => a.n.row - b.n.row);
1199
+ const pos = siblings.findIndex(({ i }) => i === this.focusedIndex);
1200
+ if (pos === -1) return true;
1201
+ const next = siblings[pos + step];
1202
+ if (!next) return true;
1203
+ this.focusedIndex = next.i;
1204
+ return true;
1205
+ }
1206
+
1207
+ // ---- test seams ----
1208
+ get _focusedIndex(): number {
1209
+ return this.focusedIndex;
1210
+ }
1211
+ get _switcherOpen(): boolean {
1212
+ return this.switcherOpen;
1213
+ }
1214
+ get _switcherState(): SwitcherState {
1215
+ return this.switcherState;
1216
+ }
1217
+ }