@bastani/atomic 0.7.17 → 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,1522 @@
1
+ /**
2
+ * Main DAG executor: run(def, inputs, opts) → RunResult
3
+ */
4
+
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import { basename, dirname, extname, isAbsolute, join, resolve } from "node:path";
7
+ import { CONFIG_DIR_NAME } from "@bastani/atomic";
8
+ import type {
9
+ WorkflowDefinition,
10
+ WorkflowRunContext,
11
+ WorkflowUIContext,
12
+ WorkflowUIAdapter,
13
+ WorkflowInputSchema,
14
+ StageContext,
15
+ StageOptions,
16
+ WorkflowTaskContextInput,
17
+ WorkflowTaskOptions,
18
+ WorkflowTaskResult,
19
+ WorkflowTaskStep,
20
+ WorkflowArtifact,
21
+ WorkflowMaxOutput,
22
+ WorkflowChainOptions,
23
+ WorkflowParallelOptions,
24
+ WorkflowDetails,
25
+ WorkflowDirectOptions,
26
+ WorkflowDirectTaskItem,
27
+ WorkflowChainStep,
28
+ WorkflowMcpPort,
29
+ WorkflowPersistencePort,
30
+ WorkflowRuntimeConfig,
31
+ WorkflowModelCatalogPort,
32
+ } from "../../shared/types.js";
33
+ import type { InternalStageContext, StageAdapters } from "./stage-runner.js";
34
+ import type { RunStatus, StageNotice, StageSnapshot, RunSnapshot, WorkflowOverlayAdapter } from "../../shared/store-types.js";
35
+ import type { StageControlHandle, StageControlRegistry, AgentSessionEventListener } from "./stage-control-registry.js";
36
+ import type { Store } from "../../shared/store.js";
37
+ import type { CancellationRegistry } from "../background/cancellation-registry.js";
38
+ import { createStageContext } from "./stage-runner.js";
39
+ import { GraphFrontierTracker } from "../shared/graph-inference.js";
40
+ import { stageControlRegistry as defaultStageControlRegistry } from "./stage-control-registry.js";
41
+ import { createRunLimiter } from "../shared/concurrency.js";
42
+ import {
43
+ cleanupWorktrees,
44
+ createWorktrees,
45
+ diffWorktrees,
46
+ findWorktreeTaskCwdConflict,
47
+ formatWorktreeDiffSummary,
48
+ formatWorktreeTaskCwdConflict,
49
+ type WorktreeSetup,
50
+ } from "../shared/worktree.js";
51
+ import { store as defaultStore } from "../../shared/store.js";
52
+ import {
53
+ appendRunStart,
54
+ appendStageStart,
55
+ appendStageEnd,
56
+ appendRunEnd,
57
+ } from "../../shared/persistence-session-entries.js";
58
+ import { validateWorkflowModels } from "../shared/model-fallback.js";
59
+
60
+ export interface ResolvedInputs extends Record<string, unknown> {}
61
+
62
+ export interface RunOpts {
63
+ adapters?: StageAdapters;
64
+ /** HIL adapter injected by the pi runtime or test harness. */
65
+ ui?: WorkflowUIAdapter;
66
+ /** Store override (for testing; defaults to singleton store) */
67
+ store?: Store;
68
+ /** Persistence port for writing session entries (run.start, stage.start, etc.). */
69
+ persistence?: WorkflowPersistencePort;
70
+ /** MCP scope-gating port; forwards per-stage allow/deny to the MCP adapter. */
71
+ mcp?: WorkflowMcpPort;
72
+ /** Cancellation registry; the executor registers an ActiveRunController per run. */
73
+ cancellation?: CancellationRegistry;
74
+ /** Overlay adapter for displaying run progress in the UI layer. */
75
+ overlay?: WorkflowOverlayAdapter;
76
+ /** AbortSignal that requests cancellation from the caller side. */
77
+ signal?: AbortSignal;
78
+ /**
79
+ * Internal background-runner seam. When true, the executor records the run
80
+ * synchronously, then yields to the next event-loop turn before invoking user
81
+ * workflow code so detached dispatch cannot be blocked by pre-await work.
82
+ */
83
+ deferWorkflowStart?: boolean;
84
+ /**
85
+ * Resolved runtime configuration. Injected by the composition root after
86
+ * merging file config with defaults. Downstream tasks (maxDepth, concurrency,
87
+ * status writer) consume this; values are threaded here but not yet acted on.
88
+ */
89
+ config?: WorkflowRuntimeConfig;
90
+ /** Optional model catalog used for fallback validation/resolution. */
91
+ models?: WorkflowModelCatalogPort;
92
+ /**
93
+ * Current nesting depth of this workflow run. Starts at 0 for top-level runs.
94
+ * Callers that spawn nested runs must increment this by 1 before passing to
95
+ * run()/runDetached() so the maxDepth guard can reject runs that exceed the
96
+ * configured limit.
97
+ */
98
+ depth?: number;
99
+ /**
100
+ * Live stage-control registry. The executor registers a handle per
101
+ * stage so attached panes can lazily prompt/steer/pause/resume the
102
+ * underlying Pi session without going through the JSON snapshot.
103
+ * Defaults to the process-wide singleton registered alongside the
104
+ * default store.
105
+ */
106
+ stageControlRegistry?: StageControlRegistry;
107
+ /**
108
+ * Pre-allocated runId. When provided, the executor uses this ID instead of
109
+ * generating a new UUID. The detached runner uses this seam to preallocate
110
+ * the runId before starting the background promise.
111
+ */
112
+ runId?: string;
113
+ onRunStart?: (snapshot: RunSnapshot) => void;
114
+ onStageStart?: (runId: string, snapshot: StageSnapshot) => void;
115
+ onStageEnd?: (runId: string, snapshot: StageSnapshot) => void;
116
+ onRunEnd?: (runId: string, status: RunStatus, result?: Record<string, unknown>, error?: string) => void;
117
+ }
118
+
119
+ export interface RunResult {
120
+ readonly runId: string;
121
+ readonly status: RunStatus;
122
+ readonly result?: Record<string, unknown>;
123
+ readonly error?: string;
124
+ readonly stages: StageSnapshot[];
125
+ }
126
+
127
+ // ---------------------------------------------------------------------------
128
+ // Input resolution / validation
129
+ // ---------------------------------------------------------------------------
130
+
131
+ export function resolveInputs(
132
+ schema: Readonly<Record<string, WorkflowInputSchema>>,
133
+ provided: Record<string, unknown>,
134
+ ): ResolvedInputs {
135
+ const resolved: Record<string, unknown> = { ...provided };
136
+
137
+ for (const [key, schemaDef] of Object.entries(schema)) {
138
+ if (resolved[key] === undefined && "default" in schemaDef && schemaDef.default !== undefined) {
139
+ resolved[key] = schemaDef.default;
140
+ }
141
+ }
142
+
143
+ for (const [key, schemaDef] of Object.entries(schema)) {
144
+ if (schemaDef.required === true && resolved[key] === undefined) {
145
+ throw new TypeError(`pi-workflows: required input "${key}" not provided`);
146
+ }
147
+ }
148
+
149
+ return resolved;
150
+ }
151
+
152
+ // ---------------------------------------------------------------------------
153
+ // HIL unavailable fallback — rejects with precise per-primitive error
154
+ // ---------------------------------------------------------------------------
155
+
156
+ function makeUnavailableUIContext(): WorkflowUIContext {
157
+ const msg = (primitive: string): string =>
158
+ `pi-workflows: HIL ctx.ui.${primitive} is unavailable because pi runtime did not provide a UI adapter`;
159
+ return {
160
+ input: () => Promise.reject(new Error(msg("input"))),
161
+ confirm: () => Promise.reject(new Error(msg("confirm"))),
162
+ select: () => Promise.reject(new Error(msg("select"))),
163
+ editor: () => Promise.reject(new Error(msg("editor"))),
164
+ };
165
+ }
166
+
167
+ type AskUserQuestionToolEvent =
168
+ | { phase: "start"; callId: string }
169
+ | { phase: "end"; callId: string; nameMatched: boolean };
170
+
171
+ function stringField(value: Record<string, unknown>, keys: readonly string[]): string | undefined {
172
+ for (const key of keys) {
173
+ const candidate = value[key];
174
+ if (typeof candidate === "string" && candidate.length > 0) return candidate;
175
+ }
176
+ return undefined;
177
+ }
178
+
179
+ function isAskUserQuestionToolName(name: string | undefined): boolean {
180
+ if (name === undefined) return false;
181
+ return name.toLowerCase().replace(/[^a-z0-9]/g, "") === "askuserquestion";
182
+ }
183
+
184
+ function askUserQuestionToolEvent(event: unknown): AskUserQuestionToolEvent | undefined {
185
+ if (event === null || typeof event !== "object") return undefined;
186
+ const record = event as Record<string, unknown>;
187
+ const type = typeof record["type"] === "string" ? record["type"] : "";
188
+ const toolName = stringField(record, ["toolName", "tool_name", "name"]);
189
+ const callId = stringField(record, ["toolCallId", "tool_call_id", "toolUseId", "tool_use_id", "id"]) ?? "__ask_user_question__";
190
+
191
+ if (type === "tool_execution_start" && isAskUserQuestionToolName(toolName)) {
192
+ return { phase: "start", callId };
193
+ }
194
+ if (type === "tool_execution_end" || type === "tool_execution_error" || type === "tool_result") {
195
+ return { phase: "end", callId, nameMatched: isAskUserQuestionToolName(toolName) };
196
+ }
197
+ return undefined;
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // raceAbort — races a promise against an AbortSignal
202
+ // ---------------------------------------------------------------------------
203
+
204
+ function normalizeTaskContexts(
205
+ previous: WorkflowTaskOptions["previous"],
206
+ ): Array<{ readonly name?: string; readonly text: string }> {
207
+ if (previous === undefined) return [];
208
+ const items = Array.isArray(previous) ? previous : [previous];
209
+ return items
210
+ .map((item: WorkflowTaskContextInput) => {
211
+ if (typeof item === "string") return { text: item };
212
+ return item.name ? { name: item.name, text: item.text } : { text: item.text };
213
+ })
214
+ .filter((item) => item.text.trim().length > 0);
215
+ }
216
+
217
+ function renderTaskContext(contexts: readonly { readonly name?: string; readonly text: string }[]): string {
218
+ if (contexts.length === 0) return "";
219
+ if (contexts.length === 1 && contexts[0]?.name === undefined) return contexts[0]!.text;
220
+ return contexts
221
+ .map((context, index) => {
222
+ const label = context.name ?? `context-${index + 1}`;
223
+ return `--- ${label} ---\n${context.text}`;
224
+ })
225
+ .join("\n\n");
226
+ }
227
+
228
+ function applyTaskContext(prompt: string, previous: WorkflowTaskOptions["previous"]): string {
229
+ const contexts = normalizeTaskContexts(previous);
230
+ if (contexts.length === 0) return prompt;
231
+
232
+ const lastPrevious = contexts[contexts.length - 1]?.text ?? "";
233
+ const rendered = renderTaskContext(contexts);
234
+ let next = prompt.replace(/\{previous\}/g, lastPrevious);
235
+
236
+ if (next !== prompt) return next;
237
+ next += `\n\n---\nContext:\n${rendered}`;
238
+ return next;
239
+ }
240
+
241
+ function taskPrompt(options: WorkflowTaskOptions): string {
242
+ const prompt = options.prompt ?? options.task;
243
+ if (prompt === undefined) {
244
+ throw new Error("pi-workflows: ctx.task requires options.prompt or options.task");
245
+ }
246
+ return prompt;
247
+ }
248
+
249
+ function taskPrevious(options: WorkflowTaskOptions): WorkflowTaskOptions["previous"] {
250
+ return options.previous;
251
+ }
252
+
253
+ function taskStageOptions(options: WorkflowTaskOptions): StageOptions {
254
+ const {
255
+ prompt: _prompt,
256
+ task: _task,
257
+ previous: _previous,
258
+ output: _output,
259
+ outputMode: _outputMode,
260
+ reads: _reads,
261
+ progress: _progress,
262
+ worktree: _worktree,
263
+ maxOutput: _maxOutput,
264
+ artifacts: _artifacts,
265
+ ...stageOptions
266
+ } = options;
267
+ return stageOptions;
268
+ }
269
+
270
+ function taskOptionsFromStep(step: WorkflowTaskStep, prompt: string, previous?: WorkflowTaskOptions["previous"]): WorkflowTaskOptions {
271
+ const {
272
+ name: _name,
273
+ prompt: _prompt,
274
+ task: _task,
275
+ previous: _previous,
276
+ output: _output,
277
+ outputMode: _outputMode,
278
+ reads: _reads,
279
+ progress: _progress,
280
+ worktree: _worktree,
281
+ ...stageOptions
282
+ } = step;
283
+ return previous === undefined
284
+ ? { ...stageOptions, prompt }
285
+ : { ...stageOptions, prompt, previous };
286
+ }
287
+
288
+ function replaceTaskPlaceholder(prompt: string, task: string): string {
289
+ return prompt.replace(/\{task\}/g, task);
290
+ }
291
+
292
+ function chainStepPrompt(step: WorkflowTaskStep, index: number): string {
293
+ return step.prompt ?? step.task ?? (index === 0 ? "{task}" : "{previous}");
294
+ }
295
+
296
+ function parallelFallbackTask(steps: readonly WorkflowTaskStep[], options?: WorkflowParallelOptions): string {
297
+ if (options?.task !== undefined) return options.task;
298
+ for (const step of steps) {
299
+ const task = step.prompt ?? step.task;
300
+ if (task !== undefined) return task;
301
+ }
302
+ return "";
303
+ }
304
+
305
+ function directTaskPrompt(item: WorkflowDirectTaskItem): string | undefined {
306
+ return item.prompt ?? item.task;
307
+ }
308
+
309
+ function directModelRequestsFromChain(
310
+ chain: readonly WorkflowChainStep[],
311
+ options: WorkflowDirectOptions,
312
+ ): Array<{ readonly model?: WorkflowDirectTaskItem["model"]; readonly fallbackModels?: readonly string[] }> {
313
+ const requests: Array<{ readonly model?: WorkflowDirectTaskItem["model"]; readonly fallbackModels?: readonly string[] }> = [];
314
+ for (const step of chain) {
315
+ if ("parallel" in step) {
316
+ requests.push(...step.parallel.map((item) => directTaskWithDefaults(item, options)));
317
+ } else {
318
+ requests.push(directTaskWithDefaults(step, options));
319
+ }
320
+ }
321
+ return requests;
322
+ }
323
+
324
+ async function validateDirectModels(
325
+ tasks: readonly WorkflowDirectTaskItem[],
326
+ runOptions: RunOpts,
327
+ ): Promise<readonly string[]> {
328
+ return validateWorkflowModels({
329
+ requests: tasks.map((task) => ({ model: task.model, fallbackModels: task.fallbackModels })),
330
+ catalog: runOptions.models,
331
+ });
332
+ }
333
+
334
+ const DEFAULT_MAX_OUTPUT_BYTES = 200 * 1024;
335
+ const DEFAULT_MAX_OUTPUT_LINES = 5000;
336
+
337
+ function normalizeMaxOutput(maxOutput: WorkflowMaxOutput | undefined): Required<WorkflowMaxOutput> {
338
+ return {
339
+ bytes: maxOutput?.bytes ?? DEFAULT_MAX_OUTPUT_BYTES,
340
+ lines: maxOutput?.lines ?? DEFAULT_MAX_OUTPUT_LINES,
341
+ };
342
+ }
343
+
344
+ function truncateByLines(text: string, maxLines: number): { text: string; truncated: boolean } {
345
+ if (!Number.isFinite(maxLines) || maxLines <= 0) return { text: "", truncated: text.length > 0 };
346
+ const lines = text.split(/\r?\n/);
347
+ if (lines.length <= maxLines) return { text, truncated: false };
348
+ return {
349
+ text: lines.slice(0, maxLines).join("\n"),
350
+ truncated: true,
351
+ };
352
+ }
353
+
354
+ function truncateByBytes(text: string, maxBytes: number): { text: string; truncated: boolean } {
355
+ if (!Number.isFinite(maxBytes) || maxBytes <= 0) return { text: "", truncated: text.length > 0 };
356
+ if (Buffer.byteLength(text, "utf8") <= maxBytes) return { text, truncated: false };
357
+
358
+ let low = 0;
359
+ let high = text.length;
360
+ while (low < high) {
361
+ const mid = Math.ceil((low + high) / 2);
362
+ if (Buffer.byteLength(text.slice(0, mid), "utf8") <= maxBytes) {
363
+ low = mid;
364
+ } else {
365
+ high = mid - 1;
366
+ }
367
+ }
368
+ return { text: text.slice(0, low), truncated: true };
369
+ }
370
+
371
+ function truncateTaskOutput(text: string, maxOutput: WorkflowMaxOutput | undefined): string {
372
+ const limits = normalizeMaxOutput(maxOutput);
373
+ const byLines = truncateByLines(text, limits.lines);
374
+ const byBytes = truncateByBytes(byLines.text, limits.bytes);
375
+ if (!byLines.truncated && !byBytes.truncated) return text;
376
+ return `${byBytes.text}\n\n[workflow output truncated; limits: ${limits.bytes} bytes, ${limits.lines} lines]`;
377
+ }
378
+
379
+ function directTaskWithDefaults(
380
+ item: WorkflowDirectTaskItem,
381
+ options: WorkflowDirectOptions,
382
+ ): WorkflowDirectTaskItem {
383
+ return {
384
+ ...item,
385
+ ...(item.context === undefined && options.context !== undefined ? { context: options.context } : {}),
386
+ ...(item.forkFromSessionFile === undefined && options.forkFromSessionFile !== undefined ? { forkFromSessionFile: options.forkFromSessionFile } : {}),
387
+ ...(item.cwd === undefined && options.cwd !== undefined ? { cwd: options.cwd } : {}),
388
+ ...(item.output === undefined && options.output !== undefined ? { output: options.output } : {}),
389
+ ...(item.outputMode === undefined && options.outputMode !== undefined ? { outputMode: options.outputMode } : {}),
390
+ ...(item.maxOutput === undefined && options.maxOutput !== undefined ? { maxOutput: options.maxOutput } : {}),
391
+ ...(item.artifacts === undefined && options.artifacts !== undefined ? { artifacts: options.artifacts } : {}),
392
+ ...(item.sessionDir === undefined && options.sessionDir !== undefined ? { sessionDir: options.sessionDir } : {}),
393
+ ...(item.fallbackModels === undefined && options.fallbackModels !== undefined ? { fallbackModels: options.fallbackModels } : {}),
394
+ };
395
+ }
396
+
397
+ function directTaskToStep(
398
+ item: WorkflowDirectTaskItem,
399
+ fallbackPrompt?: string,
400
+ previous?: WorkflowTaskOptions["previous"],
401
+ ): WorkflowTaskStep {
402
+ const {
403
+ count: _count,
404
+ output: _output,
405
+ outputMode: _outputMode,
406
+ reads: _reads,
407
+ progress: _progress,
408
+ worktree: _worktree,
409
+ prompt,
410
+ task,
411
+ previous: itemPrevious,
412
+ ...stageOptions
413
+ } = item;
414
+ return {
415
+ ...stageOptions,
416
+ prompt: prompt ?? task ?? fallbackPrompt,
417
+ previous: previous ?? itemPrevious,
418
+ };
419
+ }
420
+
421
+ function expandedParallelTasks(tasks: readonly WorkflowDirectTaskItem[]): WorkflowDirectTaskItem[] {
422
+ const expanded: WorkflowDirectTaskItem[] = [];
423
+ for (const task of tasks) {
424
+ const count = task.count ?? 1;
425
+ if (!Number.isInteger(count) || count < 1) {
426
+ throw new Error(`pi-workflows: direct task "${task.name}" count must be a positive integer`);
427
+ }
428
+ for (let index = 0; index < count; index += 1) {
429
+ expanded.push(count === 1 ? task : {
430
+ ...task,
431
+ name: `${task.name}-${index + 1}`,
432
+ count: undefined,
433
+ output: namespaceRepeatedOutput(task.output, index),
434
+ });
435
+ }
436
+ }
437
+ return expanded;
438
+ }
439
+
440
+ function namespaceRepeatedOutput(output: WorkflowDirectTaskItem["output"], index: number): WorkflowDirectTaskItem["output"] {
441
+ if (typeof output !== "string") return output;
442
+ const ext = extname(output);
443
+ const base = basename(output, ext);
444
+ return join(dirname(output), `${base}-${index + 1}${ext}`);
445
+ }
446
+
447
+ interface PreparedDirectWorktrees {
448
+ readonly tasks: WorkflowDirectTaskItem[];
449
+ readonly setup?: WorktreeSetup;
450
+ readonly agents: string[];
451
+ readonly diffsDir?: string;
452
+ }
453
+
454
+ function directRunId(runOptions: RunOpts): string {
455
+ return runOptions.runId ?? crypto.randomUUID();
456
+ }
457
+
458
+ function hasDirectWorktreeIsolation(tasks: readonly WorkflowDirectTaskItem[], options: WorkflowDirectOptions): boolean {
459
+ return options.worktree === true || tasks.some((task) => task.worktree === true);
460
+ }
461
+
462
+ function resolveSharedDirectWorktreeCwd(tasks: readonly WorkflowDirectTaskItem[]): string {
463
+ const explicitCwd = tasks.find((task) => typeof task.cwd === "string")?.cwd;
464
+ if (explicitCwd === undefined) return process.cwd();
465
+ return isAbsolute(explicitCwd) ? explicitCwd : resolve(process.cwd(), explicitCwd);
466
+ }
467
+
468
+ function normalizeDirectTaskCwd(cwd: string | undefined): string | undefined {
469
+ if (cwd === undefined) return undefined;
470
+ return isAbsolute(cwd) ? cwd : resolve(process.cwd(), cwd);
471
+ }
472
+
473
+ function directWorktreeDiffsDir(options: WorkflowDirectOptions, setup: WorktreeSetup, runId: string, scope: string): string {
474
+ const baseDir = options.chainDir ?? join(setup.cwd, CONFIG_DIR_NAME, "workflows");
475
+ return join(baseDir, "worktree-diffs", runId, scope);
476
+ }
477
+
478
+ function prepareDirectWorktrees(
479
+ tasks: readonly WorkflowDirectTaskItem[],
480
+ options: WorkflowDirectOptions,
481
+ runId: string,
482
+ scope: string,
483
+ ): PreparedDirectWorktrees {
484
+ if (!hasDirectWorktreeIsolation(tasks, options)) {
485
+ return {
486
+ tasks: [...tasks],
487
+ agents: tasks.map((task) => task.name),
488
+ };
489
+ }
490
+
491
+ const sharedCwd = resolveSharedDirectWorktreeCwd(tasks);
492
+ const conflict = findWorktreeTaskCwdConflict(
493
+ tasks.map((task) => ({ agent: task.name, cwd: normalizeDirectTaskCwd(task.cwd) })),
494
+ sharedCwd,
495
+ );
496
+ if (conflict !== undefined) {
497
+ throw new Error(formatWorktreeTaskCwdConflict(conflict, sharedCwd));
498
+ }
499
+
500
+ const agents = tasks.map((task) => task.name);
501
+ const setup = createWorktrees(sharedCwd, runId, tasks.length, { agents });
502
+ return {
503
+ tasks: tasks.map((task, index) => ({
504
+ ...task,
505
+ cwd: setup.worktrees[index]!.agentCwd,
506
+ })),
507
+ setup,
508
+ agents,
509
+ diffsDir: directWorktreeDiffsDir(options, setup, runId, scope),
510
+ };
511
+ }
512
+
513
+ function collectWorktreeDiffs(prepared: PreparedDirectWorktrees, enabled = true): {
514
+ artifacts: WorkflowArtifact[];
515
+ summary?: string;
516
+ } {
517
+ if (!enabled || prepared.setup === undefined || prepared.diffsDir === undefined) {
518
+ return { artifacts: [] };
519
+ }
520
+
521
+ const diffs = diffWorktrees(prepared.setup, prepared.agents, prepared.diffsDir);
522
+ const artifacts = diffs.map((diff) => ({
523
+ kind: "diff" as const,
524
+ path: diff.patchPath,
525
+ taskName: diff.agent,
526
+ branch: diff.branch,
527
+ diffStat: diff.diffStat,
528
+ filesChanged: diff.filesChanged,
529
+ insertions: diff.insertions,
530
+ deletions: diff.deletions,
531
+ }));
532
+ const summary = formatWorktreeDiffSummary(diffs);
533
+ return {
534
+ artifacts,
535
+ ...(summary.length > 0 ? { summary } : {}),
536
+ };
537
+ }
538
+
539
+ function isRunOpts(value: WorkflowDirectOptions | RunOpts | undefined): value is RunOpts {
540
+ if (value === undefined) return false;
541
+ return (
542
+ "adapters" in value ||
543
+ "ui" in value ||
544
+ "store" in value ||
545
+ "persistence" in value ||
546
+ "mcp" in value ||
547
+ "cancellation" in value ||
548
+ "overlay" in value ||
549
+ "signal" in value ||
550
+ "config" in value ||
551
+ "depth" in value ||
552
+ "stageControlRegistry" in value ||
553
+ "runId" in value ||
554
+ "onRunStart" in value ||
555
+ "onStageStart" in value ||
556
+ "onStageEnd" in value ||
557
+ "onRunEnd" in value ||
558
+ "models" in value
559
+ );
560
+ }
561
+
562
+ async function writeDirectOutput(
563
+ item: Pick<WorkflowDirectTaskItem, "output" | "outputMode">,
564
+ result: WorkflowTaskResult,
565
+ ): Promise<{ result: WorkflowTaskResult; artifact?: WorkflowArtifact }> {
566
+ if (typeof item.output !== "string") return { result };
567
+
568
+ await mkdir(dirname(item.output), { recursive: true });
569
+ await writeFile(item.output, result.text, "utf8");
570
+
571
+ const visibleResult =
572
+ item.outputMode === "file-only"
573
+ ? { ...result, text: "" }
574
+ : result;
575
+
576
+ return {
577
+ result: visibleResult,
578
+ artifact: {
579
+ kind: "output",
580
+ path: item.output,
581
+ taskName: result.name,
582
+ },
583
+ };
584
+ }
585
+
586
+ function failedDirectDetails(
587
+ mode: WorkflowDetails["mode"],
588
+ runId: string,
589
+ total: number,
590
+ error: unknown,
591
+ options: WorkflowDirectOptions = {},
592
+ ): WorkflowDetails {
593
+ return {
594
+ mode,
595
+ action: "run",
596
+ runId,
597
+ status: "failed",
598
+ ...(options.context !== undefined ? { context: options.context } : {}),
599
+ results: [],
600
+ progress: { completed: 0, total },
601
+ error: error instanceof Error ? error.message : String(error),
602
+ };
603
+ }
604
+
605
+ function workflowDetailsFromRun(
606
+ mode: WorkflowDetails["mode"],
607
+ runResult: RunResult,
608
+ results: readonly WorkflowTaskResult[],
609
+ options: WorkflowDirectOptions = {},
610
+ warnings: readonly string[] = [],
611
+ ): WorkflowDetails {
612
+ const sessionArtifacts = options.artifacts === false ? [] : results.flatMap((result) =>
613
+ result.sessionFile === undefined
614
+ ? []
615
+ : [{ kind: "session" as const, path: result.sessionFile, taskName: result.name }],
616
+ );
617
+ const outputArtifacts = Array.isArray(runResult.result?.["artifacts"])
618
+ ? runResult.result["artifacts"] as WorkflowArtifact[]
619
+ : [];
620
+ const artifacts = [...outputArtifacts, ...sessionArtifacts];
621
+ const resultWarnings = results.flatMap((result) => result.warnings ?? []);
622
+ const allWarnings = [...warnings, ...resultWarnings];
623
+ return {
624
+ mode,
625
+ action: "run",
626
+ runId: runResult.runId,
627
+ status: runResult.status === "killed" ? "killed" : runResult.status === "failed" ? "failed" : "completed",
628
+ ...(options.context !== undefined ? { context: options.context } : {}),
629
+ results: [...results],
630
+ output: runResult.result,
631
+ progress: { completed: results.length, total: results.length },
632
+ ...(artifacts.length > 0 ? { artifacts } : {}),
633
+ ...(allWarnings.length > 0 ? { warnings: allWarnings } : {}),
634
+ ...(runResult.error !== undefined ? { error: runResult.error } : {}),
635
+ };
636
+ }
637
+
638
+ function defineDirectWorkflow(
639
+ name: string,
640
+ runFn: WorkflowDefinition["run"],
641
+ ): WorkflowDefinition {
642
+ return Object.freeze({
643
+ __piWorkflow: true,
644
+ name,
645
+ normalizedName: name,
646
+ description: "Direct workflow execution",
647
+ inputs: Object.freeze({}),
648
+ run: runFn,
649
+ });
650
+ }
651
+
652
+ /**
653
+ * SDK helper for direct single-task execution. It synthesizes an ephemeral
654
+ * workflow and reuses the normal executor so store snapshots, cancellation,
655
+ * persistence, and stage session behavior stay on the same runtime path.
656
+ */
657
+ export function runTask(
658
+ task: WorkflowDirectTaskItem,
659
+ runOptions?: RunOpts,
660
+ ): Promise<WorkflowDetails>;
661
+ export function runTask(
662
+ task: WorkflowDirectTaskItem,
663
+ options?: WorkflowDirectOptions,
664
+ runOptions?: RunOpts,
665
+ ): Promise<WorkflowDetails>;
666
+ export async function runTask(
667
+ task: WorkflowDirectTaskItem,
668
+ optionsOrRunOptions: WorkflowDirectOptions | RunOpts = {},
669
+ maybeRunOptions: RunOpts = {},
670
+ ): Promise<WorkflowDetails> {
671
+ const options = isRunOpts(optionsOrRunOptions) ? {} : optionsOrRunOptions;
672
+ const runOptions = isRunOpts(optionsOrRunOptions) ? optionsOrRunOptions : maybeRunOptions;
673
+ const runId = directRunId(runOptions);
674
+ const taskWithDefaults = directTaskWithDefaults(task, options);
675
+ let validationWarnings: readonly string[] = [];
676
+ try {
677
+ validationWarnings = await validateDirectModels([taskWithDefaults], runOptions);
678
+ } catch (err) {
679
+ return failedDirectDetails("single", runId, 1, err, options);
680
+ }
681
+ const prepared = prepareDirectWorktrees([taskWithDefaults], options, runId, "single");
682
+ const preparedTask = prepared.tasks[0]!;
683
+ const direct = defineDirectWorkflow("direct-task", async (ctx) => {
684
+ try {
685
+ const rawResult = await ctx.task(preparedTask.name, directTaskToStep(preparedTask));
686
+ const { result, artifact } = await writeDirectOutput(preparedTask, rawResult);
687
+ const worktreeDiffs = collectWorktreeDiffs(prepared, options.artifacts !== false);
688
+ return {
689
+ results: [result],
690
+ text: result.text,
691
+ artifacts: [
692
+ ...worktreeDiffs.artifacts,
693
+ ...(artifact === undefined ? [] : [artifact]),
694
+ ],
695
+ ...(worktreeDiffs.summary === undefined ? {} : { worktreeSummary: worktreeDiffs.summary }),
696
+ };
697
+ } finally {
698
+ if (prepared.setup !== undefined) cleanupWorktrees(prepared.setup);
699
+ }
700
+ });
701
+ const runResult = await run(direct, {}, { ...runOptions, runId });
702
+ const results = (runResult.result?.["results"] ?? []) as WorkflowTaskResult[];
703
+ return workflowDetailsFromRun("single", runResult, results, options, validationWarnings);
704
+ }
705
+
706
+ /** SDK helper for direct top-level parallel task execution. */
707
+ export async function runParallel(
708
+ tasks: readonly WorkflowDirectTaskItem[],
709
+ options: WorkflowDirectOptions = {},
710
+ runOptions: RunOpts = {},
711
+ ): Promise<WorkflowDetails> {
712
+ const tasksWithDefaults = tasks.map((task) => directTaskWithDefaults(task, options));
713
+ const expanded = expandedParallelTasks(tasksWithDefaults);
714
+ const runId = directRunId(runOptions);
715
+ let validationWarnings: readonly string[] = [];
716
+ try {
717
+ validationWarnings = await validateDirectModels(expanded, runOptions);
718
+ } catch (err) {
719
+ return failedDirectDetails("parallel", runId, expanded.length, err, options);
720
+ }
721
+ const prepared = prepareDirectWorktrees(expanded, options, runId, "parallel");
722
+ const direct = defineDirectWorkflow("direct-parallel", async (ctx) => {
723
+ try {
724
+ const steps = prepared.tasks.map((task) => directTaskToStep(task));
725
+ const rawResults = await ctx.parallel(steps, { task: options.task });
726
+ const persisted = await Promise.all(
727
+ rawResults.map((result, index) => writeDirectOutput(prepared.tasks[index]!, result)),
728
+ );
729
+ const results = persisted.map((item) => item.result);
730
+ const worktreeDiffs = collectWorktreeDiffs(prepared, options.artifacts !== false);
731
+ const artifacts = [
732
+ ...worktreeDiffs.artifacts,
733
+ ...persisted.flatMap((item) => item.artifact === undefined ? [] : [item.artifact]),
734
+ ];
735
+ return {
736
+ results,
737
+ count: results.length,
738
+ artifacts,
739
+ ...(worktreeDiffs.summary === undefined ? {} : { worktreeSummary: worktreeDiffs.summary }),
740
+ };
741
+ } finally {
742
+ if (prepared.setup !== undefined) cleanupWorktrees(prepared.setup);
743
+ }
744
+ });
745
+ const runResult = await run(direct, {}, { ...runOptions, runId });
746
+ const results = (runResult.result?.["results"] ?? []) as WorkflowTaskResult[];
747
+ return workflowDetailsFromRun("parallel", runResult, results, options, validationWarnings);
748
+ }
749
+
750
+ async function runDirectChainStep(
751
+ ctx: WorkflowRunContext,
752
+ step: WorkflowChainStep,
753
+ index: number,
754
+ rootTask: string,
755
+ prior: WorkflowTaskResult | readonly WorkflowTaskResult[] | undefined,
756
+ options: WorkflowDirectOptions,
757
+ runId: string,
758
+ ): Promise<{ results: WorkflowTaskResult[]; artifacts: WorkflowArtifact[] }> {
759
+ if ("parallel" in step) {
760
+ const expanded = expandedParallelTasks(step.parallel.map((item) => directTaskWithDefaults(item, options)));
761
+ const stepOptions = { ...options, worktree: options.worktree === true || step.worktree === true };
762
+ const prepared = prepareDirectWorktrees(expanded, stepOptions, `${runId}-s${index}`, `step-${index}`);
763
+ try {
764
+ const steps = prepared.tasks.map((item) =>
765
+ directTaskToStep(item, directTaskPrompt(item) ?? "{previous}", item.previous ?? prior),
766
+ );
767
+ const rawResults = await ctx.parallel(steps, { task: rootTask });
768
+ const persisted = await Promise.all(
769
+ rawResults.map((result, taskIndex) => writeDirectOutput(prepared.tasks[taskIndex]!, result)),
770
+ );
771
+ const worktreeDiffs = collectWorktreeDiffs(prepared, stepOptions.artifacts !== false);
772
+ return {
773
+ results: persisted.map((item) => item.result),
774
+ artifacts: [
775
+ ...worktreeDiffs.artifacts,
776
+ ...persisted.flatMap((item) => item.artifact === undefined ? [] : [item.artifact]),
777
+ ],
778
+ };
779
+ } finally {
780
+ if (prepared.setup !== undefined) cleanupWorktrees(prepared.setup);
781
+ }
782
+ }
783
+
784
+ const prompt = directTaskPrompt(step) ?? (index === 0 ? "{task}" : "{previous}");
785
+ const prepared = prepareDirectWorktrees([directTaskWithDefaults(step, options)], options, `${runId}-s${index}`, `step-${index}`);
786
+ const preparedStep = prepared.tasks[0]!;
787
+ try {
788
+ const rawResult = await ctx.task(
789
+ preparedStep.name,
790
+ directTaskToStep(preparedStep, replaceTaskPlaceholder(prompt, rootTask), preparedStep.previous ?? prior),
791
+ );
792
+ const { result, artifact } = await writeDirectOutput(preparedStep, rawResult);
793
+ const worktreeDiffs = collectWorktreeDiffs(prepared, options.artifacts !== false);
794
+ return {
795
+ results: [result],
796
+ artifacts: [
797
+ ...worktreeDiffs.artifacts,
798
+ ...(artifact === undefined ? [] : [artifact]),
799
+ ],
800
+ };
801
+ } finally {
802
+ if (prepared.setup !== undefined) cleanupWorktrees(prepared.setup);
803
+ }
804
+ }
805
+
806
+ /** SDK helper for direct sequential/parallel chain execution. */
807
+ export async function runChain(
808
+ chain: readonly WorkflowChainStep[],
809
+ options: WorkflowDirectOptions = {},
810
+ runOptions: RunOpts = {},
811
+ ): Promise<WorkflowDetails> {
812
+ const runId = directRunId(runOptions);
813
+ let validationWarnings: readonly string[] = [];
814
+ try {
815
+ validationWarnings = await validateWorkflowModels({
816
+ requests: directModelRequestsFromChain(chain, options),
817
+ catalog: runOptions.models,
818
+ });
819
+ } catch (err) {
820
+ return failedDirectDetails("chain", runId, chain.length, err, options);
821
+ }
822
+ const direct = defineDirectWorkflow("direct-chain", async (ctx) => {
823
+ const results: WorkflowTaskResult[] = [];
824
+ const artifacts: WorkflowArtifact[] = [];
825
+ let prior: WorkflowTaskResult | readonly WorkflowTaskResult[] | undefined;
826
+ for (let index = 0; index < chain.length; index += 1) {
827
+ const step = await runDirectChainStep(ctx, chain[index]!, index, options.task ?? "", prior, options, runId);
828
+ results.push(...step.results);
829
+ artifacts.push(...step.artifacts);
830
+ prior = step.results.length === 1 ? step.results[0] : step.results;
831
+ }
832
+ return { results, count: results.length, artifacts };
833
+ });
834
+ const runResult = await run(direct, {}, { ...runOptions, runId });
835
+ const results = (runResult.result?.["results"] ?? []) as WorkflowTaskResult[];
836
+ return workflowDetailsFromRun("chain", runResult, results, options, validationWarnings);
837
+ }
838
+
839
+ function raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {
840
+ if (signal.aborted) {
841
+ return Promise.reject(signal.reason ?? new DOMException("workflow killed", "AbortError"));
842
+ }
843
+ return new Promise<T>((resolve, reject) => {
844
+ const onAbort = (): void => {
845
+ reject(signal.reason ?? new DOMException("workflow killed", "AbortError"));
846
+ };
847
+ signal.addEventListener("abort", onAbort, { once: true });
848
+ promise.then(
849
+ (val) => { signal.removeEventListener("abort", onAbort); resolve(val); },
850
+ (err: unknown) => { signal.removeEventListener("abort", onAbort); reject(err); },
851
+ );
852
+ });
853
+ }
854
+
855
+ function appendRunEndWhenRecorded(
856
+ persistence: WorkflowPersistencePort | undefined,
857
+ recorded: boolean,
858
+ payload: {
859
+ readonly runId: string;
860
+ readonly status: RunStatus;
861
+ readonly result?: Record<string, unknown>;
862
+ readonly ts: number;
863
+ },
864
+ ): void {
865
+ if (!persistence || !recorded) return;
866
+ appendRunEnd(persistence, payload);
867
+ }
868
+
869
+ // ---------------------------------------------------------------------------
870
+ // Shared killed finalizer — used for catch-abort and post-body abort check
871
+ // ---------------------------------------------------------------------------
872
+
873
+ function finalizeKilled(
874
+ runId: string,
875
+ runSnapshot: RunSnapshot,
876
+ activeStore: Store,
877
+ persistence: WorkflowPersistencePort | undefined,
878
+ onRunEnd: RunOpts["onRunEnd"],
879
+ ): RunResult {
880
+ const recorded = activeStore.recordRunEnd(runId, "killed", undefined, "workflow killed");
881
+ onRunEnd?.(runId, "killed", undefined, "workflow killed");
882
+ appendRunEndWhenRecorded(persistence, recorded, {
883
+ runId,
884
+ status: "killed",
885
+ ts: Date.now(),
886
+ });
887
+ return {
888
+ runId,
889
+ status: "killed",
890
+ error: "workflow killed",
891
+ stages: [...runSnapshot.stages],
892
+ };
893
+ }
894
+
895
+ // ---------------------------------------------------------------------------
896
+ // Main executor
897
+ // ---------------------------------------------------------------------------
898
+
899
+ function nextEventLoopTurn(): Promise<void> {
900
+ return new Promise((resolve) => setTimeout(resolve, 0));
901
+ }
902
+
903
+ export async function run(
904
+ def: WorkflowDefinition,
905
+ inputs: Record<string, unknown>,
906
+ opts: RunOpts = {},
907
+ ): Promise<RunResult> {
908
+ const activeStore = opts.store ?? defaultStore;
909
+ const adapters = opts.adapters ?? {};
910
+
911
+ // 0. maxDepth guard — reject before any store/persistence side effects.
912
+ const depth = opts.depth ?? 0;
913
+ const maxDepth = opts.config?.maxDepth ?? 4;
914
+ if (depth >= maxDepth) {
915
+ const max = maxDepth;
916
+ return {
917
+ runId: opts.runId ?? crypto.randomUUID(),
918
+ status: "failed",
919
+ error: `pi-workflows: maxDepth exceeded (max ${max})`,
920
+ stages: [],
921
+ };
922
+ }
923
+
924
+ // 1. Resolve + validate inputs
925
+ const resolvedInputs = resolveInputs(def.inputs, inputs);
926
+
927
+ // 2. Generate runId (or use pre-allocated seam from caller)
928
+ const runId = opts.runId ?? crypto.randomUUID();
929
+
930
+ // 2a. Create own AbortController; forward caller signal if provided
931
+ const ownController = new AbortController();
932
+ const callerSignal = opts.signal;
933
+ if (callerSignal) {
934
+ if (callerSignal.aborted) {
935
+ ownController.abort(callerSignal.reason);
936
+ } else {
937
+ callerSignal.addEventListener("abort", () => { ownController.abort(callerSignal.reason); }, { once: true });
938
+ }
939
+ }
940
+
941
+ // 3. Create RunSnapshot + register
942
+ const runSnapshot: RunSnapshot = {
943
+ id: runId,
944
+ name: def.name,
945
+ inputs: Object.freeze(resolvedInputs),
946
+ status: "running",
947
+ stages: [],
948
+ startedAt: Date.now(),
949
+ };
950
+
951
+ activeStore.recordRunStart(runSnapshot);
952
+ // When the caller already has a controller registered (the detached runner
953
+ // pre-registers before calling run() so abort() can hit the run during
954
+ // executor setup), avoid overwriting it. Two registrations for the same
955
+ // runId means `cancellation.abort(runId)` only hits one controller, and
956
+ // listeners on the other never fire — which is exactly the leak that
957
+ // wedges HIL waiters in background runs.
958
+ if (!opts.signal) {
959
+ opts.cancellation?.register(runId, ownController);
960
+ }
961
+ opts.onRunStart?.(runSnapshot);
962
+
963
+ // Persistence: append run.start entry
964
+ if (opts.persistence) {
965
+ appendRunStart(opts.persistence, {
966
+ runId,
967
+ name: def.name,
968
+ inputs: resolvedInputs,
969
+ ts: runSnapshot.startedAt,
970
+ });
971
+ }
972
+
973
+ // 4. Create GraphFrontierTracker and per-run ConcurrencyLimiter
974
+ const tracker = new GraphFrontierTracker();
975
+ const limiter = createRunLimiter(opts.config?.defaultConcurrency);
976
+ interface ReleaseBarrier {
977
+ readonly promise: Promise<void>;
978
+ readonly resolve: () => void;
979
+ readonly reject: (reason?: unknown) => void;
980
+ }
981
+ const releaseBarriers = new Map<string, ReleaseBarrier>();
982
+
983
+ const makeReleaseBarrier = (): ReleaseBarrier => {
984
+ const resolver = Promise.withResolvers<void>();
985
+ return { promise: resolver.promise, resolve: resolver.resolve, reject: resolver.reject };
986
+ };
987
+
988
+ const isTerminalStage = (stage: StageSnapshot): boolean =>
989
+ stage.status === "completed" || stage.status === "failed";
990
+
991
+ const stageById = (stageId: string): StageSnapshot | undefined =>
992
+ runSnapshot.stages.find((stage) => stage.id === stageId);
993
+
994
+ const hasAncestor = (stage: StageSnapshot, ancestorId: string): boolean => {
995
+ const queue = [...stage.parentIds];
996
+ const seen = new Set<string>();
997
+ while (queue.length > 0) {
998
+ const next = queue.shift();
999
+ if (next === undefined || seen.has(next)) continue;
1000
+ if (next === ancestorId) return true;
1001
+ seen.add(next);
1002
+ queue.push(...tracker.getParents(next));
1003
+ }
1004
+ return false;
1005
+ };
1006
+
1007
+ const descendantsOf = (stageId: string): StageSnapshot[] =>
1008
+ runSnapshot.stages.filter((stage) => stage.id !== stageId && hasAncestor(stage, stageId));
1009
+
1010
+ const blockingAncestorFor = (stage: StageSnapshot): string | undefined => {
1011
+ const queue = [...stage.parentIds];
1012
+ const seen = new Set<string>();
1013
+ while (queue.length > 0) {
1014
+ const next = queue.shift();
1015
+ if (next === undefined || seen.has(next)) continue;
1016
+ seen.add(next);
1017
+ const ancestor = stageById(next);
1018
+ if (ancestor?.status === "paused" || ancestor?.status === "blocked") return next;
1019
+ queue.push(...tracker.getParents(next));
1020
+ }
1021
+ return undefined;
1022
+ };
1023
+
1024
+ const ensureReleaseBarrier = (stageId: string): ReleaseBarrier => {
1025
+ let barrier = releaseBarriers.get(stageId);
1026
+ if (!barrier) {
1027
+ barrier = makeReleaseBarrier();
1028
+ releaseBarriers.set(stageId, barrier);
1029
+ }
1030
+ return barrier;
1031
+ };
1032
+
1033
+ const blockStageUntilCascadeRelease = (stage: StageSnapshot, blockedBy: string): void => {
1034
+ ensureReleaseBarrier(stage.id);
1035
+ activeStore.recordStageBlocked(runId, stage.id, blockedBy);
1036
+ };
1037
+
1038
+ const releaseStageBarrier = (stageId: string): void => {
1039
+ const barrier = releaseBarriers.get(stageId);
1040
+ if (!barrier) return;
1041
+ releaseBarriers.delete(stageId);
1042
+ barrier.resolve();
1043
+ };
1044
+
1045
+ const cascadePauseFrom = async (pausedStageId: string): Promise<void> => {
1046
+ for (const descendant of descendantsOf(pausedStageId)) {
1047
+ if (isTerminalStage(descendant) || descendant.status === "paused" || descendant.status === "blocked") continue;
1048
+ if (descendant.status === "running") {
1049
+ const descendantHandle = (opts.stageControlRegistry ?? defaultStageControlRegistry).get(runId, descendant.id);
1050
+ if (descendantHandle && descendantHandle.status === "running") {
1051
+ await descendantHandle.pause();
1052
+ }
1053
+ continue;
1054
+ }
1055
+ blockStageUntilCascadeRelease(descendant, pausedStageId);
1056
+ }
1057
+ };
1058
+
1059
+ const cascadeResumeFrom = (resumedStageId: string): void => {
1060
+ for (const descendant of descendantsOf(resumedStageId)) {
1061
+ if (isTerminalStage(descendant) || descendant.status !== "blocked") continue;
1062
+ if (blockingAncestorFor(descendant) !== undefined) continue;
1063
+ if (activeStore.recordStageUnblocked(runId, descendant.id)) {
1064
+ releaseStageBarrier(descendant.id);
1065
+ }
1066
+ }
1067
+ };
1068
+
1069
+ const rejectReleaseBarriers = (reason: unknown): void => {
1070
+ for (const [stageId, barrier] of releaseBarriers) {
1071
+ releaseBarriers.delete(stageId);
1072
+ activeStore.recordStageUnblocked(runId, stageId);
1073
+ barrier.reject(reason);
1074
+ }
1075
+ };
1076
+
1077
+ ownController.signal.addEventListener(
1078
+ "abort",
1079
+ () => rejectReleaseBarriers(ownController.signal.reason ?? new Error("pi-workflows: run aborted")),
1080
+ { once: true },
1081
+ );
1082
+
1083
+ // 5. Build WorkflowRunContext
1084
+ const ctx: WorkflowRunContext = {
1085
+ inputs: resolvedInputs,
1086
+ ui: opts.ui ?? makeUnavailableUIContext(),
1087
+
1088
+ stage(name: string, options?: StageOptions) {
1089
+ // a. Generate stageId
1090
+ const stageId = crypto.randomUUID();
1091
+
1092
+ // b. tracker.onSpawn → parentIds
1093
+ const parentIds = tracker.onSpawn(stageId, name);
1094
+
1095
+ // c. Create StageSnapshot as "pending"
1096
+ const stageSnapshot: StageSnapshot = {
1097
+ id: stageId,
1098
+ name,
1099
+ status: "pending",
1100
+ parentIds: Object.freeze(parentIds),
1101
+ toolEvents: [],
1102
+ // Store mcp scope options on snapshot when provided
1103
+ ...(options?.mcp !== undefined
1104
+ ? { mcpScope: { allow: options.mcp.allow ?? null, deny: options.mcp.deny ?? null } }
1105
+ : {}),
1106
+ // Mark attachable up-front: the live stage handle is registered
1107
+ // below before the first onStageStart fires, so consumers that
1108
+ // hook onStageStart see `attachable: true` for the pending stage.
1109
+ attachable: true,
1110
+ };
1111
+
1112
+ // d. Create inner AgentSession-like StageContext (raw, without lifecycle wrapping).
1113
+ // Must come before the registry registration because the handle
1114
+ // delegates to it for every operation.
1115
+ const innerCtx: InternalStageContext = createStageContext({
1116
+ stageId,
1117
+ stageName: name,
1118
+ adapters,
1119
+ runId,
1120
+ signal: ownController.signal,
1121
+ stageOptions: options,
1122
+ models: opts.models,
1123
+ });
1124
+ const activeAskUserQuestionCalls = new Set<string>();
1125
+ const unsubscribeAskUserQuestionWatcher = innerCtx.subscribe((event) => {
1126
+ const toolEvent = askUserQuestionToolEvent(event);
1127
+ if (!toolEvent) return;
1128
+ if (toolEvent.phase === "start") {
1129
+ activeAskUserQuestionCalls.add(toolEvent.callId);
1130
+ activeStore.recordStageAwaitingInput(runId, stageId, true);
1131
+ return;
1132
+ }
1133
+
1134
+ if (toolEvent.nameMatched || activeAskUserQuestionCalls.has(toolEvent.callId)) {
1135
+ activeAskUserQuestionCalls.delete(toolEvent.callId);
1136
+ if (activeAskUserQuestionCalls.size === 0) {
1137
+ activeStore.recordStageAwaitingInput(runId, stageId, false);
1138
+ }
1139
+ }
1140
+ });
1141
+ const disposeInnerContext = async (): Promise<void> => {
1142
+ unsubscribeAskUserQuestionWatcher();
1143
+ activeAskUserQuestionCalls.clear();
1144
+ activeStore.recordStageAwaitingInput(runId, stageId, false);
1145
+ await innerCtx.__dispose();
1146
+ };
1147
+
1148
+ // e. Register a live stage-control handle so attached panes can
1149
+ // prompt/steer/pause/resume the underlying Pi session lazily.
1150
+ // Pending stages are attachable from the moment they are spawned;
1151
+ // the chat surface only realises the SDK session when the user
1152
+ // types or the workflow body invokes a tracked call.
1153
+ const stageRegistry = opts.stageControlRegistry ?? defaultStageControlRegistry;
1154
+ const handle: StageControlHandle = {
1155
+ runId,
1156
+ stageId,
1157
+ stageName: name,
1158
+ get status() {
1159
+ return stageSnapshot.status;
1160
+ },
1161
+ get sessionId() {
1162
+ return innerCtx.__sessionMeta().sessionId;
1163
+ },
1164
+ get sessionFile() {
1165
+ return innerCtx.__sessionMeta().sessionFile;
1166
+ },
1167
+ get isStreaming() {
1168
+ return innerCtx.isStreaming;
1169
+ },
1170
+ get messages() {
1171
+ return innerCtx.messages;
1172
+ },
1173
+ async ensureAttached() {
1174
+ await innerCtx.__ensureSession();
1175
+ const meta = innerCtx.__sessionMeta();
1176
+ if (meta.sessionId !== undefined || meta.sessionFile !== undefined) {
1177
+ activeStore.recordStageSession(runId, stageId, meta);
1178
+ }
1179
+ },
1180
+ async prompt(text: string) {
1181
+ await innerCtx.prompt(text);
1182
+ const meta = innerCtx.__sessionMeta();
1183
+ if (meta.sessionId !== undefined || meta.sessionFile !== undefined) {
1184
+ activeStore.recordStageSession(runId, stageId, meta);
1185
+ }
1186
+ },
1187
+ async steer(text: string) {
1188
+ await innerCtx.steer(text);
1189
+ },
1190
+ async followUp(text: string) {
1191
+ await innerCtx.followUp(text);
1192
+ },
1193
+ async pause() {
1194
+ const changed = activeStore.recordStagePaused(runId, stageId);
1195
+ if (changed) await cascadePauseFrom(stageId);
1196
+ await innerCtx.__requestPause();
1197
+ },
1198
+ async resume(message?: string) {
1199
+ const changed = activeStore.recordStageResumed(runId, stageId);
1200
+ if (changed) cascadeResumeFrom(stageId);
1201
+ await innerCtx.__resume(message);
1202
+ },
1203
+ subscribe(listener: AgentSessionEventListener) {
1204
+ return innerCtx.subscribe(listener);
1205
+ },
1206
+ };
1207
+ const unregisterStageHandle = stageRegistry.register(handle);
1208
+
1209
+ // f. Record stage start in store (as pending), call onStageStart.
1210
+ activeStore.recordStageStart(runId, stageSnapshot);
1211
+ opts.onStageStart?.(runId, stageSnapshot);
1212
+ const blockedBy = blockingAncestorFor(stageSnapshot);
1213
+ if (blockedBy !== undefined) {
1214
+ blockStageUntilCascadeRelease(stageSnapshot, blockedBy);
1215
+ }
1216
+
1217
+
1218
+ const runTrackedStageCall = async (call: () => Promise<string>): Promise<string> => {
1219
+ const barrier = releaseBarriers.get(stageId);
1220
+ if (barrier) {
1221
+ try {
1222
+ await barrier.promise;
1223
+ } catch (err) {
1224
+ activeStore.recordStageAttachable(runId, stageId, false);
1225
+ unregisterStageHandle();
1226
+ await disposeInnerContext();
1227
+ throw err;
1228
+ }
1229
+ }
1230
+
1231
+ // Block here until a concurrency slot is available for this run.
1232
+ await limiter.acquire();
1233
+
1234
+ stageSnapshot.status = "running";
1235
+ stageSnapshot.startedAt = Date.now();
1236
+ activeStore.recordStageStart(runId, stageSnapshot);
1237
+
1238
+ // Persistence: append stage.start entry
1239
+ if (opts.persistence) {
1240
+ appendStageStart(opts.persistence, {
1241
+ runId,
1242
+ stageId,
1243
+ name,
1244
+ parentIds: stageSnapshot.parentIds,
1245
+ ts: stageSnapshot.startedAt,
1246
+ });
1247
+ }
1248
+
1249
+ const mcpAllow = options?.mcp?.allow ?? null;
1250
+ const mcpDeny = options?.mcp?.deny ?? null;
1251
+ const hasMcpScope = mcpAllow !== null || mcpDeny !== null;
1252
+
1253
+ if (opts.mcp && hasMcpScope) {
1254
+ opts.mcp.setScope(stageId, mcpAllow, mcpDeny);
1255
+ }
1256
+
1257
+ try {
1258
+ const abortSession = (): void => {
1259
+ void innerCtx.abort().catch(() => {});
1260
+ };
1261
+ if (ownController.signal.aborted) abortSession();
1262
+ else ownController.signal.addEventListener("abort", abortSession, { once: true });
1263
+ let result = "";
1264
+ try {
1265
+ result = await raceAbort(call(), ownController.signal);
1266
+ } finally {
1267
+ ownController.signal.removeEventListener("abort", abortSession);
1268
+ }
1269
+ // Capture SDK session metadata into the snapshot so the
1270
+ // attached chat surface can reopen the persisted session
1271
+ // via SessionManager.open(sessionFile) post-mortem.
1272
+ {
1273
+ const meta = innerCtx.__sessionMeta();
1274
+ if (meta.sessionId !== undefined || meta.sessionFile !== undefined) {
1275
+ activeStore.recordStageSession(runId, stageId, meta);
1276
+ }
1277
+ const modelMeta = innerCtx.__modelFallbackMeta();
1278
+ if (modelMeta.model !== undefined) stageSnapshot.model = modelMeta.model;
1279
+ if (modelMeta.attemptedModels !== undefined) stageSnapshot.attemptedModels = modelMeta.attemptedModels;
1280
+ if (modelMeta.modelAttempts !== undefined) stageSnapshot.modelAttempts = modelMeta.modelAttempts;
1281
+ }
1282
+ stageSnapshot.status = "completed";
1283
+ const assistantText = innerCtx.__getLastAssistantText();
1284
+ if (assistantText !== undefined) {
1285
+ stageSnapshot.result = assistantText;
1286
+ }
1287
+ return result;
1288
+ } catch (err) {
1289
+ stageSnapshot.status = "failed";
1290
+ stageSnapshot.error = err instanceof Error ? err.message : String(err);
1291
+ throw err;
1292
+ } finally {
1293
+ stageSnapshot.endedAt = Date.now();
1294
+ stageSnapshot.durationMs =
1295
+ stageSnapshot.startedAt !== undefined
1296
+ ? stageSnapshot.endedAt - stageSnapshot.startedAt
1297
+ : undefined;
1298
+
1299
+ const finalModelMeta = innerCtx.__modelFallbackMeta();
1300
+ if (finalModelMeta.model !== undefined) stageSnapshot.model = finalModelMeta.model;
1301
+ if (finalModelMeta.attemptedModels !== undefined) stageSnapshot.attemptedModels = finalModelMeta.attemptedModels;
1302
+ if (finalModelMeta.modelAttempts !== undefined) stageSnapshot.modelAttempts = finalModelMeta.modelAttempts;
1303
+
1304
+ if (opts.mcp && hasMcpScope) {
1305
+ opts.mcp.clearScope(stageId);
1306
+ }
1307
+
1308
+ activeStore.recordStageEnd(runId, stageSnapshot);
1309
+ opts.onStageEnd?.(runId, stageSnapshot);
1310
+
1311
+ // Persistence: append stage.end entry
1312
+ if (opts.persistence) {
1313
+ appendStageEnd(opts.persistence, {
1314
+ runId,
1315
+ stageId,
1316
+ status: stageSnapshot.status,
1317
+ durationMs: stageSnapshot.durationMs,
1318
+ });
1319
+ }
1320
+
1321
+ tracker.onSettle(stageId);
1322
+ activeStore.recordStageAttachable(runId, stageId, false);
1323
+ unregisterStageHandle();
1324
+ try {
1325
+ await disposeInnerContext();
1326
+ } finally {
1327
+ limiter.release();
1328
+ }
1329
+ }
1330
+ };
1331
+
1332
+ const noticeValue = (value: unknown): string => {
1333
+ if (typeof value === "string") return value;
1334
+ if (value === undefined || value === null) return "";
1335
+ if (typeof value === "object") {
1336
+ const candidate = value as { id?: unknown; name?: unknown; label?: unknown };
1337
+ if (typeof candidate.id === "string") return candidate.id;
1338
+ if (typeof candidate.name === "string") return candidate.name;
1339
+ if (typeof candidate.label === "string") return candidate.label;
1340
+ }
1341
+ return String(value);
1342
+ };
1343
+
1344
+ const recordStageNotice = (notice: Omit<StageNotice, "id" | "ts">): void => {
1345
+ activeStore.recordStageNotice(runId, stageId, {
1346
+ id: crypto.randomUUID(),
1347
+ ts: Date.now(),
1348
+ ...notice,
1349
+ });
1350
+ };
1351
+
1352
+ const compactionMeta = (result: unknown): string | undefined => {
1353
+ if (result === undefined || result === null || typeof result !== "object") return undefined;
1354
+ const compaction = result as { tokensBefore?: unknown; tokensAfter?: unknown; tokensKept?: unknown };
1355
+ const before = typeof compaction.tokensBefore === "number" ? compaction.tokensBefore : undefined;
1356
+ const keptRaw = compaction.tokensKept ?? compaction.tokensAfter;
1357
+ const kept = typeof keptRaw === "number" ? keptRaw : undefined;
1358
+ if (before === undefined || kept === undefined) return undefined;
1359
+ return `${(before / 1000).toFixed(1)}k → ${(kept / 1000).toFixed(1)}k`;
1360
+ };
1361
+
1362
+ const stageContext: StageContext & Pick<InternalStageContext, "__modelFallbackMeta"> = {
1363
+ name: innerCtx.name,
1364
+ prompt: (text, promptOptions) => runTrackedStageCall(() => innerCtx.prompt(text, promptOptions)),
1365
+ complete: (text, completeOptions) => runTrackedStageCall(() => innerCtx.complete(text, completeOptions)),
1366
+ steer: (text) => innerCtx.steer(text),
1367
+ followUp: (text) => innerCtx.followUp(text),
1368
+ subscribe: (listener) => innerCtx.subscribe(listener),
1369
+ get sessionFile() { return innerCtx.sessionFile; },
1370
+ get sessionId() { return innerCtx.sessionId; },
1371
+ setModel: async (model) => {
1372
+ await innerCtx.__ensureSession();
1373
+ recordStageNotice({ kind: "model", from: noticeValue(innerCtx.model), to: noticeValue(model) });
1374
+ await innerCtx.setModel(model);
1375
+ },
1376
+ setThinkingLevel: (level) => {
1377
+ recordStageNotice({ kind: "thinking", from: noticeValue(innerCtx.thinkingLevel), to: noticeValue(level) });
1378
+ innerCtx.setThinkingLevel(level);
1379
+ },
1380
+ cycleModel: async () => {
1381
+ const from = noticeValue(innerCtx.model);
1382
+ const result = await innerCtx.cycleModel();
1383
+ recordStageNotice({ kind: "model", from, to: noticeValue(innerCtx.model) });
1384
+ return result;
1385
+ },
1386
+ cycleThinkingLevel: () => {
1387
+ const from = noticeValue(innerCtx.thinkingLevel);
1388
+ const result = innerCtx.cycleThinkingLevel();
1389
+ recordStageNotice({ kind: "thinking", from, to: noticeValue(innerCtx.thinkingLevel) });
1390
+ return result;
1391
+ },
1392
+ get agent() { return innerCtx.agent; },
1393
+ get model() { return innerCtx.model; },
1394
+ get thinkingLevel() { return innerCtx.thinkingLevel; },
1395
+ get messages() { return innerCtx.messages; },
1396
+ get isStreaming() { return innerCtx.isStreaming; },
1397
+ navigateTree: async (targetId, treeOptions) => {
1398
+ recordStageNotice({ kind: "tree", to: targetId });
1399
+ return innerCtx.navigateTree(targetId, treeOptions);
1400
+ },
1401
+ compact: async (customInstructions) => {
1402
+ const result = await innerCtx.compact(customInstructions);
1403
+ recordStageNotice({ kind: "compaction", to: "summarized", meta: compactionMeta(result) });
1404
+ return result;
1405
+ },
1406
+ abortCompaction: () => innerCtx.abortCompaction(),
1407
+ abort: async () => {
1408
+ recordStageNotice({ kind: "abort", to: "interrupted" });
1409
+ await innerCtx.abort();
1410
+ },
1411
+ __modelFallbackMeta: () => innerCtx.__modelFallbackMeta(),
1412
+ };
1413
+ return stageContext;
1414
+ },
1415
+
1416
+ async task(name: string, options: WorkflowTaskOptions): Promise<WorkflowTaskResult> {
1417
+ const stage = ctx.stage(name, taskStageOptions(options));
1418
+ const rawText = await stage.prompt(applyTaskContext(taskPrompt(options), taskPrevious(options)));
1419
+ const text = truncateTaskOutput(rawText, options.maxOutput);
1420
+ const sessionId = (() => {
1421
+ try {
1422
+ return stage.sessionId;
1423
+ } catch {
1424
+ return undefined;
1425
+ }
1426
+ })();
1427
+ const stageMeta = (stage as InternalStageContext).__modelFallbackMeta?.() ?? {};
1428
+ return {
1429
+ name,
1430
+ stageName: name,
1431
+ text,
1432
+ ...(sessionId !== undefined ? { sessionId } : {}),
1433
+ ...(stage.sessionFile !== undefined ? { sessionFile: stage.sessionFile } : {}),
1434
+ ...(stageMeta.model !== undefined ? { model: stageMeta.model } : {}),
1435
+ ...(stageMeta.attemptedModels !== undefined ? { attemptedModels: stageMeta.attemptedModels } : {}),
1436
+ ...(stageMeta.modelAttempts !== undefined ? { modelAttempts: stageMeta.modelAttempts } : {}),
1437
+ ...(stageMeta.warnings !== undefined ? { warnings: stageMeta.warnings } : {}),
1438
+ };
1439
+ },
1440
+
1441
+ async chain(steps: readonly WorkflowTaskStep[], options: WorkflowChainOptions = {}): Promise<WorkflowTaskResult[]> {
1442
+ const results: WorkflowTaskResult[] = [];
1443
+ for (let index = 0; index < steps.length; index += 1) {
1444
+ const step = steps[index]!;
1445
+ const explicitPrevious = taskPrevious(step);
1446
+ const previous = explicitPrevious ?? (index > 0 ? results[index - 1] : undefined);
1447
+ const prompt = replaceTaskPlaceholder(chainStepPrompt(step, index), options.task ?? "");
1448
+ results.push(await ctx.task(step.name, taskOptionsFromStep(step, prompt, previous)));
1449
+ }
1450
+ return results;
1451
+ },
1452
+
1453
+ async parallel(steps: readonly WorkflowTaskStep[], options: WorkflowParallelOptions = {}): Promise<WorkflowTaskResult[]> {
1454
+ const fallback = parallelFallbackTask(steps, options);
1455
+ return Promise.all(
1456
+ steps.map((step) => {
1457
+ const prompt = replaceTaskPlaceholder(step.prompt ?? step.task ?? fallback, options.task ?? fallback);
1458
+ return ctx.task(step.name, taskOptionsFromStep(step, prompt, taskPrevious(step)));
1459
+ }),
1460
+ );
1461
+ },
1462
+ };
1463
+
1464
+ // 6. Call def.run(ctx)
1465
+ try {
1466
+ if (opts.deferWorkflowStart === true) {
1467
+ await nextEventLoopTurn();
1468
+ if (ownController.signal.aborted) {
1469
+ return finalizeKilled(runId, runSnapshot, activeStore, opts.persistence, opts.onRunEnd);
1470
+ }
1471
+ }
1472
+
1473
+ const result = await def.run(ctx);
1474
+
1475
+ // Post-body abort check: if signal was aborted at any point before we record
1476
+ // completion, the run must be finalized as "killed", never "completed".
1477
+ if (ownController.signal.aborted) {
1478
+ return finalizeKilled(runId, runSnapshot, activeStore, opts.persistence, opts.onRunEnd);
1479
+ }
1480
+
1481
+ const recorded = activeStore.recordRunEnd(runId, "completed", result);
1482
+ opts.onRunEnd?.(runId, "completed", result);
1483
+
1484
+ appendRunEndWhenRecorded(opts.persistence, recorded, {
1485
+ runId,
1486
+ status: "completed",
1487
+ result,
1488
+ ts: Date.now(),
1489
+ });
1490
+
1491
+ return {
1492
+ runId,
1493
+ status: "completed",
1494
+ result,
1495
+ stages: [...runSnapshot.stages],
1496
+ };
1497
+ } catch (err) {
1498
+ if (ownController.signal.aborted) {
1499
+ return finalizeKilled(runId, runSnapshot, activeStore, opts.persistence, opts.onRunEnd);
1500
+ }
1501
+
1502
+ const errorMessage = err instanceof Error ? err.message : String(err);
1503
+
1504
+ const recorded = activeStore.recordRunEnd(runId, "failed", undefined, errorMessage);
1505
+ opts.onRunEnd?.(runId, "failed", undefined, errorMessage);
1506
+
1507
+ appendRunEndWhenRecorded(opts.persistence, recorded, {
1508
+ runId,
1509
+ status: "failed",
1510
+ ts: Date.now(),
1511
+ });
1512
+
1513
+ return {
1514
+ runId,
1515
+ status: "failed",
1516
+ error: errorMessage,
1517
+ stages: [...runSnapshot.stages],
1518
+ };
1519
+ } finally {
1520
+ opts.cancellation?.unregister(runId);
1521
+ }
1522
+ }