poly-weaver 0.2.5

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 (365) hide show
  1. package/README.md +388 -0
  2. package/dist/agents/implementors/adapter.d.ts +18 -0
  3. package/dist/agents/implementors/adapter.d.ts.map +1 -0
  4. package/dist/agents/implementors/adapter.js +36 -0
  5. package/dist/agents/implementors/adapter.js.map +1 -0
  6. package/dist/agents/implementors/dsl.d.ts +11 -0
  7. package/dist/agents/implementors/dsl.d.ts.map +1 -0
  8. package/dist/agents/implementors/dsl.js +9 -0
  9. package/dist/agents/implementors/dsl.js.map +1 -0
  10. package/dist/agents/implementors/handler.d.ts +10 -0
  11. package/dist/agents/implementors/handler.d.ts.map +1 -0
  12. package/dist/agents/implementors/handler.js +55 -0
  13. package/dist/agents/implementors/handler.js.map +1 -0
  14. package/dist/agents/implementors/index.d.ts +10 -0
  15. package/dist/agents/implementors/index.d.ts.map +1 -0
  16. package/dist/agents/implementors/index.js +21 -0
  17. package/dist/agents/implementors/index.js.map +1 -0
  18. package/dist/agents/implementors/prompts.d.ts +20 -0
  19. package/dist/agents/implementors/prompts.d.ts.map +1 -0
  20. package/dist/agents/implementors/prompts.js +72 -0
  21. package/dist/agents/implementors/prompts.js.map +1 -0
  22. package/dist/agents/implementors/types.d.ts +24 -0
  23. package/dist/agents/implementors/types.d.ts.map +1 -0
  24. package/dist/agents/implementors/types.js +2 -0
  25. package/dist/agents/implementors/types.js.map +1 -0
  26. package/dist/agents/index.d.ts +12 -0
  27. package/dist/agents/index.d.ts.map +1 -0
  28. package/dist/agents/index.js +25 -0
  29. package/dist/agents/index.js.map +1 -0
  30. package/dist/agents/planners/adapter.d.ts +22 -0
  31. package/dist/agents/planners/adapter.d.ts.map +1 -0
  32. package/dist/agents/planners/adapter.js +67 -0
  33. package/dist/agents/planners/adapter.js.map +1 -0
  34. package/dist/agents/planners/dsl.d.ts +13 -0
  35. package/dist/agents/planners/dsl.d.ts.map +1 -0
  36. package/dist/agents/planners/dsl.js +9 -0
  37. package/dist/agents/planners/dsl.js.map +1 -0
  38. package/dist/agents/planners/handler.d.ts +9 -0
  39. package/dist/agents/planners/handler.d.ts.map +1 -0
  40. package/dist/agents/planners/handler.js +86 -0
  41. package/dist/agents/planners/handler.js.map +1 -0
  42. package/dist/agents/planners/index.d.ts +10 -0
  43. package/dist/agents/planners/index.d.ts.map +1 -0
  44. package/dist/agents/planners/index.js +21 -0
  45. package/dist/agents/planners/index.js.map +1 -0
  46. package/dist/agents/planners/prompts.d.ts +30 -0
  47. package/dist/agents/planners/prompts.d.ts.map +1 -0
  48. package/dist/agents/planners/prompts.js +153 -0
  49. package/dist/agents/planners/prompts.js.map +1 -0
  50. package/dist/agents/planners/types.d.ts +37 -0
  51. package/dist/agents/planners/types.d.ts.map +1 -0
  52. package/dist/agents/planners/types.js +2 -0
  53. package/dist/agents/planners/types.js.map +1 -0
  54. package/dist/agents/registry.d.ts +29 -0
  55. package/dist/agents/registry.d.ts.map +1 -0
  56. package/dist/agents/registry.js +44 -0
  57. package/dist/agents/registry.js.map +1 -0
  58. package/dist/agents/reviewers/adapter.d.ts +10 -0
  59. package/dist/agents/reviewers/adapter.d.ts.map +1 -0
  60. package/dist/agents/reviewers/adapter.js +35 -0
  61. package/dist/agents/reviewers/adapter.js.map +1 -0
  62. package/dist/agents/reviewers/dsl.d.ts +12 -0
  63. package/dist/agents/reviewers/dsl.d.ts.map +1 -0
  64. package/dist/agents/reviewers/dsl.js +9 -0
  65. package/dist/agents/reviewers/dsl.js.map +1 -0
  66. package/dist/agents/reviewers/handler.d.ts +8 -0
  67. package/dist/agents/reviewers/handler.d.ts.map +1 -0
  68. package/dist/agents/reviewers/handler.js +48 -0
  69. package/dist/agents/reviewers/handler.js.map +1 -0
  70. package/dist/agents/reviewers/index.d.ts +10 -0
  71. package/dist/agents/reviewers/index.d.ts.map +1 -0
  72. package/dist/agents/reviewers/index.js +33 -0
  73. package/dist/agents/reviewers/index.js.map +1 -0
  74. package/dist/agents/reviewers/prompts.d.ts +25 -0
  75. package/dist/agents/reviewers/prompts.d.ts.map +1 -0
  76. package/dist/agents/reviewers/prompts.js +143 -0
  77. package/dist/agents/reviewers/prompts.js.map +1 -0
  78. package/dist/agents/reviewers/types.d.ts +35 -0
  79. package/dist/agents/reviewers/types.d.ts.map +1 -0
  80. package/dist/agents/reviewers/types.js +10 -0
  81. package/dist/agents/reviewers/types.js.map +1 -0
  82. package/dist/agents/runner.d.ts +62 -0
  83. package/dist/agents/runner.d.ts.map +1 -0
  84. package/dist/agents/runner.js +136 -0
  85. package/dist/agents/runner.js.map +1 -0
  86. package/dist/agents/simplifiers/adapter.d.ts +12 -0
  87. package/dist/agents/simplifiers/adapter.d.ts.map +1 -0
  88. package/dist/agents/simplifiers/adapter.js +27 -0
  89. package/dist/agents/simplifiers/adapter.js.map +1 -0
  90. package/dist/agents/simplifiers/dsl.d.ts +11 -0
  91. package/dist/agents/simplifiers/dsl.d.ts.map +1 -0
  92. package/dist/agents/simplifiers/dsl.js +9 -0
  93. package/dist/agents/simplifiers/dsl.js.map +1 -0
  94. package/dist/agents/simplifiers/handler.d.ts +9 -0
  95. package/dist/agents/simplifiers/handler.d.ts.map +1 -0
  96. package/dist/agents/simplifiers/handler.js +39 -0
  97. package/dist/agents/simplifiers/handler.js.map +1 -0
  98. package/dist/agents/simplifiers/index.d.ts +10 -0
  99. package/dist/agents/simplifiers/index.d.ts.map +1 -0
  100. package/dist/agents/simplifiers/index.js +20 -0
  101. package/dist/agents/simplifiers/index.js.map +1 -0
  102. package/dist/agents/simplifiers/prompts.d.ts +11 -0
  103. package/dist/agents/simplifiers/prompts.d.ts.map +1 -0
  104. package/dist/agents/simplifiers/prompts.js +24 -0
  105. package/dist/agents/simplifiers/prompts.js.map +1 -0
  106. package/dist/agents/simplifiers/types.d.ts +15 -0
  107. package/dist/agents/simplifiers/types.d.ts.map +1 -0
  108. package/dist/agents/simplifiers/types.js +2 -0
  109. package/dist/agents/simplifiers/types.js.map +1 -0
  110. package/dist/agents/whip-hint.d.ts +23 -0
  111. package/dist/agents/whip-hint.d.ts.map +1 -0
  112. package/dist/agents/whip-hint.js +41 -0
  113. package/dist/agents/whip-hint.js.map +1 -0
  114. package/dist/ansi.d.ts +39 -0
  115. package/dist/ansi.d.ts.map +1 -0
  116. package/dist/ansi.js +158 -0
  117. package/dist/ansi.js.map +1 -0
  118. package/dist/cli.d.ts +3 -0
  119. package/dist/cli.d.ts.map +1 -0
  120. package/dist/cli.js +309 -0
  121. package/dist/cli.js.map +1 -0
  122. package/dist/config.d.ts +41 -0
  123. package/dist/config.d.ts.map +1 -0
  124. package/dist/config.js +55 -0
  125. package/dist/config.js.map +1 -0
  126. package/dist/dsl.d.ts +25 -0
  127. package/dist/dsl.d.ts.map +1 -0
  128. package/dist/dsl.js +16 -0
  129. package/dist/dsl.js.map +1 -0
  130. package/dist/flow/artifacts.d.ts +13 -0
  131. package/dist/flow/artifacts.d.ts.map +1 -0
  132. package/dist/flow/artifacts.js +27 -0
  133. package/dist/flow/artifacts.js.map +1 -0
  134. package/dist/flow/built-in/default.d.ts +15 -0
  135. package/dist/flow/built-in/default.d.ts.map +1 -0
  136. package/dist/flow/built-in/default.js +123 -0
  137. package/dist/flow/built-in/default.js.map +1 -0
  138. package/dist/flow/built-in/default.ts +152 -0
  139. package/dist/flow/built-in/why-so-serious.d.ts +15 -0
  140. package/dist/flow/built-in/why-so-serious.d.ts.map +1 -0
  141. package/dist/flow/built-in/why-so-serious.js +147 -0
  142. package/dist/flow/built-in/why-so-serious.js.map +1 -0
  143. package/dist/flow/custom/AUTHORING.md +558 -0
  144. package/dist/flow/custom/index.d.ts +3 -0
  145. package/dist/flow/custom/index.d.ts.map +1 -0
  146. package/dist/flow/custom/index.js +2 -0
  147. package/dist/flow/custom/index.js.map +1 -0
  148. package/dist/flow/custom/load.d.ts +19 -0
  149. package/dist/flow/custom/load.d.ts.map +1 -0
  150. package/dist/flow/custom/load.js +117 -0
  151. package/dist/flow/custom/load.js.map +1 -0
  152. package/dist/flow/diagram.d.ts +37 -0
  153. package/dist/flow/diagram.d.ts.map +1 -0
  154. package/dist/flow/diagram.js +596 -0
  155. package/dist/flow/diagram.js.map +1 -0
  156. package/dist/flow/dsl.d.ts +65 -0
  157. package/dist/flow/dsl.d.ts.map +1 -0
  158. package/dist/flow/dsl.js +210 -0
  159. package/dist/flow/dsl.js.map +1 -0
  160. package/dist/flow/executor.d.ts +22 -0
  161. package/dist/flow/executor.d.ts.map +1 -0
  162. package/dist/flow/executor.js +185 -0
  163. package/dist/flow/executor.js.map +1 -0
  164. package/dist/flow/index.d.ts +16 -0
  165. package/dist/flow/index.d.ts.map +1 -0
  166. package/dist/flow/index.js +12 -0
  167. package/dist/flow/index.js.map +1 -0
  168. package/dist/flow/inspect.d.ts +21 -0
  169. package/dist/flow/inspect.d.ts.map +1 -0
  170. package/dist/flow/inspect.js +54 -0
  171. package/dist/flow/inspect.js.map +1 -0
  172. package/dist/flow/neighbors.d.ts +10 -0
  173. package/dist/flow/neighbors.d.ts.map +1 -0
  174. package/dist/flow/neighbors.js +48 -0
  175. package/dist/flow/neighbors.js.map +1 -0
  176. package/dist/flow/params.d.ts +21 -0
  177. package/dist/flow/params.d.ts.map +1 -0
  178. package/dist/flow/params.js +44 -0
  179. package/dist/flow/params.js.map +1 -0
  180. package/dist/flow/types.d.ts +159 -0
  181. package/dist/flow/types.d.ts.map +1 -0
  182. package/dist/flow/types.js +33 -0
  183. package/dist/flow/types.js.map +1 -0
  184. package/dist/flow-editor/index.d.ts +9 -0
  185. package/dist/flow-editor/index.d.ts.map +1 -0
  186. package/dist/flow-editor/index.js +6 -0
  187. package/dist/flow-editor/index.js.map +1 -0
  188. package/dist/flow-editor/llm.d.ts +33 -0
  189. package/dist/flow-editor/llm.d.ts.map +1 -0
  190. package/dist/flow-editor/llm.js +137 -0
  191. package/dist/flow-editor/llm.js.map +1 -0
  192. package/dist/flow-editor/names.d.ts +5 -0
  193. package/dist/flow-editor/names.d.ts.map +1 -0
  194. package/dist/flow-editor/names.js +21 -0
  195. package/dist/flow-editor/names.js.map +1 -0
  196. package/dist/flow-editor/save.d.ts +59 -0
  197. package/dist/flow-editor/save.d.ts.map +1 -0
  198. package/dist/flow-editor/save.js +143 -0
  199. package/dist/flow-editor/save.js.map +1 -0
  200. package/dist/flow-editor/tui.d.ts +56 -0
  201. package/dist/flow-editor/tui.d.ts.map +1 -0
  202. package/dist/flow-editor/tui.js +628 -0
  203. package/dist/flow-editor/tui.js.map +1 -0
  204. package/dist/flow-editor/validate.d.ts +39 -0
  205. package/dist/flow-editor/validate.d.ts.map +1 -0
  206. package/dist/flow-editor/validate.js +192 -0
  207. package/dist/flow-editor/validate.js.map +1 -0
  208. package/dist/git-info.d.ts +6 -0
  209. package/dist/git-info.d.ts.map +1 -0
  210. package/dist/git-info.js +26 -0
  211. package/dist/git-info.js.map +1 -0
  212. package/dist/orchestrator.d.ts +55 -0
  213. package/dist/orchestrator.d.ts.map +1 -0
  214. package/dist/orchestrator.js +240 -0
  215. package/dist/orchestrator.js.map +1 -0
  216. package/dist/preflight.d.ts +30 -0
  217. package/dist/preflight.d.ts.map +1 -0
  218. package/dist/preflight.js +107 -0
  219. package/dist/preflight.js.map +1 -0
  220. package/dist/preview-panel.d.ts +87 -0
  221. package/dist/preview-panel.d.ts.map +1 -0
  222. package/dist/preview-panel.js +418 -0
  223. package/dist/preview-panel.js.map +1 -0
  224. package/dist/prompts.d.ts +34 -0
  225. package/dist/prompts.d.ts.map +1 -0
  226. package/dist/prompts.js +67 -0
  227. package/dist/prompts.js.map +1 -0
  228. package/dist/providers/base-completion.d.ts +56 -0
  229. package/dist/providers/base-completion.d.ts.map +1 -0
  230. package/dist/providers/base-completion.js +111 -0
  231. package/dist/providers/base-completion.js.map +1 -0
  232. package/dist/providers/claude/completion.d.ts +28 -0
  233. package/dist/providers/claude/completion.d.ts.map +1 -0
  234. package/dist/providers/claude/completion.js +103 -0
  235. package/dist/providers/claude/completion.js.map +1 -0
  236. package/dist/providers/claude/index.d.ts +2 -0
  237. package/dist/providers/claude/index.d.ts.map +1 -0
  238. package/dist/providers/claude/index.js +2 -0
  239. package/dist/providers/claude/index.js.map +1 -0
  240. package/dist/providers/claude/session.d.ts +55 -0
  241. package/dist/providers/claude/session.d.ts.map +1 -0
  242. package/dist/providers/claude/session.js +172 -0
  243. package/dist/providers/claude/session.js.map +1 -0
  244. package/dist/providers/claude/strategy.d.ts +14 -0
  245. package/dist/providers/claude/strategy.d.ts.map +1 -0
  246. package/dist/providers/claude/strategy.js +38 -0
  247. package/dist/providers/claude/strategy.js.map +1 -0
  248. package/dist/providers/codex/completion.d.ts +21 -0
  249. package/dist/providers/codex/completion.d.ts.map +1 -0
  250. package/dist/providers/codex/completion.js +63 -0
  251. package/dist/providers/codex/completion.js.map +1 -0
  252. package/dist/providers/codex/index.d.ts +2 -0
  253. package/dist/providers/codex/index.d.ts.map +1 -0
  254. package/dist/providers/codex/index.js +2 -0
  255. package/dist/providers/codex/index.js.map +1 -0
  256. package/dist/providers/codex/session.d.ts +46 -0
  257. package/dist/providers/codex/session.d.ts.map +1 -0
  258. package/dist/providers/codex/session.js +151 -0
  259. package/dist/providers/codex/session.js.map +1 -0
  260. package/dist/providers/codex/strategy.d.ts +14 -0
  261. package/dist/providers/codex/strategy.d.ts.map +1 -0
  262. package/dist/providers/codex/strategy.js +41 -0
  263. package/dist/providers/codex/strategy.js.map +1 -0
  264. package/dist/providers/copilot/completion.d.ts +22 -0
  265. package/dist/providers/copilot/completion.d.ts.map +1 -0
  266. package/dist/providers/copilot/completion.js +65 -0
  267. package/dist/providers/copilot/completion.js.map +1 -0
  268. package/dist/providers/copilot/index.d.ts +2 -0
  269. package/dist/providers/copilot/index.d.ts.map +1 -0
  270. package/dist/providers/copilot/index.js +2 -0
  271. package/dist/providers/copilot/index.js.map +1 -0
  272. package/dist/providers/copilot/session.d.ts +39 -0
  273. package/dist/providers/copilot/session.d.ts.map +1 -0
  274. package/dist/providers/copilot/session.js +185 -0
  275. package/dist/providers/copilot/session.js.map +1 -0
  276. package/dist/providers/copilot/strategy.d.ts +14 -0
  277. package/dist/providers/copilot/strategy.d.ts.map +1 -0
  278. package/dist/providers/copilot/strategy.js +48 -0
  279. package/dist/providers/copilot/strategy.js.map +1 -0
  280. package/dist/providers/index.d.ts +8 -0
  281. package/dist/providers/index.d.ts.map +1 -0
  282. package/dist/providers/index.js +6 -0
  283. package/dist/providers/index.js.map +1 -0
  284. package/dist/providers/invoke.d.ts +14 -0
  285. package/dist/providers/invoke.d.ts.map +1 -0
  286. package/dist/providers/invoke.js +55 -0
  287. package/dist/providers/invoke.js.map +1 -0
  288. package/dist/providers/path-utils.d.ts +7 -0
  289. package/dist/providers/path-utils.d.ts.map +1 -0
  290. package/dist/providers/path-utils.js +9 -0
  291. package/dist/providers/path-utils.js.map +1 -0
  292. package/dist/providers/prompt-file.d.ts +8 -0
  293. package/dist/providers/prompt-file.d.ts.map +1 -0
  294. package/dist/providers/prompt-file.js +17 -0
  295. package/dist/providers/prompt-file.js.map +1 -0
  296. package/dist/providers/registry.d.ts +17 -0
  297. package/dist/providers/registry.d.ts.map +1 -0
  298. package/dist/providers/registry.js +49 -0
  299. package/dist/providers/registry.js.map +1 -0
  300. package/dist/providers/types.d.ts +145 -0
  301. package/dist/providers/types.d.ts.map +1 -0
  302. package/dist/providers/types.js +5 -0
  303. package/dist/providers/types.js.map +1 -0
  304. package/dist/providers/version.d.ts +11 -0
  305. package/dist/providers/version.d.ts.map +1 -0
  306. package/dist/providers/version.js +31 -0
  307. package/dist/providers/version.js.map +1 -0
  308. package/dist/pty/exit.d.ts +12 -0
  309. package/dist/pty/exit.d.ts.map +1 -0
  310. package/dist/pty/exit.js +43 -0
  311. package/dist/pty/exit.js.map +1 -0
  312. package/dist/pty/spawn.d.ts +20 -0
  313. package/dist/pty/spawn.d.ts.map +1 -0
  314. package/dist/pty/spawn.js +163 -0
  315. package/dist/pty/spawn.js.map +1 -0
  316. package/dist/pty/types.d.ts +44 -0
  317. package/dist/pty/types.d.ts.map +1 -0
  318. package/dist/pty/types.js +2 -0
  319. package/dist/pty/types.js.map +1 -0
  320. package/dist/session/dir.d.ts +19 -0
  321. package/dist/session/dir.d.ts.map +1 -0
  322. package/dist/session/dir.js +31 -0
  323. package/dist/session/dir.js.map +1 -0
  324. package/dist/session/locator.d.ts +28 -0
  325. package/dist/session/locator.d.ts.map +1 -0
  326. package/dist/session/locator.js +88 -0
  327. package/dist/session/locator.js.map +1 -0
  328. package/dist/session/reader.d.ts +12 -0
  329. package/dist/session/reader.d.ts.map +1 -0
  330. package/dist/session/reader.js +94 -0
  331. package/dist/session/reader.js.map +1 -0
  332. package/dist/startup-tui.d.ts +75 -0
  333. package/dist/startup-tui.d.ts.map +1 -0
  334. package/dist/startup-tui.js +504 -0
  335. package/dist/startup-tui.js.map +1 -0
  336. package/dist/status-bar.d.ts +29 -0
  337. package/dist/status-bar.d.ts.map +1 -0
  338. package/dist/status-bar.js +135 -0
  339. package/dist/status-bar.js.map +1 -0
  340. package/dist/terminal-input.d.ts +51 -0
  341. package/dist/terminal-input.d.ts.map +1 -0
  342. package/dist/terminal-input.js +212 -0
  343. package/dist/terminal-input.js.map +1 -0
  344. package/dist/user/dsl.d.ts +13 -0
  345. package/dist/user/dsl.d.ts.map +1 -0
  346. package/dist/user/dsl.js +19 -0
  347. package/dist/user/dsl.js.map +1 -0
  348. package/dist/user/handler.d.ts +16 -0
  349. package/dist/user/handler.d.ts.map +1 -0
  350. package/dist/user/handler.js +49 -0
  351. package/dist/user/handler.js.map +1 -0
  352. package/dist/user/index.d.ts +5 -0
  353. package/dist/user/index.d.ts.map +1 -0
  354. package/dist/user/index.js +4 -0
  355. package/dist/user/index.js.map +1 -0
  356. package/dist/user/prompt.d.ts +86 -0
  357. package/dist/user/prompt.d.ts.map +1 -0
  358. package/dist/user/prompt.js +320 -0
  359. package/dist/user/prompt.js.map +1 -0
  360. package/dist/version.d.ts +2 -0
  361. package/dist/version.d.ts.map +1 -0
  362. package/dist/version.js +4 -0
  363. package/dist/version.js.map +1 -0
  364. package/package.json +50 -0
  365. package/schemas/review-verdict.json +41 -0
