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
@@ -15,11 +15,12 @@ export async function knownMerge(operation, expected) {
15
15
  `${repositoryPath}/pulls/${String(expected.number)}`,
16
16
  ]));
17
17
  const head = commitOf(field(pull, "head"), "sha");
18
+ const open = field(pull, "state") === "open";
18
19
  if (field(pull, "merged") !== true)
19
- return { head, merged: undefined };
20
+ return { head, open, merged: undefined };
20
21
  if (head !== expected.commit && head !== expected.updated)
21
22
  throw new Error("merged-other-commit");
22
- return { head, merged: commitOf(pull, "merge_commit_sha") };
23
+ return { head, open, merged: commitOf(pull, "merge_commit_sha") };
23
24
  }
24
25
  async function mergedNow(operation, pull) {
25
26
  const reply = JSON.parse(await operation.calls.gh([
@@ -63,11 +64,17 @@ export function mergePull(operation, pull) {
63
64
  },
64
65
  statuses: pull.updated === pull.commit ? [] : [405, 409],
65
66
  }).catch(async (error) => {
66
- if (!(error instanceof Error) || error.message !== "github-network-failed")
67
+ if (!(error instanceof Error))
68
+ throw error;
69
+ const refused = error.message === "github-call-failed" &&
70
+ [405, 409].includes(Number(field(error, "status")));
71
+ if (error.message !== "github-network-failed" && !refused)
67
72
  throw error;
68
73
  const known = await knownMerge(operation, pull);
69
74
  if (known.merged !== undefined)
70
75
  return known.merged;
76
+ if (refused && known.open)
77
+ return error;
71
78
  throw error;
72
79
  });
73
80
  }
@@ -69,12 +69,13 @@ async function updatedTree(operation, place) {
69
69
  async function checked(operation, place) {
70
70
  await changeChecked(operation, place);
71
71
  const head = await headOf(operation, place.tree);
72
- if (operation.settings.check !== undefined)
73
- await operation.calls.run(operation.settings.check, place.tree.path);
72
+ const command = place.check === null ? undefined : operation.settings.check;
73
+ if (command !== undefined)
74
+ await operation.calls.run(command, place.tree.path);
74
75
  await clean(operation, place.tree);
75
76
  if ((await headOf(operation, place.tree)) !== head)
76
77
  throw new Error("uncommitted-change");
77
- if (head !== place.commit && operation.settings.check === undefined)
78
+ if (head !== place.commit && command === undefined && place.check !== null)
78
79
  throw new Error("check-required");
79
80
  return head;
80
81
  }
@@ -135,34 +136,64 @@ async function readyHead(operation, pull) {
135
136
  let recorded = pull.recorded;
136
137
  let remote = pull.remote;
137
138
  for (let attempt = 0; attempt < 3; attempt += 1) {
138
- const updated = await refreshed(operation, {
139
+ const updated = await pushedHead(operation, {
140
+ ...pull,
139
141
  tree,
140
- commit: pull.commit,
141
142
  recorded,
143
+ remote,
142
144
  });
143
- if (updated !== pull.commit && recorded !== updated)
144
- await writeRecord(operation.folder, {
145
- name: "updated-head.json",
146
- value: { commit: pull.commit, updated },
147
- });
148
- if (updated !== pull.commit && remote !== updated)
149
- await operation.calls.git(tree.path, [
150
- "push",
151
- "--quiet",
152
- "origin",
153
- `${updated}:refs/heads/${tree.branch}`,
154
- ]);
155
145
  const ci = await waitForCi(operation, updated);
156
146
  if (ci !== undefined)
157
147
  return ci;
158
- const newest = await fetched(operation, await defaultBranch(operation));
159
- if ((await operation.calls.git(tree.path, ["merge-base", updated, newest])).trim() === newest)
160
- return updated;
161
148
  recorded = updated;
162
149
  remote = updated;
150
+ if (!(await containsBase(operation, updated)))
151
+ continue;
152
+ const merged = await mergePull(operation, { ...pull, updated });
153
+ if (typeof merged === "string")
154
+ return { updated, merged };
155
+ if (await containsBase(operation, updated))
156
+ throw merged;
157
+ await recordRefusal(operation, { error: merged, updated, attempt });
163
158
  }
164
159
  throw new Error("base-moved");
165
160
  }
161
+ async function recordRefusal(operation, refusal) {
162
+ const observation = await operation.observe?.({
163
+ condition: "working",
164
+ reason: "github-merge-refused",
165
+ evidence: `github-merge/HTTP-${String(field(refusal.error, "status"))}/head-${refusal.updated}/merge-main`,
166
+ attempt: refusal.attempt + 1,
167
+ limit: 3,
168
+ });
169
+ if (observation !== undefined &&
170
+ !["accepted", "duplicate"].includes(observation.kind))
171
+ throw new Error("github-call-failed");
172
+ }
173
+ async function pushedHead(operation, pull) {
174
+ const updated = await refreshed(operation, pull);
175
+ if (updated !== pull.commit && pull.recorded !== updated)
176
+ await writeRecord(operation.folder, {
177
+ name: "updated-head.json",
178
+ value: { commit: pull.commit, updated },
179
+ });
180
+ if (updated !== pull.commit && pull.remote !== updated)
181
+ await operation.calls.git(pull.tree.path, [
182
+ "push",
183
+ "--quiet",
184
+ "origin",
185
+ `${updated}:refs/heads/${pull.tree.branch}`,
186
+ ]);
187
+ return updated;
188
+ }
189
+ async function containsBase(operation, updated) {
190
+ const newest = await fetched(operation, await defaultBranch(operation));
191
+ return ((await operation.calls.git(existingTree(operation).path, [
192
+ "merge-base",
193
+ updated,
194
+ newest,
195
+ ])).trim() === newest);
196
+ }
166
197
  function checkOutput(cause) {
167
198
  return commandOutput(cause).slice(-6_000);
168
199
  }
@@ -175,6 +206,8 @@ function commandOutput(cause) {
175
206
  .join("");
176
207
  }
177
208
  export async function merge(operation, pull) {
209
+ if (pull.check === "beforeMerge" && operation.settings.check === undefined)
210
+ throw new Error("check-not-configured");
178
211
  try {
179
212
  return await completedMerge(operation, pull);
180
213
  }
@@ -205,12 +238,11 @@ async function completedMerge(operation, pull) {
205
238
  ...pull,
206
239
  updated: recorded ?? pull.commit,
207
240
  });
208
- const updated = known.merged === undefined
241
+ const result = known.merged === undefined
209
242
  ? await readyHead(operation, { ...pull, recorded, remote: known.head })
210
- : (recorded ?? pull.commit);
211
- if (typeof updated !== "string")
212
- return updated;
213
- const merged = known.merged ?? (await mergePull(operation, { ...pull, updated }));
243
+ : { updated: recorded ?? pull.commit, merged: known.merged };
244
+ if ("reason" in result)
245
+ return result;
214
246
  await removed(operation, place);
215
- return { number: pull.number, commit: pull.commit, updated, merged };
247
+ return { number: pull.number, commit: pull.commit, ...result };
216
248
  }
@@ -2,15 +2,20 @@ import { setTimeout as delay } from "node:timers/promises";
2
2
  import { appendFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { findingsOf, scoreOf, } from "./github-calls.js";
5
+ import { attachAsset } from "./github-attach.js";
5
6
  import { closeIssue, partialIssue } from "./github-ticket-status.js";
6
7
  import { merge } from "./github-merge.js";
7
- import { createIssue, discard } from "./github-issue-methods.js";
8
+ import { captureDraft, createIssue, discard, repositoryName, } from "./github-issue-methods.js";
8
9
  import { existingTree, defaultBranch, changeChecked, field, githubTiming, repositoryPath, text, } from "./github-operation.js";
9
10
  import { workTree } from "./work-tree.js";
10
11
  const triggerText = "@greptileai";
11
12
  const maximumReviewRequests = 3;
12
13
  export const methodReasons = new Set([
14
+ "attachment-not-available",
15
+ "attachment-too-large",
13
16
  "draft-not-available",
17
+ "draft-changed",
18
+ "draft-too-large",
14
19
  "invalid-draft",
15
20
  "post-uncertain",
16
21
  "private-texts-not-set",
@@ -21,6 +26,7 @@ export const methodReasons = new Set([
21
26
  "check-failed",
22
27
  "merge-conflict",
23
28
  "check-required",
29
+ "check-not-configured",
24
30
  "base-moved",
25
31
  "head-not-updated",
26
32
  "uncommitted-change",
@@ -37,6 +43,14 @@ function integer(operation, name) {
37
43
  throw new Error("invalid-payload");
38
44
  return value;
39
45
  }
46
+ function mergeCheck(operation) {
47
+ if (!Object.hasOwn(operation.payload, "check"))
48
+ return undefined;
49
+ const value = operation.payload["check"];
50
+ if (value === null || value === "beforeMerge")
51
+ return value;
52
+ throw new Error("invalid-payload");
53
+ }
40
54
  async function prepare(operation) {
41
55
  const { settings, calls, target, signal } = operation;
42
56
  await calls.git(settings.repository, ["fetch", "--quiet", "origin"]);
@@ -68,7 +82,10 @@ function labels(operation, name) {
68
82
  });
69
83
  }
70
84
  async function label(operation) {
71
- const repository = `${text(operation, "owner")}/${text(operation, "repository")}`;
85
+ const repository = !Object.hasOwn(operation.payload, "owner") &&
86
+ !Object.hasOwn(operation.payload, "repository")
87
+ ? repositoryName(await operation.calls.gh(["repo", "view", "--json", "nameWithOwner"]))
88
+ : `${text(operation, "owner")}/${text(operation, "repository")}`;
72
89
  const number = integer(operation, "number");
73
90
  if (!/^[\w.-]+\/[\w.-]+$/.test(repository) || !Number.isSafeInteger(number))
74
91
  throw new Error("invalid-payload");
@@ -253,14 +270,17 @@ export const methods = new Map([
253
270
  ["partial-issue", partialIssue],
254
271
  ["label", label],
255
272
  ["create-issue", createIssue],
273
+ ["capture-draft", captureDraft],
256
274
  ["discard", discard],
257
275
  ["open-pr", openPull],
276
+ ["attach-asset", attachAsset],
258
277
  ["wait-review", waitReview],
259
278
  [
260
279
  "merge",
261
280
  (operation) => merge(operation, {
262
281
  number: integer(operation, "number"),
263
282
  commit: text(operation, "commit"),
283
+ check: mergeCheck(operation),
264
284
  }),
265
285
  ],
266
286
  ]);
@@ -1,4 +1,5 @@
1
1
  import type { CallSettings, Calls } from "./github-calls.ts";
2
+ import type { ObservationReport } from "../service/worker-port.ts";
2
3
  export interface GithubTiming {
3
4
  readonly pollMilliseconds: number;
4
5
  readonly triggerMilliseconds: number;
@@ -10,6 +11,7 @@ export declare const githubTiming: GithubTiming;
10
11
  export interface MethodSettings extends CallSettings {
11
12
  readonly worktrees: string;
12
13
  readonly timing?: GithubTiming;
14
+ readonly requiredChecks?: readonly string[] | null;
13
15
  readonly check?: readonly string[];
14
16
  }
15
17
  export interface Operation {
@@ -19,6 +21,9 @@ export interface Operation {
19
21
  readonly payload: Readonly<Record<string, unknown>>;
20
22
  readonly signal: AbortSignal;
21
23
  readonly folder: string;
24
+ readonly observe?: (report: Pick<ObservationReport, "condition" | "reason" | "evidence" | "attempt" | "limit">) => Promise<{
25
+ readonly kind: string;
26
+ } | undefined>;
22
27
  }
23
28
  export interface Place {
24
29
  readonly path: string;
@@ -1,6 +1,8 @@
1
1
  import { homedir } from "node:os";
2
2
  import { existsSync } from "node:fs";
3
3
  import { join } from "node:path";
4
+ import { rm } from "node:fs/promises";
5
+ import { attachmentFolder } from "./attachments.js";
4
6
  import { treePlace } from "./work-tree.js";
5
7
  export const githubTiming = {
6
8
  pollMilliseconds: 30_000,
@@ -32,6 +34,10 @@ export async function removeWorktree(operation, place) {
32
34
  await repository(["worktree", "remove", "--force", place.path]);
33
35
  if ((await repository(["branch", "--list", place.branch])).trim() !== "")
34
36
  await repository(["branch", "-D", place.branch]);
37
+ await rm(attachmentFolder({
38
+ worktrees: operation.settings.worktrees,
39
+ target: operation.target,
40
+ }), { recursive: true, force: true });
35
41
  }
36
42
  export async function defaultBranch(operation) {
37
43
  const reference = await operation.calls.git(operation.settings.repository, [
@@ -1,49 +1,13 @@
1
- import { setTimeout as delay } from "node:timers/promises";
2
- import { field, githubTiming } from "./github-operation.js";
3
- function transient(error) {
4
- if (!(error instanceof Error) || error.message !== "github-call-failed")
5
- return false;
6
- const detail = field(error, "detail");
7
- if (typeof detail !== "string")
8
- return false;
9
- const status = field(error, "status");
10
- if ([500, 502, 503, 504].includes(Number(status)))
11
- return true;
12
- return ((status === undefined ||
13
- (typeof status === "number" && Number.isNaN(status))) &&
14
- /TLS handshake timeout|connection reset|i\/o timeout|\bEOF\b/i.test(detail));
15
- }
16
- function retryFactor(error, retry) {
17
- const network = transient(error);
18
- if (!network && !retry.statuses.includes(Number(field(error, "status"))))
19
- throw error;
20
- if (retry.attempt < 2)
21
- return network ? retry.attempt + 1 : 1;
22
- if (!network)
23
- throw error;
24
- throw Object.assign(new Error("github-network-failed", { cause: error }), {
25
- detail: field(error, "detail"),
1
+ import { githubRetry } from "../cli/github-retry.js";
2
+ import { githubTiming } from "./github-operation.js";
3
+ export function retryGithub(operation, retry) {
4
+ return githubRetry({
5
+ ...retry,
6
+ signal: operation.signal,
7
+ pollMilliseconds: (operation.settings.timing ?? githubTiming)
8
+ .pollMilliseconds,
26
9
  });
27
10
  }
28
- export async function retryGithub(operation, retry) {
29
- const timing = operation.settings.timing ?? githubTiming;
30
- for (let attempt = 0;; attempt += 1) {
31
- operation.signal.throwIfAborted();
32
- try {
33
- return await retry.action(attempt);
34
- }
35
- catch (error) {
36
- operation.signal.throwIfAborted();
37
- const factor = retryFactor(error, {
38
- attempt,
39
- statuses: retry.statuses ?? [],
40
- });
41
- await delay(timing.pollMilliseconds * factor, undefined, {
42
- signal: operation.signal,
43
- });
44
- }
45
- }
46
- }
47
11
  export function githubRead(operation, parts) {
48
12
  return retryGithub(operation, { action: () => operation.calls.gh(parts) });
49
13
  }
@@ -1,4 +1,5 @@
1
1
  import type { Delivery } from "../broker/actor/delivery-intents.ts";
2
+ import type { ObservationReport } from "../service/worker-port.ts";
2
3
  import { type MethodSettings } from "./github-methods.ts";
3
4
  import { type WorkerReport } from "./operation-journal.ts";
4
5
  export type { GithubTiming } from "./github-methods.ts";
@@ -6,6 +7,9 @@ export interface GithubWorkerSettings extends MethodSettings {
6
7
  readonly journal: string;
7
8
  readonly document: (digest: string) => Promise<string | undefined>;
8
9
  readonly report: (report: WorkerReport) => Promise<unknown>;
10
+ readonly observe?: (report: ObservationReport) => Promise<{
11
+ readonly kind: string;
12
+ }>;
9
13
  readonly operationStatus: (operationId: string) => Promise<string | undefined>;
10
14
  readonly runStatus: (runId: string) => Promise<string | undefined>;
11
15
  }
@@ -47,6 +47,12 @@ async function outcome(parts, run) {
47
47
  target: intent.target,
48
48
  payload,
49
49
  signal,
50
+ observe: async (observation) => settings.observe?.({
51
+ ...observation,
52
+ runId: intent.runId,
53
+ operationId: intent.operationId,
54
+ commandId: `github:${run.key}:merge-refused:${String(observation.attempt)}`,
55
+ }),
50
56
  });
51
57
  return {
52
58
  outcome: "completed",
@@ -4,6 +4,7 @@ interface QueueSettings {
4
4
  readonly intervalMilliseconds: number;
5
5
  readonly lanes?: number;
6
6
  readonly resetQueue?: boolean;
7
+ readonly workflowId: string;
7
8
  }
8
9
  export declare function issueQueue(settings: QueueSettings): {
9
10
  readonly stop: () => Promise<void>;
@@ -1,3 +1,4 @@
1
+ import { queueStatus, spendNotice } from "./queue-status.js";
1
2
  import { randomUUID } from "node:crypto";
2
3
  import { readFile, rename, rm, writeFile } from "node:fs/promises";
3
4
  import { join } from "node:path";
@@ -147,30 +148,6 @@ async function completed(settings, pending) {
147
148
  await retired(pending, ending);
148
149
  return pendingRuns;
149
150
  }
150
- async function active(runtimeDirectory) {
151
- let count = 0;
152
- let after = "";
153
- do {
154
- const reply = await send(runtimeDirectory, {
155
- operation: "status",
156
- parameters: { after, limit: 500 },
157
- });
158
- if (reply.kind === "error")
159
- throw new Error(reply.error.code);
160
- const runs = reply.result["runs"];
161
- if (!Array.isArray(runs))
162
- throw new Error("invalid-run-list");
163
- count += runs.filter((value) => {
164
- const run = record(value);
165
- return run?.["workflowId"] === "develop-issue" && !terminal(run);
166
- }).length;
167
- const next = reply.result["next"];
168
- if (next !== null && (typeof next !== "string" || next <= after))
169
- throw new Error("invalid-run-page");
170
- after = next;
171
- } while (after !== null);
172
- return count;
173
- }
174
151
  async function submit(settings, pending) {
175
152
  const commandId = pending.retryCommandId ?? randomUUID();
176
153
  pending.commands.add(commandId);
@@ -178,7 +155,7 @@ async function submit(settings, pending) {
178
155
  const reply = await send(settings.runtimeDirectory, {
179
156
  operation: "run",
180
157
  parameters: {
181
- workflowId: "develop-issue",
158
+ workflowId: settings.workflowId,
182
159
  source: "ticket",
183
160
  submission: { ticket: "next" },
184
161
  commandId,
@@ -201,6 +178,7 @@ async function submit(settings, pending) {
201
178
  "workflow-active",
202
179
  "ticket-active",
203
180
  "ticket-dependency-open",
181
+ "queue-spend-limit",
204
182
  ].includes(reply.error.code))
205
183
  throw new Error(reply.error.code);
206
184
  pending.commands.delete(commandId);
@@ -265,7 +243,13 @@ async function cycle(settings, signal) {
265
243
  pending.failures.length = 0;
266
244
  await pending.save();
267
245
  }
268
- const holding = updateHold(settings.directory, pending);
246
+ const update = updateHold(settings.directory, pending);
247
+ const notice = spendNotice();
248
+ const holding = async (activeRuns = 0) => {
249
+ const updating = await update(activeRuns);
250
+ const spend = notice(await queueStatus(settings));
251
+ return updating || spend;
252
+ };
269
253
  await rm(join(settings.directory, "queue-submission"), { force: true });
270
254
  await recover(settings, pending);
271
255
  const stopped = () => signal.aborted;
@@ -275,15 +259,13 @@ async function cycle(settings, signal) {
275
259
  return;
276
260
  const pendingRuns = await completed(settings, pending);
277
261
  const lanes = settings.lanes ?? 1;
278
- if (pendingRuns >= lanes) {
279
- await holding(pendingRuns);
280
- continue;
281
- }
282
- const activeRuns = await active(settings.runtimeDirectory);
283
- const held = await holding(activeRuns);
284
- if (activeRuns >= lanes || activeRuns < pendingRuns)
262
+ const status = await queueStatus(settings);
263
+ const spend = notice(status);
264
+ const updating = await update(status.busy);
265
+ if (Math.max(pendingRuns, status.busy) >= lanes ||
266
+ status.busy < pendingRuns)
285
267
  continue;
286
- if (held)
268
+ if (updating || spend)
287
269
  continue;
288
270
  if (stopped())
289
271
  return;
@@ -0,0 +1,6 @@
1
+ import { type NotifyEvent } from "./notify-message.ts";
2
+ export type OutcomeCache = Map<string, {
3
+ readonly latestSequence: number;
4
+ readonly event: NotifyEvent | undefined;
5
+ }>;
6
+ export declare function notificationEvents(runtimeDirectory: string, cache: OutcomeCache): Promise<readonly NotifyEvent[]>;
@@ -0,0 +1,84 @@
1
+ import { send } from "../cli/client.js";
2
+ import { record } from "../protocol.js";
3
+ import { decisionNotification, outcomeNotification, scheduleStopNotifications, } from "./notify-message.js";
4
+ async function request(runtimeDirectory, request) {
5
+ const reply = await send(runtimeDirectory, request);
6
+ if (reply.kind === "error")
7
+ throw new Error(reply.error.code);
8
+ return reply.result;
9
+ }
10
+ function rows(value) {
11
+ if (!Array.isArray(value))
12
+ throw new Error("invalid-notify-list");
13
+ return value.map((item) => {
14
+ const row = record(item);
15
+ if (row === undefined)
16
+ throw new Error("invalid-notify-row");
17
+ return row;
18
+ });
19
+ }
20
+ async function scheduleNotifications(runtimeDirectory) {
21
+ const reply = await send(runtimeDirectory, {
22
+ operation: "schedule",
23
+ parameters: { action: "list" },
24
+ });
25
+ if (reply.kind !== "error")
26
+ return rows(reply.result["stops"]).flatMap(scheduleStopNotifications);
27
+ if (reply.error.code === "schedules-unavailable")
28
+ return [];
29
+ throw new Error(reply.error.code);
30
+ }
31
+ async function observedOutcome(summary, source) {
32
+ const { runtimeDirectory, cache } = source;
33
+ const latestSequence = summary["latestSequence"];
34
+ if (typeof latestSequence !== "number")
35
+ throw new Error("invalid-notify-sequence");
36
+ const runId = String(summary["runId"]);
37
+ const previous = cache.get(runId);
38
+ if (previous !== undefined && previous.latestSequence === latestSequence)
39
+ return previous.event;
40
+ const status = await request(runtimeDirectory, {
41
+ operation: "status",
42
+ parameters: { runId },
43
+ });
44
+ const run = record(status["run"]);
45
+ if (run === undefined)
46
+ throw new Error("invalid-notify-status");
47
+ const event = outcomeNotification(run);
48
+ cache.set(runId, { latestSequence, event });
49
+ return event;
50
+ }
51
+ export async function notificationEvents(runtimeDirectory, cache) {
52
+ const found = [];
53
+ const runs = new Map();
54
+ let after = "";
55
+ do {
56
+ const page = await request(runtimeDirectory, {
57
+ operation: "status",
58
+ parameters: { after, limit: 500 },
59
+ });
60
+ for (const summary of rows(page["runs"])) {
61
+ runs.set(String(summary["runId"]), summary);
62
+ const outcome = await observedOutcome(summary, {
63
+ runtimeDirectory,
64
+ cache,
65
+ });
66
+ if (outcome !== undefined)
67
+ found.push(outcome);
68
+ }
69
+ const next = page["next"];
70
+ if (next !== null && (typeof next !== "string" || next <= after))
71
+ throw new Error("invalid-notify-page");
72
+ after = next;
73
+ } while (after !== null);
74
+ const questions = await request(runtimeDirectory, {
75
+ operation: "questions",
76
+ parameters: {},
77
+ });
78
+ for (const decision of rows(questions["decisions"])) {
79
+ const run = runs.get(String(decision["runId"]));
80
+ if (run !== undefined)
81
+ found.push(decisionNotification(run, decision));
82
+ }
83
+ return [...found, ...(await scheduleNotifications(runtimeDirectory))];
84
+ }
@@ -46,7 +46,7 @@ function notification(value) {
46
46
  const message = record(value);
47
47
  if (message === undefined)
48
48
  return false;
49
- return (["decision", "blocked", "failed"].includes(String(message["event"])) &&
49
+ return (["decision", "blocked", "failed", "schedule-stopped"].includes(String(message["event"])) &&
50
50
  ["event", "runId", "workflowId", "subject", "body"].every((field) => typeof message[field] === "string"));
51
51
  }
52
52
  function deliveryState(value) {
@@ -1,10 +1,11 @@
1
1
  import { type Fields } from "../protocol.ts";
2
2
  export interface Notification {
3
- readonly event: "decision" | "blocked" | "failed";
3
+ readonly event: "decision" | "blocked" | "failed" | "schedule-stopped";
4
4
  readonly runId: string;
5
5
  readonly workflowId: string;
6
6
  readonly subject: string;
7
7
  readonly body: string;
8
+ readonly failedRunIds?: readonly string[];
8
9
  }
9
10
  export interface NotifyEvent {
10
11
  readonly key: string;
@@ -12,3 +13,5 @@ export interface NotifyEvent {
12
13
  }
13
14
  export declare function decisionNotification(run: Fields, decision: Fields): NotifyEvent;
14
15
  export declare function outcomeNotification(run: Fields): NotifyEvent | undefined;
16
+ export declare function stoppedScheduleNotification(schedule: Fields): NotifyEvent | undefined;
17
+ export declare function scheduleStopNotifications(schedule: Fields): readonly NotifyEvent[];
@@ -47,3 +47,39 @@ export function outcomeNotification(run) {
47
47
  }),
48
48
  };
49
49
  }
50
+ export function stoppedScheduleNotification(schedule) {
51
+ if (schedule["state"] !== "stopped")
52
+ return undefined;
53
+ const failedRunIds = schedule["failedRunIds"];
54
+ if (!Array.isArray(failedRunIds) || failedRunIds.length !== 3)
55
+ throw new Error("invalid-stopped-schedule");
56
+ const ids = failedRunIds.map((runId) => String(runId));
57
+ const workflowId = String(schedule["workflowId"]);
58
+ return {
59
+ key: `schedule-stopped:${workflowId}:${String(schedule["stoppedSlot"])}`,
60
+ message: {
61
+ ...message({ workflowId, runId: ids[2] }, {
62
+ event: "schedule-stopped",
63
+ body: body(`Schedule stopped after three failed runs:\n${ids.join("\n")}`, [`cloving schedule resume ${workflowId}`]),
64
+ }),
65
+ failedRunIds: ids,
66
+ },
67
+ };
68
+ }
69
+ export function scheduleStopNotifications(schedule) {
70
+ const stops = schedule["stops"];
71
+ if (stops === undefined) {
72
+ const event = stoppedScheduleNotification(schedule);
73
+ return event === undefined ? [] : [event];
74
+ }
75
+ if (!Array.isArray(stops))
76
+ throw new Error("invalid-stopped-schedule");
77
+ return stops.flatMap((stop) => {
78
+ const event = stoppedScheduleNotification({
79
+ ...record(stop),
80
+ workflowId: schedule["workflowId"],
81
+ state: "stopped",
82
+ });
83
+ return event === undefined ? [] : [event];
84
+ });
85
+ }
@@ -1,4 +1,4 @@
1
- import { type Notification } from "./notify-message.ts";
1
+ import type { Notification } from "./notify-message.ts";
2
2
  interface NotifySettings {
3
3
  readonly directory: string;
4
4
  readonly runtimeDirectory: string;