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,3 +1,4 @@
1
+ import { readCommandWaitDeadline } from "../command-wait-restore.js";
1
2
  import { detailColumns, detailRow } from "../../storage/decision-rows.js";
2
3
  import { integer, runRow, text, } from "../../storage/domain-rows.js";
3
4
  import { storedRun } from "../authority-restore.js";
@@ -57,6 +58,7 @@ export async function pendingEffect(connection, attempt) {
57
58
  return {
58
59
  ...intent,
59
60
  purpose,
61
+ ...(await readCommandWaitDeadline(connection, intent)),
60
62
  inputDigest: text(row, "input_digest"),
61
63
  leaseGeneration: integer(row, "generation"),
62
64
  capability: text(row, "capability"),
@@ -7,6 +7,6 @@ export async function pinned(connection, check) {
7
7
  const stored = readExecutionManifest(JSON.parse(text(await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [
8
8
  workflow,
9
9
  ]), "manifest")));
10
- const current = available(stored);
10
+ const current = await available(stored);
11
11
  return (current !== undefined && resumePinned(stored, current).kind === "admitted");
12
12
  }
@@ -1,3 +1,4 @@
1
+ import { endedCommandWaitCheck } from "../../authority/command-waits.js";
1
2
  import { stopAttempts, } from "../../authority/stop-sequence.js";
2
3
  import { observingIntent, protectedIntent, } from "./delivery-intents.js";
3
4
  function present(state, planning) {
@@ -15,7 +16,7 @@ function present(state, planning) {
15
16
  stopped: subject.stopped || state.effects.stops[subject.operationId] !== undefined,
16
17
  };
17
18
  }
18
- const kinds = ["start-run", "continue-run"];
19
+ const kinds = ["start-run", "continue-run", "resume-hook"];
19
20
  function intentOf(state, attempt) {
20
21
  const { runId, operationId, purpose } = attempt;
21
22
  const kind = kinds.find((candidate) => candidate === attempt.kind);
@@ -33,9 +34,14 @@ export function presentSubjects(state, planning) {
33
34
  }
34
35
  export function stopIntents(state, planning) {
35
36
  const { runId, stopping } = planning;
36
- if (state.runs[runId]?.status !== "cancelled")
37
- return [];
38
- const subjects = presentSubjects(state, planning);
37
+ const cancelled = state.runs[runId]?.status === "cancelled";
38
+ const subjects = presentSubjects(state, planning).flatMap((subject) => {
39
+ if (endedCommandWaitCheck(state.commandWaits ?? {}, subject.operationId))
40
+ return [
41
+ { ...subject, stopSequence: subject.stopSequence ?? state.sequence },
42
+ ];
43
+ return cancelled ? [subject] : [];
44
+ });
39
45
  return stopAttempts(subjects, {
40
46
  cancelledSequence: planning.cancelledNow[0] ?? stopping.cancelledSequence ?? 0,
41
47
  stopLimit: planning.stopLimit,
@@ -1,4 +1,5 @@
1
1
  import type { StopSubject } from "../../authority/stop-sequence.ts";
2
+ import type { CommandWaitsState } from "../../authority/command-waits.ts";
2
3
  import { type SqlConnection } from "../../storage/domain-rows.ts";
3
4
  export interface Stopping {
4
5
  readonly subjects: readonly StopSubject[];
@@ -10,6 +11,7 @@ export declare function turnStopping(connection: SqlConnection, scope: {
10
11
  readonly runId: string;
11
12
  readonly status: string | undefined;
12
13
  readonly kind: string;
14
+ readonly commandWaits?: CommandWaitsState;
13
15
  }): Promise<Stopping>;
14
16
  export declare function droppedRuns(connection: SqlConnection, rule: {
15
17
  readonly limit: number;
@@ -11,23 +11,36 @@ function attemptOf(row) {
11
11
  const closed = "NOT EXISTS (SELECT 1 FROM deliveries x WHERE x.operation_id = o.operation_id AND x.outcome IS NULL)";
12
12
  const reported = "EXISTS (SELECT 1 FROM stopped_operations s WHERE s.operation_id = o.operation_id)";
13
13
  const finalStatuses = "'refused', 'completed', 'failed', 'stopped', 'cancelled'";
14
+ const waitStopSequence = "(SELECT min(e.sequence) FROM command_waits w JOIN events e ON e.run_id = w.run_id WHERE w.check_operation = o.operation_id AND w.state != 'waiting' AND (e.type IN ('run.completed', 'run.failed', 'run.cancelled') OR (json_extract(e.payload, '$.waitName') = w.name AND (e.type = 'command-wait.expired' OR (e.type = 'command-wait.opened' AND round(unixepoch(e.recorded_at, 'subsec') * 1000) >= w.deadline)))))";
14
15
  export async function stopping(connection, runId) {
15
- const rows = await connection.all(`SELECT o.operation_id, o.kind, d.effect_id, coalesce(a.purpose, 'dispatch') AS purpose, d.outcome, d.staged_sequence, p.status, p.receipt, ${reported} AS stopped FROM outbox o JOIN deliveries d ON d.operation_id = o.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = ? AND ((coalesce(p.status, '') NOT IN (${finalStatuses}) AND NOT ${reported}) OR NOT ${closed}) ORDER BY d.staged_sequence, d.rowid`, [runId]);
16
+ const rows = await connection.all(`SELECT o.operation_id, o.kind, d.effect_id, coalesce(a.purpose, 'dispatch') AS purpose, d.outcome, d.staged_sequence, p.status, p.receipt, ${reported} AS stopped, ${waitStopSequence} AS stop_sequence FROM outbox o JOIN deliveries d ON d.operation_id = o.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = ? AND ((coalesce(p.status, '') NOT IN (${finalStatuses}) AND NOT ${reported}) OR NOT ${closed}) ORDER BY d.staged_sequence, d.rowid`, [runId]);
16
17
  const grouped = Map.groupBy(rows, (row) => text(row, "operation_id"));
17
18
  return {
18
- subjects: [...grouped].map(([operationId, attempts]) => ({
19
- operationId,
20
- kind: text(attempts[0], "kind"),
21
- attempts: attempts.map(attemptOf),
22
- status: optionalText(attempts[0], "status"),
23
- receipt: optionalText(attempts[0], "receipt"),
24
- stopped: integer(attempts[0], "stopped") === 1,
25
- })),
19
+ subjects: [...grouped].map(([operationId, attempts]) => {
20
+ const stopSequence = optionalInteger(attempts[0], "stop_sequence");
21
+ return {
22
+ operationId,
23
+ kind: text(attempts[0], "kind"),
24
+ attempts: attempts.map(attemptOf),
25
+ status: optionalText(attempts[0], "status"),
26
+ receipt: optionalText(attempts[0], "receipt"),
27
+ stopped: integer(attempts[0], "stopped") === 1,
28
+ ...(stopSequence === null ? {} : { stopSequence }),
29
+ };
30
+ }),
26
31
  cancelledSequence: optionalInteger(await connection.get("SELECT max(sequence) AS sequence FROM events WHERE run_id = ? AND type = 'run.cancelled'", [runId]), "sequence"),
27
32
  };
28
33
  }
29
34
  export function turnStopping(connection, scope) {
30
- const dropping = scope.status === "cancelled" || scope.kind === "cancel-run";
35
+ const endingWait = Object.values(scope.commandWaits ?? {}).some((wait) => wait.checkOperation !== null &&
36
+ (wait.state !== "waiting" ||
37
+ [
38
+ "expire-command-wait",
39
+ "open-command-wait",
40
+ "complete-run",
41
+ "fail-run",
42
+ ].includes(scope.kind)));
43
+ const dropping = scope.status === "cancelled" || scope.kind === "cancel-run" || endingWait;
31
44
  return dropping
32
45
  ? stopping(connection, scope.runId)
33
46
  : Promise.resolve(noStopping);
@@ -37,6 +50,6 @@ const last = "(SELECT d.outcome FROM deliveries d WHERE d.operation_id = o.opera
37
50
  const effectDue = `o.kind = 'protected-effect' AND p.status NOT IN (${finalStatuses}) AND (p.receipt IS NULL OR ?1 = 1 OR p.status IN ('recovering', 'blocked'))`;
38
51
  const runDue = `o.kind != 'protected-effect' AND NOT ${reported} AND ((${sent} AND ?1 = 1) OR (NOT ${sent} AND ${last} NOT IN ('withheld', 'blocked', 'absent')))`;
39
52
  export async function droppedRuns(connection, rule) {
40
- const rows = await connection.all(`SELECT r.run_id FROM runs r WHERE r.status = 'cancelled' AND EXISTS (SELECT 1 FROM outbox o LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = r.run_id AND ${closed} AND ((${effectDue}) OR (${runDue}))) ORDER BY r.run_id LIMIT ?2`, [rule.stopSupported ? 1 : 0, rule.limit]);
53
+ const rows = await connection.all(`SELECT r.run_id FROM runs r WHERE EXISTS (SELECT 1 FROM outbox o LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = r.run_id AND (r.status = 'cancelled' OR EXISTS (SELECT 1 FROM command_waits w WHERE w.run_id = r.run_id AND w.check_operation = o.operation_id AND w.state != 'waiting')) AND ${closed} AND ((${effectDue}) OR (${runDue}))) ORDER BY r.run_id LIMIT ?2`, [rule.stopSupported ? 1 : 0, rule.limit]);
41
54
  return rows.map((row) => text(row, "run_id"));
42
55
  }
@@ -11,6 +11,7 @@ export interface ChangeDraft {
11
11
  readonly released: readonly Row[];
12
12
  readonly closed: readonly Row[];
13
13
  readonly gates: readonly Row[];
14
+ readonly waits: readonly Row[];
14
15
  readonly details: readonly Row[];
15
16
  readonly documents: readonly Row[];
16
17
  readonly budgets: readonly Row[];
@@ -1,3 +1,4 @@
1
+ import { commandWaitRows } from "../command-wait-restore.js";
1
2
  import { evidenceOf } from "../../authority/operations.js";
2
3
  import { detailRecord, gateRecord } from "../decision-restore.js";
3
4
  import { effectRows } from "../effect-restore.js";
@@ -23,6 +24,7 @@ export function unchangedAt(sequence, closed) {
23
24
  released: [],
24
25
  closed,
25
26
  gates: [],
27
+ waits: [],
26
28
  details: [],
27
29
  documents: [],
28
30
  ...unchangedEffects,
@@ -78,6 +80,7 @@ export function draft(result, extra) {
78
80
  closed,
79
81
  documents,
80
82
  ...effectDraft(result, before),
83
+ waits: commandWaitRows(changedEntries(state.commandWaits ?? {}, before.commandWaits ?? {})).map(columns),
81
84
  gates: changed(state.gates, before.gates).map((gate) => columns(gateRecord(gate))),
82
85
  details: changed(state.details, before.details).map((details) => columns(detailRecord(details))),
83
86
  previous: before.sequence,
@@ -127,6 +130,7 @@ export function merged(first, later) {
127
130
  released: joined("released"),
128
131
  closed: joined("closed"),
129
132
  gates: joined("gates"),
133
+ waits: joined("waits"),
130
134
  details: joined("details"),
131
135
  documents: joined("documents"),
132
136
  budgets: joined("budgets"),
@@ -1,3 +1,4 @@
1
+ import { readCommandWaits } from "../command-wait-restore.js";
1
2
  import { parseCommand } from "../../authority/commands.js";
2
3
  import { readExecutionManifest } from "../../execution-pin.js";
3
4
  import { operationScope } from "../../operation-identity.js";
@@ -76,7 +77,7 @@ export async function adoptionTurn(connection) {
76
77
  return latest;
77
78
  }
78
79
  export async function recoverableIntents(connection) {
79
- const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind = 'continue-run' AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
80
+ const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind IN ('continue-run', 'resume-hook') AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
80
81
  const intents = [];
81
82
  for (const row of rows) {
82
83
  const intent = {
@@ -92,7 +93,7 @@ export async function recoverableIntents(connection) {
92
93
  return [...intents, ...(await uncertainEffects(connection))];
93
94
  }
94
95
  async function uncertainEffects(connection) {
95
- const rows = await connection.all("SELECT p.operation_id, p.run_id, r.workflow FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE p.status IN ('recovering', 'blocked') AND r.status != 'cancelled' AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = p.operation_id AND d.outcome IS NULL) ORDER BY p.requested_sequence LIMIT ?", [recoveryBatch]);
96
+ const rows = await connection.all("SELECT p.operation_id, p.run_id, r.workflow FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE p.status IN ('recovering', 'blocked') AND r.status != 'cancelled' AND NOT EXISTS (SELECT 1 FROM command_waits w WHERE w.check_operation = p.operation_id AND w.state != 'waiting') AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = p.operation_id AND d.outcome IS NULL) ORDER BY p.requested_sequence LIMIT ?", [recoveryBatch]);
96
97
  const intents = [];
97
98
  for (const row of rows)
98
99
  intents.push(await pendingEffect(connection, {
@@ -161,8 +162,10 @@ async function turnState(connection, scope) {
161
162
  sql: "SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox WHERE run_id = ? AND released_sequence IS NULL ORDER BY created_sequence, rowid",
162
163
  parameters: [runId],
163
164
  });
165
+ const waits = await readCommandWaits(connection, runId);
164
166
  return {
165
167
  state: {
168
+ ...waits,
166
169
  sequence,
167
170
  runs: { ...near.runs, ...(stored ? { [runId]: stored } : {}) },
168
171
  commands: recorded ? { [commandId]: recorded } : {},
@@ -178,6 +181,7 @@ async function turnState(connection, scope) {
178
181
  runId,
179
182
  status: stored?.status,
180
183
  kind: scope.kind,
184
+ ...waits,
181
185
  }),
182
186
  runId,
183
187
  created: recorded
@@ -1,3 +1,5 @@
1
+ import { commandWaitKey } from "../authority/command-waits.js";
2
+ import { documentDigest } from "./decision-restore.js";
1
3
  import { parseCommand } from "../authority/commands.js";
2
4
  import { executionCapabilities, readExecutionManifest, resumePinned, } from "../execution-pin.js";
3
5
  import { effectInputDigest } from "./effect-restore.js";
@@ -33,15 +35,70 @@ const resumption = (command, context) => {
33
35
  ? resumed
34
36
  : admissible;
35
37
  };
36
- const effectRequest = (command, context) => {
38
+ const commandEffect = (command, context) => {
39
+ const pin = context.state.runs[command.runId]?.workflow ?? "";
40
+ const names = context.definitions.get(pin)?.commands ?? [];
41
+ const method = String(command.method);
42
+ if (!method.startsWith("run:") || !names.includes(method.slice(4)))
43
+ return { kind: "rejected", reason: "command-not-declared" };
44
+ return unpinned(command, context);
45
+ };
46
+ function waitMatches(command, wait) {
47
+ return (command.target === wait.command &&
48
+ command.maximumWaitSeconds === wait.maximumWaitSeconds &&
49
+ command.pollEverySeconds === wait.pollEverySeconds);
50
+ }
51
+ const commandWait = (command, context) => {
52
+ const pin = context.state.runs[command.runId]?.workflow ?? "";
53
+ const declaration = context.definitions.get(pin);
54
+ const name = String(command.waitName);
55
+ const waits = declaration?.commandWaits ?? {};
56
+ const wait = Object.hasOwn(waits, name) ? waits[name] : undefined;
57
+ if (wait === undefined || !waitMatches(command, wait))
58
+ return { kind: "rejected", reason: "command-wait-not-declared" };
59
+ return unpinned(command, context);
60
+ };
61
+ function declaredWaitCheck(command, context) {
62
+ const pin = context.state.runs[command.runId]?.workflow ?? "";
63
+ const declarations = context.definitions.get(pin)?.commandWaits ?? {};
64
+ const name = String(command.waitName);
65
+ const declaration = Object.hasOwn(declarations, name)
66
+ ? declarations[name]
67
+ : undefined;
68
+ const wait = context.state.commandWaits?.[commandWaitKey(command.runId, name)];
69
+ if (declaration === undefined || wait === undefined)
70
+ return undefined;
71
+ return waitMatches({
72
+ ...command,
73
+ target: wait.command,
74
+ maximumWaitSeconds: wait.maximumWaitSeconds,
75
+ pollEverySeconds: wait.pollEverySeconds,
76
+ }, declaration)
77
+ ? wait
78
+ : undefined;
79
+ }
80
+ const commandWaitCheck = (command, context) => {
81
+ const wait = declaredWaitCheck(command, context);
82
+ if (wait === undefined)
83
+ return { kind: "rejected", reason: "command-wait-not-declared" };
37
84
  const computed = effectInputDigest({
38
- capability: String(command.capability),
39
- method: String(command.method),
40
- target: String(command.target),
41
- payload: String(command.payload),
85
+ capability: "command",
86
+ method: `run:${wait.command}`,
87
+ target: wait.command,
88
+ payload: wait.inputDigest,
42
89
  });
43
- if (computed !== command.inputDigest)
44
- return { kind: "rejected", reason: "input-digest-mismatch" };
90
+ return command.inputDigest === computed
91
+ ? unpinned(command, context)
92
+ : { kind: "rejected", reason: "input-digest-mismatch" };
93
+ };
94
+ const commandReport = (command, context) => {
95
+ const output = command.commandOutput;
96
+ if (output !== undefined &&
97
+ (command.worker !== "command" || documentDigest(output) !== command.result))
98
+ return { kind: "rejected", reason: "command-output-mismatch" };
99
+ return unpinned(command, context);
100
+ };
101
+ const handoffEffect = (command, context) => {
45
102
  if (command.capability !== "handoff")
46
103
  return unpinned(command, context);
47
104
  const pin = context.state.runs[command.runId]?.workflow ?? "";
@@ -52,8 +109,24 @@ const effectRequest = (command, context) => {
52
109
  return { kind: "rejected", reason: "invalid-handoff-request" };
53
110
  return unpinned(command, context);
54
111
  };
112
+ const effectRequest = (command, context) => {
113
+ const computed = effectInputDigest({
114
+ capability: String(command.capability),
115
+ method: String(command.method),
116
+ target: String(command.target),
117
+ payload: String(command.payload),
118
+ });
119
+ if (computed !== command.inputDigest)
120
+ return { kind: "rejected", reason: "input-digest-mismatch" };
121
+ return command.capability === "command"
122
+ ? commandEffect(command, context)
123
+ : handoffEffect(command, context);
124
+ };
55
125
  const rules = {
56
126
  "request-effect": effectRequest,
127
+ "check-command-wait": commandWaitCheck,
128
+ "report-effect": commandReport,
129
+ "open-command-wait": commandWait,
57
130
  "admit-run": admission,
58
131
  "decide-gate": resumption,
59
132
  "resume-run": resumption,
@@ -1,3 +1,4 @@
1
+ import type { CommandWaitRow } from "../storage/command-wait-rows.ts";
1
2
  import type { AuthorityEvent, AuthorityState, EffectIntent, RunState } from "../authority/reducer.ts";
2
3
  import type { DecisionRows, DocumentRow } from "../storage/decision-rows.ts";
3
4
  import type { EffectRows } from "../storage/effect-rows.ts";
@@ -7,6 +8,7 @@ import type { ExecutionManifest } from "../workflow-admission.ts";
7
8
  export type RestoredSnapshot = AuthoritySnapshot & Partial<DecisionRows> & {
8
9
  readonly documents?: readonly DocumentRow[];
9
10
  readonly effects?: EffectRows;
11
+ readonly waits?: readonly CommandWaitRow[];
10
12
  };
11
13
  export type Restoration = {
12
14
  readonly kind: "restored";
@@ -1,3 +1,4 @@
1
+ import { commandWaitState, commandWaitRows, commandOutputsIntact, } from "./command-wait-restore.js";
1
2
  import { isDeepStrictEqual } from "node:util";
2
3
  import { parseEvent } from "../authority/events.js";
3
4
  import { rebuildHistory } from "../authority/history.js";
@@ -51,6 +52,7 @@ export function restore(snapshot) {
51
52
  isDeepStrictEqual(Object.fromEntries(snapshot.runs.map((row) => [row.runId, row.sequence])), history.runSequences),
52
53
  ],
53
54
  ["definitions", definitionsIntact(definitions, state)],
55
+ ...waitChecks(snapshot, { state, definitions, events }),
54
56
  ...decisionChecks(snapshot, state),
55
57
  ...(snapshot.effects === undefined
56
58
  ? []
@@ -68,6 +70,21 @@ export function restore(snapshot) {
68
70
  };
69
71
  return { kind: "restored", state, events, definitions };
70
72
  }
73
+ function waitChecks(snapshot, context) {
74
+ const { state, definitions } = context;
75
+ return [
76
+ ["command-outputs", commandOutputsIntact(context.events)],
77
+ ["command-waits", commandWaitsIntact(definitions, state)],
78
+ ...(snapshot.waits === undefined
79
+ ? []
80
+ : [
81
+ [
82
+ "waits",
83
+ isDeepStrictEqual(snapshot.waits, commandWaitRows(state.commandWaits ?? {})),
84
+ ],
85
+ ]),
86
+ ];
87
+ }
71
88
  function decisionChecks(snapshot, state) {
72
89
  const { gates, details, documents } = snapshot;
73
90
  if (gates === undefined || details === undefined || documents === undefined)
@@ -95,12 +112,29 @@ function definitionsIntact(definitions, state) {
95
112
  const used = new Set(Object.values(state.runs).map((run) => run.workflow));
96
113
  return ([...definitions].every(([pin, manifest]) => workflowPin(manifest) === pin && used.has(pin)) && [...used].every((pin) => definitions.has(pin)));
97
114
  }
115
+ function commandWaitsIntact(definitions, state) {
116
+ return Object.values(state.commandWaits ?? {}).every((wait) => {
117
+ const pin = state.runs[wait.runId]?.workflow ?? "";
118
+ const waits = definitions.get(pin)?.commandWaits ?? {};
119
+ const permission = Object.hasOwn(waits, wait.name)
120
+ ? waits[wait.name]
121
+ : undefined;
122
+ return (permission !== undefined &&
123
+ permission.command === wait.command &&
124
+ permission.maximumWaitSeconds === wait.maximumWaitSeconds &&
125
+ permission.pollEverySeconds === wait.pollEverySeconds);
126
+ });
127
+ }
98
128
  const projectionParts = ["sequence", "runs", "commands", "intents"];
99
129
  function text(error) {
100
130
  return String(Reflect.get(Object(error), "message"));
101
131
  }
102
132
  export function currentState(snapshot) {
103
- return { ...projectedState(snapshot), ...decisionState(snapshot) };
133
+ return {
134
+ ...projectedState(snapshot),
135
+ ...decisionState(snapshot),
136
+ ...commandWaitState(snapshot.waits ?? []),
137
+ };
104
138
  }
105
139
  export function projectedState(snapshot) {
106
140
  return {
@@ -122,6 +156,7 @@ export function projectedState(snapshot) {
122
156
  const intentKinds = [
123
157
  "start-run",
124
158
  "continue-run",
159
+ "resume-hook",
125
160
  "protected-effect",
126
161
  ];
127
162
  export function intentKind(value) {
@@ -0,0 +1,31 @@
1
+ import type { Database } from "solid-objects";
2
+ import { type CommandWaitsState } from "../authority/command-waits.ts";
3
+ import type { AuthorityEvent } from "../authority/transitions.ts";
4
+ import type { DispatchRead } from "../authority/dispatch-decision.ts";
5
+ import type { AuthorityState } from "../authority/transitions.ts";
6
+ import { type CommandWaitRow } from "../storage/command-wait-rows.ts";
7
+ import type { SqlConnection } from "../storage/domain-rows.ts";
8
+ export declare function commandWaitRows(waits: CommandWaitsState): readonly CommandWaitRow[];
9
+ export declare function commandWaitState(rows: readonly CommandWaitRow[]): {
10
+ readonly commandWaits?: CommandWaitsState;
11
+ };
12
+ export declare function readCommandWaits(connection: SqlConnection, runId: string): Promise<{
13
+ readonly commandWaits?: CommandWaitsState;
14
+ }>;
15
+ export declare function upgradeCommandWaits(database: Database, state: AuthorityState): Promise<void>;
16
+ export declare function upgradeCommandWaitChecks(database: Database): Promise<void>;
17
+ export declare function commandWaitDeadline(waits: CommandWaitsState, operationId: string): {
18
+ readonly commandDeadline?: string;
19
+ };
20
+ export declare function dispatchCommandWait(connection: SqlConnection, check: {
21
+ readonly runId: string;
22
+ readonly workflow: string;
23
+ readonly operationId: string;
24
+ }): Promise<Pick<DispatchRead, "commandWait">>;
25
+ export declare function commandOutputsIntact(events: readonly AuthorityEvent[]): boolean;
26
+ export declare function readCommandWaitDeadline(connection: SqlConnection, scope: {
27
+ readonly runId: string;
28
+ readonly operationId: string;
29
+ }): Promise<{
30
+ readonly commandDeadline?: string;
31
+ }>;
@@ -0,0 +1,86 @@
1
+ import { commandWaitKey, } from "../authority/command-waits.js";
2
+ import { operationPhase } from "../operation-identity.js";
3
+ import { documentDigest } from "./decision-restore.js";
4
+ import { readExecutionManifest } from "../execution-pin.js";
5
+ import { text } from "../storage/domain-rows.js";
6
+ import { commandWaitStatements, loadCommandWaits, } from "../storage/command-wait-rows.js";
7
+ import { checkedVersion, waitingVersion, upgradeSchema, } from "../storage/domain-schema.js";
8
+ export function commandWaitRows(waits) {
9
+ return Object.values(waits).sort((left, right) => {
10
+ if (left.runId !== right.runId)
11
+ return left.runId < right.runId ? -1 : 1;
12
+ return left.name < right.name ? -1 : 1;
13
+ });
14
+ }
15
+ export function commandWaitState(rows) {
16
+ const waits = {};
17
+ for (const row of rows) {
18
+ const state = [
19
+ "waiting",
20
+ "timed-out",
21
+ "cancelled",
22
+ "completed",
23
+ "failed",
24
+ ];
25
+ const kind = state.find((candidate) => candidate === row.state);
26
+ if (kind === undefined)
27
+ throw new Error("invalid-command-wait-state");
28
+ waits[commandWaitKey(row.runId, row.name)] = { ...row, state: kind };
29
+ }
30
+ return rows.length === 0 ? {} : { commandWaits: waits };
31
+ }
32
+ export async function readCommandWaits(connection, runId) {
33
+ return commandWaitState(await loadCommandWaits(connection, { runId }));
34
+ }
35
+ export async function upgradeCommandWaits(database, state) {
36
+ await database.transaction(async (connection) => {
37
+ await upgradeSchema(connection, waitingVersion);
38
+ for (const statement of commandWaitStatements(commandWaitRows(state.commandWaits ?? {}), { version: "opened" }))
39
+ await connection.run(statement.sql, statement.parameters);
40
+ });
41
+ }
42
+ export async function upgradeCommandWaitChecks(database) {
43
+ await database.transaction(async (connection) => {
44
+ await upgradeSchema(connection, checkedVersion);
45
+ });
46
+ }
47
+ export function commandWaitDeadline(waits, operationId) {
48
+ const wait = Object.values(waits).find((wait) => wait.checkOperation === operationId);
49
+ return wait === undefined
50
+ ? {}
51
+ : { commandDeadline: new Date(wait.deadline).toISOString() };
52
+ }
53
+ export async function dispatchCommandWait(connection, check) {
54
+ if (operationPhase(check.operationId) !== "command-wait")
55
+ return {};
56
+ const state = await readCommandWaits(connection, check.runId);
57
+ const wait = Object.values(state.commandWaits ?? {}).find((wait) => wait.checkOperation === check.operationId);
58
+ if (wait === undefined)
59
+ return {};
60
+ const row = await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [check.workflow]);
61
+ const declarations = readExecutionManifest(JSON.parse(text(row, "manifest"))).commandWaits ?? {};
62
+ const permission = Object.hasOwn(declarations, wait.name)
63
+ ? declarations[wait.name]
64
+ : undefined;
65
+ return { commandWait: { wait, declared: declaredWait(wait, permission) } };
66
+ }
67
+ function declaredWait(wait, permission) {
68
+ return (permission !== undefined &&
69
+ permission.command === wait.command &&
70
+ permission.maximumWaitSeconds === wait.maximumWaitSeconds &&
71
+ permission.pollEverySeconds === wait.pollEverySeconds);
72
+ }
73
+ export function commandOutputsIntact(events) {
74
+ return events.every((event) => {
75
+ const output = event.payload["commandOutput"];
76
+ return (output === undefined ||
77
+ (event.payload["worker"] === "command" &&
78
+ documentDigest(output) === event.payload["result"]));
79
+ });
80
+ }
81
+ export async function readCommandWaitDeadline(connection, scope) {
82
+ if (operationPhase(scope.operationId) !== "command-wait")
83
+ return {};
84
+ const state = await readCommandWaits(connection, scope.runId);
85
+ return commandWaitDeadline(state.commandWaits ?? {}, scope.operationId);
86
+ }
@@ -2,7 +2,7 @@ import type { RunDetails } from "../authority/details.ts";
2
2
  import { type GateState } from "../authority/gates.ts";
3
3
  import type { AuthorityState } from "../authority/reducer.ts";
4
4
  import type { DecisionRows, DetailRow, DocumentRow, GateRow } from "../storage/decision-rows.ts";
5
- export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions">;
5
+ export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions" | "commandWaits">;
6
6
  export declare function documentDigest(body: string): string;
7
7
  export declare function gateRecord(gate: GateState): GateRow;
8
8
  export declare function detailRecord(details: RunDetails): DetailRow;
@@ -1,8 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
- import { continues, gateKey } from "../authority/gates.js";
3
- import { gateContinuation } from "../authority/reduction.js";
2
+ import { delivers, gateKey } from "../authority/gates.js";
3
+ import { gateDelivery } from "../authority/reduction.js";
4
4
  const kinds = ["question", "approval", "untyped"];
5
- const waits = ["registered", "pending"];
5
+ const waits = ["registered", "pending", "hook"];
6
6
  export function documentDigest(body) {
7
7
  return `sha256:${createHash("sha256").update(body).digest("hex")}`;
8
8
  }
@@ -22,7 +22,7 @@ export function gateRecord(gate) {
22
22
  answer: gate.outcome?.answer ?? null,
23
23
  decidedSequence: gate.outcome?.sequence ?? null,
24
24
  openedSequence: gate.openedSequence,
25
- continuation: continues(gate) ? gateContinuation(gate).operationId : null,
25
+ continuation: delivers(gate) ? gateDelivery(gate).operationId : null,
26
26
  };
27
27
  }
28
28
  const unobserved = {
@@ -141,6 +141,7 @@ export function decisionRows(state) {
141
141
  }
142
142
  export function referencedDigests(state) {
143
143
  return [
144
+ ...Object.values(state.commandWaits ?? {}).map((wait) => wait.inputDigest),
144
145
  ...Object.values(state.gates).flatMap((gate) => [
145
146
  gate.prompt,
146
147
  gate.outcome?.answer ?? null,
@@ -1,3 +1,5 @@
1
1
  import type { Database } from "solid-objects";
2
2
  import type { AuthorityState } from "../authority/reducer.ts";
3
3
  export declare function upgradeEffects(database: Database, state: AuthorityState): Promise<void>;
4
+ export declare function upgradeSpendingIndexes(database: Database): Promise<void>;
5
+ export declare function upgradeEventIndexes(database: Database): Promise<void>;
@@ -1,9 +1,15 @@
1
- import { currentVersion, upgradeSchema } from "../storage/domain-schema.js";
1
+ import { currentVersion, effectedVersion, spendingVersion, upgradeSchema, } from "../storage/domain-schema.js";
2
2
  import { persistEffects } from "../storage/effect-changes.js";
3
3
  import { effectRows } from "./effect-restore.js";
4
4
  export async function upgradeEffects(database, state) {
5
5
  await database.transaction(async (connection) => {
6
- await upgradeSchema(connection, currentVersion);
6
+ await upgradeSchema(connection, effectedVersion);
7
7
  await persistEffects(connection, effectRows(state.effects, []));
8
8
  });
9
9
  }
10
+ export async function upgradeSpendingIndexes(database) {
11
+ await database.transaction((connection) => upgradeSchema(connection, spendingVersion));
12
+ }
13
+ export async function upgradeEventIndexes(database) {
14
+ await database.transaction((connection) => upgradeSchema(connection, currentVersion));
15
+ }
@@ -6,4 +6,6 @@ export type SocketAddress = {
6
6
  readonly reason: "runtime-path-too-long";
7
7
  readonly detail: string;
8
8
  };
9
- export declare function socketAddress(path: string): SocketAddress;
9
+ export declare function socketAddress(path: string, options?: {
10
+ readonly directory: string;
11
+ }): SocketAddress;
@@ -1,7 +1,7 @@
1
1
  import { relative } from "node:path";
2
2
  const maximumBytes = 103;
3
- export function socketAddress(path) {
4
- const [shortest] = [path, relative(process.cwd(), path)]
3
+ export function socketAddress(path, options = { directory: process.cwd() }) {
4
+ const [shortest] = [path, relative(options.directory, path)]
5
5
  .filter((candidate) => candidate.length > 0)
6
6
  .sort((left, right) => Buffer.byteLength(left) - Buffer.byteLength(right));
7
7
  if (shortest === undefined || Buffer.byteLength(shortest) > maximumBytes)