cloving 1.2.0 → 1.4.0

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 (752) hide show
  1. package/README.md +700 -331
  2. package/dist/src/agent-harness-shell.d.ts +13 -0
  3. package/dist/src/agent-harness-shell.js +93 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/command-wait-checks.d.ts +8 -0
  9. package/dist/src/authority/command-wait-checks.js +88 -0
  10. package/dist/src/authority/command-wait-results.d.ts +15 -0
  11. package/dist/src/authority/command-wait-results.js +73 -0
  12. package/dist/src/authority/command-wait-view.d.ts +21 -0
  13. package/dist/src/authority/command-wait-view.js +34 -0
  14. package/dist/src/authority/command-waits.d.ts +39 -0
  15. package/dist/src/authority/command-waits.js +97 -0
  16. package/dist/src/authority/commands.d.ts +1 -0
  17. package/dist/src/authority/commands.js +46 -5
  18. package/dist/src/authority/dispatch-decision.d.ts +8 -0
  19. package/dist/src/authority/dispatch-decision.js +26 -1
  20. package/dist/src/authority/effect-requests.js +6 -3
  21. package/dist/src/authority/effect-results.js +4 -2
  22. package/dist/src/authority/gate-reduction.d.ts +1 -0
  23. package/dist/src/authority/gate-reduction.js +18 -3
  24. package/dist/src/authority/gates.d.ts +2 -1
  25. package/dist/src/authority/gates.js +5 -1
  26. package/dist/src/authority/history-state.d.ts +2 -0
  27. package/dist/src/authority/history-state.js +13 -1
  28. package/dist/src/authority/instants.d.ts +1 -0
  29. package/dist/src/authority/instants.js +21 -0
  30. package/dist/src/authority/operations.js +1 -1
  31. package/dist/src/authority/reduction-state.d.ts +2 -0
  32. package/dist/src/authority/reduction-state.js +5 -0
  33. package/dist/src/authority/reduction.d.ts +1 -1
  34. package/dist/src/authority/reduction.js +30 -1
  35. package/dist/src/authority/status-input.d.ts +3 -1
  36. package/dist/src/authority/status.d.ts +3 -0
  37. package/dist/src/authority/status.js +28 -3
  38. package/dist/src/authority/stop-sequence.d.ts +1 -0
  39. package/dist/src/authority/stop-sequence.js +2 -1
  40. package/dist/src/authority/transitions.d.ts +7 -5
  41. package/dist/src/authority/transitions.js +13 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +9 -2
  44. package/dist/src/broker/actor/authority-queries.js +29 -5
  45. package/dist/src/broker/actor/authority-receipts.js +11 -1
  46. package/dist/src/broker/actor/authority-session.js +2 -2
  47. package/dist/src/broker/actor/authority-settings.js +4 -0
  48. package/dist/src/broker/actor/authority-upgrades.d.ts +19 -2
  49. package/dist/src/broker/actor/authority-upgrades.js +7 -2
  50. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  51. package/dist/src/broker/actor/delivery-intents.js +6 -4
  52. package/dist/src/broker/actor/effect-delivery.d.ts +1 -1
  53. package/dist/src/broker/actor/effect-delivery.js +18 -2
  54. package/dist/src/broker/actor/effect-plan.js +11 -2
  55. package/dist/src/broker/actor/effect-queries.d.ts +5 -0
  56. package/dist/src/broker/actor/effect-queries.js +16 -1
  57. package/dist/src/broker/actor/effect-turn.js +2 -0
  58. package/dist/src/broker/actor/pin-check.js +1 -1
  59. package/dist/src/broker/actor/stop-plan.js +10 -4
  60. package/dist/src/broker/actor/stop-turn.d.ts +2 -0
  61. package/dist/src/broker/actor/stop-turn.js +24 -11
  62. package/dist/src/broker/actor/turn-draft.d.ts +1 -0
  63. package/dist/src/broker/actor/turn-draft.js +4 -0
  64. package/dist/src/broker/actor/turn-state.js +6 -2
  65. package/dist/src/broker/authority-admission.js +80 -7
  66. package/dist/src/broker/authority-restore.d.ts +2 -0
  67. package/dist/src/broker/authority-restore.js +36 -1
  68. package/dist/src/broker/command-wait-restore.d.ts +31 -0
  69. package/dist/src/broker/command-wait-restore.js +86 -0
  70. package/dist/src/broker/decision-restore.d.ts +1 -1
  71. package/dist/src/broker/decision-restore.js +5 -4
  72. package/dist/src/broker/effect-upgrade.d.ts +2 -0
  73. package/dist/src/broker/effect-upgrade.js +8 -2
  74. package/dist/src/broker/socket-address.d.ts +3 -1
  75. package/dist/src/broker/socket-address.js +2 -2
  76. package/dist/src/cli/arguments.d.ts +22 -11
  77. package/dist/src/cli/arguments.js +73 -104
  78. package/dist/src/cli/chat-stores.d.ts +2 -0
  79. package/dist/src/cli/chat-stores.js +113 -0
  80. package/dist/src/cli/client.d.ts +4 -1
  81. package/dist/src/cli/client.js +9 -3
  82. package/dist/src/cli/command-effects.d.ts +7 -0
  83. package/dist/src/cli/command-effects.js +39 -0
  84. package/dist/src/cli/command-requests.d.ts +17 -0
  85. package/dist/src/cli/command-requests.js +43 -0
  86. package/dist/src/cli/command-waits.d.ts +9 -0
  87. package/dist/src/cli/command-waits.js +51 -0
  88. package/dist/src/cli/commands.js +21 -41
  89. package/dist/src/cli/config-arguments.d.ts +11 -0
  90. package/dist/src/cli/config-arguments.js +59 -0
  91. package/dist/src/cli/config-command.d.ts +2 -0
  92. package/dist/src/cli/config-command.js +105 -0
  93. package/dist/src/cli/config-file.d.ts +3 -0
  94. package/dist/src/cli/config-file.js +52 -0
  95. package/dist/src/cli/config-lock.d.ts +7 -0
  96. package/dist/src/cli/config-lock.js +61 -0
  97. package/dist/src/cli/config-notice.d.ts +5 -0
  98. package/dist/src/cli/config-notice.js +46 -0
  99. package/dist/src/cli/doctor-github.d.ts +9 -0
  100. package/dist/src/cli/doctor-github.js +138 -0
  101. package/dist/src/cli/doctor-harness.d.ts +13 -0
  102. package/dist/src/cli/doctor-harness.js +242 -0
  103. package/dist/src/cli/doctor-local.d.ts +18 -0
  104. package/dist/src/cli/doctor-local.js +77 -0
  105. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  106. package/dist/src/cli/doctor-runtime.js +176 -0
  107. package/dist/src/cli/doctor-service.d.ts +1 -0
  108. package/dist/src/cli/doctor-service.js +11 -0
  109. package/dist/src/cli/doctor-workflows.d.ts +6 -0
  110. package/dist/src/cli/doctor-workflows.js +50 -0
  111. package/dist/src/cli/doctor.d.ts +15 -0
  112. package/dist/src/cli/doctor.js +187 -0
  113. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  114. package/dist/src/cli/github-ci-progress.js +83 -0
  115. package/dist/src/cli/github-retry.d.ts +6 -0
  116. package/dist/src/cli/github-retry.js +47 -0
  117. package/dist/src/cli/harness-probes.d.ts +24 -0
  118. package/dist/src/cli/harness-probes.js +183 -0
  119. package/dist/src/cli/harness-processes.d.ts +6 -0
  120. package/dist/src/cli/harness-processes.js +36 -0
  121. package/dist/src/cli/init-command.d.ts +9 -0
  122. package/dist/src/cli/init-command.js +52 -0
  123. package/dist/src/cli/init-prompt-command.d.ts +10 -0
  124. package/dist/src/cli/init-prompt-command.js +145 -0
  125. package/dist/src/cli/init-prompt.d.ts +35 -0
  126. package/dist/src/cli/init-prompt.js +74 -0
  127. package/dist/src/cli/init-selection.d.ts +13 -0
  128. package/dist/src/cli/init-selection.js +75 -0
  129. package/dist/src/cli/main.d.ts +9 -1
  130. package/dist/src/cli/main.js +69 -61
  131. package/dist/src/cli/mcp-server.d.ts +1 -0
  132. package/dist/src/cli/mcp-server.js +156 -0
  133. package/dist/src/cli/mcp-tools.d.ts +15 -0
  134. package/dist/src/cli/mcp-tools.js +80 -0
  135. package/dist/src/cli/phone-arguments.d.ts +14 -0
  136. package/dist/src/cli/phone-arguments.js +37 -0
  137. package/dist/src/cli/phone-client.d.ts +2 -0
  138. package/dist/src/cli/phone-client.js +32 -0
  139. package/dist/src/cli/phone-command.d.ts +13 -0
  140. package/dist/src/cli/phone-command.js +101 -0
  141. package/dist/src/cli/probe-command.d.ts +36 -0
  142. package/dist/src/cli/probe-command.js +59 -0
  143. package/dist/src/cli/project-settings.d.ts +4 -0
  144. package/dist/src/cli/project-settings.js +33 -0
  145. package/dist/src/cli/render.d.ts +2 -1
  146. package/dist/src/cli/render.js +57 -54
  147. package/dist/src/cli/report-ci-jobs.d.ts +23 -0
  148. package/dist/src/cli/report-ci-jobs.js +103 -0
  149. package/dist/src/cli/report-ci-usage.d.ts +9 -0
  150. package/dist/src/cli/report-ci-usage.js +185 -0
  151. package/dist/src/cli/report-ci.d.ts +13 -0
  152. package/dist/src/cli/report-ci.js +74 -0
  153. package/dist/src/cli/report-closures.d.ts +6 -0
  154. package/dist/src/cli/report-closures.js +97 -0
  155. package/dist/src/cli/report-flow.d.ts +7 -0
  156. package/dist/src/cli/report-flow.js +122 -0
  157. package/dist/src/cli/report-github-reader.d.ts +29 -0
  158. package/dist/src/cli/report-github-reader.js +157 -0
  159. package/dist/src/cli/report-github.d.ts +25 -0
  160. package/dist/src/cli/report-github.js +181 -0
  161. package/dist/src/cli/report-operator.d.ts +3 -0
  162. package/dist/src/cli/report-operator.js +40 -0
  163. package/dist/src/cli/report-ready.d.ts +3 -0
  164. package/dist/src/cli/report-ready.js +96 -0
  165. package/dist/src/cli/report-text.d.ts +9 -0
  166. package/dist/src/cli/report-text.js +33 -0
  167. package/dist/src/cli/report.d.ts +18 -0
  168. package/dist/src/cli/report.js +269 -0
  169. package/dist/src/cli/repository-arguments.d.ts +5 -0
  170. package/dist/src/cli/repository-arguments.js +34 -0
  171. package/dist/src/cli/runtime-arguments.d.ts +6 -1
  172. package/dist/src/cli/runtime-arguments.js +22 -2
  173. package/dist/src/cli/runtime-directory.d.ts +6 -2
  174. package/dist/src/cli/runtime-directory.js +72 -14
  175. package/dist/src/cli/schedule-arguments.d.ts +14 -0
  176. package/dist/src/cli/schedule-arguments.js +26 -0
  177. package/dist/src/cli/schedule-render.d.ts +22 -0
  178. package/dist/src/cli/schedule-render.js +73 -0
  179. package/dist/src/cli/terminal-text.d.ts +3 -0
  180. package/dist/src/cli/terminal-text.js +28 -0
  181. package/dist/src/cli/toolchain.d.ts +2 -0
  182. package/dist/src/cli/toolchain.js +22 -2
  183. package/dist/src/cli/usage-render.d.ts +6 -0
  184. package/dist/src/cli/usage-render.js +67 -1
  185. package/dist/src/cli/usage.d.ts +3 -3
  186. package/dist/src/cli/usage.js +119 -50
  187. package/dist/src/cli/watch-actions.d.ts +2 -0
  188. package/dist/src/cli/watch-actions.js +6 -6
  189. package/dist/src/cli/watch-board-view.d.ts +1 -1
  190. package/dist/src/cli/watch-board-view.js +27 -4
  191. package/dist/src/cli/watch-board.d.ts +4 -2
  192. package/dist/src/cli/watch-board.js +58 -35
  193. package/dist/src/cli/watch-card-forms.d.ts +1 -1
  194. package/dist/src/cli/watch-card-forms.js +13 -12
  195. package/dist/src/cli/watch-client.d.ts +1 -1
  196. package/dist/src/cli/watch-client.js +7 -11
  197. package/dist/src/cli/watch-header-view.d.ts +22 -0
  198. package/dist/src/cli/watch-header-view.js +104 -0
  199. package/dist/src/cli/watch-model.d.ts +4 -1
  200. package/dist/src/cli/watch-model.js +34 -15
  201. package/dist/src/cli/watch-page.js +57 -23
  202. package/dist/src/cli/watch-phases.d.ts +12 -3
  203. package/dist/src/cli/watch-phases.js +68 -11
  204. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  205. package/dist/src/cli/watch-phone-client.js +84 -0
  206. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  207. package/dist/src/cli/watch-phone-view.js +113 -0
  208. package/dist/src/cli/watch-phone.d.ts +5 -0
  209. package/dist/src/cli/watch-phone.js +53 -0
  210. package/dist/src/cli/watch-pr-board.js +1 -1
  211. package/dist/src/cli/watch-pr-command.d.ts +1 -0
  212. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  213. package/dist/src/cli/watch-pull-request.js +22 -8
  214. package/dist/src/cli/watch-reads.d.ts +2 -0
  215. package/dist/src/cli/watch-reads.js +17 -16
  216. package/dist/src/cli/watch-render.d.ts +23 -1
  217. package/dist/src/cli/watch-run-input.d.ts +0 -1
  218. package/dist/src/cli/watch-run-input.js +0 -13
  219. package/dist/src/cli/watch-server.js +29 -11
  220. package/dist/src/cli/watch-turn.d.ts +4 -1
  221. package/dist/src/cli/watch-turn.js +37 -1
  222. package/dist/src/cli/watch-usage.js +5 -1
  223. package/dist/src/cli/watch-view.d.ts +4 -21
  224. package/dist/src/cli/watch-view.js +26 -118
  225. package/dist/src/cli.js +165 -28
  226. package/dist/src/command-settings.d.ts +16 -0
  227. package/dist/src/command-settings.js +42 -0
  228. package/dist/src/command-wait.d.ts +4 -0
  229. package/dist/src/command-wait.js +45 -0
  230. package/dist/src/configuration-change.d.ts +18 -0
  231. package/dist/src/configuration-change.js +76 -0
  232. package/dist/src/configuration-display.d.ts +21 -0
  233. package/dist/src/configuration-display.js +69 -0
  234. package/dist/src/configuration-schema.d.ts +58 -0
  235. package/dist/src/configuration-schema.js +163 -0
  236. package/dist/src/daemon/attachment-file.d.ts +6 -0
  237. package/dist/src/daemon/attachment-file.js +86 -0
  238. package/dist/src/daemon/attachments.d.ts +14 -0
  239. package/dist/src/daemon/attachments.js +17 -0
  240. package/dist/src/daemon/claude-recovery.d.ts +50 -0
  241. package/dist/src/daemon/claude-recovery.js +204 -0
  242. package/dist/src/daemon/claude-stream.d.ts +27 -0
  243. package/dist/src/daemon/claude-stream.js +63 -0
  244. package/dist/src/daemon/claude-turn.d.ts +18 -18
  245. package/dist/src/daemon/claude-turn.js +151 -105
  246. package/dist/src/daemon/claude-worker.d.ts +5 -4
  247. package/dist/src/daemon/claude-worker.js +149 -158
  248. package/dist/src/daemon/command-journal.d.ts +5 -0
  249. package/dist/src/daemon/command-journal.js +50 -0
  250. package/dist/src/daemon/command-process.d.ts +28 -0
  251. package/dist/src/daemon/command-process.js +164 -0
  252. package/dist/src/daemon/command-worker.d.ts +19 -0
  253. package/dist/src/daemon/command-worker.js +182 -0
  254. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  255. package/dist/src/daemon/cursor-stream.js +154 -0
  256. package/dist/src/daemon/daemon-adapters.d.ts +60 -0
  257. package/dist/src/daemon/daemon-adapters.js +126 -0
  258. package/dist/src/daemon/daemon-loops.d.ts +16 -0
  259. package/dist/src/daemon/daemon-loops.js +41 -0
  260. package/dist/src/daemon/daemon.d.ts +2 -33
  261. package/dist/src/daemon/daemon.js +133 -131
  262. package/dist/src/daemon/declared-input.d.ts +3 -0
  263. package/dist/src/daemon/declared-input.js +9 -0
  264. package/dist/src/daemon/delivery-router.js +1 -1
  265. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  266. package/dist/src/daemon/gemini-stream.js +129 -0
  267. package/dist/src/daemon/github-attach.d.ts +2 -0
  268. package/dist/src/daemon/github-attach.js +149 -0
  269. package/dist/src/daemon/github-ci-filters.d.ts +6 -0
  270. package/dist/src/daemon/github-ci-filters.js +138 -0
  271. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  272. package/dist/src/daemon/github-ci-rerun.js +92 -0
  273. package/dist/src/daemon/github-ci-workflows.d.ts +10 -0
  274. package/dist/src/daemon/github-ci-workflows.js +148 -0
  275. package/dist/src/daemon/github-ci.js +109 -10
  276. package/dist/src/daemon/github-issue-methods.d.ts +2 -0
  277. package/dist/src/daemon/github-issue-methods.js +37 -2
  278. package/dist/src/daemon/github-merge-call.d.ts +4 -1
  279. package/dist/src/daemon/github-merge-call.js +10 -3
  280. package/dist/src/daemon/github-merge.js +58 -26
  281. package/dist/src/daemon/github-methods.js +22 -2
  282. package/dist/src/daemon/github-operation.d.ts +5 -0
  283. package/dist/src/daemon/github-operation.js +6 -0
  284. package/dist/src/daemon/github-retry.js +8 -44
  285. package/dist/src/daemon/github-worker.d.ts +4 -0
  286. package/dist/src/daemon/github-worker.js +6 -0
  287. package/dist/src/daemon/issue-queue.d.ts +1 -0
  288. package/dist/src/daemon/issue-queue.js +16 -34
  289. package/dist/src/daemon/notify-events.d.ts +6 -0
  290. package/dist/src/daemon/notify-events.js +84 -0
  291. package/dist/src/daemon/notify-journal.js +1 -1
  292. package/dist/src/daemon/notify-message.d.ts +4 -1
  293. package/dist/src/daemon/notify-message.js +36 -0
  294. package/dist/src/daemon/notify.d.ts +1 -1
  295. package/dist/src/daemon/notify.js +7 -78
  296. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  297. package/dist/src/daemon/opencode-stream.js +87 -0
  298. package/dist/src/daemon/operation-journal.d.ts +1 -0
  299. package/dist/src/daemon/queue-status.d.ts +10 -0
  300. package/dist/src/daemon/queue-status.js +51 -0
  301. package/dist/src/daemon/resume-index-lock.d.ts +13 -0
  302. package/dist/src/daemon/resume-index-lock.js +160 -0
  303. package/dist/src/daemon/resume-worktree.d.ts +7 -0
  304. package/dist/src/daemon/resume-worktree.js +29 -0
  305. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  306. package/dist/src/daemon/retry-worktree.js +139 -0
  307. package/dist/src/daemon/retrying-turn.d.ts +2 -10
  308. package/dist/src/daemon/retrying-turn.js +145 -141
  309. package/dist/src/daemon/schedule-control.d.ts +26 -0
  310. package/dist/src/daemon/schedule-control.js +110 -0
  311. package/dist/src/daemon/schedule-journal.d.ts +6 -0
  312. package/dist/src/daemon/schedule-journal.js +120 -0
  313. package/dist/src/daemon/text-output.d.ts +18 -0
  314. package/dist/src/daemon/text-output.js +44 -0
  315. package/dist/src/daemon/ticket-registration.d.ts +7 -14
  316. package/dist/src/daemon/ticket-registration.js +93 -114
  317. package/dist/src/daemon/turn-attempt-journal.d.ts +38 -0
  318. package/dist/src/daemon/turn-attempt-journal.js +136 -0
  319. package/dist/src/daemon/turn-attempts.d.ts +47 -0
  320. package/dist/src/daemon/turn-attempts.js +166 -0
  321. package/dist/src/daemon/turn-command.d.ts +10 -0
  322. package/dist/src/daemon/turn-command.js +33 -0
  323. package/dist/src/daemon/turn-report.d.ts +25 -0
  324. package/dist/src/daemon/turn-report.js +118 -0
  325. package/dist/src/daemon/work-tree.d.ts +11 -1
  326. package/dist/src/daemon/work-tree.js +35 -12
  327. package/dist/src/daemon/worker-profile.d.ts +8 -0
  328. package/dist/src/daemon/worker-profile.js +40 -0
  329. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  330. package/dist/src/daemon/workflow-generations.js +57 -0
  331. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  332. package/dist/src/daemon/workflow-replay.js +58 -0
  333. package/dist/src/daemon/workflow-schedules.d.ts +30 -0
  334. package/dist/src/daemon/workflow-schedules.js +238 -0
  335. package/dist/src/daemon/worktree-processes.d.ts +9 -0
  336. package/dist/src/daemon/worktree-processes.js +151 -0
  337. package/dist/src/decision-wait.d.ts +1 -0
  338. package/dist/src/decision-wait.js +3 -0
  339. package/dist/src/delivery-backoff.d.ts +1 -0
  340. package/dist/src/delivery-backoff.js +3 -0
  341. package/dist/src/doctor-report.d.ts +22 -0
  342. package/dist/src/doctor-report.js +63 -0
  343. package/dist/src/execution-pin.d.ts +5 -0
  344. package/dist/src/execution-pin.js +67 -4
  345. package/dist/src/grok-result.d.ts +12 -0
  346. package/dist/src/grok-result.js +61 -0
  347. package/dist/src/harness-defaults.d.ts +35 -0
  348. package/dist/src/harness-defaults.js +121 -0
  349. package/dist/src/harness-start.d.ts +15 -0
  350. package/dist/src/harness-start.js +37 -0
  351. package/dist/src/host/command-wait.d.ts +38 -0
  352. package/dist/src/host/command-wait.js +115 -0
  353. package/dist/src/host/decision-resume.d.ts +35 -0
  354. package/dist/src/host/decision-resume.js +86 -0
  355. package/dist/src/host/gate-bridge.d.ts +48 -0
  356. package/dist/src/host/gate-bridge.js +124 -0
  357. package/dist/src/host/run-wait.d.ts +26 -0
  358. package/dist/src/host/run-wait.js +37 -0
  359. package/dist/src/host/start-delivery.d.ts +6 -8
  360. package/dist/src/host/start-delivery.js +13 -18
  361. package/dist/src/host/step-bridge-host.d.ts +8 -20
  362. package/dist/src/host/step-bridge-host.js +65 -58
  363. package/dist/src/merge-request.d.ts +19 -0
  364. package/dist/src/merge-request.js +32 -0
  365. package/dist/src/operation-identity.d.ts +1 -0
  366. package/dist/src/operation-identity.js +4 -0
  367. package/dist/src/phone/canonical-json.d.ts +1 -0
  368. package/dist/src/phone/canonical-json.js +16 -0
  369. package/dist/src/phone/phone-link.d.ts +7 -0
  370. package/dist/src/phone/phone-link.js +21 -0
  371. package/dist/src/phone/qr-data.d.ts +8 -0
  372. package/dist/src/phone/qr-data.js +133 -0
  373. package/dist/src/phone/qr-matrix.d.ts +6 -0
  374. package/dist/src/phone/qr-matrix.js +175 -0
  375. package/dist/src/phone/qr-penalty.d.ts +3 -0
  376. package/dist/src/phone/qr-penalty.js +67 -0
  377. package/dist/src/phone/qr-picture.d.ts +5 -0
  378. package/dist/src/phone/qr-picture.js +24 -0
  379. package/dist/src/private-config.schema.json +303 -0
  380. package/dist/src/project-config.schema.json +105 -0
  381. package/dist/src/project-settings.d.ts +19 -0
  382. package/dist/src/project-settings.js +133 -0
  383. package/dist/src/queue-spend.d.ts +4 -0
  384. package/dist/src/queue-spend.js +21 -0
  385. package/dist/src/relay/answer-check.d.ts +24 -0
  386. package/dist/src/relay/answer-check.js +145 -0
  387. package/dist/src/relay/answer-inbox.d.ts +15 -0
  388. package/dist/src/relay/answer-inbox.js +173 -0
  389. package/dist/src/relay/daemon-keys.d.ts +16 -0
  390. package/dist/src/relay/daemon-keys.js +75 -0
  391. package/dist/src/relay/decision-check.d.ts +3 -0
  392. package/dist/src/relay/decision-check.js +77 -0
  393. package/dist/src/relay/decision-close.d.ts +6 -0
  394. package/dist/src/relay/decision-close.js +72 -0
  395. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  396. package/dist/src/relay/decision-envelopes.js +93 -0
  397. package/dist/src/relay/decision-watch.d.ts +14 -0
  398. package/dist/src/relay/decision-watch.js +68 -0
  399. package/dist/src/relay/envelope-post.d.ts +8 -0
  400. package/dist/src/relay/envelope-post.js +71 -0
  401. package/dist/src/relay/envelope.d.ts +28 -0
  402. package/dist/src/relay/envelope.js +53 -0
  403. package/dist/src/relay/hpke.d.ts +25 -0
  404. package/dist/src/relay/hpke.js +108 -0
  405. package/dist/src/relay/pairing-checks.d.ts +42 -0
  406. package/dist/src/relay/pairing-checks.js +172 -0
  407. package/dist/src/relay/pairing-follow.d.ts +8 -0
  408. package/dist/src/relay/pairing-follow.js +95 -0
  409. package/dist/src/relay/pairing-session.d.ts +29 -0
  410. package/dist/src/relay/pairing-session.js +87 -0
  411. package/dist/src/relay/phone-delivery.d.ts +51 -0
  412. package/dist/src/relay/phone-delivery.js +139 -0
  413. package/dist/src/relay/phone-devices.d.ts +36 -0
  414. package/dist/src/relay/phone-devices.js +46 -0
  415. package/dist/src/relay/phone-inbox.d.ts +18 -0
  416. package/dist/src/relay/phone-inbox.js +17 -0
  417. package/dist/src/relay/phone-operations.d.ts +18 -0
  418. package/dist/src/relay/phone-operations.js +121 -0
  419. package/dist/src/relay/phone-outbox.d.ts +21 -0
  420. package/dist/src/relay/phone-outbox.js +25 -0
  421. package/dist/src/relay/phone-socket.d.ts +6 -0
  422. package/dist/src/relay/phone-socket.js +63 -0
  423. package/dist/src/relay/relay-control.d.ts +7 -0
  424. package/dist/src/relay/relay-control.js +24 -0
  425. package/dist/src/relay/relay-files.d.ts +2 -0
  426. package/dist/src/relay/relay-files.js +23 -0
  427. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  428. package/dist/src/relay/relay-heartbeat.js +81 -0
  429. package/dist/src/relay/relay-http.d.ts +14 -0
  430. package/dist/src/relay/relay-http.js +63 -0
  431. package/dist/src/relay/relay-registration.d.ts +15 -0
  432. package/dist/src/relay/relay-registration.js +63 -0
  433. package/dist/src/relay/relay-service.d.ts +28 -0
  434. package/dist/src/relay/relay-service.js +218 -0
  435. package/dist/src/relay/relay-store.d.ts +48 -0
  436. package/dist/src/relay/relay-store.js +131 -0
  437. package/dist/src/relay/sealed-post.d.ts +25 -0
  438. package/dist/src/relay/sealed-post.js +52 -0
  439. package/dist/src/relay.d.ts +1 -0
  440. package/dist/src/relay.js +8 -0
  441. package/dist/src/report-ci.d.ts +164 -0
  442. package/dist/src/report-ci.js +32 -0
  443. package/dist/src/report-effects.d.ts +15 -0
  444. package/dist/src/report-effects.js +212 -0
  445. package/dist/src/report-flow-types.d.ts +38 -0
  446. package/dist/src/report-flow-types.js +7 -0
  447. package/dist/src/report-flow.d.ts +43 -0
  448. package/dist/src/report-flow.js +193 -0
  449. package/dist/src/report-operator.d.ts +67 -0
  450. package/dist/src/report-operator.js +25 -0
  451. package/dist/src/report-quality.d.ts +221 -0
  452. package/dist/src/report-quality.js +94 -0
  453. package/dist/src/report-ready.d.ts +23 -0
  454. package/dist/src/report-ready.js +117 -0
  455. package/dist/src/report-statistics.d.ts +51 -0
  456. package/dist/src/report-statistics.js +106 -0
  457. package/dist/src/report.d.ts +712 -0
  458. package/dist/src/report.js +234 -0
  459. package/dist/src/repository-identity.d.ts +4 -0
  460. package/dist/src/repository-identity.js +4 -0
  461. package/dist/src/review-subject.d.ts +41 -0
  462. package/dist/src/review-subject.js +91 -0
  463. package/dist/src/run-wait.d.ts +23 -0
  464. package/dist/src/run-wait.js +20 -0
  465. package/dist/src/schedule-progress.d.ts +33 -0
  466. package/dist/src/schedule-progress.js +45 -0
  467. package/dist/src/service/active-tickets.d.ts +4 -0
  468. package/dist/src/service/active-tickets.js +49 -0
  469. package/dist/src/service/command-effects.d.ts +4 -0
  470. package/dist/src/service/command-effects.js +16 -0
  471. package/dist/src/service/command-waits.d.ts +34 -0
  472. package/dist/src/service/command-waits.js +86 -0
  473. package/dist/src/service/decision-handler.d.ts +4 -0
  474. package/dist/src/service/decision-handler.js +39 -4
  475. package/dist/src/service/expiry.js +2 -0
  476. package/dist/src/service/gateway.js +21 -4
  477. package/dist/src/service/queue-spend.d.ts +6 -0
  478. package/dist/src/service/queue-spend.js +68 -0
  479. package/dist/src/service/registry.d.ts +16 -3
  480. package/dist/src/service/registry.js +34 -3
  481. package/dist/src/service/replies.d.ts +16 -1
  482. package/dist/src/service/replies.js +23 -0
  483. package/dist/src/service/run-handlers.js +35 -56
  484. package/dist/src/service/run-metadata.d.ts +22 -0
  485. package/dist/src/service/run-metadata.js +138 -0
  486. package/dist/src/service/run-waits.d.ts +3 -0
  487. package/dist/src/service/run-waits.js +41 -0
  488. package/dist/src/service/service.d.ts +22 -2
  489. package/dist/src/service/service.js +29 -13
  490. package/dist/src/service/submission-handler.d.ts +0 -1
  491. package/dist/src/service/submission-handler.js +22 -36
  492. package/dist/src/service/worker-port.d.ts +1 -0
  493. package/dist/src/service/worker-port.js +9 -1
  494. package/dist/src/service/worker-totals.d.ts +2 -0
  495. package/dist/src/service/worker-totals.js +9 -24
  496. package/dist/src/step-bridge.d.ts +43 -0
  497. package/dist/src/steps/command-wait.d.ts +12 -0
  498. package/dist/src/steps/command-wait.js +26 -0
  499. package/dist/src/steps/merge-by-person.d.ts +2 -0
  500. package/dist/src/steps/merge-by-person.js +18 -0
  501. package/dist/src/steps/merge-when-green.d.ts +2 -0
  502. package/dist/src/steps/merge-when-green.js +62 -0
  503. package/dist/src/steps/open-decision-wait.d.ts +2 -0
  504. package/dist/src/steps/open-decision-wait.js +8 -0
  505. package/dist/src/steps/review-by-agent.d.ts +5 -0
  506. package/dist/src/steps/review-by-agent.js +124 -0
  507. package/dist/src/steps/review-by-person.d.ts +4 -0
  508. package/dist/src/steps/review-by-person.js +19 -0
  509. package/dist/src/steps/review-subject.d.ts +2 -0
  510. package/dist/src/steps/review-subject.js +11 -0
  511. package/dist/src/steps/run-command.d.ts +2 -0
  512. package/dist/src/steps/run-command.js +15 -0
  513. package/dist/src/steps/sleep.d.ts +3 -0
  514. package/dist/src/steps/sleep.js +19 -0
  515. package/dist/src/steps/wait-for-command.d.ts +3 -0
  516. package/dist/src/steps/wait-for-command.js +17 -0
  517. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  518. package/dist/src/steps/wait-for-decision.js +71 -0
  519. package/dist/src/steps/wait-for-run.d.ts +5 -0
  520. package/dist/src/steps/wait-for-run.js +9 -0
  521. package/dist/src/storage/command-wait-rows.d.ts +30 -0
  522. package/dist/src/storage/command-wait-rows.js +96 -0
  523. package/dist/src/storage/decision-snapshots.d.ts +9 -1
  524. package/dist/src/storage/decision-snapshots.js +22 -2
  525. package/dist/src/storage/domain-changes.d.ts +2 -0
  526. package/dist/src/storage/domain-changes.js +3 -0
  527. package/dist/src/storage/domain-schema.d.ts +13 -1
  528. package/dist/src/storage/domain-schema.js +31 -4
  529. package/dist/src/storage/effect-schema.d.ts +1 -0
  530. package/dist/src/storage/effect-schema.js +5 -0
  531. package/dist/src/submission.d.ts +4 -0
  532. package/dist/src/submission.js +6 -2
  533. package/dist/src/testing-requests.d.ts +15 -0
  534. package/dist/src/testing-requests.js +93 -0
  535. package/dist/src/testing.d.ts +23 -0
  536. package/dist/src/testing.js +211 -0
  537. package/dist/src/ticket-status-stream.d.ts +9 -0
  538. package/dist/src/ticket-status-stream.js +94 -0
  539. package/dist/src/token-prices.d.ts +12 -4
  540. package/dist/src/token-prices.js +15 -2
  541. package/dist/src/turn-profile.d.ts +1 -0
  542. package/dist/src/turn-profile.js +8 -1
  543. package/dist/src/worker-usage.d.ts +17 -0
  544. package/dist/src/worker-usage.js +60 -0
  545. package/dist/src/workflow-admission.d.ts +5 -0
  546. package/dist/src/workflow-candidate.d.ts +8 -2
  547. package/dist/src/workflow-candidate.js +59 -6
  548. package/dist/src/workflow-contracts.d.ts +1 -0
  549. package/dist/src/workflow-contracts.js +9 -2
  550. package/dist/src/workflow-declaration.d.ts +21 -3
  551. package/dist/src/workflow-declaration.js +77 -9
  552. package/dist/src/workflow-discovery.d.ts +3 -13
  553. package/dist/src/workflow-discovery.js +5 -14
  554. package/dist/src/workflow-refusals.js +3 -1
  555. package/dist/src/workflow-schedule.d.ts +22 -0
  556. package/dist/src/workflow-schedule.js +53 -0
  557. package/dist/src/workflows.d.ts +12 -2
  558. package/dist/src/workflows.js +9 -1
  559. package/dist/tools/admit-workflow.d.ts +1 -0
  560. package/dist/tools/admit-workflow.js +18 -5
  561. package/dist/tools/doctor-adoption.d.ts +1 -0
  562. package/dist/tools/doctor-adoption.js +11 -0
  563. package/dist/tools/project-configuration.d.ts +4 -0
  564. package/dist/tools/project-configuration.js +47 -0
  565. package/dist/tools/red-green-command.d.ts +1 -0
  566. package/dist/tools/red-green-command.js +174 -0
  567. package/dist/tools/red-green-process.d.ts +10 -0
  568. package/dist/tools/red-green-process.js +59 -0
  569. package/dist/tools/self-host-processes.d.ts +3 -0
  570. package/dist/tools/self-host-processes.js +63 -33
  571. package/dist/tools/self-host-project.d.ts +4 -0
  572. package/dist/tools/self-host-project.js +42 -60
  573. package/dist/tools/self-host-runtime.d.ts +16 -0
  574. package/dist/tools/self-host-runtime.js +60 -0
  575. package/dist/tools/self-host-workflows.d.ts +1 -0
  576. package/dist/tools/self-host-workflows.js +36 -1
  577. package/dist/tools/self-host.js +128 -71
  578. package/dist/tools/template-command.d.ts +1 -0
  579. package/dist/tools/template-command.js +160 -0
  580. package/dist/tools/template-copy.d.ts +11 -0
  581. package/dist/tools/template-copy.js +130 -0
  582. package/dist/tools/template-files.d.ts +17 -0
  583. package/dist/tools/template-files.js +74 -0
  584. package/dist/tools/workflow-bundles.js +1 -0
  585. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  586. package/dist/tools/workflow-candidate-counts.js +31 -16
  587. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  588. package/dist/tools/workflow-candidate-fields.js +24 -0
  589. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  590. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  591. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  592. package/dist/tools/workflow-candidate-program.js +36 -8
  593. package/dist/tools/workflow-candidate-shape.d.ts +3 -0
  594. package/dist/tools/workflow-candidate-shape.js +90 -0
  595. package/dist/tools/workflow-candidate-source.js +92 -16
  596. package/dist/tools/workflow-candidate-syntax.d.ts +9 -3
  597. package/dist/tools/workflow-candidate-syntax.js +83 -109
  598. package/dist/tools/workflow-command.d.ts +1 -0
  599. package/dist/tools/workflow-command.js +142 -0
  600. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  601. package/dist/tools/workflow-folder-capture.js +47 -2
  602. package/dist/tools/workflow-folders.d.ts +18 -3
  603. package/dist/tools/workflow-folders.js +60 -7
  604. package/dist/tools/workflow-test-hook.d.ts +7 -0
  605. package/dist/tools/workflow-test-hook.js +16 -0
  606. package/dist/tools/workflow-test-loader.d.ts +1 -0
  607. package/dist/tools/workflow-test-loader.js +10 -0
  608. package/package.json +60 -10
  609. package/templates/develop/README.md +90 -0
  610. package/templates/develop/develop/accept.ts +11 -0
  611. package/templates/develop/develop/flow-tests.ts +394 -0
  612. package/templates/develop/develop/local.ts +40 -0
  613. package/templates/develop/develop/option-tests.ts +174 -0
  614. package/templates/develop/develop/partial-choice.ts +29 -0
  615. package/templates/develop/develop/partial.ts +28 -0
  616. package/templates/develop/develop/pull.ts +156 -0
  617. package/templates/develop/develop/queue-partial.ts +39 -0
  618. package/templates/develop/develop/refusal-tests.ts +251 -0
  619. package/templates/develop/develop/report.ts +156 -0
  620. package/templates/develop/develop/round.ts +40 -0
  621. package/templates/develop/develop/scenarios.ts +87 -0
  622. package/templates/develop/develop/turn.ts +68 -0
  623. package/templates/develop/develop.declaration.json +24 -0
  624. package/templates/develop/develop.test.ts +287 -0
  625. package/templates/develop/develop.ts +30 -0
  626. package/templates/develop/template.json +153 -0
  627. package/templates/idea-to-issue/README.md +27 -0
  628. package/templates/idea-to-issue/idea-to-issue/effects.ts +52 -0
  629. package/templates/idea-to-issue/idea-to-issue/leave.ts +10 -0
  630. package/templates/idea-to-issue/idea-to-issue/next.ts +29 -0
  631. package/templates/idea-to-issue/idea-to-issue/post-person.ts +18 -0
  632. package/templates/idea-to-issue/idea-to-issue/post.ts +50 -0
  633. package/templates/idea-to-issue/idea-to-issue/queue.ts +27 -0
  634. package/templates/idea-to-issue/idea-to-issue/review.ts +42 -0
  635. package/templates/idea-to-issue/idea-to-issue/scenarios.ts +50 -0
  636. package/templates/idea-to-issue/idea-to-issue/turn.ts +40 -0
  637. package/templates/idea-to-issue/idea-to-issue.declaration.json +16 -0
  638. package/templates/idea-to-issue/idea-to-issue.test.ts +79 -0
  639. package/templates/idea-to-issue/idea-to-issue.ts +49 -0
  640. package/templates/idea-to-issue/template.json +81 -0
  641. package/templates/review-day/README.md +97 -0
  642. package/templates/review-day/review-day/critique.ts +58 -0
  643. package/templates/review-day/review-day/decision.ts +29 -0
  644. package/templates/review-day/review-day/facts.ts +69 -0
  645. package/templates/review-day/review-day/label.ts +29 -0
  646. package/templates/review-day/review-day/next.ts +28 -0
  647. package/templates/review-day/review-day/post.ts +27 -0
  648. package/templates/review-day/review-day/report.ts +98 -0
  649. package/templates/review-day/review-day/rules.ts +12 -0
  650. package/templates/review-day/review-day/scenarios.ts +76 -0
  651. package/templates/review-day/review-day/turn.ts +73 -0
  652. package/templates/review-day/review-day.declaration.json +16 -0
  653. package/templates/review-day/review-day.test.ts +362 -0
  654. package/templates/review-day/review-day.ts +37 -0
  655. package/templates/review-day/template.json +56 -0
  656. package/dist/src/chats/analysis-batches.d.ts +0 -42
  657. package/dist/src/chats/analysis-batches.js +0 -97
  658. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  659. package/dist/src/chats/analysis-checkpoint.js +0 -31
  660. package/dist/src/chats/analysis-contract.d.ts +0 -80
  661. package/dist/src/chats/analysis-contract.js +0 -16
  662. package/dist/src/chats/analysis-data.d.ts +0 -3
  663. package/dist/src/chats/analysis-data.js +0 -85
  664. package/dist/src/chats/analysis-input.d.ts +0 -18
  665. package/dist/src/chats/analysis-input.js +0 -97
  666. package/dist/src/chats/analysis-links.d.ts +0 -2
  667. package/dist/src/chats/analysis-links.js +0 -25
  668. package/dist/src/chats/analysis-merge.d.ts +0 -16
  669. package/dist/src/chats/analysis-merge.js +0 -134
  670. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  671. package/dist/src/chats/analysis-prompt.js +0 -42
  672. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  673. package/dist/src/chats/analysis-proposal.js +0 -41
  674. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  675. package/dist/src/chats/analysis-provenance.js +0 -99
  676. package/dist/src/chats/analysis-shape.d.ts +0 -4
  677. package/dist/src/chats/analysis-shape.js +0 -235
  678. package/dist/src/chats/analysis.d.ts +0 -3
  679. package/dist/src/chats/analysis.js +0 -42
  680. package/dist/src/chats/corpus-input.d.ts +0 -5
  681. package/dist/src/chats/corpus-input.js +0 -288
  682. package/dist/src/chats/destination.d.ts +0 -4
  683. package/dist/src/chats/destination.js +0 -96
  684. package/dist/src/chats/import.d.ts +0 -15
  685. package/dist/src/chats/import.js +0 -243
  686. package/dist/src/chats/input-file.d.ts +0 -3
  687. package/dist/src/chats/input-file.js +0 -32
  688. package/dist/src/chats/normalize.d.ts +0 -29
  689. package/dist/src/chats/normalize.js +0 -155
  690. package/dist/src/chats/previous-import.d.ts +0 -5
  691. package/dist/src/chats/previous-import.js +0 -34
  692. package/dist/src/chats/reader.d.ts +0 -21
  693. package/dist/src/chats/reader.js +0 -118
  694. package/dist/src/chats/redact-import.d.ts +0 -14
  695. package/dist/src/chats/redact-import.js +0 -141
  696. package/dist/src/chats/redaction.d.ts +0 -41
  697. package/dist/src/chats/redaction.js +0 -161
  698. package/dist/src/chats/reference-mapping.d.ts +0 -16
  699. package/dist/src/chats/reference-mapping.js +0 -153
  700. package/dist/src/chats/revision-input.d.ts +0 -3
  701. package/dist/src/chats/revision-input.js +0 -180
  702. package/dist/src/chats/revision.d.ts +0 -48
  703. package/dist/src/chats/revision.js +0 -94
  704. package/dist/src/chats/selection.d.ts +0 -25
  705. package/dist/src/chats/selection.js +0 -109
  706. package/dist/src/chats/source.d.ts +0 -23
  707. package/dist/src/chats/source.js +0 -135
  708. package/dist/src/chats/structure.d.ts +0 -57
  709. package/dist/src/chats/structure.js +0 -216
  710. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  711. package/dist/src/chats/workflow-generation-projection.js +0 -75
  712. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  713. package/dist/src/chats/workflow-generation-source.js +0 -124
  714. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  715. package/dist/src/chats/workflow-generation-text.js +0 -74
  716. package/dist/src/chats/workflow-generation.d.ts +0 -69
  717. package/dist/src/chats/workflow-generation.js +0 -142
  718. package/dist/src/cli/watch-start-view.d.ts +0 -18
  719. package/dist/src/cli/watch-start-view.js +0 -77
  720. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  721. package/dist/src/daemon/analysis-launch.js +0 -81
  722. package/dist/src/daemon/analysis-token.d.ts +0 -6
  723. package/dist/src/daemon/analysis-token.js +0 -88
  724. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  725. package/dist/src/daemon/analysis-worker.js +0 -271
  726. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  727. package/dist/src/daemon/chats-batch-binding.js +0 -99
  728. package/dist/src/daemon/chats-capture.d.ts +0 -18
  729. package/dist/src/daemon/chats-capture.js +0 -194
  730. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  731. package/dist/src/daemon/chats-checkpoints.js +0 -186
  732. package/dist/src/daemon/chats-files.d.ts +0 -42
  733. package/dist/src/daemon/chats-files.js +0 -252
  734. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  735. package/dist/src/daemon/chats-follow-up.js +0 -180
  736. package/dist/src/daemon/chats-question.d.ts +0 -15
  737. package/dist/src/daemon/chats-question.js +0 -93
  738. package/dist/src/daemon/chats-worker.d.ts +0 -13
  739. package/dist/src/daemon/chats-worker.js +0 -201
  740. package/dist/src/steps/decision-gate.d.ts +0 -2
  741. package/dist/src/steps/decision-gate.js +0 -8
  742. package/dist/workflows/analyze-chats.d.ts +0 -15
  743. package/dist/workflows/analyze-chats.declaration.json +0 -22
  744. package/dist/workflows/analyze-chats.js +0 -250
  745. package/dist/workflows/develop-prd.d.ts +0 -7
  746. package/dist/workflows/develop-prd.js +0 -165
  747. package/dist/workflows/develop-ticket.d.ts +0 -9
  748. package/dist/workflows/develop-ticket.js +0 -207
  749. package/dist/workflows/issue-labels.d.ts +0 -16
  750. package/dist/workflows/issue-labels.js +0 -70
  751. package/dist/workflows/ticket-prompts.d.ts +0 -35
  752. package/dist/workflows/ticket-prompts.js +0 -143
