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,30 @@
1
+ import type { WorkerPort } from "../service/worker-port.ts";
2
+ import type { DeclaredWorkflow } from "../workflow-declaration.ts";
3
+ import type { SchedulePort } from "../schedule-progress.ts";
4
+ interface ScheduleSettings {
5
+ readonly directory: string;
6
+ readonly runtimeDirectory: string;
7
+ readonly declarations?: readonly DeclaredWorkflow[];
8
+ readonly scheduleClock?: () => number;
9
+ readonly scheduleObservationClock?: () => number;
10
+ readonly submit: WorkerPort["submit"];
11
+ }
12
+ export declare function scheduledDeclarations(settings: {
13
+ readonly declarations?: readonly DeclaredWorkflow[];
14
+ readonly schedules?: unknown;
15
+ }, limits?: {
16
+ readonly repository: string;
17
+ readonly documentBytes: number;
18
+ }): {
19
+ readonly kind: "configured";
20
+ readonly declarations: readonly DeclaredWorkflow[];
21
+ } | {
22
+ readonly kind: "refused";
23
+ readonly reason: string;
24
+ readonly detail: string;
25
+ };
26
+ export declare function workflowSchedules(settings: ScheduleSettings): Promise<{
27
+ readonly stop: () => Promise<void>;
28
+ readonly request: SchedulePort;
29
+ }>;
30
+ export {};
@@ -0,0 +1,238 @@
1
+ import { join } from "node:path";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { mutate } from "../cli/client.js";
4
+ import { record, } from "../protocol.js";
5
+ import { runIdentity } from "../service/submission-handler.js";
6
+ import { configuredSchedules } from "../workflow-schedule.js";
7
+ import { declaredInput } from "./declared-input.js";
8
+ import { finishedScheduleRun } from "../schedule-progress.js";
9
+ import { scheduleControl } from "./schedule-control.js";
10
+ import { scheduleJournal, } from "./schedule-journal.js";
11
+ export function scheduledDeclarations(settings, limits) {
12
+ try {
13
+ const declarations = settings.declarations ?? [];
14
+ const configured = configuredSchedules(declarations, settings.schedules === undefined ? {} : settings.schedules);
15
+ if (limits !== undefined &&
16
+ Object.entries(configured).some(([workflowId, schedule]) => Buffer.byteLength(JSON.stringify(declaredInput(limits.repository, {
17
+ commandId: commandId(workflowId, 1),
18
+ submission: schedule.input,
19
+ }))) > limits.documentBytes))
20
+ throw new Error("invalid-schedule-input");
21
+ return {
22
+ kind: "configured",
23
+ declarations: declarations.map((entry) => {
24
+ const schedule = Object.hasOwn(configured, entry.workflowId)
25
+ ? configured[entry.workflowId]
26
+ : undefined;
27
+ return schedule === undefined ? entry : { ...entry, schedule };
28
+ }),
29
+ };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ kind: "refused",
34
+ reason: "schedule-rejected",
35
+ detail: String(error),
36
+ };
37
+ }
38
+ }
39
+ function commandId(workflowId, slot) {
40
+ return `schedule:${workflowId}:${String(slot)}`;
41
+ }
42
+ async function request(settings, request) {
43
+ const interrupted = Promise.withResolvers();
44
+ const interrupt = () => {
45
+ interrupted.resolve(undefined);
46
+ };
47
+ settings.signal.addEventListener("abort", interrupt, { once: true });
48
+ try {
49
+ settings.signal.throwIfAborted();
50
+ return await mutate(settings.runtimeDirectory, {
51
+ request,
52
+ signal: interrupted.promise,
53
+ });
54
+ }
55
+ finally {
56
+ settings.signal.removeEventListener("abort", interrupt);
57
+ }
58
+ }
59
+ async function pending(settings, entry) {
60
+ settings.signal.throwIfAborted();
61
+ const { workflowId, progress } = entry;
62
+ const { pending: planned, ...rest } = progress;
63
+ if (planned === undefined)
64
+ return progress;
65
+ if (progress.state !== "active")
66
+ throw new Error("invalid-schedule-state");
67
+ const identity = commandId(workflowId, progress.lastSlot);
68
+ if (planned.kind === "skip") {
69
+ const receipt = await settings.submit({
70
+ kind: "record-schedule-skip",
71
+ commandId: `skip:${identity}`,
72
+ runId: planned.runId,
73
+ workflowId,
74
+ slot: progress.lastSlot,
75
+ });
76
+ if (receipt.kind !== "accepted" && receipt.kind !== "duplicate")
77
+ throw new Error("schedule-skip-not-recorded");
78
+ return rest;
79
+ }
80
+ const reply = await request(settings, {
81
+ operation: "run",
82
+ parameters: {
83
+ workflowId,
84
+ source: "declared",
85
+ submission: planned.input,
86
+ commandId: identity,
87
+ },
88
+ });
89
+ if (reply.kind === "error")
90
+ throw new Error(reply.error.code);
91
+ return { ...rest, activeCommandId: identity };
92
+ }
93
+ async function scheduledRunStatus(settings, runId) {
94
+ const reply = await request(settings, {
95
+ operation: "status",
96
+ parameters: { runId },
97
+ });
98
+ if (reply.kind === "error")
99
+ throw new Error(reply.error.code);
100
+ const run = record(reply.result["run"]);
101
+ if (typeof run?.["state"] !== "string")
102
+ throw new Error("invalid-schedule-run");
103
+ return run;
104
+ }
105
+ async function active(settings, progress) {
106
+ if (progress.activeCommandId === undefined)
107
+ return progress;
108
+ const now = (settings.scheduleClock ?? Date.now)();
109
+ const observedAt = settings.observationClock();
110
+ const next = settings.nextObservations.get(progress.activeCommandId) ?? 0;
111
+ const due = progress.state === "active" && now >= progress.nextAt;
112
+ if (!due && observedAt < next)
113
+ return progress;
114
+ const runId = runIdentity(progress.activeCommandId);
115
+ const run = await scheduledRunStatus(settings, runId);
116
+ settings.nextObservations.set(progress.activeCommandId, observedAt + 5000);
117
+ if (run["condition"] === "cancelling")
118
+ return progress;
119
+ if (!["completed", "failed", "cancelled"].includes(String(run["state"])))
120
+ return progress;
121
+ settings.nextObservations.delete(progress.activeCommandId);
122
+ return finishedScheduleRun(progress, {
123
+ runId,
124
+ status: run,
125
+ now: (settings.scheduleClock ?? Date.now)(),
126
+ });
127
+ }
128
+ async function advance(settings, declaration) {
129
+ settings.signal.throwIfAborted();
130
+ const { workflowId, schedule } = declaration;
131
+ if (schedule === undefined)
132
+ return;
133
+ let progress = settings.journal.entries.get(workflowId);
134
+ if (progress === undefined)
135
+ throw new Error("missing-schedule-state");
136
+ if (progress.pending !== undefined) {
137
+ progress = await pending(settings, { workflowId, progress });
138
+ settings.journal.entries.set(workflowId, progress);
139
+ await settings.journal.save();
140
+ if (settings.now < progress.nextAt)
141
+ return;
142
+ }
143
+ const observed = await active(settings, progress);
144
+ if (observed !== progress) {
145
+ progress = observed;
146
+ settings.journal.entries.set(workflowId, progress);
147
+ await settings.journal.save();
148
+ }
149
+ if (progress.state !== "active" || settings.now < progress.nextAt)
150
+ return;
151
+ const runId = progress.activeCommandId === undefined
152
+ ? undefined
153
+ : runIdentity(progress.activeCommandId);
154
+ const planned = runId === undefined
155
+ ? { kind: "run", input: schedule.input }
156
+ : { kind: "skip", runId };
157
+ const elapsed = Math.floor((settings.now - progress.nextAt) / (schedule.everySeconds * 1000)) + 1;
158
+ progress = {
159
+ ...progress,
160
+ lastSlot: progress.lastSlot + elapsed,
161
+ nextAt: progress.nextAt + elapsed * schedule.everySeconds * 1000,
162
+ pending: planned,
163
+ };
164
+ settings.journal.entries.set(workflowId, progress);
165
+ await settings.journal.save();
166
+ settings.journal.entries.set(workflowId, await pending(settings, { workflowId, progress }));
167
+ await settings.journal.save();
168
+ }
169
+ async function tick(settings, journal) {
170
+ const now = (settings.scheduleClock ?? Date.now)();
171
+ for (const declaration of settings.declarations ?? [])
172
+ await advance({ ...settings, journal, now }, declaration);
173
+ }
174
+ async function initialized(settings) {
175
+ const journal = await scheduleJournal(join(settings.directory, "state"));
176
+ const now = (settings.scheduleClock ?? Date.now)();
177
+ for (const declaration of settings.declarations ?? []) {
178
+ const { workflowId, schedule } = declaration;
179
+ if (schedule === undefined)
180
+ continue;
181
+ const prior = journal.entries.get(workflowId);
182
+ if (prior?.everySeconds === schedule.everySeconds)
183
+ continue;
184
+ journal.entries.set(workflowId, {
185
+ ...(prior ?? {
186
+ lastSlot: 0,
187
+ state: "active",
188
+ failuresInRow: 0,
189
+ failedRunIds: [],
190
+ }),
191
+ everySeconds: schedule.everySeconds,
192
+ nextAt: now + schedule.everySeconds * 1000,
193
+ });
194
+ }
195
+ if (settings.declarations?.some((entry) => entry.schedule !== undefined))
196
+ await journal.save();
197
+ return journal;
198
+ }
199
+ export async function workflowSchedules(settings) {
200
+ const declarations = settings.declarations ?? [];
201
+ const journal = await initialized(settings);
202
+ const stopping = new AbortController();
203
+ const stopped = () => stopping.signal.aborted;
204
+ const context = {
205
+ ...settings,
206
+ signal: stopping.signal,
207
+ nextObservations: new Map(),
208
+ observationClock: settings.scheduleObservationClock ?? (() => performance.now()),
209
+ };
210
+ const control = scheduleControl({
211
+ journal,
212
+ declarations,
213
+ clock: settings.scheduleClock ?? Date.now,
214
+ signal: stopping.signal,
215
+ recoverPending: (entry) => pending(context, entry),
216
+ tick: () => tick(context, journal),
217
+ });
218
+ const running = (async () => {
219
+ while (!stopped()) {
220
+ await delay(250, undefined, { signal: stopping.signal }).catch(() => undefined);
221
+ if (stopped())
222
+ return;
223
+ await control.tick();
224
+ }
225
+ })().catch((error) => {
226
+ if (!stopped())
227
+ process.stderr.write(`Schedules stopped: ${String(error)}\n`);
228
+ stopping.abort();
229
+ });
230
+ return {
231
+ request: control.request,
232
+ stop: async () => {
233
+ stopping.abort();
234
+ await running;
235
+ await control.drain();
236
+ },
237
+ };
238
+ }
@@ -0,0 +1,9 @@
1
+ export declare function recordedProcessDirectory(processId: number): Promise<string | undefined>;
2
+ interface StopRequest {
3
+ readonly directory: string;
4
+ readonly folder: string;
5
+ readonly signal: AbortSignal;
6
+ readonly stopMilliseconds?: number;
7
+ }
8
+ export declare function stopTreeProcesses(request: StopRequest): Promise<boolean>;
9
+ export {};
@@ -0,0 +1,151 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readdir, readlink, realpath } from "node:fs/promises";
3
+ import { resolve, sep } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { promisify } from "node:util";
6
+ import { writeRecord } from "./operation-journal.js";
7
+ const execute = promisify(execFile);
8
+ async function output(command, arguments_) {
9
+ return (await execute(command, arguments_, {
10
+ encoding: "utf8",
11
+ timeout: 5000,
12
+ maxBuffer: 8 * 1024 * 1024,
13
+ })).stdout;
14
+ }
15
+ async function directories() {
16
+ if (process.platform === "linux") {
17
+ const entries = await readdir("/proc");
18
+ const links = await Promise.all(entries
19
+ .filter((entry) => /^\d+$/.test(entry))
20
+ .map(async (entry) => {
21
+ const directory = await readlink(`/proc/${entry}/cwd`).catch(() => undefined);
22
+ return [Number(entry), directory];
23
+ }));
24
+ return new Map(links.filter((entry) => entry[1] !== undefined));
25
+ }
26
+ const text = await output("lsof", ["-d", "cwd", "-Fpn", "-n", "-P"]);
27
+ const found = new Map();
28
+ let processId = 0;
29
+ for (const line of text.split("\n")) {
30
+ if (line.startsWith("p"))
31
+ processId = Number(line.slice(1));
32
+ if (line.startsWith("n"))
33
+ found.set(processId, line.slice(1));
34
+ }
35
+ return found;
36
+ }
37
+ async function processes() {
38
+ try {
39
+ const text = await output("ps", ["-axo", "pid=,pgid=,uid="]);
40
+ const entries = text
41
+ .trim()
42
+ .split("\n")
43
+ .map((line) => {
44
+ const [processId = 0, group = 0, user = -1] = line
45
+ .trim()
46
+ .split(/\s+/)
47
+ .map(Number);
48
+ return { processId, group, user };
49
+ });
50
+ const working = await directories();
51
+ return entries.map((entry) => {
52
+ const directory = working.get(entry.processId);
53
+ return { ...entry, ...(directory === undefined ? {} : { directory }) };
54
+ });
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ }
60
+ function inTree(entry, directory) {
61
+ if (entry.processId <= 1 ||
62
+ entry.processId === process.pid ||
63
+ entry.directory === undefined)
64
+ return false;
65
+ const root = resolve(directory);
66
+ return entry.directory === root || entry.directory.startsWith(root + sep);
67
+ }
68
+ export async function recordedProcessDirectory(processId) {
69
+ return (await processes())?.find((entry) => entry.processId === processId)
70
+ ?.directory;
71
+ }
72
+ function terminate(entries, request) {
73
+ const { directory, signal } = request;
74
+ const maySignal = (entry) => entry.user === process.getuid?.() && inTree(entry, directory);
75
+ const found = entries.filter(maySignal);
76
+ const groups = new Set();
77
+ for (const entry of found) {
78
+ const safeGroup = entry.group > 1 &&
79
+ entries.filter((other) => other.group === entry.group).every(maySignal);
80
+ const target = safeGroup ? -entry.group : entry.processId;
81
+ if (groups.has(target))
82
+ continue;
83
+ groups.add(target);
84
+ try {
85
+ process.kill(target, signal);
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ }
91
+ return found.map((entry) => entry.processId);
92
+ }
93
+ async function treeSnapshot(directory) {
94
+ const entries = await processes();
95
+ return entries?.some((entry) => inTree(entry, directory)) === false
96
+ ? processes()
97
+ : entries;
98
+ }
99
+ async function waitForTree(request, deadline) {
100
+ while (!request.signal.aborted) {
101
+ const entries = await treeSnapshot(request.directory);
102
+ if (entries === undefined ||
103
+ !entries.some((entry) => inTree(entry, request.directory)) ||
104
+ performance.now() >= deadline)
105
+ return entries;
106
+ await delay(Math.min(250, Math.max(0, deadline - performance.now())));
107
+ }
108
+ return undefined;
109
+ }
110
+ export async function stopTreeProcesses(request) {
111
+ const directory = await realpath(request.directory).catch(() => undefined);
112
+ return directory === undefined
113
+ ? false
114
+ : stopCanonicalTree({ ...request, directory });
115
+ }
116
+ async function stopCanonicalTree(request) {
117
+ const entries = await treeSnapshot(request.directory);
118
+ const aborted = () => request.signal.aborted;
119
+ if (entries === undefined || aborted())
120
+ return false;
121
+ const processIds = terminate(entries, {
122
+ directory: request.directory,
123
+ signal: "SIGTERM",
124
+ });
125
+ let remaining = processIds.length === 0
126
+ ? entries
127
+ : await waitForTree(request, performance.now() + (request.stopMilliseconds ?? 15_000));
128
+ if (remaining === undefined || aborted())
129
+ return recordCleanup(request, { processIds, remaining });
130
+ const killed = terminate(remaining, {
131
+ directory: request.directory,
132
+ signal: "SIGKILL",
133
+ });
134
+ processIds.push(...killed);
135
+ if (killed.length > 0)
136
+ remaining = await waitForTree(request, performance.now() + 1000);
137
+ return recordCleanup(request, { processIds, remaining });
138
+ }
139
+ async function recordCleanup(request, cleanup) {
140
+ const remainingProcessIds = cleanup.remaining
141
+ ?.filter((entry) => inTree(entry, request.directory))
142
+ .map((entry) => entry.processId);
143
+ await writeRecord(request.folder, {
144
+ name: "resume-processes.json",
145
+ value: {
146
+ processIds: [...new Set(cleanup.processIds)],
147
+ remainingProcessIds,
148
+ },
149
+ });
150
+ return !request.signal.aborted && remainingProcessIds?.length === 0;
151
+ }
@@ -0,0 +1 @@
1
+ export declare function decisionToken(runId: string, gateId: string): string;
@@ -0,0 +1,3 @@
1
+ export function decisionToken(runId, gateId) {
2
+ return `cloving-decision/v1/${encodeURIComponent(runId)}/${encodeURIComponent(gateId)}`;
3
+ }
@@ -0,0 +1 @@
1
+ export declare const deliveryBackoffMilliseconds: readonly [0, 60000, 300000, 900000, 3600000];
@@ -0,0 +1,3 @@
1
+ export const deliveryBackoffMilliseconds = [
2
+ 0, 60_000, 300_000, 900_000, 3_600_000,
3
+ ];
@@ -0,0 +1,22 @@
1
+ import { type SubmissionContract } from "./submission.ts";
2
+ export declare const doctorCodes: readonly ["git-repository", "node-version", "harnesses", "default-harness", "gh-login", "github-origin", "greptile-review", "settings-files", "no-workflow", "runtime-directory", "service", "ticket-command", "next-command", "check-command", "queue-interval", "private-texts"];
3
+ export type DoctorCode = (typeof doctorCodes)[number];
4
+ export interface DoctorObservation {
5
+ readonly result: "ok" | "fail" | "skip";
6
+ readonly detail: string;
7
+ }
8
+ export interface DoctorCheck extends DoctorObservation {
9
+ readonly code: DoctorCode;
10
+ readonly required: boolean;
11
+ readonly fix: string;
12
+ }
13
+ export declare const doctorFixes: Readonly<Record<DoctorCode, string>>;
14
+ export declare function doctorExitCode(checks: readonly DoctorCheck[]): number;
15
+ export interface DoctorWorkflow {
16
+ readonly queue?: boolean;
17
+ readonly scope: "project" | "user";
18
+ readonly workflowId: string;
19
+ readonly capabilities: readonly string[];
20
+ readonly input?: SubmissionContract;
21
+ }
22
+ export declare function requiredDoctorCodes(workflows: readonly DoctorWorkflow[]): readonly DoctorCode[];
@@ -0,0 +1,63 @@
1
+ import { hasTicketField } from "./submission.js";
2
+ export const doctorCodes = [
3
+ "git-repository",
4
+ "node-version",
5
+ "harnesses",
6
+ "default-harness",
7
+ "gh-login",
8
+ "github-origin",
9
+ "greptile-review",
10
+ "settings-files",
11
+ "no-workflow",
12
+ "runtime-directory",
13
+ "service",
14
+ "ticket-command",
15
+ "next-command",
16
+ "check-command",
17
+ "queue-interval",
18
+ "private-texts",
19
+ ];
20
+ export const doctorFixes = {
21
+ "git-repository": "Change to the repository, or run: git init",
22
+ "node-version": "Install a supported Node version: nvm install 26 && nvm use 26",
23
+ harnesses: "Install a harness: npm install -g @anthropic-ai/claude-code",
24
+ "default-harness": "Install a harness: npm install -g @anthropic-ai/claude-code; select it: CLOVING_WORKER=claude cloving doctor; clear command overrides: unset CLOVING_CLAUDE_COMMAND CLOVING_CODEX_COMMAND; edit private harness.command if configured; for another harness: cloving config set harness.turn '[...]'",
25
+ "gh-login": "Log in with the configured GitHub command: gh auth login",
26
+ "github-origin": "Set a GitHub origin: git remote add origin git@github.com:OWNER/REPO.git || git remote set-url origin git@github.com:OWNER/REPO.git",
27
+ "greptile-review": "Install the Greptile app at https://github.com/apps/greptile, then open a first pull request: gh pr create",
28
+ "settings-files": "Fix the project JSON: ${EDITOR:-vi} .cloving/config.json; for private JSON, edit <config>/cloving/projects/<repository-id>.json",
29
+ "no-workflow": "cloving init",
30
+ "runtime-directory": 'Select a private writable runtime: CLOVING_RUNTIME_DIR="$HOME/.local/state/cloving/doctor/run" cloving doctor',
31
+ service: "Start the service: cloving start",
32
+ "ticket-command": "Set tickets.command to an executable list: ${EDITOR:-vi} .cloving/config.json",
33
+ "next-command": "Set tickets.nextCommand to an executable list: ${EDITOR:-vi} .cloving/config.json",
34
+ "check-command": "Set checks.beforeMerge to an executable list: ${EDITOR:-vi} .cloving/config.json",
35
+ "queue-interval": "Set an interval from 10 to 3600: CLOVING_QUEUE_SECONDS=30 cloving doctor",
36
+ "private-texts": `Set a nonblank private text: CLOVING_PRIVATE_TEXTS='["TEXT TO KEEP PRIVATE"]' cloving doctor`,
37
+ };
38
+ export function doctorExitCode(checks) {
39
+ return checks.some((check) => check.required && check.result !== "ok")
40
+ ? 1
41
+ : 0;
42
+ }
43
+ export function requiredDoctorCodes(workflows) {
44
+ const codes = new Set([
45
+ "git-repository",
46
+ "node-version",
47
+ "default-harness",
48
+ "settings-files",
49
+ "no-workflow",
50
+ "runtime-directory",
51
+ ]);
52
+ if (workflows.some((workflow) => workflow.capabilities.includes("github"))) {
53
+ codes.add("gh-login");
54
+ codes.add("github-origin");
55
+ }
56
+ if (workflows.some((workflow) => workflow.queue === true)) {
57
+ codes.add("next-command");
58
+ codes.add("queue-interval");
59
+ }
60
+ if (workflows.some((workflow) => hasTicketField(workflow.input)))
61
+ codes.add("ticket-command");
62
+ return [...codes];
63
+ }
@@ -1,8 +1,13 @@
1
1
  import type { AdmissionResult, ExecutionManifest } from "./workflow-admission.ts";
2
+ import { type CommandWaits } from "./workflow-declaration.ts";
2
3
  export declare function executionCapabilities(manifest: ExecutionManifest): string;
3
4
  export declare function pinnedIdentity(manifest: ExecutionManifest): string;
4
5
  export declare function resumePinned(pinned: ExecutionManifest, available: ExecutionManifest): AdmissionResult;
5
6
  export declare function readExecutionManifest(value: unknown): ExecutionManifest;
6
7
  export declare function declaredManifest(manifest: ExecutionManifest, declaration: {
7
8
  readonly handoffs?: readonly string[];
9
+ readonly commands?: readonly string[];
10
+ readonly commandWaits?: CommandWaits;
11
+ readonly bundleDigest?: string | undefined;
12
+ readonly queue?: boolean;
8
13
  }): ExecutionManifest;
@@ -1,10 +1,21 @@
1
- import { isWorkflowHandoffs } from "./workflow-declaration.js";
1
+ import { isCommandWaits, isWorkflowNames, } from "./workflow-declaration.js";
2
2
  const canonical = {
3
+ queue: (manifest) => JSON.stringify(manifest.queue === true),
3
4
  name: (manifest) => JSON.stringify(manifest.name),
4
5
  workflowId: (manifest) => JSON.stringify(manifest.workflowId),
5
6
  steps: (manifest) => JSON.stringify([...manifest.steps].sort()),
6
7
  capabilities: (manifest) => JSON.stringify([...manifest.capabilities].sort()),
7
8
  handoffs: (manifest) => JSON.stringify([...(manifest.handoffs ?? [])].sort()),
9
+ commands: (manifest) => JSON.stringify([...(manifest.commands ?? [])].sort()),
10
+ commandWaits: (manifest) => JSON.stringify(Object.entries(manifest.commandWaits ?? {})
11
+ .sort(([first], [second]) => first < second ? -1 : Number(first > second))
12
+ .map(([name, wait]) => [
13
+ name,
14
+ wait.command,
15
+ wait.maximumWaitSeconds,
16
+ wait.pollEverySeconds,
17
+ ])),
18
+ bundleDigest: (manifest) => JSON.stringify(manifest.bundleDigest),
8
19
  artifacts: (manifest) => JSON.stringify(Object.keys(manifest.artifacts)
9
20
  .sort()
10
21
  .map((name) => [name, manifest.artifacts[name]])),
@@ -30,10 +41,25 @@ export function pinnedIdentity(manifest) {
30
41
  const identity = fields.map((field) => canonical[field](manifest));
31
42
  if (manifest.handoffs?.length)
32
43
  identity.push(canonical.handoffs(manifest));
44
+ if (manifest.commands?.length)
45
+ identity.push(JSON.stringify(["commands", canonical.commands(manifest)]));
46
+ if (Object.keys(manifest.commandWaits ?? {}).length > 0)
47
+ identity.push(JSON.stringify(["commandWaits", canonical.commandWaits(manifest)]));
48
+ if (manifest.bundleDigest !== undefined)
49
+ identity.push(canonical.bundleDigest(manifest));
50
+ if (manifest.queue === true)
51
+ identity.push(JSON.stringify(["queue", true]));
33
52
  return JSON.stringify(identity);
34
53
  }
35
54
  export function resumePinned(pinned, available) {
36
- const changed = [...fields, "handoffs"].find((field) => canonical[field](pinned) !== canonical[field](available));
55
+ const changed = [
56
+ ...fields,
57
+ "handoffs",
58
+ "commands",
59
+ "commandWaits",
60
+ "bundleDigest",
61
+ "queue",
62
+ ].find((field) => canonical[field](pinned) !== canonical[field](available));
37
63
  if (changed !== undefined)
38
64
  return {
39
65
  kind: "rejected",
@@ -46,14 +72,23 @@ export function readExecutionManifest(value) {
46
72
  const fields = record(value);
47
73
  const toolchain = record(fields["toolchain"]);
48
74
  const handoffs = fields["handoffs"];
49
- if (Object.hasOwn(fields, "handoffs") && !isWorkflowHandoffs(handoffs))
75
+ const commands = fields["commands"];
76
+ if (Object.hasOwn(fields, "handoffs") && !isWorkflowNames(handoffs))
50
77
  throw new Error("invalid-handoffs");
78
+ if (Object.hasOwn(fields, "commands") && !isWorkflowNames(commands))
79
+ throw new Error("invalid-commands");
51
80
  return {
52
81
  name: text(fields["name"]),
53
82
  workflowId: text(fields["workflowId"]),
54
83
  steps: texts(fields["steps"]),
55
84
  capabilities: texts(fields["capabilities"]),
56
- ...(isWorkflowHandoffs(handoffs) ? { handoffs: [...handoffs] } : {}),
85
+ ...queueMetadata(fields),
86
+ ...(isWorkflowNames(handoffs) ? { handoffs: [...handoffs] } : {}),
87
+ ...(isWorkflowNames(commands) ? { commands: [...commands] } : {}),
88
+ ...readCommandWaits(fields),
89
+ ...(Object.hasOwn(fields, "bundleDigest")
90
+ ? { bundleDigest: text(fields["bundleDigest"]) }
91
+ : {}),
57
92
  artifacts: textRecord(fields["artifacts"]),
58
93
  resources: textRecord(fields["resources"]),
59
94
  toolchain: {
@@ -65,12 +100,35 @@ export function readExecutionManifest(value) {
65
100
  },
66
101
  };
67
102
  }
103
+ function readCommandWaits(fields) {
104
+ if (!Object.hasOwn(fields, "commandWaits"))
105
+ return {};
106
+ const commandWaits = fields["commandWaits"];
107
+ if (!isCommandWaits(commandWaits, {
108
+ capabilities: texts(fields["capabilities"]),
109
+ commands: texts(fields["commands"]),
110
+ }))
111
+ throw new Error("invalid-command-waits");
112
+ return {
113
+ commandWaits: Object.fromEntries(Object.entries(commandWaits).map(([name, wait]) => [name, { ...wait }])),
114
+ };
115
+ }
68
116
  export function declaredManifest(manifest, declaration) {
69
117
  return readExecutionManifest({
70
118
  ...manifest,
119
+ ...(declaration.queue === undefined ? {} : { queue: declaration.queue }),
120
+ ...(declaration.commands === undefined
121
+ ? {}
122
+ : { commands: declaration.commands }),
123
+ ...(declaration.commandWaits === undefined
124
+ ? {}
125
+ : { commandWaits: declaration.commandWaits }),
71
126
  ...(declaration.handoffs === undefined
72
127
  ? {}
73
128
  : { handoffs: declaration.handoffs }),
129
+ ...(declaration.bundleDigest === undefined
130
+ ? {}
131
+ : { bundleDigest: declaration.bundleDigest }),
74
132
  });
75
133
  }
76
134
  function record(value) {
@@ -87,3 +145,8 @@ function texts(value) {
87
145
  function textRecord(value) {
88
146
  return Object.fromEntries(Object.entries(record(value)).map(([key, item]) => [key, text(item)]));
89
147
  }
148
+ function queueMetadata(fields) {
149
+ if (Object.hasOwn(fields, "queue") && typeof fields["queue"] !== "boolean")
150
+ throw new Error("invalid-queue");
151
+ return fields["queue"] === true ? { queue: true } : {};
152
+ }