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,34 @@
1
+ import type { UserClarification } from "./agents/planners/types.js";
2
+ export declare function getVerdictSchema(): Promise<string>;
3
+ /**
4
+ * Derive a human-readable feedback markdown from a review verdict.
5
+ */
6
+ export declare function deriveFeedback(verdict: {
7
+ approved: boolean;
8
+ issues: Array<{
9
+ description: string;
10
+ category?: string;
11
+ severity?: string;
12
+ }>;
13
+ summary: string;
14
+ }): string;
15
+ /**
16
+ * Derive a feedback markdown from user comments.
17
+ */
18
+ export declare function deriveUserFeedback(comments: string): string;
19
+ /**
20
+ * Append one or more clarification entries to the task content.
21
+ * Creates the "## User Clarifications" section header on first call
22
+ * (startNumber === 1). Returns the updated content and next available number.
23
+ */
24
+ export declare function appendClarifications(taskContent: string, entries: Array<{
25
+ type: "qa";
26
+ clarification: UserClarification;
27
+ } | {
28
+ type: "comment";
29
+ text: string;
30
+ }>, startNumber: number): {
31
+ content: string;
32
+ nextNumber: number;
33
+ };
34
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAOpE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE;IACP,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,iBAAiB,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACpG,WAAW,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAuBzC"}
@@ -0,0 +1,67 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const SCHEMA_PATH = join(__dirname, "..", "schemas", "review-verdict.json");
6
+ let cachedSchema = null;
7
+ export async function getVerdictSchema() {
8
+ if (!cachedSchema) {
9
+ cachedSchema = await readFile(SCHEMA_PATH, "utf-8");
10
+ }
11
+ return cachedSchema;
12
+ }
13
+ /**
14
+ * Derive a human-readable feedback markdown from a review verdict.
15
+ */
16
+ export function deriveFeedback(verdict) {
17
+ const lines = ["# Review Feedback", "", `**Summary:** ${verdict.summary}`, ""];
18
+ if (verdict.issues.length > 0) {
19
+ lines.push("## Issues to Address", "");
20
+ for (const issue of verdict.issues) {
21
+ if (issue.severity && issue.category) {
22
+ lines.push(`- **[${issue.severity.toUpperCase()}] ${issue.category}**: ${issue.description}`);
23
+ }
24
+ else if (issue.category) {
25
+ lines.push(`- **${issue.category}**: ${issue.description}`);
26
+ }
27
+ else {
28
+ lines.push(`- ${issue.description}`);
29
+ }
30
+ }
31
+ }
32
+ return lines.join("\n");
33
+ }
34
+ /**
35
+ * Derive a feedback markdown from user comments.
36
+ */
37
+ export function deriveUserFeedback(comments) {
38
+ return ["# User Feedback", "", comments].join("\n");
39
+ }
40
+ /**
41
+ * Append one or more clarification entries to the task content.
42
+ * Creates the "## User Clarifications" section header on first call
43
+ * (startNumber === 1). Returns the updated content and next available number.
44
+ */
45
+ export function appendClarifications(taskContent, entries, startNumber) {
46
+ if (entries.length === 0)
47
+ return { content: taskContent, nextNumber: startNumber };
48
+ const parts = [];
49
+ if (startNumber === 1) {
50
+ parts.push("\n\n---\n## User Clarifications\n\n> Points are listed in chronological order. If a later point conflicts with an earlier one, follow the later point.\n");
51
+ }
52
+ let n = startNumber;
53
+ for (const entry of entries) {
54
+ if (entry.type === "qa") {
55
+ parts.push(`${n}. **Q:** ${entry.clarification.question}\n **A:** ${entry.clarification.answer}`);
56
+ }
57
+ else {
58
+ parts.push(`${n}. ${entry.text}`);
59
+ }
60
+ n++;
61
+ }
62
+ return {
63
+ content: taskContent + parts.join("\n"),
64
+ nextNumber: n,
65
+ };
66
+ }
67
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAE5E,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,OAIC;IAED,MAAM,KAAK,GAAG,CAAC,mBAAmB,EAAE,EAAE,EAAE,gBAAgB,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/E,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CACR,QAAQ,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,WAAW,EAAE,CAClF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,CAAC,iBAAiB,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,OAAoG,EACpG,WAAmB;IAEnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IAEnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,0JAA0J,CAAC,CAAC;IACzK,CAAC;IAED,IAAI,CAAC,GAAG,WAAW,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,QAAQ,eAAe,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACtG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO;QACL,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvC,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { CompletionDetector } from "./types.js";
2
+ import { type SessionLine } from "../session/reader.js";
3
+ /**
4
+ * Base class for completion detectors that share the same poll-based lifecycle:
5
+ *
6
+ * 1. Poll the session file via `fs.stat()` (reliable on Windows, unlike fs.watch).
7
+ * 2. On file growth: re-read, slice by `lineOffset`, call `analyzeLines()`.
8
+ * 3. When `isPrimarySignalFired()` returns true and the quiet debounce elapses,
9
+ * resolve with `extractResponse()`.
10
+ *
11
+ * Subclasses only implement:
12
+ * - `analyzeLines(lines)` — update provider-specific state
13
+ * - `isPrimarySignalFired()` — check if the turn is considered done
14
+ * - `extractResponse(lines)` — pull the final text from parsed session lines
15
+ *
16
+ * Optional override:
17
+ * - `shouldShortCircuit(lines)` — return true to resolve immediately (skip debounce).
18
+ * Used by Codex which resolves instantly on `task_complete`.
19
+ */
20
+ export declare abstract class AbstractCompletionDetector implements CompletionDetector {
21
+ private readonly pollMs;
22
+ private readonly quietMs;
23
+ private disposed;
24
+ private pollTimer;
25
+ private resolve;
26
+ private reject;
27
+ private lastFileSize;
28
+ private sessionFile;
29
+ private lineOffset;
30
+ protected lastDataTime: number;
31
+ protected lastParsedLines: SessionLine[];
32
+ constructor(pollMs?: number, quietMs?: number);
33
+ start(sessionFile: string, lineOffset?: number): Promise<string>;
34
+ onPtyData(_data: string): void;
35
+ dispose(): void;
36
+ /** Update provider-specific state from the current session lines. */
37
+ protected abstract analyzeLines(lines: SessionLine[]): void;
38
+ /** Return true when the provider's primary completion signal has fired. */
39
+ protected abstract isPrimarySignalFired(): boolean;
40
+ /** Extract the final response text from parsed session lines. */
41
+ protected abstract extractResponse(lines: SessionLine[]): string;
42
+ /**
43
+ * Return true to resolve immediately when new data arrives (skip debounce).
44
+ * Default: false. Override in providers where the primary signal is authoritative
45
+ * (e.g., Codex's `task_complete`).
46
+ */
47
+ protected shouldShortCircuit(_lines: SessionLine[]): boolean;
48
+ /**
49
+ * Return true to suppress PTY timer resets in `onPtyData`.
50
+ * Default: false. Override in providers that keep emitting TUI data after
51
+ * the task is done (e.g., Codex, Copilot).
52
+ */
53
+ protected shouldSuppressPtyTimerReset(): boolean;
54
+ private poll;
55
+ }
56
+ //# sourceMappingURL=base-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-completion.d.ts","sourceRoot":"","sources":["../../src/providers/base-completion.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,0BAA2B,YAAW,kBAAkB;IAa1E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAAK;IAEvB,SAAS,CAAC,YAAY,SAAK;IAC3B,SAAS,CAAC,eAAe,EAAE,WAAW,EAAE,CAAM;gBAG3B,MAAM,SAAM,EACZ,OAAO,SAAM;IAGhC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAe3D,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B,OAAO,IAAI,IAAI;IAUf,qEAAqE;IACrE,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;IAE3D,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,OAAO;IAElD,iEAAiE;IACjE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;IAEhE;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO;IAI5D;;;;OAIG;IACH,SAAS,CAAC,2BAA2B,IAAI,OAAO;YAMlC,IAAI;CAqCnB"}
@@ -0,0 +1,111 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { readSessionFile } from "../session/reader.js";
3
+ /**
4
+ * Base class for completion detectors that share the same poll-based lifecycle:
5
+ *
6
+ * 1. Poll the session file via `fs.stat()` (reliable on Windows, unlike fs.watch).
7
+ * 2. On file growth: re-read, slice by `lineOffset`, call `analyzeLines()`.
8
+ * 3. When `isPrimarySignalFired()` returns true and the quiet debounce elapses,
9
+ * resolve with `extractResponse()`.
10
+ *
11
+ * Subclasses only implement:
12
+ * - `analyzeLines(lines)` — update provider-specific state
13
+ * - `isPrimarySignalFired()` — check if the turn is considered done
14
+ * - `extractResponse(lines)` — pull the final text from parsed session lines
15
+ *
16
+ * Optional override:
17
+ * - `shouldShortCircuit(lines)` — return true to resolve immediately (skip debounce).
18
+ * Used by Codex which resolves instantly on `task_complete`.
19
+ */
20
+ export class AbstractCompletionDetector {
21
+ pollMs;
22
+ quietMs;
23
+ disposed = false;
24
+ pollTimer = null;
25
+ resolve = null;
26
+ reject = null;
27
+ lastFileSize = 0;
28
+ sessionFile = "";
29
+ lineOffset = 0;
30
+ lastDataTime = 0;
31
+ lastParsedLines = [];
32
+ constructor(pollMs = 500, quietMs = 500) {
33
+ this.pollMs = pollMs;
34
+ this.quietMs = quietMs;
35
+ }
36
+ start(sessionFile, lineOffset = 0) {
37
+ this.sessionFile = sessionFile;
38
+ this.lineOffset = lineOffset;
39
+ this.lastDataTime = Date.now();
40
+ return new Promise((resolve, reject) => {
41
+ this.resolve = resolve;
42
+ this.reject = reject;
43
+ this.pollTimer = setInterval(() => {
44
+ void this.poll();
45
+ }, this.pollMs);
46
+ });
47
+ }
48
+ onPtyData(_data) {
49
+ if (!this.shouldSuppressPtyTimerReset()) {
50
+ this.lastDataTime = Date.now();
51
+ }
52
+ }
53
+ dispose() {
54
+ this.disposed = true;
55
+ if (this.pollTimer) {
56
+ clearInterval(this.pollTimer);
57
+ this.pollTimer = null;
58
+ }
59
+ }
60
+ /**
61
+ * Return true to resolve immediately when new data arrives (skip debounce).
62
+ * Default: false. Override in providers where the primary signal is authoritative
63
+ * (e.g., Codex's `task_complete`).
64
+ */
65
+ shouldShortCircuit(_lines) {
66
+ return false;
67
+ }
68
+ /**
69
+ * Return true to suppress PTY timer resets in `onPtyData`.
70
+ * Default: false. Override in providers that keep emitting TUI data after
71
+ * the task is done (e.g., Codex, Copilot).
72
+ */
73
+ shouldSuppressPtyTimerReset() {
74
+ return false;
75
+ }
76
+ // ── Poll loop ───────────────────────────────────────────────────────
77
+ async poll() {
78
+ if (this.disposed)
79
+ return;
80
+ try {
81
+ const s = await stat(this.sessionFile);
82
+ if (s.size === this.lastFileSize) {
83
+ // No new data — check if quiet debounce has passed and primary signal is ready
84
+ if (this.isPrimarySignalFired() &&
85
+ Date.now() - this.lastDataTime >= this.quietMs) {
86
+ const text = this.extractResponse(this.lastParsedLines);
87
+ this.dispose();
88
+ this.resolve?.(text);
89
+ }
90
+ return;
91
+ }
92
+ const lines = await readSessionFile(this.sessionFile);
93
+ // Update AFTER successful read — if readSessionFile() throws (e.g. EBUSY
94
+ // on Windows), lastFileSize stays stale so the next poll retries the read.
95
+ this.lastFileSize = s.size;
96
+ this.lastDataTime = Date.now();
97
+ this.lastParsedLines = lines.slice(this.lineOffset);
98
+ this.analyzeLines(this.lastParsedLines);
99
+ // Allow providers to short-circuit (e.g. Codex on task_complete)
100
+ if (this.shouldShortCircuit(this.lastParsedLines)) {
101
+ const text = this.extractResponse(this.lastParsedLines);
102
+ this.dispose();
103
+ this.resolve?.(text);
104
+ }
105
+ }
106
+ catch {
107
+ // File might not exist yet — keep polling
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=base-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-completion.js","sourceRoot":"","sources":["../../src/providers/base-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { SessionLine } from "../../session/reader.js";
2
+ import { AbstractCompletionDetector } from "../base-completion.js";
3
+ /**
4
+ * Claude completion detection using the two-signal rule:
5
+ *
6
+ * 1. **Tool-use tracking (primary)**: Track tool_use IDs in assistant messages,
7
+ * mark resolved when matching tool_result appears. Complete when pending set
8
+ * is empty AND at least one text output was emitted.
9
+ *
10
+ * 2. **Quiet debounce (secondary)**: No new JSONL lines for `quietMs` after
11
+ * the primary signal fires.
12
+ *
13
+ * Both signals must agree before the turn is considered complete.
14
+ */
15
+ export declare class ClaudeCompletionStrategy extends AbstractCompletionDetector {
16
+ private readonly exitToolName?;
17
+ private pendingToolUses;
18
+ private hasTextOutput;
19
+ private primaryFired;
20
+ private exitToolCalled;
21
+ constructor(pollMs?: number, quietMs?: number, exitToolName?: string | undefined);
22
+ protected analyzeLines(currentLines: SessionLine[]): void;
23
+ protected isPrimarySignalFired(): boolean;
24
+ protected shouldShortCircuit(_lines: SessionLine[]): boolean;
25
+ protected shouldSuppressPtyTimerReset(): boolean;
26
+ protected extractResponse(lines: SessionLine[]): string;
27
+ }
28
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,qBAAa,wBAAyB,SAAQ,0BAA0B;IAUpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IARhC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;gBAG7B,MAAM,SAAM,EACZ,OAAO,SAAM,EACI,YAAY,CAAC,EAAE,MAAM,YAAA;IAKxC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI;IA4EzD,SAAS,CAAC,oBAAoB,IAAI,OAAO;cAItB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO;cAIlD,2BAA2B,IAAI,OAAO;IAIzD,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;CAGxD"}
@@ -0,0 +1,103 @@
1
+ import { extractClaudeResponse } from "./session.js";
2
+ import { AbstractCompletionDetector } from "../base-completion.js";
3
+ /**
4
+ * Claude completion detection using the two-signal rule:
5
+ *
6
+ * 1. **Tool-use tracking (primary)**: Track tool_use IDs in assistant messages,
7
+ * mark resolved when matching tool_result appears. Complete when pending set
8
+ * is empty AND at least one text output was emitted.
9
+ *
10
+ * 2. **Quiet debounce (secondary)**: No new JSONL lines for `quietMs` after
11
+ * the primary signal fires.
12
+ *
13
+ * Both signals must agree before the turn is considered complete.
14
+ */
15
+ export class ClaudeCompletionStrategy extends AbstractCompletionDetector {
16
+ exitToolName;
17
+ // Two-signal state
18
+ pendingToolUses = new Set();
19
+ hasTextOutput = false;
20
+ primaryFired = false;
21
+ exitToolCalled = false;
22
+ constructor(pollMs = 500, quietMs = 500, exitToolName) {
23
+ super(pollMs, quietMs);
24
+ this.exitToolName = exitToolName;
25
+ }
26
+ analyzeLines(currentLines) {
27
+ this.pendingToolUses.clear();
28
+ this.hasTextOutput = false;
29
+ this.exitToolCalled = false;
30
+ let hasAnyToolUse = false;
31
+ let lastToolActivityIdx = -1;
32
+ let lastAssistantTextIdx = -1;
33
+ let lastAssistantStopReason;
34
+ for (let idx = 0; idx < currentLines.length; idx++) {
35
+ const line = currentLines[idx];
36
+ if (line.type === "assistant") {
37
+ const message = line.message;
38
+ if (!message?.content)
39
+ continue;
40
+ lastAssistantStopReason = message.stop_reason;
41
+ for (const block of message.content) {
42
+ if (block.type === "tool_use" && block.id) {
43
+ // If this is the plan-exit tool, mark it and skip tracking
44
+ if (this.exitToolName && block.name === this.exitToolName) {
45
+ this.exitToolCalled = true;
46
+ continue;
47
+ }
48
+ this.pendingToolUses.add(block.id);
49
+ hasAnyToolUse = true;
50
+ lastToolActivityIdx = idx;
51
+ }
52
+ if (block.type === "text" && block.text) {
53
+ this.hasTextOutput = true;
54
+ lastAssistantTextIdx = idx;
55
+ }
56
+ }
57
+ }
58
+ else if (line.type === "user") {
59
+ // Tool results resolve pending tool uses
60
+ const message = line.message;
61
+ if (!message?.content)
62
+ continue;
63
+ for (const block of message.content) {
64
+ if (block.type === "tool_result" && block.tool_use_id) {
65
+ this.pendingToolUses.delete(block.tool_use_id);
66
+ lastToolActivityIdx = idx;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ // Guard: stop_reason === null (strict) means the API response is still
72
+ // streaming content blocks. Suppress primary to avoid false completion
73
+ // during the gap between intermediate JSONL lines of the same response.
74
+ // undefined (missing field, e.g. in test data) falls through.
75
+ const responseIncomplete = lastAssistantStopReason === null ||
76
+ lastAssistantStopReason === "stop_sequence";
77
+ // Primary signal:
78
+ // - the last assistant response is not mid-stream
79
+ // - no pending tool uses
80
+ // - at least one assistant text output
81
+ // - if tools were used, we require assistant text to appear after the
82
+ // most recent tool activity (prevents resolving between tool_result and
83
+ // the final narrative/verdict message).
84
+ this.primaryFired =
85
+ !responseIncomplete &&
86
+ this.pendingToolUses.size === 0 &&
87
+ this.hasTextOutput &&
88
+ (!hasAnyToolUse || lastAssistantTextIdx > lastToolActivityIdx);
89
+ }
90
+ isPrimarySignalFired() {
91
+ return this.primaryFired;
92
+ }
93
+ shouldShortCircuit(_lines) {
94
+ return this.exitToolCalled && this.pendingToolUses.size === 0;
95
+ }
96
+ shouldSuppressPtyTimerReset() {
97
+ return this.primaryFired || (this.exitToolCalled && this.pendingToolUses.size === 0);
98
+ }
99
+ extractResponse(lines) {
100
+ return extractClaudeResponse(lines);
101
+ }
102
+ }
103
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ClaudeStrategy } from "./strategy.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ClaudeStrategy } from "./strategy.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { SessionHandler, SessionSnapshot } from "../types.js";
2
+ import { type SessionLine } from "../../session/reader.js";
3
+ import type { UserClarification } from "../../agents/planners/types.js";
4
+ /**
5
+ * Get the Claude session base directory.
6
+ * Claude stores sessions at: ~/.claude/projects/{encoded-cwd}/{sessionId}.jsonl
7
+ */
8
+ export declare function getClaudeSessionDir(): string;
9
+ /**
10
+ * Encode a working directory path into the directory name Claude uses
11
+ * under ~/.claude/projects/. Claude replaces colons, forward slashes,
12
+ * and backslashes with hyphens.
13
+ */
14
+ export declare function encodeClaudeProjectDir(cwd: string): string;
15
+ /**
16
+ * Extract the last assistant response text from a Claude session file.
17
+ *
18
+ * Claude format: message.content[] where type === "text".
19
+ * We collect text blocks from the last assistant message sequence.
20
+ */
21
+ export declare function extractClaudeResponse(lines: SessionLine[]): string;
22
+ /**
23
+ * Extract the plan file path from Claude session lines.
24
+ *
25
+ * Scans for Write or Edit tool_use blocks where `input.file_path` targets
26
+ * the `.claude/plans/` directory. Returns the last matching path
27
+ * (always re-scanned on each run to avoid staleness).
28
+ */
29
+ export declare function extractClaudePlanFilePath(lines: SessionLine[]): string | undefined;
30
+ /**
31
+ * Extract AskUserQuestion Q&A pairs from Claude session lines.
32
+ *
33
+ * Walks forward to pair `tool_use` blocks (name === "AskUserQuestion") with
34
+ * their corresponding `tool_result` responses. Multi-question calls have
35
+ * their questions joined with "; ". Unmatched tool_use blocks are skipped.
36
+ */
37
+ export declare function extractClaudeClarifications(lines: SessionLine[]): UserClarification[];
38
+ /**
39
+ * Claude session handler.
40
+ *
41
+ * Handles session file discovery across Claude's per-project subdirectories
42
+ * and extracts clarifications from AskUserQuestion Q&A pairs.
43
+ */
44
+ export declare class ClaudeSessionHandler implements SessionHandler {
45
+ private readonly getSessionDir;
46
+ constructor(getSessionDir?: () => string);
47
+ predictSessionFile(workdir: string, sessionId: string): string;
48
+ snapshot(workdir: string): Promise<SessionSnapshot>;
49
+ findSessionFile(snapshot: SessionSnapshot, _workdir: string): Promise<string>;
50
+ extractSessionId(sessionFilePath: string): Promise<string>;
51
+ extractClarifications(sessionFilePath: string, lineOffset: number): Promise<UserClarification[]>;
52
+ extractPlanFilePath(sessionFilePath: string, lineOffset: number): Promise<string | undefined>;
53
+ private readNewLines;
54
+ }
55
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CA0BlE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CA8BlF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CA8CrF;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;gBAEjC,aAAa,CAAC,EAAE,MAAM,MAAM;IAIxC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAKxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,eAAe,CACnB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAOZ,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,qBAAqB,CACzB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIzB,mBAAmB,CACvB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAIhB,YAAY;CAI3B"}