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,135 @@
1
+ import { visibleLength } from "./ansi.js";
2
+ import { APP_VERSION } from "./version.js";
3
+ function formatContext(ctx) {
4
+ if (ctx.iteration != null && ctx.maxIterations != null) {
5
+ return `Iteration ${ctx.iteration}/${ctx.maxIterations}`;
6
+ }
7
+ return "";
8
+ }
9
+ const ANIMAL_EMOJIS = [
10
+ "🐶", "🐱", "🐭", "🐹", "🐰", "🦊", "🐻", "🐼",
11
+ "🐨", "🐯", "🦁", "🐮", "🐷", "🐸", "🐵", "🐔",
12
+ "🐧", "🐦", "🐤", "🦆", "🦅", "🦉", "🐴", "🦄",
13
+ "🐝", "🐛", "🦋", "🐌", "🐙", "🦑", "🐠", "🐬",
14
+ ];
15
+ /** Deterministic animal emoji for a branch name (djb2 hash). */
16
+ export function branchAnimalEmoji(branch) {
17
+ let h = 5381;
18
+ for (let i = 0; i < branch.length; i++) {
19
+ h = ((h << 5) + h + branch.charCodeAt(i)) | 0;
20
+ }
21
+ return ANIMAL_EMOJIS[Math.abs(h) % ANIMAL_EMOJIS.length];
22
+ }
23
+ export class StatusBar {
24
+ enabled;
25
+ barRow;
26
+ lastCtx;
27
+ out;
28
+ resizeHandler;
29
+ redrawTimer;
30
+ lastDrawnOutput;
31
+ gitInfo = null;
32
+ constructor(out) {
33
+ this.out = out ?? process.stdout;
34
+ this.enabled =
35
+ this.out.isTTY === true && (this.out.rows ?? 0) >= 5;
36
+ this.barRow = this.out.rows ?? 0;
37
+ }
38
+ init() {
39
+ if (!this.enabled)
40
+ return;
41
+ this.barRow = this.out.rows;
42
+ // Set scroll region with cursor save/restore (no cursor homing)
43
+ this.out.write(`\x1b7\x1b[1;${this.barRow - 1}r\x1b8`);
44
+ // Draw initial bar
45
+ this.drawBar();
46
+ // Handle terminal resize
47
+ this.resizeHandler = () => {
48
+ this.barRow = this.out.rows;
49
+ this.out.write(`\x1b7\x1b[1;${this.barRow - 1}r\x1b8`);
50
+ this.drawBar();
51
+ };
52
+ this.out.on("resize", this.resizeHandler);
53
+ // Periodic redraw to repair scroll region disruption
54
+ this.redrawTimer = setInterval(() => {
55
+ this.lastDrawnOutput = undefined;
56
+ this.drawBar();
57
+ }, 1000);
58
+ }
59
+ update(ctx) {
60
+ if (!this.enabled)
61
+ return;
62
+ this.lastCtx = ctx;
63
+ this.drawBar();
64
+ }
65
+ setGitInfo(info) {
66
+ this.gitInfo = info;
67
+ if (this.enabled)
68
+ this.drawBar();
69
+ }
70
+ destroy() {
71
+ if (!this.enabled)
72
+ return;
73
+ this.enabled = false;
74
+ if (this.redrawTimer != null) {
75
+ clearInterval(this.redrawTimer);
76
+ this.redrawTimer = undefined;
77
+ }
78
+ if (this.resizeHandler) {
79
+ this.out.removeListener("resize", this.resizeHandler);
80
+ this.resizeHandler = undefined;
81
+ }
82
+ // Clear bar and reset scroll region (cursor-safe)
83
+ this.out.write(`\x1b7\x1b[${this.barRow};1H\x1b[2K\x1b[r\x1b8`);
84
+ }
85
+ get reservedRows() {
86
+ return this.enabled ? 1 : 0;
87
+ }
88
+ formatGitSegment() {
89
+ if (!this.gitInfo)
90
+ return null;
91
+ const animal = branchAnimalEmoji(this.gitInfo.branch);
92
+ const wt = this.gitInfo.isWorktree ? " \u{1F332}" : "";
93
+ return `${animal} ${this.gitInfo.branch}${wt}`;
94
+ }
95
+ drawBar() {
96
+ const columns = this.out.columns ?? 80;
97
+ let content;
98
+ const gitSeg = this.formatGitSegment();
99
+ if (!this.lastCtx) {
100
+ content = gitSeg
101
+ ? ` poly-weaver v${APP_VERSION} \u2502 ${gitSeg}`
102
+ : ` poly-weaver v${APP_VERSION}`;
103
+ }
104
+ else {
105
+ const phaseLabel = this.lastCtx.phase;
106
+ const ctx = formatContext(this.lastCtx);
107
+ const segments = [` poly-weaver v${APP_VERSION}`];
108
+ if (gitSeg)
109
+ segments.push(gitSeg);
110
+ segments.push(phaseLabel);
111
+ if (this.lastCtx.agent)
112
+ segments.push(this.lastCtx.agent);
113
+ if (ctx)
114
+ segments.push(ctx);
115
+ content = segments.join(" \u2502 ");
116
+ }
117
+ // Pad visible content to full terminal width
118
+ const pad = columns - visibleLength(content);
119
+ const padded = pad > 0 ? content + " ".repeat(pad) : content;
120
+ // Atomic write: save cursor, re-establish scroll region, draw bar, restore cursor
121
+ const output = `\x1b7` +
122
+ `\x1b[1;${this.barRow - 1}r` +
123
+ `\x1b[${this.barRow};1H` +
124
+ `\x1b[2K` +
125
+ `\x1b[7m` +
126
+ padded +
127
+ `\x1b[27m` +
128
+ `\x1b8`;
129
+ if (output === this.lastDrawnOutput)
130
+ return;
131
+ this.lastDrawnOutput = output;
132
+ this.out.write(output);
133
+ }
134
+ }
135
+ //# sourceMappingURL=status-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../src/status-bar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared terminal input parser — bytes → low-level key identities.
3
+ *
4
+ * This module owns the byte-level state machine (normal/esc/csi), kitty
5
+ * keyboard protocol parsing, kitty dedup tracking, and escape timeout.
6
+ * It produces {@link TerminalKey} events with no domain semantics.
7
+ *
8
+ * Consumers (e.g. RawInputParser for review-phase, TuiInputParser for
9
+ * startup TUI) wrap this via composition and map TerminalKey → their own
10
+ * domain event types.
11
+ */
12
+ export type TerminalKey = {
13
+ kind: "printable";
14
+ char: string;
15
+ source: "plain" | "kitty-u" | "kitty-text";
16
+ } | {
17
+ kind: "control";
18
+ byte: number;
19
+ } | {
20
+ kind: "enter";
21
+ } | {
22
+ kind: "backspace";
23
+ } | {
24
+ kind: "escape";
25
+ } | {
26
+ kind: "arrow";
27
+ direction: "up" | "down" | "left" | "right";
28
+ } | {
29
+ kind: "kitty-key";
30
+ keyCode: number;
31
+ modifiers: number;
32
+ };
33
+ export declare class TerminalKeyParser {
34
+ private readonly now;
35
+ private readonly dedupeWindowMs;
36
+ private readonly escapeTimeoutMs;
37
+ private state;
38
+ private csiParams;
39
+ private lastKittyPrintable;
40
+ private escapeTimer;
41
+ private deferredCallback;
42
+ constructor(now?: () => number, dedupeWindowMs?: number, escapeTimeoutMs?: number);
43
+ onDeferredKeys(cb: (keys: TerminalKey[]) => void): void;
44
+ cancelPendingEscape(): void;
45
+ parseChunk(chunk: Buffer): TerminalKey[];
46
+ private handleCsi;
47
+ private parseKittyEventType;
48
+ private shouldInsertKittyPrintable;
49
+ private clearKittyPrintable;
50
+ }
51
+ //# sourceMappingURL=terminal-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-input.d.ts","sourceRoot":"","sources":["../src/terminal-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAXlC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,kBAAkB,CAEZ;IACd,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,gBAAgB,CAA8C;gBAGnD,GAAG,GAAE,MAAM,MAAiB,EAC5B,cAAc,SAAK,EACnB,eAAe,SAAK;IAGvC,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,GAAG,IAAI;IAIvD,mBAAmB,IAAI,IAAI;IAO3B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE;IAqExC,OAAO,CAAC,SAAS;IA+FjB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,0BAA0B;IAyBlC,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Shared terminal input parser — bytes → low-level key identities.
3
+ *
4
+ * This module owns the byte-level state machine (normal/esc/csi), kitty
5
+ * keyboard protocol parsing, kitty dedup tracking, and escape timeout.
6
+ * It produces {@link TerminalKey} events with no domain semantics.
7
+ *
8
+ * Consumers (e.g. RawInputParser for review-phase, TuiInputParser for
9
+ * startup TUI) wrap this via composition and map TerminalKey → their own
10
+ * domain event types.
11
+ */
12
+ export class TerminalKeyParser {
13
+ now;
14
+ dedupeWindowMs;
15
+ escapeTimeoutMs;
16
+ state = "normal";
17
+ csiParams = "";
18
+ lastKittyPrintable;
19
+ escapeTimer;
20
+ deferredCallback;
21
+ constructor(now = Date.now, dedupeWindowMs = 30, escapeTimeoutMs = 50) {
22
+ this.now = now;
23
+ this.dedupeWindowMs = dedupeWindowMs;
24
+ this.escapeTimeoutMs = escapeTimeoutMs;
25
+ }
26
+ onDeferredKeys(cb) {
27
+ this.deferredCallback = cb;
28
+ }
29
+ cancelPendingEscape() {
30
+ if (this.escapeTimer != null) {
31
+ clearTimeout(this.escapeTimer);
32
+ this.escapeTimer = undefined;
33
+ }
34
+ }
35
+ parseChunk(chunk) {
36
+ const keys = [];
37
+ for (const byte of chunk) {
38
+ switch (this.state) {
39
+ case "normal":
40
+ if (byte === 0x1b) {
41
+ this.cancelPendingEscape();
42
+ this.state = "esc";
43
+ }
44
+ else if (byte === 0x0d || byte === 0x0a) {
45
+ this.clearKittyPrintable();
46
+ keys.push({ kind: "enter" });
47
+ }
48
+ else if (byte === 0x7f || byte === 0x08) {
49
+ this.clearKittyPrintable();
50
+ keys.push({ kind: "backspace" });
51
+ }
52
+ else if (byte < 0x20) {
53
+ this.clearKittyPrintable();
54
+ keys.push({ kind: "control", byte });
55
+ }
56
+ else {
57
+ this.clearKittyPrintable();
58
+ keys.push({
59
+ kind: "printable",
60
+ char: String.fromCharCode(byte),
61
+ source: "plain",
62
+ });
63
+ }
64
+ break;
65
+ case "esc":
66
+ if (byte === 0x5b) {
67
+ this.state = "csi";
68
+ this.csiParams = "";
69
+ }
70
+ else {
71
+ this.state = "normal";
72
+ this.clearKittyPrintable();
73
+ keys.push({ kind: "escape" });
74
+ // Re-process current byte in normal mode
75
+ keys.push(...this.parseChunk(Buffer.from([byte])));
76
+ }
77
+ break;
78
+ case "csi":
79
+ if (byte >= 0x40 && byte <= 0x7e) {
80
+ keys.push(...this.handleCsi(this.csiParams, String.fromCharCode(byte)));
81
+ this.state = "normal";
82
+ }
83
+ else {
84
+ this.csiParams += String.fromCharCode(byte);
85
+ }
86
+ break;
87
+ }
88
+ }
89
+ // Bare ESC at end of chunk: start escape timeout
90
+ if (this.state === "esc" && this.escapeTimer == null) {
91
+ this.escapeTimer = setTimeout(() => {
92
+ this.escapeTimer = undefined;
93
+ if (this.state === "esc") {
94
+ this.state = "normal";
95
+ this.clearKittyPrintable();
96
+ this.deferredCallback?.([{ kind: "escape" }]);
97
+ }
98
+ }, this.escapeTimeoutMs);
99
+ }
100
+ return keys;
101
+ }
102
+ handleCsi(params, finalByte) {
103
+ // Standard arrow keys: CSI A/B/C/D (with optional params like "1;1")
104
+ if (finalByte === "A") {
105
+ this.clearKittyPrintable();
106
+ return [{ kind: "arrow", direction: "up" }];
107
+ }
108
+ if (finalByte === "B") {
109
+ this.clearKittyPrintable();
110
+ return [{ kind: "arrow", direction: "down" }];
111
+ }
112
+ if (finalByte === "C") {
113
+ this.clearKittyPrintable();
114
+ return [{ kind: "arrow", direction: "right" }];
115
+ }
116
+ if (finalByte === "D") {
117
+ this.clearKittyPrintable();
118
+ return [{ kind: "arrow", direction: "left" }];
119
+ }
120
+ // CSI Z: standard Shift+Tab — normalize to Kitty protocol representation
121
+ if (finalByte === "Z") {
122
+ this.clearKittyPrintable();
123
+ return [{ kind: "kitty-key", keyCode: 9, modifiers: 2 }];
124
+ }
125
+ if (finalByte !== "u" && finalByte !== "_") {
126
+ this.clearKittyPrintable();
127
+ return [];
128
+ }
129
+ const parts = params.split(";");
130
+ const keyCode = parseInt(parts[0]?.split(":")[0] ?? "", 10) || 0;
131
+ const modifiers = parseInt(parts[1]?.split(":")[0] ?? "1", 10) || 1;
132
+ const eventType = this.parseKittyEventType(parts[1]);
133
+ // Ignore key-release events
134
+ if (eventType === 3) {
135
+ this.clearKittyPrintable();
136
+ return [];
137
+ }
138
+ // Enter with Ctrl modifier → kitty-key (so consumer can distinguish Ctrl+Enter)
139
+ if ((keyCode === 13 || keyCode === 10) && (modifiers - 1) & 0x04) {
140
+ this.clearKittyPrintable();
141
+ return [{ kind: "kitty-key", keyCode, modifiers }];
142
+ }
143
+ // Enter (no Ctrl)
144
+ if (keyCode === 13 || keyCode === 10) {
145
+ this.clearKittyPrintable();
146
+ return [{ kind: "enter" }];
147
+ }
148
+ // Backspace
149
+ if (keyCode === 127 || keyCode === 8) {
150
+ this.clearKittyPrintable();
151
+ return [{ kind: "backspace" }];
152
+ }
153
+ // Special keycodes → kitty-key (consumer decides semantics)
154
+ if (keyCode === 9 || keyCode === 27 || keyCode === 3) {
155
+ this.clearKittyPrintable();
156
+ return [{ kind: "kitty-key", keyCode, modifiers }];
157
+ }
158
+ // Kitty text event (_): extract codepoints
159
+ if (finalByte === "_" && parts.length >= 3) {
160
+ const cps = parts[2]
161
+ .split(":")
162
+ .map(Number)
163
+ .filter((cp) => cp >= 32);
164
+ const result = [];
165
+ for (const cp of cps) {
166
+ const ch = String.fromCodePoint(cp);
167
+ if (this.shouldInsertKittyPrintable(ch, "kitty-text")) {
168
+ result.push({ kind: "printable", char: ch, source: "kitty-text" });
169
+ }
170
+ }
171
+ return result;
172
+ }
173
+ // Printable keycodes via 'u'
174
+ if (keyCode >= 32 && keyCode < 127) {
175
+ const ch = String.fromCharCode(keyCode);
176
+ if (this.shouldInsertKittyPrintable(ch, "kitty-u")) {
177
+ return [{ kind: "printable", char: ch, source: "kitty-u" }];
178
+ }
179
+ return [];
180
+ }
181
+ this.clearKittyPrintable();
182
+ return [];
183
+ }
184
+ parseKittyEventType(modsAndEvent) {
185
+ if (!modsAndEvent)
186
+ return 1;
187
+ const raw = modsAndEvent.split(":")[1];
188
+ const parsed = raw ? parseInt(raw, 10) : NaN;
189
+ return Number.isFinite(parsed) ? parsed : 1;
190
+ }
191
+ shouldInsertKittyPrintable(char, source) {
192
+ const ts = this.now();
193
+ const prev = this.lastKittyPrintable;
194
+ if (prev && ts - prev.at > this.dedupeWindowMs) {
195
+ this.lastKittyPrintable = undefined;
196
+ }
197
+ const currentPrev = this.lastKittyPrintable;
198
+ if (currentPrev &&
199
+ currentPrev.char === char &&
200
+ currentPrev.source !== source &&
201
+ ts - currentPrev.at <= this.dedupeWindowMs) {
202
+ this.lastKittyPrintable = undefined;
203
+ return false;
204
+ }
205
+ this.lastKittyPrintable = { char, source, at: ts };
206
+ return true;
207
+ }
208
+ clearKittyPrintable() {
209
+ this.lastKittyPrintable = undefined;
210
+ }
211
+ }
212
+ //# sourceMappingURL=terminal-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-input.js","sourceRoot":"","sources":["../src/terminal-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { UserStep } from "../flow/types.js";
2
+ import type { WhenCondition, PhaseLabelSpec } from "../flow/dsl.js";
3
+ export declare function user(label: string, opts?: {
4
+ id?: string;
5
+ when?: WhenCondition;
6
+ whenLabel?: string;
7
+ reads?: Record<string, string>;
8
+ writes?: Record<string, string>;
9
+ feedbackToTask?: boolean;
10
+ breakOnAccept?: boolean;
11
+ phaseLabel?: PhaseLabelSpec;
12
+ }): UserStep;
13
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/user/dsl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAEjF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B,GAAG,QAAQ,CAiBX"}
@@ -0,0 +1,19 @@
1
+ export function user(label, opts) {
2
+ const _phaseLabel = opts?.phaseLabel ?? "👤 User Review...";
3
+ const raw = {
4
+ type: "user",
5
+ id: opts?.id ?? "",
6
+ role: "user",
7
+ reads: opts?.reads ?? { display: "plan" },
8
+ writes: opts?.writes ?? {},
9
+ feedbackToTask: opts?.feedbackToTask ?? true,
10
+ breakOnAccept: opts?.breakOnAccept,
11
+ phaseLabel: typeof _phaseLabel === "string" ? _phaseLabel : "",
12
+ _idPrefix: `user-${label}`,
13
+ _when: opts?.when,
14
+ _whenLabel: opts?.whenLabel,
15
+ _phaseLabel,
16
+ };
17
+ return raw;
18
+ }
19
+ //# sourceMappingURL=dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.js","sourceRoot":"","sources":["../../src/user/dsl.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,IASnC;IACC,MAAM,WAAW,GAAG,IAAI,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC5D,MAAM,GAAG,GAAgB;QACvB,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;QAC1B,cAAc,EAAE,IAAI,EAAE,cAAc,IAAI,IAAI;QAC5C,aAAa,EAAE,IAAI,EAAE,aAAa;QAClC,UAAU,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;QAC9D,SAAS,EAAE,QAAQ,KAAK,EAAE;QAC1B,KAAK,EAAE,IAAI,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI,EAAE,SAAS;QAC3B,WAAW;KACZ,CAAC;IACF,OAAO,GAA0B,CAAC;AACpC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { UserPromptHandler } from "./prompt.js";
2
+ import type { BaseStep, StepContext, StepSignal, RetryFn, RoleHandler } from "../flow/types.js";
3
+ /**
4
+ * RoleHandler adapter that bridges UserPromptHandler with the flow executor.
5
+ * Registered as the "user" role so user steps are dispatched uniformly.
6
+ *
7
+ * On rejection, writes a unified verdict artifact with data, text, and meta.
8
+ * This ensures `artifactData("verdict", "approved")` evaluates correctly when
9
+ * the user rejects after a reviewer approves.
10
+ */
11
+ export declare class UserRoleHandler implements RoleHandler {
12
+ private userPhase;
13
+ constructor(userPhase: UserPromptHandler);
14
+ execute(step: BaseStep, ctx: StepContext, _retry: RetryFn): Promise<StepSignal>;
15
+ }
16
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/user/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EACV,QAAQ,EAER,WAAW,EACX,UAAU,EACV,OAAO,EACP,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,iBAAiB;IAE1C,OAAO,CACX,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,UAAU,CAAC;CAsCvB"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * RoleHandler adapter that bridges UserPromptHandler with the flow executor.
3
+ * Registered as the "user" role so user steps are dispatched uniformly.
4
+ *
5
+ * On rejection, writes a unified verdict artifact with data, text, and meta.
6
+ * This ensures `artifactData("verdict", "approved")` evaluates correctly when
7
+ * the user rejects after a reviewer approves.
8
+ */
9
+ export class UserRoleHandler {
10
+ userPhase;
11
+ constructor(userPhase) {
12
+ this.userPhase = userPhase;
13
+ }
14
+ async execute(step, ctx, _retry) {
15
+ const displayArtifact = step.reads.display;
16
+ const displayText = displayArtifact
17
+ ? ctx.artifacts.getText(displayArtifact) ?? "" : "";
18
+ // Build prompt context from the verdict artifact
19
+ const verdictArtifactName = step.writes.verdict;
20
+ const verdictData = verdictArtifactName
21
+ ? ctx.artifacts.getData(verdictArtifactName)
22
+ : undefined;
23
+ const verdictSource = verdictArtifactName
24
+ ? ctx.artifacts.getMeta(verdictArtifactName, "source")
25
+ : undefined;
26
+ const promptCtx = {
27
+ verdictApproved: verdictData?.approved,
28
+ isFirstReview: verdictData === undefined,
29
+ verdictSource,
30
+ previousStepRole: ctx.previousStepRole,
31
+ };
32
+ const result = await this.userPhase.prompt(displayText, step.id, promptCtx);
33
+ if (result.accepted) {
34
+ const userStep = step;
35
+ return { kind: userStep.breakOnAccept ? "break-loop" : "continue" };
36
+ }
37
+ // Rejected — write to verdict artifact with data + text + meta
38
+ const verdictKey = step.writes.verdict;
39
+ if (verdictKey) {
40
+ ctx.artifacts.set(verdictKey, {
41
+ data: { approved: false },
42
+ text: result.comments ?? "",
43
+ meta: { source: "user" },
44
+ });
45
+ }
46
+ return { kind: "restart-loop" };
47
+ }
48
+ }
49
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/user/handler.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IACN;IAApB,YAAoB,SAA4B;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CACX,IAAc,EACd,GAAgB,EAChB,MAAe;QAEf,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,MAAM,WAAW,GAAG,eAAe;YACjC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,iDAAiD;QACjD,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,WAAW,GAAG,mBAAmB;YACrC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAyB,mBAAmB,CAAC;YACpE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,aAAa,GAAG,mBAAmB;YACvC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAS,mBAAmB,EAAE,QAAQ,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GAAsB;YACnC,eAAe,EAAE,WAAW,EAAE,QAAQ;YACtC,aAAa,EAAE,WAAW,KAAK,SAAS;YACxC,aAAa;YACb,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;SACvC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAgB,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACtE,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;gBACzB,IAAI,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export type { UserPromptHandler, UserPromptResult, UserPromptContext } from "./prompt.js";
2
+ export { InteractiveUserPrompt, AutoUserPrompt, RawInputParser } from "./prompt.js";
3
+ export { UserRoleHandler } from "./handler.js";
4
+ export { user } from "./dsl.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { InteractiveUserPrompt, AutoUserPrompt, RawInputParser } from "./prompt.js";
2
+ export { UserRoleHandler } from "./handler.js";
3
+ export { user } from "./dsl.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { type FeatureGates } from "../providers/registry.js";
2
+ import type { BuiltinRole } from "../flow/types.js";
3
+ export interface UserPromptResult {
4
+ accepted: boolean;
5
+ comments?: string;
6
+ }
7
+ type RawInputEvent = {
8
+ type: "insert";
9
+ text: string;
10
+ } | {
11
+ type: "backspace";
12
+ } | {
13
+ type: "submit";
14
+ } | {
15
+ type: "newline";
16
+ } | {
17
+ type: "ctrl-c";
18
+ } | {
19
+ type: "arrow";
20
+ direction: "up" | "down";
21
+ };
22
+ /**
23
+ * Stateful parser for raw stdin bytes in normal mode and kitty keyboard protocol mode.
24
+ *
25
+ * Kitty may emit both key (`...u`) and text (`..._`) variants for one printable
26
+ * keystroke. We deduplicate matching adjacent variants so one physical keypress
27
+ * produces exactly one inserted character.
28
+ */
29
+ export declare class RawInputParser {
30
+ private parser;
31
+ constructor(now?: () => number, dedupeWindowMs?: number);
32
+ parseChunk(chunk: Buffer): RawInputEvent[];
33
+ private mapKey;
34
+ }
35
+ export interface UserPromptContext {
36
+ /** Whether the reviewer approved the plan. undefined = no verdict yet. */
37
+ verdictApproved?: boolean;
38
+ /** True when no prior verdict exists (first review before any reviewer runs). */
39
+ isFirstReview?: boolean;
40
+ /** Who produced the verdict: "user" | "reviewer" | undefined. */
41
+ verdictSource?: string;
42
+ /** Role of the step that executed immediately before this user step. */
43
+ previousStepRole?: BuiltinRole | "user";
44
+ }
45
+ export interface UserPromptHandler {
46
+ /**
47
+ * Present the plan to the user and collect their decision.
48
+ * @param plan - The full plan text. Displayed unless the provider streamed it natively (see FeatureGates.nativePlanMode).
49
+ * @param phase - Which checkpoint triggered this prompt
50
+ * @param context - Optional context with verdict status
51
+ */
52
+ prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
53
+ }
54
+ /**
55
+ * Interactive user prompt handler.
56
+ * Displays the plan (unless nativePlanMode gate suppresses it) and collects multiline input.
57
+ * Empty input = accept, non-empty = comments for revision.
58
+ *
59
+ * Uses a raw stdin reader instead of readline so that input works even
60
+ * when the terminal is in kitty keyboard protocol mode (which spawned
61
+ * PTY processes like Claude Code may leave enabled).
62
+ */
63
+ export declare class InteractiveUserPrompt implements UserPromptHandler {
64
+ readonly gates: FeatureGates;
65
+ constructor(gates?: FeatureGates);
66
+ prompt(plan: string, phase: string, context?: UserPromptContext): Promise<UserPromptResult>;
67
+ /** True unless the provider already streamed the plan natively (planner → user). */
68
+ private shouldDisplayPlan;
69
+ private printPlan;
70
+ /**
71
+ * Two-row selector: "Approve" row and multiline feedback input area.
72
+ * `❯` arrow moves between rows to indicate which is active.
73
+ * Input row is active by default — just start typing.
74
+ * Enter inserts a newline; Ctrl+D submits.
75
+ * Approve requires ↑ then Enter.
76
+ */
77
+ private collectDecision;
78
+ }
79
+ /**
80
+ * No-op handler that always accepts. Used for --auto mode and as the default.
81
+ */
82
+ export declare class AutoUserPrompt implements UserPromptHandler {
83
+ prompt(): Promise<UserPromptResult>;
84
+ }
85
+ export {};
86
+ //# sourceMappingURL=prompt.d.ts.map