@@ -0,0 +1,39 @@
1
+ import type { FlowTemplate, FlowDefinition } from "../flow/types.js";
2
+ export type ValidationSuccess = {
3
+ ok: true;
4
+ template: FlowTemplate;
5
+ flow: FlowDefinition;
6
+ diagramLines: string[];
7
+ code: string;
8
+ };
9
+ export type ValidationFailure = {
10
+ ok: false;
11
+ error: string;
12
+ phase: "import" | "validate" | "build" | "name-patch";
13
+ };
14
+ export type ValidationResult = ValidationSuccess | ValidationFailure;
15
+ /**
16
+ * Replace the flow name in generated source code.
17
+ * Patches TWO locations to maintain the template.name === flow.name invariant:
18
+ * 1. Template object literal: name: "currentName" → name: "expectedName"
19
+ * 2. defineFlow call: defineFlow("currentName", ...) → defineFlow("expectedName", ...)
20
+ * Throws if either location cannot be found.
21
+ */
22
+ export declare function patchFlowName(code: string, currentName: string, expectedName: string): string;
23
+ /**
24
+ * Validate LLM-generated flow code:
25
+ * 1. Write to temp file
26
+ * 2. Dynamic import()
27
+ * 3. Extract factory (default or createTemplate export)
28
+ * 4. Call factory(flowDSL) → FlowTemplate
29
+ * 5. validateTemplate() shape check
30
+ * 6. Name consistency check: if template.name !== flowName,
31
+ * call patchFlowName(code, template.name, flowName),
32
+ * re-import and re-validate the patched code
33
+ * 7. Call build() with default param values → FlowDefinition
34
+ * 8. Build-time name invariant: assert flow.name === flowName
35
+ * 9. Render diagram from FlowDefinition
36
+ * 10. Return ValidationSuccess with final code + template + flow + diagram
37
+ */
38
+ export declare function validateFlowCode(code: string, flowName: string, diagramWidth: number): Promise<ValidationResult>;
39
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/flow-editor/validate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIrE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAQrE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CA8BR;AAqBD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAkI3B"}
@@ -0,0 +1,192 @@
1
+ import { writeFile, unlink, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { pathToFileURL } from "node:url";
5
+ import { randomBytes } from "node:crypto";
6
+ import { flowDSL } from "../dsl.js";
7
+ import { validateTemplate } from "../flow/custom/index.js";
8
+ import { renderFlowDiagram } from "../flow/diagram.js";
9
+ // ─── Name Patching ───────────────────────────────────────────────────────
10
+ function escapeRegex(s) {
11
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12
+ }
13
+ /**
14
+ * Replace the flow name in generated source code.
15
+ * Patches TWO locations to maintain the template.name === flow.name invariant:
16
+ * 1. Template object literal: name: "currentName" → name: "expectedName"
17
+ * 2. defineFlow call: defineFlow("currentName", ...) → defineFlow("expectedName", ...)
18
+ * Throws if either location cannot be found.
19
+ */
20
+ export function patchFlowName(code, currentName, expectedName) {
21
+ const escaped = escapeRegex(currentName);
22
+ // 1. Patch template object literal: name: "currentName" or name: 'currentName'
23
+ const nameFieldPattern = new RegExp(`(name\\s*:\\s*)(['"])${escaped}\\2`);
24
+ const nameFieldMatch = code.match(nameFieldPattern);
25
+ if (!nameFieldMatch) {
26
+ throw new Error(`Could not find name: "${currentName}" in template object literal`);
27
+ }
28
+ const q1 = nameFieldMatch[2];
29
+ code = code.replace(nameFieldPattern, `$1${q1}${expectedName}${q1}`);
30
+ // 2. Patch defineFlow call: defineFlow("currentName", ...) or defineFlow('currentName', ...)
31
+ const defineFlowPattern = new RegExp(`(defineFlow\\s*\\(\\s*)(['"])${escaped}\\2`);
32
+ const defineFlowMatch = code.match(defineFlowPattern);
33
+ if (!defineFlowMatch) {
34
+ throw new Error(`Could not find defineFlow("${currentName}", ...) call`);
35
+ }
36
+ const q2 = defineFlowMatch[2];
37
+ code = code.replace(defineFlowPattern, `$1${q2}${expectedName}${q2}`);
38
+ return code;
39
+ }
40
+ // ─── Validation Pipeline ─────────────────────────────────────────────────
41
+ async function writeTempFile(code) {
42
+ const dir = join(tmpdir(), "poly-weaver-validate");
43
+ await mkdir(dir, { recursive: true });
44
+ const name = `flow-${randomBytes(8).toString("hex")}.mjs`;
45
+ const filePath = join(dir, name);
46
+ await writeFile(filePath, code, "utf-8");
47
+ return filePath;
48
+ }
49
+ async function cleanupTempFile(filePath) {
50
+ try {
51
+ await unlink(filePath);
52
+ }
53
+ catch {
54
+ // Best-effort cleanup
55
+ }
56
+ }
57
+ /**
58
+ * Validate LLM-generated flow code:
59
+ * 1. Write to temp file
60
+ * 2. Dynamic import()
61
+ * 3. Extract factory (default or createTemplate export)
62
+ * 4. Call factory(flowDSL) → FlowTemplate
63
+ * 5. validateTemplate() shape check
64
+ * 6. Name consistency check: if template.name !== flowName,
65
+ * call patchFlowName(code, template.name, flowName),
66
+ * re-import and re-validate the patched code
67
+ * 7. Call build() with default param values → FlowDefinition
68
+ * 8. Build-time name invariant: assert flow.name === flowName
69
+ * 9. Render diagram from FlowDefinition
70
+ * 10. Return ValidationSuccess with final code + template + flow + diagram
71
+ */
72
+ export async function validateFlowCode(code, flowName, diagramWidth) {
73
+ let filePath = await writeTempFile(code);
74
+ let finalCode = code;
75
+ try {
76
+ // Step 2-3: Import and extract factory
77
+ let mod;
78
+ try {
79
+ const url = pathToFileURL(filePath).href + `?t=${Date.now()}`;
80
+ mod = await import(url);
81
+ }
82
+ catch (err) {
83
+ return {
84
+ ok: false,
85
+ error: `Import error: ${err instanceof Error ? err.message : String(err)}`,
86
+ phase: "import",
87
+ };
88
+ }
89
+ const factory = (mod.default ?? mod.createTemplate);
90
+ if (typeof factory !== "function") {
91
+ return {
92
+ ok: false,
93
+ error: "No default export or createTemplate function found",
94
+ phase: "validate",
95
+ };
96
+ }
97
+ // Step 4-5: Create template and validate
98
+ let template;
99
+ try {
100
+ const raw = factory(flowDSL);
101
+ template = validateTemplate(raw, "generated");
102
+ }
103
+ catch (err) {
104
+ return {
105
+ ok: false,
106
+ error: `Validation error: ${err instanceof Error ? err.message : String(err)}`,
107
+ phase: "validate",
108
+ };
109
+ }
110
+ // Step 6: Name consistency check + patching
111
+ if (template.name !== flowName) {
112
+ try {
113
+ finalCode = patchFlowName(code, template.name, flowName);
114
+ }
115
+ catch (err) {
116
+ return {
117
+ ok: false,
118
+ error: `Name patch error: ${err instanceof Error ? err.message : String(err)}`,
119
+ phase: "name-patch",
120
+ };
121
+ }
122
+ // Re-import patched code
123
+ await cleanupTempFile(filePath);
124
+ filePath = await writeTempFile(finalCode);
125
+ try {
126
+ const url = pathToFileURL(filePath).href + `?t=${Date.now()}`;
127
+ mod = await import(url);
128
+ }
129
+ catch (err) {
130
+ return {
131
+ ok: false,
132
+ error: `Import error after name patching: ${err instanceof Error ? err.message : String(err)}`,
133
+ phase: "name-patch",
134
+ };
135
+ }
136
+ const patchedFactory = (mod.default ?? mod.createTemplate);
137
+ if (typeof patchedFactory !== "function") {
138
+ return {
139
+ ok: false,
140
+ error: "Patched code lost its factory export",
141
+ phase: "name-patch",
142
+ };
143
+ }
144
+ try {
145
+ const raw = patchedFactory(flowDSL);
146
+ template = validateTemplate(raw, "generated-patched");
147
+ }
148
+ catch (err) {
149
+ return {
150
+ ok: false,
151
+ error: `Validation error after name patching: ${err instanceof Error ? err.message : String(err)}`,
152
+ phase: "name-patch",
153
+ };
154
+ }
155
+ }
156
+ // Step 7: Build with default values
157
+ let flow;
158
+ try {
159
+ const defaults = Object.fromEntries(template.params.map((p) => [p.key, p.default]));
160
+ flow = template.build(defaults);
161
+ }
162
+ catch (err) {
163
+ return {
164
+ ok: false,
165
+ error: `Build error: ${err instanceof Error ? err.message : String(err)}`,
166
+ phase: "build",
167
+ };
168
+ }
169
+ // Step 8: Post-build name invariant
170
+ if (flow.name !== flowName) {
171
+ return {
172
+ ok: false,
173
+ error: `Flow name invariant violated: expected "${flowName}" but got "${flow.name}" after build`,
174
+ phase: "name-patch",
175
+ };
176
+ }
177
+ // Step 9: Render diagram
178
+ const diagramLines = renderFlowDiagram(flow, diagramWidth);
179
+ // Step 10: Success
180
+ return {
181
+ ok: true,
182
+ template,
183
+ flow,
184
+ diagramLines,
185
+ code: finalCode,
186
+ };
187
+ }
188
+ finally {
189
+ await cleanupTempFile(filePath);
190
+ }
191
+ }
192
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/flow-editor/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface GitInfo {
2
+ branch: string;
3
+ isWorktree: boolean;
4
+ }
5
+ export declare function getGitInfo(cwd: string): Promise<GitInfo | null>;
6
+ //# sourceMappingURL=git-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-info.d.ts","sourceRoot":"","sources":["../src/git-info.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAeD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAcrE"}
@@ -0,0 +1,26 @@
1
+ import { execFile } from "node:child_process";
2
+ import { normalizePath } from "./providers/path-utils.js";
3
+ function exec(cmd, args, cwd) {
4
+ return new Promise((resolve, reject) => {
5
+ execFile(cmd, args, { cwd, timeout: 5000 }, (err, stdout) => {
6
+ if (err)
7
+ return reject(err);
8
+ resolve(stdout.trim());
9
+ });
10
+ });
11
+ }
12
+ export async function getGitInfo(cwd) {
13
+ try {
14
+ const [branch, gitDir, commonDir] = await Promise.all([
15
+ exec("git", ["rev-parse", "--abbrev-ref", "HEAD"], cwd),
16
+ exec("git", ["rev-parse", "--git-dir"], cwd),
17
+ exec("git", ["rev-parse", "--git-common-dir"], cwd),
18
+ ]);
19
+ const isWorktree = normalizePath(gitDir) !== normalizePath(commonDir);
20
+ return { branch, isWorktree };
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ //# sourceMappingURL=git-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-info.js","sourceRoot":"","sources":["../src/git-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAO1D,SAAS,IAAI,CACX,GAAW,EACX,IAAc,EACd,GAAW;IAEX,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,GAAG;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;YACvD,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC;SACpD,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,SAAS,CAAC,CAAC;QAEtE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { ReviewVerdict } from "./agents/reviewers/types.js";
2
+ import { type UserPromptHandler } from "./user/prompt.js";
3
+ import { type FeatureGates } from "./providers/registry.js";
4
+ import type { StatusBar } from "./status-bar.js";
5
+ import { type FlowTemplate, type FlowParamValues } from "./flow/types.js";
6
+ export declare class PlannerContractError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class ReviewerContractError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ export interface OrchestratorResult {
13
+ /** The final plan text. */
14
+ plan: string;
15
+ /** Total plan-review iterations. */
16
+ iterations: number;
17
+ /** Overall success. True when plan and implementation (if configured) are approved. */
18
+ approved: boolean;
19
+ /** The final plan-review verdict. */
20
+ verdict?: ReviewVerdict;
21
+ /** Implementation-review outcome if implementation phase ran. */
22
+ implementation?: {
23
+ approved: boolean;
24
+ iterations: number;
25
+ verdict?: ReviewVerdict;
26
+ };
27
+ }
28
+ /**
29
+ * Resolve task content: if the task looks like a file path and exists, read it.
30
+ * Otherwise, treat it as inline task text.
31
+ */
32
+ export declare function resolveTaskContent(task: string): Promise<string>;
33
+ export declare function runPhaseWithRetries<T>(phaseName: string, run: (attempt: number) => Promise<T>, maxAttempts?: number): Promise<T>;
34
+ export declare function logPhase(phase: string, message: string): void;
35
+ export declare function readPlanFromContract(planFile: string): Promise<string>;
36
+ export declare function removeFileIfExists(path: string): Promise<void>;
37
+ export declare function readVerdictFromContract(verdictFile: string): Promise<ReviewVerdict>;
38
+ export interface TemplateOrchestratorOptions {
39
+ template: FlowTemplate;
40
+ paramValues: FlowParamValues;
41
+ task?: string;
42
+ verbose?: boolean;
43
+ opinionless?: boolean;
44
+ yolo?: boolean;
45
+ whipMode?: boolean;
46
+ workdir?: string;
47
+ statusBar?: StatusBar;
48
+ }
49
+ export declare function createUserPromptHandler(auto: boolean, gates: FeatureGates): UserPromptHandler;
50
+ /**
51
+ * Orchestrate using a FlowTemplate. Driver params are used to create
52
+ * drivers dynamically; structure params shape the flow via build().
53
+ */
54
+ export declare function orchestrateWithTemplate(opts: TemplateOrchestratorOptions): Promise<OrchestratorResult>;
55
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAQjE,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAOjD,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,QAAQ,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,iEAAiE;IACjE,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,aAAa,CAAC;KACzB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CActE;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACpC,WAAW,SAAI,GACd,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB5E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE;AAcD,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmCzF;AAID,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,YAAY,GAClB,iBAAiB,CAEnB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAsG7B"}
@@ -0,0 +1,240 @@
1
+ import _Ajv from "ajv";
2
+ const Ajv = _Ajv.default ?? _Ajv;
3
+ import { createSessionDir, cleanupSessionDir, } from "./session/dir.js";
4
+ import { getVerdictSchema } from "./prompts.js";
5
+ import { readFile, writeFile, unlink } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { AutoUserPrompt, InteractiveUserPrompt } from "./user/prompt.js";
8
+ import { computeFeatureGates } from "./providers/registry.js";
9
+ import { UserRoleHandler } from "./user/handler.js";
10
+ import { dim, reset, cyan } from "./ansi.js";
11
+ import { MapArtifactStore } from "./flow/artifacts.js";
12
+ import { FlowExecutor } from "./flow/executor.js";
13
+ import { inspectFlow } from "./flow/inspect.js";
14
+ import { computeConsumerMap } from "./flow/neighbors.js";
15
+ import { createHandler } from "./agents/registry.js";
16
+ import { TASK, handlerKey, } from "./flow/types.js";
17
+ export class PlannerContractError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "PlannerContractError";
21
+ }
22
+ }
23
+ export class ReviewerContractError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = "ReviewerContractError";
27
+ }
28
+ }
29
+ /**
30
+ * Resolve task content: if the task looks like a file path and exists, read it.
31
+ * Otherwise, treat it as inline task text.
32
+ */
33
+ export async function resolveTaskContent(task) {
34
+ if (task.endsWith(".md") ||
35
+ task.endsWith(".txt") ||
36
+ task.includes("/") ||
37
+ task.includes("\\")) {
38
+ try {
39
+ return await readFile(task, "utf-8");
40
+ }
41
+ catch {
42
+ // Not a valid file path, treat as inline text
43
+ }
44
+ }
45
+ return task;
46
+ }
47
+ export async function runPhaseWithRetries(phaseName, run, maxAttempts = 3) {
48
+ let lastError;
49
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
50
+ try {
51
+ return await run(attempt);
52
+ }
53
+ catch (err) {
54
+ lastError = err;
55
+ if (attempt < maxAttempts) {
56
+ const msg = err instanceof Error ? err.message : String(err);
57
+ console.warn(`[poly-weaver] ${phaseName} failed (attempt ${attempt}/${maxAttempts}): ${msg}. Retrying...`);
58
+ }
59
+ }
60
+ }
61
+ throw lastError instanceof Error
62
+ ? lastError
63
+ : new Error(`[poly-weaver] ${phaseName} failed after ${maxAttempts} attempts`);
64
+ }
65
+ export function logPhase(phase, message) {
66
+ console.log(`\n${dim}[poly-weaver]${reset} ${cyan}${phase}${reset}: ${message}\n`);
67
+ }
68
+ export async function readPlanFromContract(planFile) {
69
+ let content;
70
+ try {
71
+ content = await readFile(planFile, "utf-8");
72
+ }
73
+ catch (err) {
74
+ throw new PlannerContractError(`Planner did not produce plan output file: ${planFile}`);
75
+ }
76
+ const trimmed = content.trim();
77
+ if (!trimmed) {
78
+ throw new PlannerContractError(`Planner produced an empty plan file: ${planFile}`);
79
+ }
80
+ return content;
81
+ }
82
+ export async function removeFileIfExists(path) {
83
+ try {
84
+ await unlink(path);
85
+ }
86
+ catch (err) {
87
+ if (err.code !== "ENOENT")
88
+ throw err;
89
+ }
90
+ }
91
+ let cachedValidator = null;
92
+ async function getVerdictValidator() {
93
+ if (!cachedValidator) {
94
+ const schemaText = await getVerdictSchema();
95
+ const schema = JSON.parse(schemaText);
96
+ const ajv = new Ajv();
97
+ cachedValidator = ajv.compile(schema);
98
+ }
99
+ return cachedValidator;
100
+ }
101
+ export async function readVerdictFromContract(verdictFile) {
102
+ let content;
103
+ try {
104
+ content = await readFile(verdictFile, "utf-8");
105
+ }
106
+ catch {
107
+ throw new ReviewerContractError(`Reviewer did not produce verdict output file: ${verdictFile}`);
108
+ }
109
+ const trimmed = content.trim();
110
+ if (!trimmed) {
111
+ throw new ReviewerContractError(`Reviewer produced an empty verdict file: ${verdictFile}`);
112
+ }
113
+ let parsed;
114
+ try {
115
+ parsed = JSON.parse(trimmed);
116
+ }
117
+ catch {
118
+ throw new ReviewerContractError(`Reviewer produced invalid JSON in verdict file: ${verdictFile}`);
119
+ }
120
+ const validate = await getVerdictValidator();
121
+ if (!validate(parsed)) {
122
+ const errors = validate.errors
123
+ ?.map((e) => `${e.instancePath} ${e.message}`)
124
+ .join("; ");
125
+ throw new ReviewerContractError(`Verdict validation failed: ${errors}`);
126
+ }
127
+ return parsed;
128
+ }
129
+ export function createUserPromptHandler(auto, gates) {
130
+ return auto ? new AutoUserPrompt() : new InteractiveUserPrompt(gates);
131
+ }
132
+ /**
133
+ * Orchestrate using a FlowTemplate. Driver params are used to create
134
+ * drivers dynamically; structure params shape the flow via build().
135
+ */
136
+ export async function orchestrateWithTemplate(opts) {
137
+ const gates = computeFeatureGates(String(opts.paramValues.planner));
138
+ const handler = createUserPromptHandler(!!opts.paramValues.auto, gates);
139
+ const sessionDir = await createSessionDir(opts.workdir ?? process.cwd());
140
+ try {
141
+ const artifacts = new MapArtifactStore();
142
+ if (opts.task) {
143
+ const taskContent = await resolveTaskContent(opts.task);
144
+ const taskFile = join(sessionDir, "task.md");
145
+ await writeFile(taskFile, taskContent, "utf-8");
146
+ artifacts.set(TASK, { file: taskFile, text: taskContent });
147
+ }
148
+ const workdir = opts.workdir ?? process.cwd();
149
+ // Build flow FIRST so we can scan steps for handler creation
150
+ const flow = opts.template.build(opts.paramValues);
151
+ // Build handler map by scanning flow steps
152
+ const handlers = new Map();
153
+ for (const step of collectAgentSteps(flow.steps)) {
154
+ const key = handlerKey(step);
155
+ if (handlers.has(key))
156
+ continue;
157
+ handlers.set(key, createHandler(step.role, step.driver, workdir, {
158
+ opinionless: opts.opinionless, variant: step.variant, yolo: opts.yolo,
159
+ }));
160
+ }
161
+ handlers.set("user", new UserRoleHandler(handler));
162
+ // Build context
163
+ const ctx = {
164
+ sessionDir,
165
+ artifacts,
166
+ sessionIds: new Map(),
167
+ loopIterations: new Map(),
168
+ loopCycle: new Map(),
169
+ totalIterations: 0,
170
+ nextClarificationNumber: 1,
171
+ statusBar: opts.statusBar,
172
+ verbose: opts.verbose ?? false,
173
+ consumerMap: computeConsumerMap(flow),
174
+ whipMode: opts.whipMode ?? true,
175
+ };
176
+ // Execute
177
+ const executor = new FlowExecutor(flow, handlers, opts.statusBar);
178
+ await executor.execute(ctx);
179
+ // Extract results via semantic flow inspection
180
+ const { loops } = inspectFlow(flow);
181
+ // Plan loops: all loops that produce a "plan" write key
182
+ const planLoopsAll = loops.filter(l => "plan" in l.ownWrites);
183
+ // Use the deepest plan loop for iteration count (inner agent-review loop in interactive mode)
184
+ const agentReviewLoop = planLoopsAll.length > 0
185
+ ? planLoopsAll.reduce((deepest, l) => l.depth > deepest.depth ? l : deepest)
186
+ : undefined;
187
+ // Use the shallowest plan loop for artifact extraction (outer loop has plan + verdict)
188
+ const planLoop = planLoopsAll.length > 0
189
+ ? planLoopsAll.reduce((shallowest, l) => l.depth < shallowest.depth ? l : shallowest)
190
+ : undefined;
191
+ const planText = planLoop
192
+ ? ctx.artifacts.getText(planLoop.ownWrites.plan) ?? ""
193
+ : "";
194
+ const planVerdictData = planLoop && "verdict" in planLoop.ownWrites
195
+ ? ctx.artifacts.getData(planLoop.ownWrites.verdict)
196
+ : undefined;
197
+ const planIterations = agentReviewLoop
198
+ ? ctx.loopIterations.get(agentReviewLoop.id) ?? ctx.totalIterations
199
+ : ctx.totalIterations;
200
+ const result = {
201
+ plan: planText,
202
+ iterations: planIterations,
203
+ approved: planVerdictData?.approved ?? false,
204
+ verdict: planVerdictData,
205
+ };
206
+ // Impl loop: a different top-level loop with "verdict" but not the plan loop
207
+ const topLoops = loops.filter(l => l.depth === 0);
208
+ const implLoop = topLoops.find(l => l !== planLoop && "verdict" in l.ownWrites);
209
+ if (implLoop) {
210
+ const implVerdictData = ctx.artifacts.getData(implLoop.ownWrites.verdict);
211
+ if (implVerdictData !== undefined) {
212
+ const implIterations = ctx.loopIterations.get(implLoop.id) ?? 0;
213
+ result.implementation = {
214
+ approved: implVerdictData.approved ?? false,
215
+ iterations: implIterations,
216
+ verdict: implVerdictData,
217
+ };
218
+ result.approved = result.approved && (implVerdictData.approved ?? false);
219
+ }
220
+ }
221
+ return result;
222
+ }
223
+ finally {
224
+ await cleanupSessionDir(sessionDir, { preserve: opts.verbose });
225
+ }
226
+ }
227
+ /** Recursively walk flow steps and yield all AgentStep nodes. */
228
+ function collectAgentSteps(steps) {
229
+ const result = [];
230
+ for (const step of steps) {
231
+ if (step.type === "agent") {
232
+ result.push(step);
233
+ }
234
+ else if (step.type === "loop") {
235
+ result.push(...collectAgentSteps(step.steps));
236
+ }
237
+ }
238
+ return result;
239
+ }
240
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface PreflightNeeds {
2
+ needClaude: boolean;
3
+ needCodex: boolean;
4
+ needCopilot: boolean;
5
+ }
6
+ /**
7
+ * Compute which CLI tools are needed based on the driver configuration.
8
+ * Shared by cli.ts and sanity-check.ts to avoid duplicating the logic.
9
+ */
10
+ export declare function computePreflightNeeds(opts: {
11
+ planner: string;
12
+ reviewer: string;
13
+ implementor: string;
14
+ simplifier?: string;
15
+ planOnly?: boolean;
16
+ }): PreflightNeeds;
17
+ export interface PreflightResult {
18
+ ok: boolean;
19
+ errors: string[];
20
+ versions: Map<string, string>;
21
+ }
22
+ /**
23
+ * Run preflight checks to verify required CLIs and dependencies are available.
24
+ */
25
+ export declare function runPreflight(opts: {
26
+ needClaude: boolean;
27
+ needCodex: boolean;
28
+ needCopilot: boolean;
29
+ }): Promise<PreflightResult>;
30
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,cAAc,CAkBjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoE3B"}