@@ -0,0 +1,138 @@
1
+ import { parse } from "yaml";
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ export function triggerKind(trigger) {
6
+ if (!isRecord(trigger))
7
+ return "push";
8
+ const types = patterns(trigger["types"]);
9
+ return types === undefined || types.includes("synchronize")
10
+ ? "push"
11
+ : "event";
12
+ }
13
+ export function pullRequestTrigger(source) {
14
+ try {
15
+ const document = parse(source, { merge: true });
16
+ if (!isRecord(document) || !("on" in document))
17
+ return true;
18
+ const events = document["on"];
19
+ if (typeof events === "string")
20
+ return events === "pull_request";
21
+ if (Array.isArray(events))
22
+ return events.includes("pull_request");
23
+ if (isRecord(events))
24
+ return "pull_request" in events ? events["pull_request"] : false;
25
+ return true;
26
+ }
27
+ catch {
28
+ return true;
29
+ }
30
+ }
31
+ function patternToken(token) {
32
+ if (token === "**/")
33
+ return { kind: "directory" };
34
+ if (token === "*" || token === "**")
35
+ return {
36
+ kind: "character",
37
+ matcher: token === "*" ? /[^/]/ : /[\s\S]/,
38
+ optional: true,
39
+ repeat: true,
40
+ };
41
+ const literal = token.startsWith("\\") ? token.slice(1) : token;
42
+ const source = token.startsWith("[")
43
+ ? token
44
+ : literal.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
45
+ return {
46
+ kind: "character",
47
+ matcher: new RegExp(`^${source}$`),
48
+ optional: false,
49
+ repeat: false,
50
+ };
51
+ }
52
+ function patternTokens(source) {
53
+ const tokens = [];
54
+ for (const raw of source.match(/\*\*\/|\*\*|\*|\[[a-zA-Z0-9-]+\]|\\[\s\S]|[\s\S]/g) ?? []) {
55
+ if (raw !== "?" && raw !== "+") {
56
+ tokens.push(patternToken(raw));
57
+ continue;
58
+ }
59
+ const previous = tokens.pop();
60
+ if (previous?.kind !== "character" || previous.optional || previous.repeat)
61
+ throw new Error("invalid-workflow-filter");
62
+ tokens.push({ ...previous, optional: raw === "?", repeat: raw === "+" });
63
+ }
64
+ return tokens;
65
+ }
66
+ function advanceDirectory({ value, previous, }) {
67
+ let reachable = false;
68
+ return Array.from({ length: value.length + 1 }, (_, index) => {
69
+ const matches = previous[index] === true || (reachable && value[index - 1] === "/");
70
+ reachable ||= previous[index] === true;
71
+ return matches;
72
+ });
73
+ }
74
+ function advancePattern(token, input) {
75
+ const { value, previous } = input;
76
+ const next = [];
77
+ for (let index = 0; index <= value.length; index += 1) {
78
+ const consumes = index > 0 && token.matcher.test(value[index - 1] ?? "");
79
+ next[index] =
80
+ (token.optional && previous[index] === true) ||
81
+ (consumes &&
82
+ (previous[index - 1] === true ||
83
+ (token.repeat && next[index - 1] === true)));
84
+ }
85
+ return next;
86
+ }
87
+ function matchesPattern(value, source) {
88
+ let previous = [true];
89
+ for (const token of patternTokens(source))
90
+ previous =
91
+ token.kind === "directory"
92
+ ? advanceDirectory({ value, previous })
93
+ : advancePattern(token, { value, previous });
94
+ return previous[value.length] === true;
95
+ }
96
+ function selected(value, patterns) {
97
+ let included = false;
98
+ for (const pattern of patterns) {
99
+ const negative = pattern.startsWith("!");
100
+ const source = negative ? pattern.slice(1) : pattern;
101
+ try {
102
+ if (matchesPattern(value, source))
103
+ included = !negative;
104
+ }
105
+ catch {
106
+ return undefined;
107
+ }
108
+ }
109
+ return included;
110
+ }
111
+ function patterns(value) {
112
+ if (!Array.isArray(value) || value.length === 0)
113
+ return undefined;
114
+ return value.every((item) => typeof item === "string")
115
+ ? value
116
+ : undefined;
117
+ }
118
+ function allows(values, filters) {
119
+ const include = patterns(filters.include);
120
+ const ignore = patterns(filters.ignore);
121
+ if (include !== undefined &&
122
+ !values.some((value) => selected(value, include) !== false))
123
+ return false;
124
+ return (ignore === undefined ||
125
+ values.some((value) => selected(value, ignore) !== true));
126
+ }
127
+ export function workflowApplies(trigger, context) {
128
+ if (!isRecord(trigger))
129
+ return trigger !== false;
130
+ return (allows([context.branch], {
131
+ include: trigger["branches"],
132
+ ignore: trigger["branches-ignore"],
133
+ }) &&
134
+ allows(context.paths, {
135
+ include: trigger["paths"],
136
+ ignore: trigger["paths-ignore"],
137
+ }));
138
+ }
@@ -0,0 +1,26 @@
1
+ import { type Operation } from "./github-operation.ts";
2
+ export interface CiRerun {
3
+ readonly run: string;
4
+ readonly requestedAt: number;
5
+ readonly output: string;
6
+ }
7
+ export interface CiWait {
8
+ readonly commit: string;
9
+ readonly startedAt: number;
10
+ readonly reruns: CiRerun[];
11
+ }
12
+ export declare function ciWait(operation: Operation, commit: string): Promise<CiWait>;
13
+ export declare function workflowAttempt(operation: Operation, run: string): Promise<{
14
+ readonly attempt: number;
15
+ readonly status: string;
16
+ }>;
17
+ export declare function attemptChecks(operation: Operation, workflow: {
18
+ readonly run: string;
19
+ readonly attempt: number;
20
+ }): Promise<ReadonlySet<number>>;
21
+ export declare function rerunCi(operation: Operation, request: {
22
+ readonly wait: CiWait;
23
+ readonly rerun: CiRerun;
24
+ readonly deadline: number;
25
+ }): Promise<void>;
26
+ export declare function attemptOutput(attempts: readonly string[]): string;
@@ -0,0 +1,92 @@
1
+ import { field, repositoryPath } from "./github-operation.js";
2
+ import { githubRead } from "./github-retry.js";
3
+ import { operationKey, writeRecord } from "./operation-journal.js";
4
+ import { readFile } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ function isRerun(value) {
7
+ return (typeof field(value, "run") === "string" &&
8
+ /^\d+$/.test(String(field(value, "run"))) &&
9
+ typeof field(value, "requestedAt") === "number" &&
10
+ typeof field(value, "output") === "string");
11
+ }
12
+ export async function ciWait(operation, commit) {
13
+ const text = await readFile(join(operation.folder, `ci-${operationKey(commit)}.json`), "utf8").catch((error) => {
14
+ if (field(error, "code") === "ENOENT")
15
+ return undefined;
16
+ throw error;
17
+ });
18
+ if (text === undefined)
19
+ return { commit, startedAt: Date.now(), reruns: [] };
20
+ const stored = JSON.parse(text);
21
+ const startedAt = field(stored, "startedAt");
22
+ const reruns = field(stored, "reruns");
23
+ if (field(stored, "commit") !== commit ||
24
+ typeof startedAt !== "number" ||
25
+ !Array.isArray(reruns) ||
26
+ !reruns.every(isRerun))
27
+ throw new Error("github-call-failed");
28
+ return { commit, startedAt, reruns };
29
+ }
30
+ export async function workflowAttempt(operation, run) {
31
+ const value = JSON.parse(await githubRead(operation, [
32
+ "api",
33
+ `${repositoryPath}/actions/runs/${run}`,
34
+ ]));
35
+ const attempt = field(value, "run_attempt");
36
+ const status = field(value, "status");
37
+ if (typeof attempt !== "number" ||
38
+ !Number.isSafeInteger(attempt) ||
39
+ attempt < 1 ||
40
+ typeof status !== "string")
41
+ throw new Error("github-call-failed");
42
+ return { attempt, status };
43
+ }
44
+ export async function attemptChecks(operation, workflow) {
45
+ const pages = JSON.parse(await githubRead(operation, [
46
+ "api",
47
+ "--paginate",
48
+ "--slurp",
49
+ `${repositoryPath}/actions/runs/${workflow.run}/attempts/${String(workflow.attempt)}/jobs?per_page=100`,
50
+ ]));
51
+ if (!Array.isArray(pages) || pages.length === 0)
52
+ throw new Error("github-call-failed");
53
+ const ids = new Set();
54
+ for (const page of pages) {
55
+ const jobs = field(page, "jobs");
56
+ if (!Array.isArray(jobs))
57
+ throw new Error("github-call-failed");
58
+ for (const job of jobs) {
59
+ const id = /\/check-runs\/(\d+)$/.exec(String(field(job, "check_run_url")))?.[1];
60
+ if (id === undefined)
61
+ throw new Error("github-call-failed");
62
+ ids.add(Number(id));
63
+ }
64
+ }
65
+ return ids;
66
+ }
67
+ export async function rerunCi(operation, request) {
68
+ const { wait, rerun } = request;
69
+ wait.reruns.push(rerun);
70
+ await writeRecord(operation.folder, {
71
+ name: `ci-${operationKey(wait.commit)}.json`,
72
+ value: wait,
73
+ permissions: "private",
74
+ });
75
+ if (Date.now() >= request.deadline)
76
+ return;
77
+ try {
78
+ await operation.calls.gh(["run", "rerun", rerun.run, "--failed"]);
79
+ }
80
+ catch (error) {
81
+ operation.signal.throwIfAborted();
82
+ throw Object.assign(new Error("github-network-failed", { cause: error }), {
83
+ detail: field(error, "detail"),
84
+ });
85
+ }
86
+ }
87
+ export function attemptOutput(attempts) {
88
+ const allowance = Math.floor(6_000 / attempts.length) - 40;
89
+ return attempts
90
+ .map((output, index) => `Attempt ${String(index + 1)}:\n${output.length <= allowance ? output : output.slice(0, 400) + "\n…\n" + output.slice(-(allowance - 404))}`)
91
+ .join("\n");
92
+ }
@@ -0,0 +1,10 @@
1
+ import { type Operation } from "./github-operation.ts";
2
+ export interface ExpectedWorkflow {
3
+ readonly path: string;
4
+ readonly kind: "push" | "event";
5
+ }
6
+ export declare function pullRequestWorkflows(operation: Operation, commit: string): Promise<readonly ExpectedWorkflow[]>;
7
+ export declare function pendingWorkflows(operation: Operation, input: {
8
+ readonly commit: string;
9
+ readonly workflows: readonly ExpectedWorkflow[];
10
+ }): Promise<readonly string[]>;
@@ -0,0 +1,148 @@
1
+ import { pullRequestTrigger, triggerKind, workflowApplies, } from "./github-ci-filters.js";
2
+ import { field, repositoryPath } from "./github-operation.js";
3
+ import { githubRead } from "./github-retry.js";
4
+ async function pullBase(operation) {
5
+ const pull = JSON.parse(await githubRead(operation, [
6
+ "api",
7
+ `${repositoryPath}/pulls/${String(operation.payload["number"])}`,
8
+ ]));
9
+ if (typeof pull !== "object" || pull === null || !("base" in pull))
10
+ throw new Error("github-call-failed");
11
+ const baseData = pull.base;
12
+ if (typeof baseData !== "object" || baseData === null)
13
+ throw new Error("github-call-failed");
14
+ const base = field(baseData, "sha");
15
+ const branch = field(baseData, "ref");
16
+ if (typeof base !== "string" ||
17
+ !/^[0-9a-f]{40,64}$/.test(base) ||
18
+ typeof branch !== "string")
19
+ throw new Error("github-call-failed");
20
+ return { base, branch };
21
+ }
22
+ async function appliesToPull(operation, input) {
23
+ const { commit, trigger } = input;
24
+ if (trigger === false)
25
+ return false;
26
+ if (typeof trigger !== "object" || trigger === null)
27
+ return true;
28
+ if (!["paths", "paths-ignore", "branches", "branches-ignore"].some((key) => Object.hasOwn(trigger, key)))
29
+ return true;
30
+ const { base, branch } = await pullBase(operation);
31
+ await operation.calls.git(operation.settings.repository, [
32
+ "fetch",
33
+ "--quiet",
34
+ "--no-tags",
35
+ "origin",
36
+ base,
37
+ ]);
38
+ const paths = await operation.calls.git(operation.settings.repository, [
39
+ "diff",
40
+ "--name-only",
41
+ "-z",
42
+ `${base}...${commit}`,
43
+ ]);
44
+ return workflowApplies(trigger, {
45
+ branch,
46
+ paths: paths.split("\0").filter((path) => path !== ""),
47
+ });
48
+ }
49
+ export async function pullRequestWorkflows(operation, commit) {
50
+ const read = (parts) => operation.calls.git(operation.settings.repository, parts);
51
+ const paths = await read([
52
+ "ls-tree",
53
+ "-r",
54
+ "--name-only",
55
+ "-z",
56
+ commit,
57
+ "--",
58
+ ".github/workflows",
59
+ ]);
60
+ const workflows = [];
61
+ for (const path of paths.split("\0")) {
62
+ if (!/^\.github\/workflows\/[^/]+\.ya?ml$/.test(path))
63
+ continue;
64
+ const trigger = pullRequestTrigger(await read(["show", `${commit}:${path}`]));
65
+ if (await appliesToPull(operation, { commit, trigger }))
66
+ workflows.push({ path, kind: triggerKind(trigger) });
67
+ }
68
+ if (workflows.length === 0)
69
+ return workflows;
70
+ const inactive = await inactiveWorkflows(operation);
71
+ return workflows.filter((workflow) => !inactive.has(workflow.path));
72
+ }
73
+ function isList(value) {
74
+ return Array.isArray(value);
75
+ }
76
+ async function actionPages(operation, request) {
77
+ const pages = JSON.parse(await githubRead(operation, ["api", "--paginate", "--slurp", request.path]));
78
+ if (!isList(pages) || pages.length === 0)
79
+ throw new Error("github-call-failed");
80
+ return pages.flatMap((page) => {
81
+ if (typeof page !== "object" || page === null)
82
+ throw new Error("github-call-failed");
83
+ const items = field(page, request.key);
84
+ if (!isList(items))
85
+ throw new Error("github-call-failed");
86
+ return items;
87
+ });
88
+ }
89
+ async function inactiveWorkflows(operation) {
90
+ const workflows = await actionPages(operation, {
91
+ path: `${repositoryPath}/actions/workflows?per_page=100`,
92
+ key: "workflows",
93
+ });
94
+ const inactive = new Set();
95
+ for (const workflow of workflows) {
96
+ if (typeof workflow !== "object" || workflow === null)
97
+ throw new Error("github-call-failed");
98
+ const path = field(workflow, "path");
99
+ const state = field(workflow, "state");
100
+ if (typeof path !== "string" || typeof state !== "string")
101
+ throw new Error("github-call-failed");
102
+ if (state !== "active")
103
+ inactive.add(path);
104
+ }
105
+ return inactive;
106
+ }
107
+ function isWorkflowRun(value) {
108
+ if (typeof value !== "object" || value === null)
109
+ return false;
110
+ const conclusion = field(value, "conclusion");
111
+ return (typeof field(value, "id") === "number" &&
112
+ ["path", "head_sha", "event", "status"].every((key) => typeof field(value, key) === "string") &&
113
+ (conclusion === null || typeof conclusion === "string"));
114
+ }
115
+ async function workflowRuns(operation, commit) {
116
+ const runs = await actionPages(operation, {
117
+ path: `${repositoryPath}/actions/runs?head_sha=${commit}&event=pull_request&per_page=100`,
118
+ key: "workflow_runs",
119
+ });
120
+ if (!runs.every(isWorkflowRun))
121
+ throw new Error("github-call-failed");
122
+ return runs;
123
+ }
124
+ export async function pendingWorkflows(operation, input) {
125
+ if (input.workflows.length === 0)
126
+ return [];
127
+ const paths = input.workflows.map((workflow) => workflow.path);
128
+ const latest = new Map();
129
+ for (const run of await workflowRuns(operation, input.commit)) {
130
+ if (run.head_sha !== input.commit || run.event !== "pull_request")
131
+ continue;
132
+ const path = paths
133
+ .filter((expected) => run.path === expected || run.path.startsWith(`${expected}@`))
134
+ .sort((left, right) => right.length - left.length)[0];
135
+ if (path === undefined)
136
+ continue;
137
+ if (run.id > (latest.get(path)?.id ?? -1))
138
+ latest.set(path, run);
139
+ }
140
+ const pending = input.workflows.filter((workflow) => {
141
+ const run = latest.get(workflow.path);
142
+ if (run === undefined)
143
+ return workflow.kind === "push";
144
+ return (run.status !== "completed" ||
145
+ !["success", "neutral", "skipped"].includes(run.conclusion ?? ""));
146
+ });
147
+ return pending.length === 0 ? [] : ["waiting for GitHub Actions checks"];
148
+ }
@@ -1,6 +1,9 @@
1
+ import { settingsEnvironment } from "../cli/project-settings.js";
1
2
  import { setTimeout as delay } from "node:timers/promises";
