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
@@ -1,17 +1,20 @@
1
- import { issueIdentity } from "../issue-identity.js";
1
+ import { commandWaitDisplay } from "./command-waits.js";
2
+ import { scheduleMetadata, scheduledMetadata, metadataOf, outcomeOf, ticketMetadataPage, workflowMetadata, } from "./run-metadata.js";
2
3
  import { linksOf } from "../authority/handoff-chain.js";
3
4
  import { runView, unresolvedEffects, } from "../authority/status.js";
4
5
  import { record } from "../protocol.js";
5
6
  import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, wholeNumber, } from "./replies.js";
6
7
  import { usageTotals } from "./worker-totals.js";
7
- import { feedbackOf } from "./decision-handler.js";
8
- import { queueOverview } from "./submission-handler.js";
8
+ import { commandFields } from "./command-effects.js";
9
+ import { decidedOf, feedbackOf } from "./decision-handler.js";
10
+ import { queueOverview } from "./active-tickets.js";
9
11
  import { queueRunStatuses } from "./queue-runs.js";
10
12
  async function snapshot(context) {
11
13
  const { authority } = context;
12
14
  const state = await authority.state();
13
15
  const sequences = await authority.queries.sequences();
14
16
  return {
17
+ now: context.clock(),
15
18
  links: await authority.queries.runLinks(),
16
19
  state,
17
20
  operations: await authority.operations(),
@@ -44,6 +47,7 @@ async function effectInput(context, runId) {
44
47
  const budget = await effects.budget(runId);
45
48
  const stored = await effects.operations(runId);
46
49
  return {
50
+ commandOperations: stored.filter((operation) => operation.capability === "command"),
47
51
  budget: budget ? { limit: budget.limit, spent: budget.spent } : null,
48
52
  effects: stored.map((operation) => ({
49
53
  operationId: operation.operationId,
@@ -62,8 +66,16 @@ async function viewOf(context, scope) {
62
66
  if (run === undefined)
63
67
  return undefined;
64
68
  const details = state.details[run.runId];
69
+ const workflowId = scope.snapshot.workflowIds[run.runId] ?? run.workflow;
70
+ const effects = await effectInput(context, run.runId);
65
71
  const input = {
66
- ...(await effectInput(context, run.runId)),
72
+ ...effects,
73
+ commandWaits: await commandWaitDisplay({
74
+ authority: context.authority,
75
+ runId: run.runId,
76
+ waits: state.commandWaits,
77
+ now: scope.snapshot.now,
78
+ }),
67
79
  closure: run.status === "cancelled"
68
80
  ? await context.authority.effects.closure(run.runId)
69
81
  : null,
@@ -81,9 +93,14 @@ async function viewOf(context, scope) {
81
93
  };
82
94
  return {
83
95
  ...runView(input),
96
+ ...(await scheduledMetadata(context, {
97
+ runId: run.runId,
98
+ workflowId,
99
+ })),
100
+ commandOperations: effects.commandOperations,
84
101
  ...linksOf({ runId: run.runId, ...scope.snapshot.links[run.runId] }),
85
102
  input: await submittedInput(context, details?.submission),
86
- workflowId: scope.snapshot.workflowIds[run.runId] ?? run.workflow,
103
+ workflowId,
87
104
  latestAt: times[run.runId] ?? null,
88
105
  unresolvedEffects: unresolvedEffects(input),
89
106
  feedback: await feedbackOf(context, { state, runId: run.runId }),
@@ -92,15 +109,18 @@ async function viewOf(context, scope) {
92
109
  function summary(view) {
93
110
  return {
94
111
  runId: view.runId,
112
+ ...(view.scheduled === undefined ? {} : { scheduled: view.scheduled }),
95
113
  ...linksOf(view),
96
114
  input: view.input,
97
115
  workflowId: view.workflowId,
98
116
  state: view.state,
99
117
  condition: view.condition,
118
+ awaitedRunId: view.awaitedRunId,
100
119
  revision: view.revision,
101
120
  latestSequence: view.latestSequence,
102
121
  latestAt: view.latestAt,
103
122
  pendingDecisions: view.pendingDecisions,
123
+ commandWaits: view.commandWaits,
104
124
  };
105
125
  }
106
126
  function full(view) {
@@ -122,57 +142,6 @@ function full(view) {
122
142
  feedback: view.feedback,
123
143
  };
124
144
  }
125
- async function outcomeOf(context, view) {
126
- if (view.state !== "completed")
127
- return null;
128
- const event = await context.authority.queries.latestCompletion({
129
- runId: view.runId,
130
- atOrBefore: view.latestSequence,
131
- });
132
- const payload = event?.payload ?? {};
133
- const kind = payload["outcome"];
134
- if (kind === undefined)
135
- return null;
136
- const { ticketStatus, promotionId, outcomeReason, issueUpdate } = payload;
137
- return {
138
- kind,
139
- reason: outcomeReason ?? null,
140
- ...(promotionId === undefined ? {} : { promotionId }),
141
- ...(ticketStatus === undefined ? {} : { ticketStatus }),
142
- ...(issueUpdate === "failed" ? { issueUpdate } : {}),
143
- };
144
- }
145
- function titleOf(input, workflowId) {
146
- const ticket = input?.["ticket"];
147
- if (typeof ticket !== "string")
148
- return null;
149
- const fallback = `Cloving task ${String(input?.["cycleId"])}`;
150
- const lines = ticket.split("\n");
151
- if (workflowId === "develop-prompt") {
152
- const first = lines.find((line) => /\S/.test(line));
153
- return first === undefined
154
- ? fallback
155
- : first.replace(/^# /, "").trim().slice(0, 200);
156
- }
157
- const first = lines[0] ?? "";
158
- return first.startsWith("# ")
159
- ? first.slice(2).trim().slice(0, 200)
160
- : fallback;
161
- }
162
- async function metadataOf(context, source) {
163
- const document = source.digest
164
- ? await context.authority.queries.document(source.digest)
165
- : undefined;
166
- const input = record(JSON.parse(document ?? "null"));
167
- const ticketId = input?.["ticketId"];
168
- return {
169
- ticketId: typeof ticketId === "string" && ticketId !== "" ? ticketId : null,
170
- title: titleOf(input, source.workflowId),
171
- ...(source.workflowId === "develop-issue"
172
- ? { issueIdentity: issueIdentity(input?.["ticket"]) }
173
- : {}),
174
- };
175
- }
176
145
  async function submittedInput(context, digest) {
177
146
  const document = digest
178
147
  ? await context.authority.queries.document(digest)
@@ -191,6 +160,7 @@ async function listed(context, page) {
191
160
  const runs = views.filter((view) => view !== undefined).map(summary);
192
161
  return result("run-list", {
193
162
  ...(await queueOverview(context)),
163
+ ...(await scheduleMetadata(context)),
194
164
  workflows: context.registry.workflowIds,
195
165
  workflowRefusals: context.workflowRefusals ?? [],
196
166
  ...(Object.keys(context.registry.workflowStages).length === 0
@@ -211,12 +181,16 @@ function listParameters(parameters) {
211
181
  return { after, limit };
212
182
  }
213
183
  export async function status(context, parameters) {
184
+ if (parameters["metadata"] === "workflows")
185
+ return workflowMetadata(context, parameters["runIds"]);
214
186
  if (parameters["runIds"] !== undefined)
215
187
  return queueRunStatuses(context, parameters["runIds"]);
216
188
  const { runId } = parameters;
217
189
  const page = listParameters(parameters);
218
190
  if (page === undefined)
219
191
  return invalidRequest("The status request is not valid.");
192
+ if (parameters["metadata"] === "tickets")
193
+ return ticketMetadataPage(context, page);
220
194
  const current = await snapshot(context);
221
195
  if (runId === undefined)
222
196
  return listed(context, { snapshot: current, ...page });
@@ -228,7 +202,12 @@ export async function status(context, parameters) {
228
202
  return result("run-status", {
229
203
  run: {
230
204
  ...full({ ...view, ...totals }),
205
+ ...(await commandFields(context, view.commandOperations)),
231
206
  outcome: await outcomeOf(context, view),
207
+ decisions: await decidedOf(context, {
208
+ state: current.state,
209
+ runId: view.runId,
210
+ }),
232
211
  ...(await metadataOf(context, {
233
212
  workflowId: view.workflowId,
234
213
  digest: current.state.details[view.runId]?.input,
@@ -0,0 +1,22 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { RunView } from "../authority/status.ts";
3
+ import { type ServiceContext } from "./replies.ts";
4
+ export declare function workflowMetadata(context: ServiceContext, runIds: unknown): Promise<import("../protocol.ts").Reply>;
5
+ export declare function ticketMetadataPage(context: ServiceContext, page: {
6
+ readonly after: string;
7
+ readonly limit: number;
8
+ }): Promise<import("../protocol.ts").Reply>;
9
+ export declare function outcomeOf(context: ServiceContext, view: Pick<RunView, "state" | "runId" | "latestSequence">): Promise<Fields | null>;
10
+ export declare function metadataOf(context: ServiceContext, source: {
11
+ readonly workflowId: string;
12
+ readonly digest: string | null | undefined;
13
+ }): Promise<Fields>;
14
+ export declare function scheduleMetadata(context: ServiceContext): Promise<Fields>;
15
+ export declare function scheduledMetadata(context: ServiceContext, run: {
16
+ readonly runId: string;
17
+ readonly workflowId: string;
18
+ }): Promise<{
19
+ readonly scheduled?: {
20
+ readonly slot: number;
21
+ };
22
+ }>;
@@ -0,0 +1,138 @@
1
+ import { issueIdentity } from "../issue-identity.js";
2
+ import { record } from "../protocol.js";
3
+ import { invalidRequest, isIdentifier, result, } from "./replies.js";
4
+ export async function workflowMetadata(context, runIds) {
5
+ if (!Array.isArray(runIds) ||
6
+ runIds.length === 0 ||
7
+ runIds.length > 500 ||
8
+ !runIds.every(isIdentifier) ||
9
+ new Set(runIds).size !== runIds.length)
10
+ return invalidRequest("Workflow metadata needs one to 500 distinct run IDs.");
11
+ const identities = await context.authority.queries.workflowIds(runIds);
12
+ return result("run-workflow-metadata", {
13
+ runs: runIds.map((runId) => ({
14
+ runId,
15
+ workflowId: identities[runId] ?? null,
16
+ })),
17
+ });
18
+ }
19
+ export async function ticketMetadataPage(context, page) {
20
+ const state = await context.authority.state();
21
+ const identifiers = Object.keys(state.runs)
22
+ .sort()
23
+ .filter((runId) => runId > page.after);
24
+ const shown = identifiers.slice(0, page.limit);
25
+ const runs = [];
26
+ for (const runId of shown) {
27
+ const digest = state.details[runId]?.input;
28
+ const document = digest
29
+ ? await context.authority.queries.document(digest)
30
+ : "{}";
31
+ const input = record(JSON.parse(document ?? "null"));
32
+ if (input === undefined)
33
+ throw new Error("report-ticket-metadata-unavailable");
34
+ runs.push({ runId, ticketId: ticketIdOf(input) });
35
+ }
36
+ return result("run-ticket-metadata", {
37
+ runs,
38
+ next: identifiers.length > shown.length ? shown.at(-1) : null,
39
+ });
40
+ }
41
+ export async function outcomeOf(context, view) {
42
+ if (view.state !== "completed")
43
+ return null;
44
+ const event = await context.authority.queries.latestCompletion({
45
+ runId: view.runId,
46
+ atOrBefore: view.latestSequence,
47
+ });
48
+ const payload = event?.payload ?? {};
49
+ const kind = payload["outcome"];
50
+ if (kind === undefined)
51
+ return null;
52
+ const { ticketStatus, promotionId, outcomeReason, issueUpdate } = payload;
53
+ return {
54
+ kind,
55
+ reason: outcomeReason ?? null,
56
+ ...(promotionId === undefined ? {} : { promotionId }),
57
+ ...(ticketStatus === undefined ? {} : { ticketStatus }),
58
+ ...(issueUpdate === "failed" ? { issueUpdate } : {}),
59
+ };
60
+ }
61
+ function ticketOf(input) {
62
+ const declared = record(record(input?.["input"])?.["ticket"]);
63
+ const id = declared === undefined ? input?.["ticketId"] : declared["id"];
64
+ const text = declared === undefined ? input?.["ticket"] : declared["text"];
65
+ return {
66
+ id: typeof id === "string" ? id : undefined,
67
+ text: typeof text === "string" ? text : undefined,
68
+ };
69
+ }
70
+ function titleOf(input, workflowId) {
71
+ const ticket = ticketOf(input).text;
72
+ if (ticket === undefined)
73
+ return null;
74
+ const fallback = `Cloving task ${String(input?.["cycleId"])}`;
75
+ const lines = ticket.split("\n");
76
+ if (workflowId === "develop-prompt" && !Object.hasOwn(input ?? {}, "input")) {
77
+ const first = lines.find((line) => /\S/.test(line));
78
+ return first === undefined
79
+ ? fallback
80
+ : first.replace(/^# /, "").trim().slice(0, 200);
81
+ }
82
+ const first = lines[0] ?? "";
83
+ return first.startsWith("# ")
84
+ ? first.slice(2).trim().slice(0, 200)
85
+ : fallback;
86
+ }
87
+ export async function metadataOf(context, source) {
88
+ const document = source.digest
89
+ ? await context.authority.queries.document(source.digest)
90
+ : undefined;
91
+ const input = record(JSON.parse(document ?? "null"));
92
+ return {
93
+ ticketId: ticketIdOf(input),
94
+ title: titleOf(input, source.workflowId),
95
+ ...(ticketOf(input).text === undefined
96
+ ? {}
97
+ : { issueIdentity: issueIdentity(ticketOf(input).text) }),
98
+ };
99
+ }
100
+ function ticketIdOf(input) {
101
+ const ticketId = ticketOf(input).id;
102
+ return ticketId === undefined || ticketId === "" ? null : ticketId;
103
+ }
104
+ export async function scheduleMetadata(context) {
105
+ if (context.schedule === undefined)
106
+ return {};
107
+ const reply = await context.schedule({ action: "list" });
108
+ if (reply.kind !== "result" || !Array.isArray(reply.result["schedules"]))
109
+ return { schedules: { status: "unavailable" } };
110
+ const schedules = reply.result["schedules"];
111
+ if (schedules.length === 0)
112
+ return {};
113
+ return {
114
+ schedules: schedules.map((value) => {
115
+ const schedule = record(value) ?? {};
116
+ return Object.fromEntries([
117
+ "workflowId",
118
+ "everySeconds",
119
+ "state",
120
+ "failuresInRow",
121
+ "nextAt",
122
+ "stoppedAt",
123
+ ].map((name) => [name, schedule[name]]));
124
+ }),
125
+ };
126
+ }
127
+ export async function scheduledMetadata(context, run) {
128
+ const commandId = (await context.authority.queries.run(run.runId))
129
+ ?.admissionCommandId;
130
+ const prefix = `schedule:${run.workflowId}:`;
131
+ if (typeof commandId !== "string" || !commandId.startsWith(prefix))
132
+ return {};
133
+ const suffix = commandId.slice(prefix.length);
134
+ const slot = Number(suffix);
135
+ return /^(0|[1-9][0-9]*)$/.test(suffix) && Number.isSafeInteger(slot)
136
+ ? { scheduled: { slot } }
137
+ : {};
138
+ }
@@ -0,0 +1,3 @@
1
+ import type { Authority } from "../broker/actor/authority.ts";
2
+ import type { RunWaitTarget } from "../run-wait.ts";
3
+ export declare function runWaitTarget(authority: Authority, runId: string): Promise<RunWaitTarget | undefined>;
@@ -0,0 +1,41 @@
1
+ function outcomeOf(event, status) {
2
+ if (event === undefined)
3
+ return null;
4
+ return {
5
+ kind: event.payload["outcome"] ?? status,
6
+ reason: event.payload["outcomeReason"] ?? null,
7
+ promotionId: event.payload["promotionId"] ?? null,
8
+ };
9
+ }
10
+ async function settled(authority, run) {
11
+ if (run.status !== "cancelled")
12
+ return ["completed", "failed"].includes(run.status);
13
+ const closure = await authority.effects.closure(run.runId);
14
+ return (!closure.open &&
15
+ closure.closure === "cancelled" &&
16
+ closure.unresolved.length === 0);
17
+ }
18
+ export async function runWaitTarget(authority, runId) {
19
+ const run = await authority.queries.run(runId);
20
+ const origin = (await authority.queries.runOrigins())[runId];
21
+ if (run === undefined || origin === undefined)
22
+ return undefined;
23
+ const terminal = await settled(authority, run);
24
+ const event = terminal
25
+ ? await authority.queries.latestCompletion({
26
+ runId,
27
+ atOrBefore: run.sequence,
28
+ terminal: true,
29
+ })
30
+ : undefined;
31
+ const endedAt = event === undefined ? null : Date.parse(event.recordedAt);
32
+ const stoppedAt = run.status === "cancelled" && terminal
33
+ ? await authority.effects.settledAt(runId)
34
+ : null;
35
+ return {
36
+ parentRunId: origin.parentRunId,
37
+ status: run.status,
38
+ endedAt: endedAt === null ? null : Math.max(endedAt, stoppedAt ?? endedAt),
39
+ outcome: outcomeOf(event, run.status),
40
+ };
41
+ }
@@ -1,7 +1,11 @@
1
1
  import { type Authority, type AuthorityTiming, type Delivery, type EffectSettings, type Refusal } from "../broker/actor/authority.ts";
2
2
  import { type WorkflowRefusal } from "../workflow-refusals.ts";
3
- import { type WorkflowRegistration } from "./registry.ts";
3
+ import { type Registry, type WorkflowRegistration, type WorkflowBundleStore } from "./registry.ts";
4
+ import { type ServiceContext } from "./replies.ts";
4
5
  import { type WorkerPort } from "./worker-port.ts";
6
+ import type { RunWaitTarget } from "../run-wait.ts";
7
+ import type { CommandEffects } from "../command-settings.ts";
8
+ import { type CommandWaitPort } from "./command-waits.ts";
5
9
  export type { WorkflowRegistration } from "./registry.ts";
6
10
  export type { EffectReply, EffectReport, EffectRequest, WorkerPort, } from "./worker-port.ts";
7
11
  export interface ServiceTiming {
@@ -24,22 +28,38 @@ export interface ServiceHost {
24
28
  readonly reports?: () => readonly unknown[];
25
29
  }
26
30
  export interface HostPorts {
31
+ readonly commandWait: CommandWaitPort;
32
+ readonly runWait?: {
33
+ readonly target: (runId: string) => Promise<RunWaitTarget | undefined>;
34
+ readonly observe: WorkerPort["observe"];
35
+ };
27
36
  readonly state: Authority["state"];
28
37
  readonly submit: WorkerPort["submit"];
29
38
  readonly input: (runId: string) => Promise<string | undefined>;
30
39
  readonly document: (digest: string) => Promise<string | undefined>;
31
- readonly workflowId: (runId: string) => Promise<string | undefined>;
40
+ readonly workflow: {
41
+ readonly id: (runId: string) => Promise<string | undefined>;
42
+ readonly manifest: Authority["queries"]["manifest"];
43
+ readonly available: (runId: string, workflowId?: string) => Promise<boolean>;
44
+ };
32
45
  readonly requestEffect: WorkerPort["requestEffect"];
33
46
  readonly operation: Authority["effects"]["operation"];
47
+ readonly operations: Authority["effects"]["operations"];
34
48
  readonly reportEffect: WorkerPort["reportEffect"];
35
49
  readonly openGate: WorkerPort["openGate"];
36
50
  readonly registerWait: WorkerPort["registerWait"];
37
51
  }
38
52
  export interface ServiceOptions {
53
+ readonly schedule?: NonNullable<ServiceContext["schedule"]>;
54
+ readonly queueDailySpendLimitUsd?: number;
55
+ readonly workerHarness?: ServiceContext["workerHarness"];
56
+ readonly commandEffects?: CommandEffects;
39
57
  readonly stateDirectory: string;
40
58
  readonly runtimeDirectory: string;
41
59
  readonly workflows: readonly WorkflowRegistration[];
42
60
  readonly retainedWorkflows?: readonly WorkflowRegistration[];
61
+ readonly workflowBundles?: WorkflowBundleStore;
62
+ readonly retainedWorkflow?: Registry["available"];
43
63
  readonly workflowRefusals?: readonly WorkflowRefusal[];
44
64
  readonly delivery: Delivery;
45
65
  readonly host?: (ports: HostPorts) => Promise<ServiceHost>;
@@ -2,18 +2,20 @@ import { lstat, rm } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { authorityTiming, openAuthority, } from "../broker/actor/authority.js";
4
4
  import { socketAddress } from "../broker/socket-address.js";
5
- import { workflowRefusals, } from "../workflow-refusals.js";
5
+ import {} from "../workflow-refusals.js";
6
6
  import { changeSignal } from "./changes.js";
7
7
  import { decision, questions } from "./decision-handler.js";
8
8
  import { events } from "./event-handler.js";
9
9
  import { expiryScan } from "./expiry.js";
10
10
  import { commandGateway, workerCommandBound } from "./gateway.js";
11
11
  import { workflowRegistry, } from "./registry.js";
12
- import { failed } from "./replies.js";
12
+ import { errorMessage, failed, queryMetadata, scheduleRequest, } from "./replies.js";
13
13
  import { runCommand, status } from "./run-handlers.js";
14
14
  import { submissionHandler } from "./submission-handler.js";
15
15
  import { connectionLimits, listen, reachable } from "./transport.js";
16
16
  import { workerPort } from "./worker-port.js";
17
+ import { runWaitTarget } from "./run-waits.js";
18
+ import { commandWaitPort } from "./command-waits.js";
17
19
  export const serviceTiming = {
18
20
  authority: authorityTiming,
19
21
  expiryScanMilliseconds: 1_000,
@@ -58,6 +60,7 @@ function dispatcher(context) {
58
60
  const run = submissionHandler(context);
59
61
  const operations = new Map([
60
62
  ["run", (request) => run(request.parameters)],
63
+ ["schedule", (request) => scheduleRequest(context, request.parameters)],
61
64
  ["status", (request) => status(context, request.parameters)],
62
65
  ["questions", (request) => questions(context, request.parameters)],
63
66
  ["decision", (request) => decision(context, request.parameters)],
@@ -88,7 +91,7 @@ async function started(authority, setup) {
88
91
  handle: dispatcher({
89
92
  authority,
90
93
  registry,
91
- workflowRefusals: workflowRefusals(options.workflowRefusals),
94
+ ...queryMetadata(options),
92
95
  gateway,
93
96
  clock,
94
97
  changed: changes.next,
@@ -135,7 +138,7 @@ export async function startService(options) {
135
138
  if (typeof path !== "string")
136
139
  return path;
137
140
  const timing = options.timing ?? serviceTiming;
138
- const registry = workflowRegistry(options.workflows, options.retainedWorkflows);
141
+ const registry = workflowRegistry(options.workflows, options);
139
142
  const opening = await openAuthority(options.stateDirectory, {
140
143
  delivery: options.delivery,
141
144
  timing: timing.authority,
@@ -148,7 +151,7 @@ export async function startService(options) {
148
151
  const { authority } = opening;
149
152
  const gateway = serviceGateway(authority, { options, registry });
150
153
  const worker = workerPort({ gateway, authority });
151
- const host = await hosted(options, hostPorts(authority, worker));
154
+ const host = await hosted(options, hostPorts(authority, { worker, registry, gateway }));
152
155
  if (host.kind === "refused") {
153
156
  await authority.close();
154
157
  return host;
@@ -168,8 +171,8 @@ export async function startService(options) {
168
171
  };
169
172
  }
170
173
  catch (error) {
171
- const unclosed = await released(authority, host.host).then(() => "", (failure) => `; the close failed: ${message(failure)}`);
172
- return refused("transport-failure", `${message(error)}${unclosed}`);
174
+ const unclosed = await released(authority, host.host).then(() => "", (failure) => `; the close failed: ${errorMessage(failure)}`);
175
+ return refused("transport-failure", `${errorMessage(error)}${unclosed}`);
173
176
  }
174
177
  }
175
178
  function serviceGateway(authority, parts) {
@@ -182,8 +185,14 @@ function serviceGateway(authority, parts) {
182
185
  pendingWorkerCommands: limits.pendingWorkerCommands,
183
186
  });
184
187
  }
185
- function hostPorts(authority, worker) {
188
+ function hostPorts(authority, parts) {
189
+ const { worker, registry } = parts;
186
190
  return {
191
+ commandWait: commandWaitPort({ authority, gateway: parts.gateway }),
192
+ runWait: {
193
+ target: (runId) => runWaitTarget(authority, runId),
194
+ observe: worker.observe,
195
+ },
187
196
  state: authority.state,
188
197
  submit: worker.submit,
189
198
  input: async (runId) => {
@@ -198,17 +207,24 @@ function hostPorts(authority, worker) {
198
207
  openGate: worker.openGate,
199
208
  registerWait: worker.registerWait,
200
209
  operation: authority.effects.operation,
201
- workflowId: async (runId) => (await authority.queries.workflowIds())[runId],
210
+ operations: authority.effects.operations,
211
+ workflow: {
212
+ id: async (runId) => (await authority.queries.workflowIds())[runId],
213
+ manifest: authority.queries.manifest,
214
+ available: async (runId, workflowId) => {
215
+ const manifest = await authority.queries.manifest(runId);
216
+ return (manifest !== undefined &&
217
+ (workflowId === undefined || manifest.workflowId === workflowId) &&
218
+ (await registry.available(manifest)) !== undefined);
219
+ },
220
+ },
202
221
  };
203
222
  }
204
- function message(error) {
205
- return String(Reflect.get(Object(error), "message"));
206
- }
207
223
  async function hosted(options, ports) {
208
224
  try {
209
225
  return { kind: "started", host: await options.host?.(ports) };
210
226
  }
211
227
  catch (error) {
212
- return refused("host-unavailable", message(error));
228
+ return refused("host-unavailable", errorMessage(error));
213
229
  }
214
230
  }
@@ -1,5 +1,4 @@
1
1
  import { type Fields, type Reply } from "../protocol.ts";
2
2
  import { type ServiceContext } from "./replies.ts";
3
3
  export declare function runIdentity(commandId: string): string;
4
- export declare function queueOverview(context: ServiceContext): Promise<Fields>;
5
4
  export declare function submissionHandler(context: ServiceContext): (parameters: Fields) => Promise<Reply>;
@@ -5,7 +5,9 @@ import { setTimeout as delay } from "node:timers/promises";
5
5
  import { isCommandId, isIdentifier as isWorkflowIdentifier, } from "../authority/commands.js";
6
6
  import { documentDigest } from "../broker/decision-restore.js";
7
7
  import { record } from "../protocol.js";
8
- import { checkResolution, checkSubmission, normalizedRequest, } from "../submission.js";
8
+ import { checkResolution, checkSubmission, hasTicketField, normalizedRequest, } from "../submission.js";
9
+ import { activeWorkflow } from "./active-tickets.js";
10
+ import { queueSpend } from "./queue-spend.js";
9
11
  import { committed, failed, invalidRequest, publicReceipt, rejection, result, } from "./replies.js";
10
12
  export function runIdentity(commandId) {
11
13
  return `run-${createHash("sha256").update(commandId).digest("hex").slice(0, 32)}`;
@@ -124,6 +126,9 @@ async function admit(context, admission) {
124
126
  const { input } = resolution;
125
127
  if (Buffer.byteLength(input) > context.documentBytes)
126
128
  return unresolved(context, { kind: "failure", commandId });
129
+ const held = await spendRefusal(context, admission);
130
+ if (held !== undefined)
131
+ return held;
127
132
  const receipt = await context.gateway.execute({
128
133
  principal: "operator",
129
134
  command: {
@@ -154,16 +159,28 @@ async function admit(context, admission) {
154
159
  replayed: receipt.kind === "duplicate",
155
160
  });
156
161
  }
162
+ async function spendRefusal(context, admission) {
163
+ if (admission.workflow.manifest.queue !== true)
164
+ return undefined;
165
+ const spend = record((await queueSpend(context))["spend"]);
166
+ return spend?.["holding"] === true
167
+ ? failed("queue-spend-limit", {
168
+ commandId: admission.commandId,
169
+ detail: "Queue holding for spend limit.",
170
+ })
171
+ : undefined;
172
+ }
157
173
  function admissionRefusal(workflow, request) {
158
- const { workflowId, commandId, submission, activeTickets } = request;
159
- if (workflowId === "develop-issue" &&
174
+ const { commandId, submission, activeTickets } = request;
175
+ const tickets = hasTicketField(workflow.submission);
176
+ if (tickets &&
160
177
  typeof submission["ticket"] === "string" &&
161
178
  activeTickets.some((input) => input["ticketId"] === submission["ticket"]))
162
179
  return failed("ticket-active", {
163
180
  commandId,
164
181
  detail: "An active run already works on this ticket.",
165
182
  });
166
- if (workflowId === "develop-issue" && submission["ticket"] !== "next")
183
+ if (tickets && submission["ticket"] !== "next")
167
184
  return undefined;
168
185
  return capacityRefusal(workflow, request);
169
186
  }
@@ -228,43 +245,12 @@ async function submitted(context, parameters) {
228
245
  activeTickets,
229
246
  });
230
247
  }
231
- async function activeWorkflow(context, workflowId) {
232
- const workflows = await context.authority.queries.workflowIds();
233
- const state = await context.authority.state();
234
- const runs = Object.values(state.runs).filter((run) => workflows[run.runId] === workflowId &&
235
- !["completed", "failed", "cancelled"].includes(run.status));
236
- return Promise.all(runs.map(async (run) => {
237
- const digest = state.details[run.runId]?.input;
238
- const text = digest
239
- ? await context.authority.queries.document(digest)
240
- : undefined;
241
- return record(JSON.parse(text ?? "null")) ?? {};
242
- }));
243
- }
244
- export async function queueOverview(context) {
245
- const workflow = context.registry.byId("develop-issue");
246
- if (workflow?.admission === undefined)
247
- return {};
248
- const active = await activeWorkflow(context, "develop-issue");
249
- return {
250
- queue: {
251
- lanes: workflow.admission === "when-idle" ? 1 : workflow.admission,
252
- busy: active.length,
253
- skipped: [
254
- ...active.flatMap((input) => typeof input["ticketId"] === "string"
255
- ? [{ ticketId: input["ticketId"], reason: "ticket-active" }]
256
- : []),
257
- ...(workflow.resolver.skippedTickets?.() ?? []),
258
- ],
259
- },
260
- };
261
- }
262
248
  export function submissionHandler(context) {
263
249
  const pending = new Map();
264
250
  return (parameters) => {
265
251
  const keys = [`command:${String(parameters["commandId"])}`];
266
252
  const workflowId = String(parameters["workflowId"]);
267
- if (workflowId === "develop-issue" ||
253
+ if (hasTicketField(context.registry.byId(workflowId)?.submission) ||
268
254
  context.registry.byId(workflowId)?.admission !== undefined)
269
255
  keys.push(`workflow:${workflowId}`);
270
256
  const next = () => submitted(context, parameters);
@@ -8,6 +8,7 @@ interface Revised extends Identified {
8
8
  readonly expectedRevision: number;
9
9
  }
10
10
  export interface GateOpening extends Revised {
11
+ readonly waitMode?: "hook";
11
12
  readonly gateId: string;
12
13
  readonly kind: "question" | "approval";
13
14
  readonly prompt: string;