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,49 @@
1
+ import { ClaudeStrategy } from "./claude/index.js";
2
+ import { CodexStrategy } from "./codex/index.js";
3
+ import { CopilotStrategy } from "./copilot/index.js";
4
+ let strategies;
5
+ export function builtinStrategies() {
6
+ if (!strategies) {
7
+ const entries = [
8
+ ["claude", new ClaudeStrategy()],
9
+ ["codex", new CodexStrategy()],
10
+ ["copilot", new CopilotStrategy()],
11
+ ];
12
+ strategies = new Map(entries);
13
+ }
14
+ return strategies;
15
+ }
16
+ export function setProviderVersions(versions) {
17
+ const map = builtinStrategies();
18
+ for (const [name, version] of versions) {
19
+ const strategy = map.get(name);
20
+ if (strategy)
21
+ strategy.version = version;
22
+ }
23
+ }
24
+ /** Safe default: all gates off. */
25
+ export const DEFAULT_GATES = { nativePlanMode: false };
26
+ /**
27
+ * Derive feature gates from the resolved provider strategy.
28
+ * Returns DEFAULT_GATES for unknown providers (safe for mock/test drivers).
29
+ */
30
+ export function computeFeatureGates(plannerName) {
31
+ try {
32
+ const strategy = resolveProvider(plannerName);
33
+ return {
34
+ nativePlanMode: !!strategy.planMode.nativePlanFile,
35
+ };
36
+ }
37
+ catch {
38
+ return DEFAULT_GATES;
39
+ }
40
+ }
41
+ export function resolveProvider(name) {
42
+ const map = builtinStrategies();
43
+ const strategy = map.get(name);
44
+ if (!strategy) {
45
+ throw new Error(`Unknown provider: "${name}". Available: ${[...map.keys()].join(", ")}`);
46
+ }
47
+ return strategy;
48
+ }
49
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,IAAI,UAAyD,CAAC;AAE9D,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAqC;YAChD,CAAC,QAAQ,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,CAAC,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC;YAC9B,CAAC,SAAS,EAAE,IAAI,eAAe,EAAE,CAAC;SACnC,CAAC;QACF,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA6B;IAC/D,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAkB,CAAC,CAAC;QAC7C,IAAI,QAAQ;YAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3C,CAAC;AACH,CAAC;AAOD,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAiB,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO;YACL,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc;SACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAkB,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,iBAAiB,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,145 @@
1
+ import type { UserClarification } from "../agents/planners/types.js";
2
+ /**
3
+ * Provider-specific plan mode configuration.
4
+ * The PlannerAdapter reads this to apply plan mode correctly per provider.
5
+ */
6
+ export type PlanModeConfig = {
7
+ /** Text prepended to the prompt content before passing to buildArgs(). */
8
+ promptPrefix?: string;
9
+ /** Text appended to the prompt content after the raw prompt. */
10
+ promptSuffix?: string;
11
+ /** Extra CLI permission flags (e.g., ["--permission-mode", "plan"]). */
12
+ permissionFlags?: string[];
13
+ /** Prefix for the CLI prompt argument in buildArgs() opts.promptPrefix. */
14
+ argPrefix?: string;
15
+ /** Tool/function name that signals plan mode exit (e.g., "ExitPlanMode"). */
16
+ exitToolName?: string;
17
+ /** When true, the provider writes plans to its own native location (e.g., ~/.claude/plans/). */
18
+ nativePlanFile?: boolean;
19
+ };
20
+ /**
21
+ * Opaque snapshot token for session file discovery.
22
+ * Internal structure varies by provider.
23
+ */
24
+ export type SessionSnapshot = {
25
+ skipped: true;
26
+ } | {
27
+ skipped: false;
28
+ dir: string;
29
+ files: Set<string>;
30
+ };
31
+ /** Options bag for {@link ProviderStrategy.buildArgs}. */
32
+ export type BuildArgsOpts = {
33
+ resumeSessionId?: string;
34
+ sessionId?: string;
35
+ permissionFlags?: string[];
36
+ promptPrefix?: string;
37
+ yolo?: boolean;
38
+ };
39
+ /** Returns `[flag]` when `condition` is not `false`, else `[]`. */
40
+ export declare function flagIf(condition: boolean | undefined, flag: string): string[];
41
+ /**
42
+ * Provider-specific strategy for interacting with an AI CLI agent.
43
+ *
44
+ * Each provider (Claude Code, Codex CLI, etc.) implements this interface
45
+ * to encapsulate its CLI command format, session discovery mechanism,
46
+ * completion detection, and optional capability hooks.
47
+ *
48
+ * The AgentRunner uses a ProviderStrategy to execute the shared lifecycle
49
+ * (spawn → detect → exit) without knowing which CLI is being driven.
50
+ */
51
+ /**
52
+ * Handles session file discovery and extraction for a provider.
53
+ *
54
+ * Session concerns (snapshot, file discovery, ID extraction, clarifications)
55
+ * are separated from CLI configuration concerns (command, args, exit signal).
56
+ * Implementations are stateless — a single instance is shared across runs.
57
+ */
58
+ export interface SessionHandler {
59
+ /** Snapshot existing session files before PTY spawn. */
60
+ snapshot(workdir: string): Promise<SessionSnapshot>;
61
+ /** Find the new session file created by the PTY process. */
62
+ findSessionFile(snapshot: SessionSnapshot, workdir: string): Promise<string>;
63
+ /** Extract the canonical session ID from a session file path. */
64
+ extractSessionId(sessionFilePath: string): Promise<string>;
65
+ /**
66
+ * Optional hook: predict the exact session file path for a pre-assigned
67
+ * session ID. When implemented, the runner skips snapshot/discovery and
68
+ * waits for this specific file instead.
69
+ */
70
+ predictSessionFile?(workdir: string, sessionId: string): string;
71
+ /**
72
+ * Optional hook: extract clarifications from a session file.
73
+ *
74
+ * Providers that don't support clarification extraction leave this
75
+ * undefined. The adapter treats undefined as "no clarifications".
76
+ * Only Claude implements this (parses AskUserQuestion Q&A from JSONL).
77
+ */
78
+ extractClarifications?(sessionFilePath: string, lineOffset: number): Promise<UserClarification[]>;
79
+ /**
80
+ * Optional hook: extract the plan file path written by the provider.
81
+ *
82
+ * When the provider writes plans to its own native location (e.g., Claude
83
+ * >= 2.1.74 writes to ~/.claude/plans/), this extracts the actual path
84
+ * from the session file. Returns undefined if no plan file write was found.
85
+ */
86
+ extractPlanFilePath?(sessionFilePath: string, lineOffset: number): Promise<string | undefined>;
87
+ }
88
+ /**
89
+ * Provider-specific strategy for interacting with an AI CLI agent.
90
+ *
91
+ * Each provider (Claude Code, Codex CLI, etc.) implements this interface
92
+ * to encapsulate its CLI command format, completion detection, and session
93
+ * handling. Session concerns are delegated to a {@link SessionHandler}.
94
+ *
95
+ * The AgentRunner uses a ProviderStrategy to execute the shared lifecycle
96
+ * (spawn → detect → exit) without knowing which CLI is being driven.
97
+ */
98
+ export interface ProviderStrategy {
99
+ /** Detected CLI version (set during preflight). Undefined until detection runs. */
100
+ version?: string;
101
+ /** Provider-specific plan mode configuration. */
102
+ readonly planMode: PlanModeConfig;
103
+ /** Provider name for logging/diagnostics (e.g., "claude", "codex"). */
104
+ readonly name: string;
105
+ /** Human-readable product name for UI display (e.g., "Claude Code"). */
106
+ readonly displayName: string;
107
+ /** The CLI command to invoke (e.g., "claude", "codex"). */
108
+ readonly command: string;
109
+ /** The exit signal to send to the PTY (e.g., "/exit\n", "\x03"). */
110
+ readonly exitSignal: string;
111
+ /** Session handler for file discovery and extraction. */
112
+ readonly session: SessionHandler;
113
+ /**
114
+ * Build CLI args from prompt text and options.
115
+ *
116
+ * Provider-specific: Claude passes prompt as positional arg with permission flags;
117
+ * Codex writes prompt to temp file and references it.
118
+ */
119
+ buildArgs(prompt: string, opts: BuildArgsOpts): Promise<string[]>;
120
+ /** Create a new CompletionDetector for this provider. */
121
+ createDetector(): CompletionDetector;
122
+ }
123
+ /**
124
+ * Watches a session file and PTY output to detect when an agent turn is complete.
125
+ *
126
+ * Each strategy (Claude, Codex) implements this interface with CLI-specific logic.
127
+ * The orchestrator calls start() when a PTY spawns, feeds PTY output via onPtyData(),
128
+ * and awaits the returned promise which resolves when the turn completes.
129
+ */
130
+ export interface CompletionDetector {
131
+ /**
132
+ * Begin monitoring for completion.
133
+ * @param sessionFile Path to the JSONL session file to poll.
134
+ * @param lineOffset Number of JSONL lines to skip (for resume — ignores previous turn's data).
135
+ * @returns A promise that resolves with the extracted response text when the turn completes.
136
+ */
137
+ start(sessionFile: string, lineOffset?: number): Promise<string>;
138
+ /**
139
+ * Feed PTY output data for secondary signal analysis (quiet debounce, prompt detection).
140
+ */
141
+ onPtyData(data: string): void;
142
+ /** Stop monitoring and clean up timers/watchers. */
143
+ dispose(): void;
144
+ }
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Returns `[flag]` when `condition` is not `false`, else `[]`. */
2
+ export function flagIf(condition, flag) {
3
+ return condition !== false ? [flag] : [];
4
+ }
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAsCA,mEAAmE;AACnE,MAAM,UAAU,MAAM,CAAC,SAA8B,EAAE,IAAY;IACjE,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Extract the first semver-like version (X.Y.Z or X.Y) from raw CLI output.
3
+ * Handles formats like "claude v2.1.72", "codex/0.1.5", "2.1.72\n", etc.
4
+ * Returns undefined if no version pattern is found.
5
+ */
6
+ export declare function parseVersion(raw: string): string | undefined;
7
+ /** Compare two dot-separated numeric version strings. Returns -1, 0, or 1. */
8
+ export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
9
+ /** Returns true if `version` satisfies `>= minVersion`. Both must be parsed version strings. */
10
+ export declare function versionGte(version: string | undefined, minVersion: string): boolean;
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/providers/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAWhE;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAGT"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Extract the first semver-like version (X.Y.Z or X.Y) from raw CLI output.
3
+ * Handles formats like "claude v2.1.72", "codex/0.1.5", "2.1.72\n", etc.
4
+ * Returns undefined if no version pattern is found.
5
+ */
6
+ export function parseVersion(raw) {
7
+ const match = raw.match(/(\d+\.\d+(?:\.\d+)*)/);
8
+ return match ? match[1] : undefined;
9
+ }
10
+ /** Compare two dot-separated numeric version strings. Returns -1, 0, or 1. */
11
+ export function compareVersions(a, b) {
12
+ const aParts = a.split(".").map(Number);
13
+ const bParts = b.split(".").map(Number);
14
+ const len = Math.max(aParts.length, bParts.length);
15
+ for (let i = 0; i < len; i++) {
16
+ const av = aParts[i] ?? 0;
17
+ const bv = bParts[i] ?? 0;
18
+ if (av < bv)
19
+ return -1;
20
+ if (av > bv)
21
+ return 1;
22
+ }
23
+ return 0;
24
+ }
25
+ /** Returns true if `version` satisfies `>= minVersion`. Both must be parsed version strings. */
26
+ export function versionGte(version, minVersion) {
27
+ if (version === undefined)
28
+ return false;
29
+ return compareVersions(version, minVersion) >= 0;
30
+ }
31
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/providers/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,UAAU,CACxB,OAA2B,EAC3B,UAAkB;IAElB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PtyHandle } from "./types.js";
2
+ /**
3
+ * Send an exit command to the PTY and wait for the process to exit.
4
+ *
5
+ * Falls back to SIGTERM if the exit command doesn't work within the timeout.
6
+ *
7
+ * @param handle The PTY handle
8
+ * @param exitCommand The CLI-specific exit command (e.g., "/exit\n" for Claude)
9
+ * @param timeoutMs Max time to wait for graceful exit (default: 5000ms)
10
+ */
11
+ export declare function sendExit(handle: PtyHandle, exitCommand: string, timeoutMs?: number): Promise<number>;
12
+ //# sourceMappingURL=exit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../../src/pty/exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,SAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Send an exit command to the PTY and wait for the process to exit.
3
+ *
4
+ * Falls back to SIGTERM if the exit command doesn't work within the timeout.
5
+ *
6
+ * @param handle The PTY handle
7
+ * @param exitCommand The CLI-specific exit command (e.g., "/exit\n" for Claude)
8
+ * @param timeoutMs Max time to wait for graceful exit (default: 5000ms)
9
+ */
10
+ export async function sendExit(handle, exitCommand, timeoutMs = 5000) {
11
+ handle.suppressOutput();
12
+ return new Promise((resolve) => {
13
+ let resolved = false;
14
+ let fallbackTimer;
15
+ const onExit = (code) => {
16
+ if (resolved)
17
+ return;
18
+ resolved = true;
19
+ if (fallbackTimer) {
20
+ clearTimeout(fallbackTimer);
21
+ }
22
+ // Clean up stdin listener
23
+ handle.kill();
24
+ resolve(code);
25
+ };
26
+ handle.onExit(onExit);
27
+ // The process may already have exited before onExit was registered.
28
+ if (resolved) {
29
+ return;
30
+ }
31
+ // Send the exit command
32
+ handle.write(exitCommand);
33
+ // Fallback: kill with SIGTERM if exit command doesn't work
34
+ fallbackTimer = setTimeout(() => {
35
+ if (resolved)
36
+ return;
37
+ resolved = true;
38
+ handle.kill("SIGTERM");
39
+ resolve(-1);
40
+ }, timeoutMs);
41
+ });
42
+ }
43
+ //# sourceMappingURL=exit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit.js","sourceRoot":"","sources":["../../src/pty/exit.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiB,EACjB,WAAmB,EACnB,SAAS,GAAG,IAAI;IAEhB,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACrC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,aAAwD,CAAC;QAE7D,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YACD,0BAA0B;YAC1B,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEtB,oEAAoE;QACpE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE1B,2DAA2D;QAC3D,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { PtyHandle } from "./types.js";
2
+ export declare function setReservedRows(n: number): void;
3
+ export declare function getReservedRows(): number;
4
+ export interface SpawnOptions {
5
+ command: string;
6
+ args: string[];
7
+ cwd: string;
8
+ env?: Record<string, string>;
9
+ cols?: number;
10
+ rows?: number;
11
+ interactive?: boolean;
12
+ }
13
+ /**
14
+ * Spawn a PTY process and return a PtyHandle.
15
+ *
16
+ * The PTY output is piped to process.stdout for TUI passthrough.
17
+ * Stdin is gated by default — user keystrokes are blocked until openGate() is called.
18
+ */
19
+ export declare function spawnPty(opts: SpawnOptions): PtyHandle;
20
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/pty/spawn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAsB;AACtE,wBAAgB,eAAe,IAAI,MAAM,CAAyB;AAElE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAwCD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAmItD"}
@@ -0,0 +1,163 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import * as pty from "node-pty";
3
+ let reservedRows = 0;
4
+ export function setReservedRows(n) { reservedRows = n; }
5
+ export function getReservedRows() { return reservedRows; }
6
+ /**
7
+ * On Windows, node-pty's CreateProcess cannot launch .cmd/.bat shims or
8
+ * WinGet app execution aliases directly. Resolve the command to a real
9
+ * executable path, or fall back to `cmd.exe /c` for script shims.
10
+ */
11
+ function resolveWindowsCommand(command, args) {
12
+ try {
13
+ const raw = execFileSync("where.exe", [command], {
14
+ encoding: "utf-8",
15
+ timeout: 5000,
16
+ }).trim();
17
+ const candidates = raw.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
18
+ // Prefer .exe — can be launched directly via CreateProcess.
19
+ const exe = candidates.find((c) => c.endsWith(".exe"));
20
+ if (exe) {
21
+ return { command: exe, args };
22
+ }
23
+ // .cmd/.bat need a cmd.exe wrapper.
24
+ const cmd = candidates.find((c) => c.endsWith(".cmd") || c.endsWith(".bat"));
25
+ if (cmd) {
26
+ return { command: "cmd.exe", args: ["/c", cmd, ...args] };
27
+ }
28
+ // Unknown type (e.g. extensionless npm shim) — wrap with cmd.exe.
29
+ return { command: "cmd.exe", args: ["/c", command, ...args] };
30
+ }
31
+ catch {
32
+ // `where` failed — wrap with cmd.exe as a last resort.
33
+ return { command: "cmd.exe", args: ["/c", command, ...args] };
34
+ }
35
+ }
36
+ /**
37
+ * Spawn a PTY process and return a PtyHandle.
38
+ *
39
+ * The PTY output is piped to process.stdout for TUI passthrough.
40
+ * Stdin is gated by default — user keystrokes are blocked until openGate() is called.
41
+ */
42
+ export function spawnPty(opts) {
43
+ const resolved = process.platform === "win32"
44
+ ? resolveWindowsCommand(opts.command, opts.args)
45
+ : { command: opts.command, args: opts.args };
46
+ // Strip CLAUDECODE so the spawned process doesn't think it's nested.
47
+ const { CLAUDECODE: _, ...baseEnv } = process.env;
48
+ const proc = pty.spawn(resolved.command, resolved.args, {
49
+ name: "xterm-256color",
50
+ cols: opts.cols ?? process.stdout.columns ?? 120,
51
+ rows: opts.rows ?? Math.max((process.stdout.rows ?? 30) - reservedRows, 1),
52
+ cwd: opts.cwd,
53
+ env: { ...baseEnv, ...opts.env },
54
+ // ConPTY kill-path can emit noisy AttachConsole failures in some hosts.
55
+ // WinPTY is slower but more stable for our orchestrated test/runtime flows.
56
+ ...(process.platform === "win32" ? { useConpty: false } : {}),
57
+ });
58
+ const isInteractive = opts.interactive !== false;
59
+ let gateOpen = false;
60
+ let outputSuppressed = !isInteractive;
61
+ let exited = false;
62
+ let lastExitCode = null;
63
+ let cleanedUp = false;
64
+ const dataCallbacks = [];
65
+ const exitCallbacks = [];
66
+ // Stdin forwarding when gate is open
67
+ const stdinListener = (data) => {
68
+ if (gateOpen) {
69
+ proc.write(data.toString());
70
+ }
71
+ };
72
+ if (isInteractive) {
73
+ if (process.stdin.isTTY) {
74
+ process.stdin.setRawMode(true);
75
+ }
76
+ process.stdin.on("data", stdinListener);
77
+ }
78
+ const cleanupTerminalState = () => {
79
+ if (cleanedUp)
80
+ return;
81
+ cleanedUp = true;
82
+ // Stdin cleanup — only when interactive
83
+ if (isInteractive) {
84
+ process.stdin.removeListener("data", stdinListener);
85
+ if (process.stdin.isTTY) {
86
+ process.stdin.setRawMode(false);
87
+ }
88
+ }
89
+ // Terminal-mode cleanup — always run
90
+ process.stdout.write("\x1b[<99u"); // pop all kitty keyboard protocol levels
91
+ process.stdout.write("\x1b[?2004l"); // disable bracketed paste
92
+ process.stdout.write("\x1b[?1003l"); // disable any-event mouse tracking
93
+ process.stdout.write("\x1b[?1006l"); // disable SGR mouse mode
94
+ };
95
+ // Pipe PTY output to stdout (TUI passthrough)
96
+ proc.onData((data) => {
97
+ if (!outputSuppressed) {
98
+ process.stdout.write(data);
99
+ }
100
+ for (const cb of dataCallbacks) {
101
+ cb(data);
102
+ }
103
+ });
104
+ proc.onExit(({ exitCode }) => {
105
+ exited = true;
106
+ lastExitCode = exitCode;
107
+ cleanupTerminalState();
108
+ for (const cb of exitCallbacks) {
109
+ cb(exitCode);
110
+ }
111
+ });
112
+ const handle = {
113
+ get process() {
114
+ return proc;
115
+ },
116
+ write(data) {
117
+ proc.write(data);
118
+ },
119
+ onData(callback) {
120
+ dataCallbacks.push(callback);
121
+ },
122
+ onExit(callback) {
123
+ if (exited && lastExitCode !== null) {
124
+ callback(lastExitCode);
125
+ return;
126
+ }
127
+ exitCallbacks.push(callback);
128
+ },
129
+ kill(signal) {
130
+ cleanupTerminalState();
131
+ if (exited) {
132
+ return;
133
+ }
134
+ // node-pty on Windows does not support signals — call kill() without args.
135
+ if (process.platform === "win32") {
136
+ proc.kill();
137
+ }
138
+ else {
139
+ proc.kill(signal);
140
+ }
141
+ },
142
+ openGate() {
143
+ gateOpen = true;
144
+ },
145
+ closeGate() {
146
+ gateOpen = false;
147
+ },
148
+ get gateOpen() {
149
+ return gateOpen;
150
+ },
151
+ suppressOutput() {
152
+ outputSuppressed = true;
153
+ },
154
+ resumeOutput() {
155
+ outputSuppressed = false;
156
+ },
157
+ get pid() {
158
+ return proc.pid;
159
+ },
160
+ };
161
+ return handle;
162
+ }
163
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/pty/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { IPty } from "node-pty";
2
+ export type AgentEvent = {
3
+ type: "text";
4
+ text: string;
5
+ } | {
6
+ type: "tool_call";
7
+ name: string;
8
+ input: unknown;
9
+ } | {
10
+ type: "tool_result";
11
+ id: string;
12
+ output: string;
13
+ } | {
14
+ type: "done";
15
+ result: string;
16
+ } | {
17
+ type: "error";
18
+ message: string;
19
+ };
20
+ export interface PtyHandle {
21
+ /** The underlying node-pty process. */
22
+ readonly process: IPty;
23
+ /** Write data to the PTY (bypasses stdin gate). */
24
+ write(data: string): void;
25
+ /** Subscribe to PTY output data. */
26
+ onData(callback: (data: string) => void): void;
27
+ /** Subscribe to PTY exit. */
28
+ onExit(callback: (exitCode: number) => void): void;
29
+ /** Kill the PTY process. */
30
+ kill(signal?: string): void;
31
+ /** Open the stdin gate — user keystrokes flow to PTY. */
32
+ openGate(): void;
33
+ /** Close the stdin gate — user keystrokes are blocked. */
34
+ closeGate(): void;
35
+ /** Whether the stdin gate is currently open. */
36
+ readonly gateOpen: boolean;
37
+ /** Suppress PTY output from being written to stdout. */
38
+ suppressOutput(): void;
39
+ /** Resume writing PTY output to stdout. */
40
+ resumeOutput(): void;
41
+ /** PID of the spawned process. */
42
+ readonly pid: number;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pty/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,mDAAmD;IACnD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oCAAoC;IACpC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/C,6BAA6B;IAC7B,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD,4BAA4B;IAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,IAAI,IAAI,CAAC;IACjB,0DAA0D;IAC1D,SAAS,IAAI,IAAI,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wDAAwD;IACxD,cAAc,IAAI,IAAI,CAAC;IACvB,2CAA2C;IAC3C,YAAY,IAAI,IAAI,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pty/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Sanitize a workdir path for use as a directory name.
3
+ * Lowercases and replaces every non-alphanumeric character with `-`.
4
+ */
5
+ export declare function sanitizeWorkdir(workdir: string): string;
6
+ /**
7
+ * Create a session temp directory.
8
+ * Directory: {os.tmpdir()}/poly-weaver/{sanitized-workdir}/{uuid}/
9
+ * Returns the root path as a string.
10
+ */
11
+ export declare function createSessionDir(workdir: string): Promise<string>;
12
+ /**
13
+ * Clean up the session temp directory.
14
+ * If opts.preserve is true, the directory is kept (for --verbose debugging).
15
+ */
16
+ export declare function cleanupSessionDir(root: string, opts?: {
17
+ preserve?: boolean;
18
+ }): Promise<void>;
19
+ //# sourceMappingURL=dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir.d.ts","sourceRoot":"","sources":["../../src/session/dir.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIvE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,31 @@
1
+ import { mkdir, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { v4 as uuidv4 } from "uuid";
5
+ /**
6
+ * Sanitize a workdir path for use as a directory name.
7
+ * Lowercases and replaces every non-alphanumeric character with `-`.
8
+ */
9
+ export function sanitizeWorkdir(workdir) {
10
+ return workdir.toLowerCase().replace(/[^a-z0-9]/g, "-");
11
+ }
12
+ /**
13
+ * Create a session temp directory.
14
+ * Directory: {os.tmpdir()}/poly-weaver/{sanitized-workdir}/{uuid}/
15
+ * Returns the root path as a string.
16
+ */
17
+ export async function createSessionDir(workdir) {
18
+ const root = join(tmpdir(), "poly-weaver", sanitizeWorkdir(workdir), uuidv4());
19
+ await mkdir(root, { recursive: true });
20
+ return root;
21
+ }
22
+ /**
23
+ * Clean up the session temp directory.
24
+ * If opts.preserve is true, the directory is kept (for --verbose debugging).
25
+ */
26
+ export async function cleanupSessionDir(root, opts) {
27
+ if (opts?.preserve)
28
+ return;
29
+ await rm(root, { recursive: true, force: true });
30
+ }
31
+ //# sourceMappingURL=dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dir.js","sourceRoot":"","sources":["../../src/session/dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,IAA6B;IAE7B,IAAI,IAAI,EAAE,QAAQ;QAAE,OAAO;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}