2
3
  import { githubText } from "./github-calls.js";
3
4
  import { githubRead } from "./github-retry.js";
5
+ import { pendingWorkflows, pullRequestWorkflows, } from "./github-ci-workflows.js";
6
+ import { ciWait, workflowAttempt, attemptChecks, rerunCi, attemptOutput, } from "./github-ci-rerun.js";
4
7
  import { field, githubTiming, repositoryPath, } from "./github-operation.js";
5
8
  function isCheckRun(value) {
6
9
  const conclusion = field(value, "conclusion");
@@ -117,12 +120,18 @@ async function failedOutput(operation, checks) {
117
120
  .join("\n")
118
121
  .slice(0, 6_000);
119
122
  }
123
+ function requiredCheckNames(operation) {
124
+ if (operation.settings.requiredChecks !== undefined)
125
+ return operation.settings.requiredChecks === null
126
+ ? undefined
127
+ : operation.settings.requiredChecks;
128
+ const setting = settingsEnvironment({ ...process.env, ...operation.settings.environment }, operation.settings.repository)["CLOVING_REQUIRED_CHECKS"];
129
+ return setting === undefined ? undefined : JSON.parse(setting);
130
+ }
120
131
  function requiredChecks(operation) {
121
- const setting = operation.settings.environment?.["CLOVING_REQUIRED_CHECKS"] ??
122
- process.env["CLOVING_REQUIRED_CHECKS"];
123
- if (setting === undefined)
132
+ const names = requiredCheckNames(operation);
133
+ if (names === undefined)
124
134
  return undefined;
125
- const names = JSON.parse(setting);
126
135
  if (!Array.isArray(names) ||
127
136
  !names.every((name) => typeof name === "string" && name.trim() !== ""))
128
137
  throw new Error("invalid-payload");
@@ -131,27 +140,117 @@ function requiredChecks(operation) {
131
140
  function pendingChecks(checks, names) {
132
141
  return [...names].filter((name) => !checks.some((check) => check.name === name && check.status === "completed"));
133
142
  }
134
- export async function waitForCi(operation, commit) {
135
- const { pollMilliseconds: poll, ciGraceMilliseconds: grace, ciLimitMilliseconds: limit, } = {
143
+ function runOf(check) {
144
+ return check.app?.slug === "github-actions"
145
+ ? /\/actions\/runs\/(\d+)/.exec(check.details_url ?? "")?.[1]
146
+ : undefined;
147
+ }
148
+ async function rerunBeforeDeadline(operation, request) {
149
+ if (Date.now() >= request.deadline)
150
+ return;
151
+ const output = await failedOutput(operation, request.checks);
152
+ const requestedAt = Date.now();
153
+ if (requestedAt >= request.deadline)
154
+ return;
155
+ await rerunCi(operation, {
156
+ wait: request.wait,
157
+ rerun: { run: request.run, requestedAt, output },
158
+ deadline: request.deadline,
159
+ });
160
+ }
161
+ async function rerunFailedChecks(operation, input) {
162
+ const { wait, failed } = input;
163
+ const failures = failed.filter((check) => runOf(check) === undefined);
164
+ const pending = [];
165
+ const runs = new Set(failed.flatMap((check) => runOf(check) ?? []));
166
+ for (const run of runs) {
167
+ const checks = failed.filter((check) => runOf(check) === run);
168
+ const recorded = wait.reruns.find((rerun) => rerun.run === run);
169
+ const workflow = await workflowAttempt(operation, run);
170
+ if (workflow.attempt === 1 &&
171
+ recorded === undefined &&
172
+ workflow.status === "completed")
173
+ await rerunBeforeDeadline(operation, {
174
+ wait,
175
+ run,
176
+ checks,
177
+ deadline: input.deadline,
178
+ });
179
+ if (workflow.attempt === 1) {
180
+ pending.push(`workflow ${run} rerun`);
181
+ continue;
182
+ }
183
+ const ids = await attemptChecks(operation, {
184
+ run,
185
+ attempt: workflow.attempt,
186
+ });
187
+ const current = checks.filter((check) => ids.has(check.id));
188
+ if (current.length === 0) {
189
+ pending.push(`workflow ${run} rerun`);
190
+ continue;
191
+ }
192
+ failures.push(...current);
193
+ }
194
+ return { failures, pending };
195
+ }
196
+ async function ciFailureOutput(operation, input) {
197
+ const { wait, failed } = input;
198
+ const previous = wait.reruns.filter((rerun) => failed.some((check) => runOf(check) === rerun.run));
199
+ const current = await failedOutput(operation, failed);
200
+ return previous.length === 0
201
+ ? current
202
+ : attemptOutput([
203
+ previous.map((rerun) => rerun.output).join("\n"),
204
+ current,
205
+ ]);
206
+ }
207
+ async function ciSettings(operation, commit) {
208
+ const timing = {
136
209
  ...githubTiming,
137
210
  ciGraceMilliseconds: 60_000,
138
211
  ciLimitMilliseconds: 5_400_000,
139
212
  ...operation.settings.timing,
140
213
  };
141
- const started = Date.now();
142
214
  const required = requiredChecks(operation);
215
+ const workflows = required === undefined ? await pullRequestWorkflows(operation, commit) : [];
216
+ return {
217
+ required,
218
+ workflows,
219
+ poll: timing.pollMilliseconds,
220
+ limit: timing.ciLimitMilliseconds,
221
+ grace: workflows.some((workflow) => workflow.kind === "push")
222
+ ? Infinity
223
+ : timing.ciGraceMilliseconds,
224
+ };
225
+ }
226
+ export async function waitForCi(operation, commit) {
227
+ const wait = await ciWait(operation, commit);
228
+ const started = wait.startedAt;
229
+ const { required, workflows, grace, poll, limit } = await ciSettings(operation, commit);
143
230
  const names = new Set(required);
144
231
  for (;;) {
145
232
  const checks = latestRuns(await checkRuns(operation, commit), required);
146
233
  for (const check of checks)
147
234
  names.add(check.name);
148
235
  const failed = checks.filter((check) => check.status === "completed" && !passing.has(check.conclusion ?? ""));
149
- if (failed.length > 0)
236
+ const retried = await rerunFailedChecks(operation, {
237
+ wait,
238
+ failed,
239
+ deadline: started + limit,
240
+ });
241
+ if (retried.failures.length > 0)
150
242
  return {
151
243
  reason: "ci-failed",
152
- output: await failedOutput(operation, failed),
244
+ output: await ciFailureOutput(operation, {
245
+ wait,
246
+ failed: retried.failures,
247
+ }),
153
248
  };
154
- const pending = pendingChecks(checks, names);
249
+ const pending = [
250
+ ...pendingChecks(checks, names),
251
+ ...retried.pending,
252
+ ...(await pendingWorkflows(operation, { commit, workflows })),
253
+ ];
155
254
  if (pending.length === 0 &&
156
255
  (required !== undefined ||
157
256
  names.size > 0 ||
@@ -1,3 +1,5 @@
1
1
  import { type Operation } from "./github-operation.ts";
2
+ export declare function repositoryName(reply: string): string;
3
+ export declare function captureDraft(operation: Operation): Promise<unknown>;
2
4
  export declare function createIssue(operation: Operation): Promise<unknown>;
3
5
  export declare function discard(operation: Operation): Promise<unknown>;
@@ -1,4 +1,5 @@
1
1
  import { existsSync } from "node:fs";
2
+ import { createHash } from "node:crypto";
2
3
  import { lstat, readFile } from "node:fs/promises";
3
4
  import { basename, join } from "node:path";
4
5
  import { existingTree, removeWorktree, repositoryPath, text, } from "./github-operation.js";
@@ -30,7 +31,7 @@ function issuePage(line) {
30
31
  throw new Error("github-call-failed");
31
32
  return page.map((issue) => issueOf(issue));
32
33
  }
33
- function repositoryName(reply) {
34
+ export function repositoryName(reply) {
34
35
  const repository = JSON.parse(reply);
35
36
  if (typeof repository !== "object" ||
36
37
  repository === null ||
@@ -50,6 +51,28 @@ async function draftOf(operation) {
50
51
  throw new Error("draft-not-available");
51
52
  return readFile(path, "utf8");
52
53
  }
54
+ function draftDigest(text) {
55
+ return "sha256:" + createHash("sha256").update(text).digest("hex");
56
+ }
57
+ export async function captureDraft(operation) {
58
+ const text = await draftOf(operation);
59
+ const capture = { text, digest: draftDigest(text) };
60
+ if (Buffer.byteLength(JSON.stringify(capture)) > 65_536)
61
+ throw new Error("draft-too-large");
62
+ return capture;
63
+ }
64
+ function checkDraftDigest(operation, draft) {
65
+ if (!Object.hasOwn(operation.payload, "expectedDigests"))
66
+ return;
67
+ const digests = operation.payload["expectedDigests"];
68
+ if (!Array.isArray(digests) ||
69
+ digests.length === 0 ||
70
+ !digests.every((digest) => typeof digest === "string" && /^sha256:[0-9a-f]{64}$/.test(digest)))
71
+ throw new Error("invalid-payload");
72
+ const current = draftDigest(draft);
73
+ if (!digests.every((digest) => digest === current))
74
+ throw new Error("draft-changed");
75
+ }
53
76
  async function knownIssue(operation, marker) {
54
77
  const output = await operation.calls.gh([
55
78
  "api",
@@ -62,7 +85,10 @@ async function knownIssue(operation, marker) {
62
85
  }
63
86
  export async function createIssue(operation) {
64
87
  operatorPrivateTexts(operation.settings);
65
- const draft = await draftOf(operation);
88
+ const draft = Object.hasOwn(operation.payload, "text")
89
+ ? reportText(operation)
90
+ : await draftOf(operation);
91
+ checkDraftDigest(operation, draft);
66
92
  const [heading = "", ...lines] = draft.split("\n");
67
93
  if (!heading.startsWith("# ") || heading.slice(2).trim() === "")
68
94
  throw new Error("invalid-draft");
@@ -89,6 +115,15 @@ export async function createIssue(operation) {
89
115
  const url = printed.trim().split("\n").at(-1) ?? "";
90
116
  return issueFromUrl(url);
91
117
  }
118
+ function reportText(operation) {
119
+ if (Object.hasOwn(operation.payload, "draft") ||
120
+ Object.hasOwn(operation.payload, "expectedDigests"))
121
+ throw new Error("invalid-payload");
122
+ const report = text(operation, "text");
123
+ if (Buffer.byteLength(report) > 65536)
124
+ throw new Error("draft-too-large");
125
+ return report;
126
+ }
92
127
  export async function discard(operation) {
93
128
  const place = treePlace({
94
129
  worktrees: operation.settings.worktrees,
@@ -1,14 +1,17 @@
1
1
  import { type Operation } from "./github-operation.ts";
2
+ export type MergeCheck = "beforeMerge" | null;
2
3
  export interface ReviewedPull {
3
4
  readonly number: number;
4
5
  readonly commit: string;
6
+ readonly check?: MergeCheck | undefined;
5
7
  }
6
8
  export declare function knownMerge(operation: Operation, expected: ReviewedPull & {
7
9
  readonly updated: string;
8
10
  }): Promise<{
9
11
  readonly head: string;
12
+ readonly open: boolean;
10
13
  readonly merged: string | undefined;
11
14
  }>;
12
15
  export declare function mergePull(operation: Operation, pull: ReviewedPull & {
13
16
  readonly updated: string;
14
- }): Promise<string>;
17
+ }): Promise<string | Error>;