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,172 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ import { readSessionFile } from "../../session/reader.js";
4
+ import { snapshotSessionFiles, extractSessionId, waitForNewSessionFile, } from "../../session/locator.js";
5
+ /**
6
+ * Get the Claude session base directory.
7
+ * Claude stores sessions at: ~/.claude/projects/{encoded-cwd}/{sessionId}.jsonl
8
+ */
9
+ export function getClaudeSessionDir() {
10
+ return join(homedir(), ".claude", "projects");
11
+ }
12
+ /**
13
+ * Encode a working directory path into the directory name Claude uses
14
+ * under ~/.claude/projects/. Claude replaces colons, forward slashes,
15
+ * and backslashes with hyphens.
16
+ */
17
+ export function encodeClaudeProjectDir(cwd) {
18
+ return cwd.replace(/[:/\\]/g, "-");
19
+ }
20
+ /**
21
+ * Extract the last assistant response text from a Claude session file.
22
+ *
23
+ * Claude format: message.content[] where type === "text".
24
+ * We collect text blocks from the last assistant message sequence.
25
+ */
26
+ export function extractClaudeResponse(lines) {
27
+ const textParts = [];
28
+ // Walk lines in reverse to find the last assistant text blocks
29
+ for (let i = lines.length - 1; i >= 0; i--) {
30
+ const line = lines[i];
31
+ if (line.type !== "assistant")
32
+ continue;
33
+ const message = line.message;
34
+ if (!message?.content)
35
+ continue;
36
+ for (const block of message.content) {
37
+ if (block.type === "text" && block.text) {
38
+ textParts.unshift(block.text);
39
+ }
40
+ }
41
+ // Once we've found assistant content, check if the previous line is also assistant
42
+ // (consecutive assistant messages belong to the same turn in Claude's format)
43
+ if (i > 0 && lines[i - 1].type === "assistant")
44
+ continue;
45
+ break;
46
+ }
47
+ return textParts.join("\n");
48
+ }
49
+ /**
50
+ * Extract the plan file path from Claude session lines.
51
+ *
52
+ * Scans for Write or Edit tool_use blocks where `input.file_path` targets
53
+ * the `.claude/plans/` directory. Returns the last matching path
54
+ * (always re-scanned on each run to avoid staleness).
55
+ */
56
+ export function extractClaudePlanFilePath(lines) {
57
+ const planPathPattern = /[/\\]\.claude[/\\]plans[/\\]/;
58
+ // Scan in reverse — we want the *last* matching path, so the first
59
+ // reverse hit lets us return immediately without walking the full list.
60
+ for (let i = lines.length - 1; i >= 0; i--) {
61
+ const line = lines[i];
62
+ if (line.type !== "assistant")
63
+ continue;
64
+ const message = line.message;
65
+ if (!message?.content)
66
+ continue;
67
+ // A single assistant message may contain multiple tool_use blocks;
68
+ // scan them in reverse too so the latest block within the message wins.
69
+ for (let j = message.content.length - 1; j >= 0; j--) {
70
+ const block = message.content[j];
71
+ if (block.type === "tool_use" &&
72
+ (block.name === "Write" || block.name === "Edit") &&
73
+ typeof block.input?.file_path === "string" &&
74
+ planPathPattern.test(block.input.file_path)) {
75
+ return block.input.file_path;
76
+ }
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ /**
82
+ * Extract AskUserQuestion Q&A pairs from Claude session lines.
83
+ *
84
+ * Walks forward to pair `tool_use` blocks (name === "AskUserQuestion") with
85
+ * their corresponding `tool_result` responses. Multi-question calls have
86
+ * their questions joined with "; ". Unmatched tool_use blocks are skipped.
87
+ */
88
+ export function extractClaudeClarifications(lines) {
89
+ const clarifications = [];
90
+ const questionMap = new Map(); // tool_use_id → question text
91
+ for (const line of lines) {
92
+ if (line.type === "assistant") {
93
+ const message = line.message;
94
+ if (!message?.content)
95
+ continue;
96
+ for (const block of message.content) {
97
+ if (block.type === "tool_use" && block.name === "AskUserQuestion" && block.id) {
98
+ const questions = block.input?.questions;
99
+ if (Array.isArray(questions)) {
100
+ const questionText = questions
101
+ .map((q) => (typeof q.question === "string" ? q.question : ""))
102
+ .filter(Boolean)
103
+ .join("; ");
104
+ if (questionText) {
105
+ questionMap.set(block.id, questionText);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (line.type === "user") {
112
+ const message = line.message;
113
+ if (!message?.content)
114
+ continue;
115
+ for (const block of message.content) {
116
+ if (block.type === "tool_result" && block.tool_use_id) {
117
+ const question = questionMap.get(block.tool_use_id);
118
+ if (!question)
119
+ continue;
120
+ const answer = typeof block.content === "string"
121
+ ? block.content
122
+ : JSON.stringify(block.content);
123
+ clarifications.push({ question, answer });
124
+ questionMap.delete(block.tool_use_id);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return clarifications;
130
+ }
131
+ /**
132
+ * Claude session handler.
133
+ *
134
+ * Handles session file discovery across Claude's per-project subdirectories
135
+ * and extracts clarifications from AskUserQuestion Q&A pairs.
136
+ */
137
+ export class ClaudeSessionHandler {
138
+ getSessionDir;
139
+ constructor(getSessionDir) {
140
+ this.getSessionDir = getSessionDir ?? getClaudeSessionDir;
141
+ }
142
+ predictSessionFile(workdir, sessionId) {
143
+ const baseDir = this.getSessionDir();
144
+ return join(baseDir, encodeClaudeProjectDir(workdir), `${sessionId}.jsonl`);
145
+ }
146
+ async snapshot(workdir) {
147
+ const baseDir = this.getSessionDir();
148
+ const dir = join(baseDir, encodeClaudeProjectDir(workdir));
149
+ const files = await snapshotSessionFiles(dir);
150
+ return { skipped: false, dir, files };
151
+ }
152
+ async findSessionFile(snapshot, _workdir) {
153
+ if (snapshot.skipped) {
154
+ throw new Error("Cannot find session file: snapshot was skipped");
155
+ }
156
+ return waitForNewSessionFile(snapshot.dir, snapshot.files);
157
+ }
158
+ async extractSessionId(sessionFilePath) {
159
+ return extractSessionId(sessionFilePath);
160
+ }
161
+ async extractClarifications(sessionFilePath, lineOffset) {
162
+ return extractClaudeClarifications(await this.readNewLines(sessionFilePath, lineOffset));
163
+ }
164
+ async extractPlanFilePath(sessionFilePath, lineOffset) {
165
+ return extractClaudePlanFilePath(await this.readNewLines(sessionFilePath, lineOffset));
166
+ }
167
+ async readNewLines(sessionFilePath, lineOffset) {
168
+ const allLines = await readSessionFile(sessionFilePath);
169
+ return allLines.slice(lineOffset);
170
+ }
171
+ }
172
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PlanModeConfig, ProviderStrategy, SessionHandler, BuildArgsOpts } from "../types.js";
2
+ import { ClaudeCompletionStrategy } from "./completion.js";
3
+ export declare class ClaudeStrategy implements ProviderStrategy {
4
+ readonly name = "claude";
5
+ readonly displayName = "Claude Code";
6
+ readonly command = "claude";
7
+ readonly exitSignal = "/exit\n";
8
+ readonly session: SessionHandler;
9
+ version: string | undefined;
10
+ get planMode(): PlanModeConfig;
11
+ buildArgs(prompt: string, opts: BuildArgsOpts): Promise<string[]>;
12
+ createDetector(): ClaudeCompletionStrategy;
13
+ }
14
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,qBAAa,cAAe,YAAW,gBAAgB;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,OAAO,YAAY;IAC5B,QAAQ,CAAC,UAAU,aAAa;IAChC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA8B;IAC9D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IAExC,IAAI,QAAQ,IAAI,cAAc,CAO7B;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcvE,cAAc,IAAI,wBAAwB;CAG3C"}
@@ -0,0 +1,38 @@
1
+ import { flagIf } from "../types.js";
2
+ import { versionGte } from "../version.js";
3
+ import { ClaudeCompletionStrategy } from "./completion.js";
4
+ import { ClaudeSessionHandler } from "./session.js";
5
+ export class ClaudeStrategy {
6
+ name = "claude";
7
+ displayName = "Claude Code";
8
+ command = "claude";
9
+ exitSignal = "/exit\n";
10
+ session = new ClaudeSessionHandler();
11
+ version = undefined;
12
+ get planMode() {
13
+ const native = versionGte(this.version, "2.1.74");
14
+ return {
15
+ promptPrefix: native ? "/plan " : "Enter plan mode first. ",
16
+ exitToolName: "ExitPlanMode",
17
+ nativePlanFile: native,
18
+ };
19
+ }
20
+ async buildArgs(prompt, opts) {
21
+ const args = [
22
+ ...flagIf(opts.yolo, "--dangerously-skip-permissions"),
23
+ ...(opts.permissionFlags ?? []),
24
+ ];
25
+ if (opts.resumeSessionId) {
26
+ args.push("--resume", opts.resumeSessionId);
27
+ }
28
+ else if (opts.sessionId) {
29
+ args.push("--session-id", opts.sessionId);
30
+ }
31
+ args.push(prompt);
32
+ return args;
33
+ }
34
+ createDetector() {
35
+ return new ClaudeCompletionStrategy(200, 500, this.planMode.exitToolName);
36
+ }
37
+ }
38
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,aAAa,CAAC;IAC5B,OAAO,GAAG,QAAQ,CAAC;IACnB,UAAU,GAAG,SAAS,CAAC;IACvB,OAAO,GAAmB,IAAI,oBAAoB,EAAE,CAAC;IAC9D,OAAO,GAAuB,SAAS,CAAC;IAExC,IAAI,QAAQ;QACV,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB;YAC3D,YAAY,EAAE,cAAc;YAC5B,cAAc,EAAE,MAAM;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAmB;QACjD,MAAM,IAAI,GAAa;YACrB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,gCAAgC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;SAChC,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5E,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { SessionLine } from "../../session/reader.js";
2
+ import { AbstractCompletionDetector } from "../base-completion.js";
3
+ /**
4
+ * Codex completion detection.
5
+ *
6
+ * Primary signal: `task_complete` event in the JSONL session file.
7
+ * Resolves immediately on `task_complete` (short-circuit, no debounce)
8
+ * because Codex's TUI may keep emitting data after the task is done.
9
+ */
10
+ export declare class CodexCompletionStrategy extends AbstractCompletionDetector {
11
+ private readonly exitToolName?;
12
+ private taskComplete;
13
+ private exitToolCalled;
14
+ constructor(pollMs?: number, quietMs?: number, exitToolName?: string | undefined);
15
+ protected analyzeLines(lines: SessionLine[]): void;
16
+ protected isPrimarySignalFired(): boolean;
17
+ protected extractResponse(lines: SessionLine[]): string;
18
+ protected shouldShortCircuit(_lines: SessionLine[]): boolean;
19
+ protected shouldSuppressPtyTimerReset(): boolean;
20
+ }
21
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAUnE;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,0BAA0B;IAOnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IANhC,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,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;IA4BlD,SAAS,CAAC,oBAAoB,IAAI,OAAO;IAIzC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;cAIpC,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO;cAIlD,2BAA2B,IAAI,OAAO;CAG1D"}
@@ -0,0 +1,63 @@
1
+ import { extractCodexResponse } from "./session.js";
2
+ import { AbstractCompletionDetector } from "../base-completion.js";
3
+ /** Check if a JSONL line is a Codex task_complete event. */
4
+ function isTaskComplete(line) {
5
+ return (line.type === "event_msg" &&
6
+ line.payload?.type === "task_complete");
7
+ }
8
+ /**
9
+ * Codex completion detection.
10
+ *
11
+ * Primary signal: `task_complete` event in the JSONL session file.
12
+ * Resolves immediately on `task_complete` (short-circuit, no debounce)
13
+ * because Codex's TUI may keep emitting data after the task is done.
14
+ */
15
+ export class CodexCompletionStrategy extends AbstractCompletionDetector {
16
+ exitToolName;
17
+ taskComplete = false;
18
+ exitToolCalled = false;
19
+ constructor(pollMs = 500, quietMs = 500, exitToolName) {
20
+ super(pollMs, quietMs);
21
+ this.exitToolName = exitToolName;
22
+ }
23
+ analyzeLines(lines) {
24
+ for (const line of lines) {
25
+ if (isTaskComplete(line)) {
26
+ this.taskComplete = true;
27
+ return;
28
+ }
29
+ // Detect exit tool in Codex's OpenAI-format response items
30
+ if (this.exitToolName && line.type === "response_item") {
31
+ const payload = line.payload;
32
+ if (payload) {
33
+ // Format 1: payload itself is a function_call with name
34
+ if (payload.type === "function_call" && payload.name === this.exitToolName) {
35
+ this.exitToolCalled = true;
36
+ }
37
+ // Format 2: payload.content[] contains function_call blocks
38
+ const content = payload.content;
39
+ if (content) {
40
+ for (const block of content) {
41
+ if (block.type === "function_call" && block.name === this.exitToolName) {
42
+ this.exitToolCalled = true;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ isPrimarySignalFired() {
51
+ return this.taskComplete || this.exitToolCalled;
52
+ }
53
+ extractResponse(lines) {
54
+ return extractCodexResponse(lines);
55
+ }
56
+ shouldShortCircuit(_lines) {
57
+ return this.taskComplete || this.exitToolCalled;
58
+ }
59
+ shouldSuppressPtyTimerReset() {
60
+ return this.taskComplete || this.exitToolCalled;
61
+ }
62
+ }
63
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/providers/codex/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,4DAA4D;AAC5D,SAAS,cAAc,CAAC,IAAiB;IACvC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,WAAW;QACxB,IAAI,CAAC,OAA+C,EAAE,IAAI,KAAK,eAAe,CAChF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,uBAAwB,SAAQ,0BAA0B;IAOlD;IANX,YAAY,GAAG,KAAK,CAAC;IACrB,cAAc,GAAG,KAAK,CAAC;IAE/B,YACE,MAAM,GAAG,GAAG,EACZ,OAAO,GAAG,GAAG,EACI,YAAqB;QAEtC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAFN,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAES,YAAY,CAAC,KAAoB;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,2DAA2D;YAC3D,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAC;gBACpE,IAAI,OAAO,EAAE,CAAC;oBACZ,wDAAwD;oBACxD,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;wBAC3E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC7B,CAAC;oBACD,4DAA4D;oBAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAqD,CAAC;oBAC9E,IAAI,OAAO,EAAE,CAAC;wBACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;4BAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gCACvE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;4BAC7B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAES,oBAAoB;QAC5B,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC;IAClD,CAAC;IAES,eAAe,CAAC,KAAoB;QAC5C,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEkB,kBAAkB,CAAC,MAAqB;QACzD,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC;IAClD,CAAC;IAEkB,2BAA2B;QAC5C,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export { CodexStrategy } from "./strategy.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CodexStrategy } from "./strategy.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/codex/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { SessionHandler, SessionSnapshot } from "../types.js";
2
+ import { type SessionLine } from "../../session/reader.js";
3
+ /**
4
+ * Get the Codex session directory for today's date.
5
+ * Codex stores sessions at: ~/.codex/sessions/YYYY/MM/DD/
6
+ */
7
+ export declare function getCodexSessionDir(): string;
8
+ /**
9
+ * Verify a Codex session file belongs to the expected working directory.
10
+ * Searches all lines for `session_meta` and checks the cwd field.
11
+ *
12
+ * Returns:
13
+ * - `true` — `session_meta` found with matching CWD
14
+ * - `false` — `session_meta` found with mismatching CWD (definitive mismatch)
15
+ * - `null` — inconclusive (file empty, unreadable, or no `session_meta` yet)
16
+ */
17
+ export declare function verifyCodexSessionCwd(sessionFile: string, expectedCwd: string): Promise<boolean | null>;
18
+ /**
19
+ * Extract Codex's canonical resume session ID from session metadata.
20
+ * Codex session filenames can be rollout-prefixed and are not always valid
21
+ * IDs for `codex resume`; the canonical ID is payload.id in session_meta.
22
+ */
23
+ export declare function extractCodexSessionId(sessionFile: string, retries?: number, delayMs?: number): Promise<string>;
24
+ /**
25
+ * Extract the last response text from a Codex session file.
26
+ *
27
+ * Codex format:
28
+ * - `task_complete` events have `payload.last_agent_message`
29
+ * - `response_item` events with role: "assistant" have `payload.content[].text`
30
+ */
31
+ /**
32
+ * Codex session handler.
33
+ *
34
+ * Handles session file discovery in Codex's date-based session directory
35
+ * with CWD verification. Does not support clarification extraction.
36
+ */
37
+ export declare class CodexSessionHandler implements SessionHandler {
38
+ snapshot(_workdir: string): Promise<SessionSnapshot>;
39
+ findSessionFile(snapshot: SessionSnapshot, workdir: string, { timeoutMs, pollMs }?: {
40
+ timeoutMs?: number | undefined;
41
+ pollMs?: number | undefined;
42
+ }): Promise<string>;
43
+ extractSessionId(sessionFilePath: string): Promise<string>;
44
+ }
45
+ export declare function extractCodexResponse(lines: SessionLine[]): string;
46
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAO5E;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAM3C;AAqBD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAgBzB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,SAAI,EACX,OAAO,SAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;;;;GAMG;AACH;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAMpD,eAAe,CACnB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,EACf,EAAE,SAAkB,EAAE,MAAY,EAAE;;;KAAK,GACxC,OAAO,CAAC,MAAM,CAAC;IAiCZ,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMjE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAmCjE"}
@@ -0,0 +1,151 @@
1
+ import { join } from "node:path";
2
+ import { homedir } from "node:os";
3
+ import { readSessionFile } from "../../session/reader.js";
4
+ import { snapshotSessionFiles, findNewSessionFiles, } from "../../session/locator.js";
5
+ import { normalizePath } from "../path-utils.js";
6
+ /**
7
+ * Get the Codex session directory for today's date.
8
+ * Codex stores sessions at: ~/.codex/sessions/YYYY/MM/DD/
9
+ */
10
+ export function getCodexSessionDir() {
11
+ const now = new Date();
12
+ const yyyy = now.getFullYear().toString();
13
+ const mm = (now.getMonth() + 1).toString().padStart(2, "0");
14
+ const dd = now.getDate().toString().padStart(2, "0");
15
+ return join(homedir(), ".codex", "sessions", yyyy, mm, dd);
16
+ }
17
+ async function retryWithDelay(fn, retries, delayMs) {
18
+ let lastError;
19
+ for (let attempt = 0; attempt <= retries; attempt++) {
20
+ try {
21
+ return await fn();
22
+ }
23
+ catch (err) {
24
+ lastError = err;
25
+ if (attempt < retries) {
26
+ await new Promise((r) => setTimeout(r, delayMs));
27
+ }
28
+ }
29
+ }
30
+ throw lastError;
31
+ }
32
+ /**
33
+ * Verify a Codex session file belongs to the expected working directory.
34
+ * Searches all lines for `session_meta` and checks the cwd field.
35
+ *
36
+ * Returns:
37
+ * - `true` — `session_meta` found with matching CWD
38
+ * - `false` — `session_meta` found with mismatching CWD (definitive mismatch)
39
+ * - `null` — inconclusive (file empty, unreadable, or no `session_meta` yet)
40
+ */
41
+ export async function verifyCodexSessionCwd(sessionFile, expectedCwd) {
42
+ try {
43
+ const lines = await readSessionFile(sessionFile);
44
+ if (lines.length === 0)
45
+ return null;
46
+ const meta = lines.find((line) => line.type === "session_meta");
47
+ if (!meta)
48
+ return null;
49
+ const payload = meta.payload;
50
+ if (!payload?.cwd)
51
+ return false;
52
+ return normalizePath(payload.cwd) === normalizePath(expectedCwd);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Extract Codex's canonical resume session ID from session metadata.
60
+ * Codex session filenames can be rollout-prefixed and are not always valid
61
+ * IDs for `codex resume`; the canonical ID is payload.id in session_meta.
62
+ */
63
+ export async function extractCodexSessionId(sessionFile, retries = 5, delayMs = 500) {
64
+ return retryWithDelay(async () => {
65
+ const lines = await readSessionFile(sessionFile);
66
+ const meta = lines.find((line) => line.type === "session_meta");
67
+ const payload = meta?.payload;
68
+ if (typeof payload?.id === "string" && payload.id.trim()) {
69
+ return payload.id;
70
+ }
71
+ throw new Error(`Codex session file ${sessionFile} is missing a valid session_meta.payload.id`);
72
+ }, retries, delayMs);
73
+ }
74
+ /**
75
+ * Extract the last response text from a Codex session file.
76
+ *
77
+ * Codex format:
78
+ * - `task_complete` events have `payload.last_agent_message`
79
+ * - `response_item` events with role: "assistant" have `payload.content[].text`
80
+ */
81
+ /**
82
+ * Codex session handler.
83
+ *
84
+ * Handles session file discovery in Codex's date-based session directory
85
+ * with CWD verification. Does not support clarification extraction.
86
+ */
87
+ export class CodexSessionHandler {
88
+ async snapshot(_workdir) {
89
+ const dir = getCodexSessionDir();
90
+ const files = await snapshotSessionFiles(dir);
91
+ return { skipped: false, dir, files };
92
+ }
93
+ async findSessionFile(snapshot, workdir, { timeoutMs = 60_000, pollMs = 500 } = {}) {
94
+ if (snapshot.skipped) {
95
+ throw new Error("Cannot find session file: snapshot was skipped");
96
+ }
97
+ const { dir, files: knownFiles } = snapshot;
98
+ const deadline = Date.now() + timeoutMs;
99
+ while (Date.now() < deadline) {
100
+ const newFiles = await findNewSessionFiles(dir, knownFiles);
101
+ for (const file of newFiles) {
102
+ const result = await verifyCodexSessionCwd(file, workdir);
103
+ if (result === true)
104
+ return file;
105
+ if (result === false) {
106
+ // Definitive CWD mismatch — skip permanently
107
+ knownFiles.add(file);
108
+ console.warn(`[poly-weaver] Codex session file ${file} belongs to a different workdir, skipping`);
109
+ }
110
+ // result === null → inconclusive (file empty/unreadable/no
111
+ // session_meta yet). Don't add to knownFiles — retry on next poll.
112
+ }
113
+ await new Promise((r) => setTimeout(r, pollMs));
114
+ }
115
+ throw new Error(`Timed out waiting for matching Codex session file in ${dir}`);
116
+ }
117
+ async extractSessionId(sessionFilePath) {
118
+ return extractCodexSessionId(sessionFilePath);
119
+ }
120
+ }
121
+ export function extractCodexResponse(lines) {
122
+ // Prefer task_complete event (nested inside event_msg in real Codex sessions)
123
+ for (let i = lines.length - 1; i >= 0; i--) {
124
+ const line = lines[i];
125
+ if (line.type === "event_msg" &&
126
+ line.payload?.type === "task_complete") {
127
+ const payload = line.payload;
128
+ if (typeof payload.last_agent_message === "string") {
129
+ return payload.last_agent_message;
130
+ }
131
+ }
132
+ }
133
+ // Fall back to response_item with assistant role
134
+ const textParts = [];
135
+ for (let i = lines.length - 1; i >= 0; i--) {
136
+ const line = lines[i];
137
+ if (line.type !== "response_item")
138
+ continue;
139
+ const payload = line.payload;
140
+ if (payload?.role !== "assistant" || !payload.content)
141
+ continue;
142
+ for (const block of payload.content) {
143
+ if (block.type === "text" && block.text) {
144
+ textParts.unshift(block.text);
145
+ }
146
+ }
147
+ break;
148
+ }
149
+ return textParts.join("\n");
150
+ }
151
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/codex/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PlanModeConfig, ProviderStrategy, SessionHandler, BuildArgsOpts } from "../types.js";
2
+ import { CodexCompletionStrategy } from "./completion.js";
3
+ export declare class CodexStrategy implements ProviderStrategy {
4
+ readonly name = "codex";
5
+ readonly displayName = "Codex CLI";
6
+ readonly command = "codex";
7
+ readonly exitSignal = "\u0003";
8
+ readonly session: SessionHandler;
9
+ version: string | undefined;
10
+ readonly planMode: PlanModeConfig;
11
+ buildArgs(prompt: string, opts: BuildArgsOpts): Promise<string[]>;
12
+ createDetector(): CodexCompletionStrategy;
13
+ }
14
+ //# sourceMappingURL=strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,qBAAa,aAAc,YAAW,gBAAgB;IACpD,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,eAAe;IACnC,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,UAAU,YAAU;IAC7B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA6B;IAC7D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IACxC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAG/B;IAEI,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBvE,cAAc,IAAI,uBAAuB;CAG1C"}
@@ -0,0 +1,41 @@
1
+ import { flagIf } from "../types.js";
2
+ import { writePromptFile } from "../prompt-file.js";
3
+ import { CodexCompletionStrategy } from "./completion.js";
4
+ import { CodexSessionHandler } from "./session.js";
5
+ export class CodexStrategy {
6
+ name = "codex";
7
+ displayName = "Codex CLI";
8
+ command = "codex";
9
+ exitSignal = "\x03";
10
+ session = new CodexSessionHandler();
11
+ version = undefined;
12
+ planMode = {
13
+ argPrefix: "/plan ",
14
+ exitToolName: "ExitPlanMode",
15
+ };
16
+ async buildArgs(prompt, opts) {
17
+ // Codex only reads the first line of a positional argument, so we
18
+ // write the full prompt to a temp file and pass a one-liner reference.
19
+ const promptRef = await writePromptFile(prompt);
20
+ if (opts.resumeSessionId) {
21
+ // Resume existing session — codex resume <session-id> <prompt>
22
+ return [
23
+ ...flagIf(opts.yolo, "--dangerously-bypass-approvals-and-sandbox"),
24
+ "resume",
25
+ opts.resumeSessionId,
26
+ promptRef,
27
+ ];
28
+ }
29
+ // Fresh session — optionally prepend a prefix (e.g. "/plan ") to the
30
+ // one-liner prompt reference.
31
+ const prefix = opts.promptPrefix ?? "";
32
+ return [
33
+ ...flagIf(opts.yolo, "--dangerously-bypass-approvals-and-sandbox"),
34
+ `${prefix}${promptRef}`,
35
+ ];
36
+ }
37
+ createDetector() {
38
+ return new CodexCompletionStrategy(100, 200, this.planMode.exitToolName);
39
+ }
40
+ }
41
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/providers/codex/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,WAAW,CAAC;IAC1B,OAAO,GAAG,OAAO,CAAC;IAClB,UAAU,GAAG,MAAM,CAAC;IACpB,OAAO,GAAmB,IAAI,mBAAmB,EAAE,CAAC;IAC7D,OAAO,GAAuB,SAAS,CAAC;IAC/B,QAAQ,GAAmB;QAClC,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,cAAc;KAC7B,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAmB;QACjD,kEAAkE;QAClE,uEAAuE;QACvE,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,+DAA+D;YAC/D,OAAO;gBACL,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,4CAA4C,CAAC;gBAClE,QAAQ;gBACR,IAAI,CAAC,eAAe;gBACpB,SAAS;aACV,CAAC;QACJ,CAAC;QAED,qEAAqE;QACrE,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QACvC,OAAO;YACL,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,4CAA4C,CAAC;YAClE,GAAG,MAAM,GAAG,SAAS,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3E,CAAC;CACF"}