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
@@ -88,8 +88,10 @@ const unavailablePin = assessed("infrastructure-failure", {
88
88
  nextAction: "restore-pinned-workflow",
89
89
  humanInputCanHelp: true,
90
90
  });
91
- function worldConflict(input) {
91
+ function workflowFailure(input) {
92
92
  const code = input.details?.observation?.reason;
93
+ if (code === "pinned-workflow-unavailable")
94
+ return unavailablePin;
93
95
  if (code !== "world-run-conflict")
94
96
  return undefined;
95
97
  return assessed("infrastructure-failure", {
@@ -103,7 +105,7 @@ function queued(input) {
103
105
  return unknownEffect;
104
106
  if (blocked(input.operations))
105
107
  return unavailablePin;
106
- const conflict = worldConflict(input);
108
+ const conflict = workflowFailure(input);
107
109
  if (conflict !== undefined)
108
110
  return conflict;
109
111
  if (dispatched(input.operations))
@@ -141,10 +143,13 @@ function running(input) {
141
143
  return effect;
142
144
  if (blocked(input.operations))
143
145
  return unavailablePin;
144
- return worldConflict(input) ?? observed(input);
146
+ return workflowFailure(input) ?? observed(input);
145
147
  }
146
148
  function observed(input) {
147
149
  const observation = input.details?.observation ?? null;
150
+ const wait = runWaitAssessment(observation);
151
+ if (wait !== undefined)
152
+ return wait;
148
153
  if (observation !== null &&
149
154
  Object.hasOwn(observedActions, observation.condition))
150
155
  return observedWork(observation);
@@ -160,7 +165,20 @@ function observed(input) {
160
165
  humanInputCanHelp: false,
161
166
  });
162
167
  }
168
+ function runWaitAssessment(observation) {
169
+ if (observation?.condition === "waiting-run")
170
+ return assessed("waiting-run", {
171
+ code: "awaiting-run",
172
+ detail: `The run waits for run ${observation.evidence ?? "unknown"}.`,
173
+ nextAction: "await-run",
174
+ nextActionAt: observation.retryAt,
175
+ humanInputCanHelp: false,
176
+ });
177
+ return undefined;
178
+ }
163
179
  function waiting(input) {
180
+ if (input.details?.observation?.reason === "pinned-workflow-unavailable")
181
+ return unavailablePin;
164
182
  const pending = input.gates.filter((gate) => gate.outcome === null);
165
183
  const question = pending.some((gate) => gate.kind === "question");
166
184
  const approval = pending.some((gate) => gate.kind === "approval");
@@ -226,6 +244,7 @@ export function runView(input) {
226
244
  workflow: run.workflow,
227
245
  state: run.status,
228
246
  condition: assessment.condition,
247
+ awaitedRunId: awaitedRun(assessment, observation),
229
248
  revision: run.revision,
230
249
  latestSequence: input.latestSequence,
231
250
  pendingDecisions: input.gates
@@ -247,6 +266,7 @@ export function runView(input) {
247
266
  attempts: observation?.attempt ?? 0,
248
267
  limit: observation?.limit ?? null,
249
268
  },
269
+ commandWaits: input.commandWaits,
250
270
  budget: input.budget,
251
271
  effects: effectViews(input.effects),
252
272
  nextAction: assessment.nextAction,
@@ -254,3 +274,8 @@ export function runView(input) {
254
274
  humanInputCanHelp: assessment.humanInputCanHelp,
255
275
  };
256
276
  }
277
+ function awaitedRun(assessment, observation) {
278
+ return assessment.condition === "waiting-run"
279
+ ? (observation?.evidence ?? null)
280
+ : null;
281
+ }
@@ -5,6 +5,7 @@ export interface AttemptSummary {
5
5
  readonly stagedSequence: number;
6
6
  }
7
7
  export interface StopSubject {
8
+ readonly stopSequence?: number;
8
9
  readonly operationId: string;
9
10
  readonly kind: string;
10
11
  readonly attempts: readonly AttemptSummary[];
@@ -39,7 +39,8 @@ const stopPurposes = ["stop", "reconcile"];
39
39
  export function stopCount(subject, cancelledSequence) {
40
40
  return subject.attempts.filter((attempt) => attempt.outcome !== null &&
41
41
  stopPurposes.includes(attempt.purpose) &&
42
- attempt.stagedSequence >= cancelledSequence).length;
42
+ attempt.stagedSequence >=
43
+ Math.max(cancelledSequence, subject.stopSequence ?? 0)).length;
43
44
  }
44
45
  const uncertainStatuses = ["recovering", "blocked"];
45
46
  function uncertain(subject) {
@@ -1,3 +1,4 @@
1
+ import type { CommandWaitsState } from "./command-waits.ts";
1
2
  import type { RunDetails } from "./details.ts";
2
3
  import type { GateState } from "./gates.ts";
3
4
  import type { EffectState } from "./operations.ts";
@@ -11,7 +12,7 @@ export interface RunState {
11
12
  readonly gates: readonly string[];
12
13
  }
13
14
  export interface EffectIntent {
14
- readonly kind: "start-run" | "continue-run" | "protected-effect";
15
+ readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
15
16
  readonly runId: string;
16
17
  readonly operationId: string;
17
18
  }
@@ -26,9 +27,10 @@ export interface AuthorityState {
26
27
  readonly gates: Readonly<Record<string, GateState>>;
27
28
  readonly details: Readonly<Record<string, RunDetails>>;
28
29
  readonly questions: number;
30
+ readonly commandWaits?: CommandWaitsState;
29
31
  readonly effects: EffectState;
30
32
  }
31
- export declare const eventTypes: readonly ["run.created", "run.started", "gate.opened", "gate.wait-registered", "gate.decided", "gate.expired", "run.paused", "run.resumed", "run.completed", "run.failed", "run.cancelled", "run.observed", "step.dispatched", "effect.requested", "lease.granted", "lease.expired", "effect.reported", "operation.reconciled"];
33
+ export declare const eventTypes: readonly ["run.created", "run.started", "gate.opened", "gate.wait-registered", "gate.decided", "gate.expired", "run.paused", "run.resumed", "run.completed", "run.failed", "run.cancelled", "run.observed", "step.dispatched", "effect.requested", "lease.granted", "lease.expired", "effect.reported", "operation.reconciled", "schedule.skipped", "command-wait.opened", "command-wait.checked", "command-wait.expired"];
32
34
  export type EventType = (typeof eventTypes)[number];
33
35
  export interface AuthorityEvent {
34
36
  readonly sequence: number;
@@ -39,8 +41,8 @@ export interface AuthorityEvent {
39
41
  readonly request: string;
40
42
  readonly payload: Readonly<Record<string, string>>;
41
43
  }
42
- export declare const numberFields: readonly ["expectedRevision", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity"];
43
- export declare const textFields: readonly ["parentRunId", "chainId", "workflow", "submission", "input", "resolver", "gateId", "gateKind", "subject", "prompt", "expiresAt", "decision", "answer", "condition", "reason", "evidence", "retryAt", "operationId", "receipt", "capabilities", "capability", "method", "target", "payload", "inputDigest", "resource", "transport", "source", "worker", "outcome", "outcomeReason", "promotionId", "ticketStatus", "issueUpdate", "result"];
44
+ export declare const numberFields: readonly ["expectedRevision", "expectedObservation", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity", "slot", "maximumWaitSeconds", "pollEverySeconds"];
45
+ export declare const textFields: readonly ["parentRunId", "chainId", "workflow", "workflowId", "submission", "input", "resolver", "gateId", "gateKind", "waitMode", "subject", "prompt", "expiresAt", "decision", "answer", "condition", "reason", "evidence", "retryAt", "operationId", "receipt", "capabilities", "capability", "method", "target", "payload", "inputDigest", "resource", "transport", "source", "worker", "outcome", "outcomeReason", "promotionId", "ticketStatus", "issueUpdate", "result", "actor", "waitName", "commandOutput"];
44
46
  export type NumberField = (typeof numberFields)[number];
45
47
  export type TextField = (typeof textFields)[number];
46
48
  export type AuthorityCommand = {
@@ -48,7 +50,7 @@ export type AuthorityCommand = {
48
50
  readonly commandId: string;
49
51
  readonly runId: string;
50
52
  } & Readonly<Partial<Record<NumberField, number>>> & Readonly<Partial<Record<TextField, string>>>;
51
- export type Move = Exclude<EventType, "run.created" | "step.dispatched" | "gate.wait-registered" | "run.observed" | "effect.requested" | "lease.granted" | "lease.expired" | "effect.reported" | "operation.reconciled">;
53
+ export type Move = Exclude<EventType, "run.created" | "step.dispatched" | "gate.wait-registered" | "run.observed" | "effect.requested" | "lease.granted" | "lease.expired" | "effect.reported" | "operation.reconciled" | "schedule.skipped" | "command-wait.opened" | "command-wait.checked" | "command-wait.expired">;
52
54
  export declare const terminal: readonly RunStatus[];
53
55
  export type Transition = {
54
56
  readonly kind: "moved";
@@ -17,9 +17,14 @@ export const eventTypes = [
17
17
  "lease.expired",
18
18
  "effect.reported",
19
19
  "operation.reconciled",
20
+ "schedule.skipped",
21
+ "command-wait.opened",
22
+ "command-wait.checked",
23
+ "command-wait.expired",
20
24
  ];
21
25
  export const numberFields = [
22
26
  "expectedRevision",
27
+ "expectedObservation",
23
28
  "generation",
24
29
  "attempt",
25
30
  "limit",
@@ -29,16 +34,21 @@ export const numberFields = [
29
34
  "leaseGeneration",
30
35
  "sourceGeneration",
31
36
  "capacity",
37
+ "slot",
38
+ "maximumWaitSeconds",
39
+ "pollEverySeconds",
32
40
  ];
33
41
  export const textFields = [
34
42
  "parentRunId",
35
43
  "chainId",
36
44
  "workflow",
45
+ "workflowId",
37
46
  "submission",
38
47
  "input",
39
48
  "resolver",
40
49
  "gateId",
41
50
  "gateKind",
51
+ "waitMode",
42
52
  "subject",
43
53
  "prompt",
44
54
  "expiresAt",
@@ -66,6 +76,9 @@ export const textFields = [
66
76
  "ticketStatus",
67
77
  "issueUpdate",
68
78
  "result",
79
+ "actor",
80
+ "waitName",
81
+ "commandOutput",
69
82
  ];
70
83
  export const terminal = [
71
84
  "completed",
@@ -8,6 +8,7 @@ import { pinned } from "./pin-check.js";
8
8
  const eligibleStatus = {
9
9
  "start-run": "queued",
10
10
  "continue-run": "running",
11
+ "resume-hook": "running",
11
12
  };
12
13
  function admission(parts, attempt) {
13
14
  const { intent, effectId } = attempt;
@@ -1,5 +1,6 @@
1
1
  import type { Database } from "solid-objects";
2
- import type { AuthorityCommand, AuthorityEvent } from "../../authority/transitions.ts";
2
+ import type { ExecutionManifest } from "../../workflow-admission.ts";
3
+ import type { AuthorityCommand, AuthorityEvent, RunState } from "../../authority/transitions.ts";
3
4
  import { type SqlConnection } from "../../storage/domain-rows.ts";
4
5
  import { type RunLinks, type RunOrigins } from "../../authority/handoff-chain.ts";
5
6
  export interface CommandRecord {
@@ -31,13 +32,19 @@ export interface CompletionCursor {
31
32
  readonly atOrBefore: number;
32
33
  readonly terminal?: boolean;
33
34
  }
35
+ export interface RunRecord extends RunState {
36
+ readonly admissionCommandId: string | null;
37
+ readonly sequence: number;
38
+ }
34
39
  export interface AuthorityQueries {
40
+ readonly run: (runId: string) => Promise<RunRecord | undefined>;
41
+ readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
35
42
  readonly document: (digest: string) => Promise<string | undefined>;
36
43
  readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
37
44
  readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
38
45
  readonly latestCompletion: (cursor: CompletionCursor) => Promise<PublishedEvent | undefined>;
39
46
  readonly sequences: () => Promise<Sequences>;
40
- readonly workflowIds: () => Promise<Readonly<Record<string, string>>>;
47
+ readonly workflowIds: (runIds?: readonly string[]) => Promise<Readonly<Record<string, string>>>;
41
48
  readonly runOrigins: () => Promise<RunOrigins>;
42
49
  readonly runLinks: () => Promise<Readonly<Record<string, RunLinks>>>;
43
50
  }
@@ -1,9 +1,21 @@
1
+ import { readExecutionManifest } from "../../execution-pin.js";
1
2
  import { parseCommand } from "../../authority/commands.js";
2
3
  import { documentBody } from "../../storage/decision-rows.js";
3
- import { integer, optionalText, latestSequence, text, } from "../../storage/domain-rows.js";
4
- import { storedEvents } from "../authority-restore.js";
4
+ import { integer, optionalText, latestSequence, runRow, text, } from "../../storage/domain-rows.js";
5
+ import { storedEvents, storedRun } from "../authority-restore.js";
5
6
  import { documentDigest } from "../decision-restore.js";
6
7
  import { runLinks, } from "../../authority/handoff-chain.js";
8
+ async function run(connection, runId) {
9
+ const row = await connection.get("SELECT r.run_id, r.status, r.revision, r.workflow, r.paused_from, r.gates, r.sequence, c.command_id AS admission_command_id FROM runs r LEFT JOIN events c ON c.run_id = r.run_id AND c.type = 'run.created' WHERE r.run_id = ? ORDER BY c.sequence LIMIT 1", [runId]);
10
+ if (row === undefined)
11
+ return undefined;
12
+ const record = runRow(row);
13
+ return {
14
+ ...storedRun(record),
15
+ sequence: record.sequence,
16
+ admissionCommandId: optionalText(row, "admission_command_id"),
17
+ };
18
+ }
7
19
  async function runOrigins(connection, cursor) {
8
20
  const rows = await connection.all("SELECT run_id, json_extract(payload, '$.parentRunId') AS parent_run_id, coalesce(json_extract(payload, '$.chainId'), run_id) AS chain_id FROM events WHERE type = 'run.created' AND sequence > ? AND sequence <= ? ORDER BY sequence", [cursor.after, cursor.through]);
9
21
  return Object.fromEntries(rows.map((row) => [
@@ -76,8 +88,13 @@ async function sequences(connection) {
76
88
  times: Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "recorded_at")])),
77
89
  };
78
90
  }
79
- async function workflowIds(connection) {
80
- const rows = await connection.all("SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'");
91
+ async function workflowIds(connection, runIds) {
92
+ if (runIds?.length === 0)
93
+ return {};
94
+ const scoped = runIds === undefined
95
+ ? ""
96
+ : ` AND d.run_id IN (${runIds.map(() => "?").join(", ")})`;
97
+ const rows = await connection.all(`SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'${scoped}`, runIds);
81
98
  return Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "workflow_id")]));
82
99
  }
83
100
  function cachedOrigins(read) {
@@ -122,12 +139,19 @@ export function authorityQueries(read) {
122
139
  return links;
123
140
  };
124
141
  return {
142
+ run: (runId) => read((connection) => run(connection, runId)),
143
+ manifest: (runId) => read(async (connection) => {
144
+ const row = await connection.get("SELECT d.manifest FROM runs r JOIN definitions d ON d.pin = r.workflow WHERE r.run_id = ?", [runId]);
145
+ return row === undefined
146
+ ? undefined
147
+ : readExecutionManifest(JSON.parse(text(row, "manifest")));
148
+ }),
125
149
  document: (digest) => read((connection) => documentBody(connection, digest)),
126
150
  receipt: (commandId) => read((connection) => receipt(connection, commandId)),
127
151
  eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
128
152
  latestCompletion: (cursor) => read((connection) => latestCompletion(connection, cursor)),
129
153
  sequences: () => read(sequences),
130
- workflowIds: () => read(workflowIds),
154
+ workflowIds: (runIds) => read((connection) => workflowIds(connection, runIds)),
131
155
  runOrigins: origins,
132
156
  runLinks: currentLinks,
133
157
  };
@@ -1,5 +1,6 @@
1
1
  import { integer, text } from "../../storage/domain-rows.js";
2
2
  import { intentKind } from "../authority-restore.js";
3
+ import { commandLimits } from "../../command-settings.js";
3
4
  export const unserializable = {
4
5
  kind: "rejected",
5
6
  reason: "invalid-command",
@@ -16,7 +17,16 @@ export const tooLarge = {
16
17
  detail: `A request has at most ${String(maximumRequestBytes)} bytes.`,
17
18
  };
18
19
  export function oversized(request) {
19
- return Buffer.byteLength(JSON.stringify(request)) > maximumRequestBytes;
20
+ const command = request["command"];
21
+ const report = typeof command === "object" &&
22
+ command !== null &&
23
+ !Array.isArray(command) &&
24
+ command["kind"] === "report-effect" &&
25
+ command["worker"] === "command";
26
+ const limit = report
27
+ ? maximumRequestBytes + commandLimits.stdoutBytes * 12
28
+ : maximumRequestBytes;
29
+ return Buffer.byteLength(JSON.stringify(request)) > limit;
20
30
  }
21
31
  export function failed(error) {
22
32
  const name = String(Reflect.get(Object(error), "name"));
@@ -1,5 +1,5 @@
1
1
  import { eligibleIntents, } from "../../authority/reducer.js";
2
- import { loadProjections, } from "../../storage/decision-snapshots.js";
2
+ import { loadOperationSnapshot, loadProjections, } from "../../storage/decision-snapshots.js";
3
3
  import { loadEvents } from "../../storage/domain-rows.js";
4
4
  import { pinnedResumption } from "../authority-admission.js";
5
5
  import { currentState, intentKind, storedDefinitions, storedEvents, } from "../authority-restore.js";
@@ -40,7 +40,7 @@ export function authoritySession(parts) {
40
40
  return storedEvents(await parts.reader.connection(loadEvents));
41
41
  },
42
42
  eligibleIntents: async () => eligible(await projected(session)),
43
- operations: async () => operationRecords(await projected(session)),
43
+ operations: async () => operationRecords(await read(loadOperationSnapshot)),
44
44
  resumePinned: async (runId, manifest) => {
45
45
  const snapshot = await projected(session);
46
46
  return pinnedResumption(currentState(snapshot), {
@@ -1,5 +1,6 @@
1
1
  import { recoveryBound } from "../../authority/commands.js";
2
2
  import { lineLogger } from "./authority-logger.js";
3
+ import { commandLimits } from "../../command-settings.js";
3
4
  export const authorityTiming = {
4
5
  leaseMilliseconds: 2_000,
5
6
  renewalMilliseconds: 500,
@@ -50,6 +51,9 @@ export function librarySettings(timing, log) {
50
51
  return {
51
52
  tableNamePrefix: "solid_",
52
53
  maxAttempts: 1,
54
+ maxActivationDurationMilliseconds: 50,
55
+ maxPayloadBytes: 900_000 + commandLimits.stdoutBytes * 12,
56
+ maxResultBytes: 900_000 + commandLimits.stdoutBytes * 12,
53
57
  logger: lineLogger(log ?? standardError),
54
58
  leaseDurationMilliseconds: timing.leaseMilliseconds,
55
59
  leaseRenewalIntervalMilliseconds: timing.renewalMilliseconds,
@@ -1,7 +1,8 @@
1
- import { loadDecided } from "../../storage/decision-snapshots.ts";
1
+ import { upgradeCommandWaits, upgradeCommandWaitChecks } from "../command-wait-restore.ts";
2
+ import { loadDecided, loadEffected, loadWaiting, loadCurrent } from "../../storage/decision-snapshots.ts";
2
3
  import { loadSnapshot } from "../../storage/domain-rows.ts";
3
4
  import { upgradeDecisions } from "../decision-upgrade.ts";
4
- import { upgradeEffects } from "../effect-upgrade.ts";
5
+ import { upgradeEffects, upgradeEventIndexes, upgradeSpendingIndexes } from "../effect-upgrade.ts";
5
6
  declare const upgrades: readonly [{
6
7
  readonly from: "adopted";
7
8
  readonly load: typeof loadSnapshot;
@@ -10,6 +11,22 @@ declare const upgrades: readonly [{
10
11
  readonly from: "decided";
11
12
  readonly load: typeof loadDecided;
12
13
  readonly apply: typeof upgradeEffects;
14
+ }, {
15
+ readonly from: "effected";
16
+ readonly load: typeof loadEffected;
17
+ readonly apply: typeof upgradeCommandWaits;
18
+ }, {
19
+ readonly from: "waiting";
20
+ readonly load: typeof loadWaiting;
21
+ readonly apply: typeof upgradeCommandWaitChecks;
22
+ }, {
23
+ readonly from: "checked";
24
+ readonly load: typeof loadCurrent;
25
+ readonly apply: typeof upgradeSpendingIndexes;
26
+ }, {
27
+ readonly from: "indexed";
28
+ readonly load: typeof loadCurrent;
29
+ readonly apply: typeof upgradeEventIndexes;
13
30
  }];
14
31
  export type UpgradeStep = (typeof upgrades)[number];
15
32
  export declare function upgradeSteps(kind: string): readonly UpgradeStep[];
@@ -1,10 +1,15 @@
1
- import { loadDecided } from "../../storage/decision-snapshots.js";
1
+ import { upgradeCommandWaits, upgradeCommandWaitChecks, } from "../command-wait-restore.js";
2
+ import { loadDecided, loadEffected, loadWaiting, loadCurrent, } from "../../storage/decision-snapshots.js";
2
3
  import { loadSnapshot } from "../../storage/domain-rows.js";
3
4
  import { upgradeDecisions } from "../decision-upgrade.js";
4
- import { upgradeEffects } from "../effect-upgrade.js";
5
+ import { upgradeEffects, upgradeEventIndexes, upgradeSpendingIndexes, } from "../effect-upgrade.js";
5
6
  const upgrades = [
6
7
  { from: "adopted", load: loadSnapshot, apply: upgradeDecisions },
7
8
  { from: "decided", load: loadDecided, apply: upgradeEffects },
9
+ { from: "effected", load: loadEffected, apply: upgradeCommandWaits },
10
+ { from: "waiting", load: loadWaiting, apply: upgradeCommandWaitChecks },
11
+ { from: "checked", load: loadCurrent, apply: upgradeSpendingIndexes },
12
+ { from: "indexed", load: loadCurrent, apply: upgradeEventIndexes },
8
13
  ];
9
14
  export function upgradeSteps(kind) {
10
15
  const first = upgrades.findIndex((step) => step.from === kind);
@@ -18,6 +18,7 @@ export interface DeliveryIntent extends EffectIntent, Partial<DeliveryDecision>,
18
18
  readonly workflow: string;
19
19
  readonly inputDigest: string;
20
20
  readonly purpose: Purpose;
21
+ readonly commandDeadline?: string;
21
22
  }
22
23
  export type ProtectedIntent = DeliveryIntent & EffectArguments;
23
24
  export type Undigested = Omit<DeliveryIntent, "inputDigest" | "purpose">;
@@ -54,7 +55,7 @@ export interface Delivery {
54
55
  readonly retry?: Delivery["reconcile"];
55
56
  readonly stop?: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
56
57
  }
57
- export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined;
58
+ export type AvailableManifest = (pinned: ExecutionManifest) => ExecutionManifest | undefined | Promise<ExecutionManifest | undefined>;
58
59
  export declare function intentDigest(intent: Undigested): string;
59
60
  export declare function deliveryIntent(intent: Undigested): DeliveryIntent;
60
61
  export declare function protectedIntent(state: AuthorityState, attempt: {
@@ -1,7 +1,8 @@
1
+ import { commandWaitDeadline } from "../command-wait-restore.js";
1
2
  import { createHash } from "node:crypto";
2
- import { continues, isSettled } from "../../authority/gates.js";
3
+ import { delivers, isSettled } from "../../authority/gates.js";
3
4
  import { eligibleIntents, } from "../../authority/reducer.js";
4
- import { gateContinuation } from "../../authority/reduction.js";
5
+ import { gateDelivery } from "../../authority/reduction.js";
5
6
  export function intentDigest(intent) {
6
7
  const base = [intent.kind, intent.runId, intent.operationId, intent.workflow];
7
8
  const bound = intent.gateId === undefined
@@ -26,6 +27,7 @@ export function protectedIntent(state, attempt) {
26
27
  .filter((lease) => lease.resourceKey === operation.leaseKey)
27
28
  .map((lease) => ({
28
29
  ...intent,
30
+ ...commandWaitDeadline(state.commandWaits ?? {}, operation.operationId),
29
31
  workflow,
30
32
  purpose,
31
33
  inputDigest: operation.inputDigest,
@@ -37,7 +39,7 @@ export function protectedIntent(state, attempt) {
37
39
  })));
38
40
  }
39
41
  export function gateDecision(gate) {
40
- if (gate === undefined || gate.kind === "untyped" || !continues(gate))
42
+ if (gate === undefined || gate.kind === "untyped" || !delivers(gate))
41
43
  return null;
42
44
  return {
43
45
  gateId: gate.gateId,
@@ -51,7 +53,7 @@ function workflowOf(state, runId) {
51
53
  function decisionOf(state, intent) {
52
54
  return gateDecision(Object.values(state.gates).find((gate) => gate.runId === intent.runId &&
53
55
  isSettled(gate) &&
54
- gateContinuation(gate).operationId === intent.operationId));
56
+ gateDelivery(gate).operationId === intent.operationId));
55
57
  }
56
58
  export function observingIntent(state, attempt) {
57
59
  const { intent, purpose } = attempt;
@@ -16,4 +16,4 @@ export interface Attempt {
16
16
  readonly effectId: string;
17
17
  }
18
18
  export declare function deliverEffect(parts: EffectDelivery, attempt: Attempt): Promise<JsonObject>;
19
- export declare function protectedArguments(value: JsonObject): EffectArguments;
19
+ export declare function protectedArguments(value: JsonObject): EffectArguments & Pick<ProtectedIntent, "commandDeadline">;
@@ -1,9 +1,11 @@
1
+ import { dispatchCommandWait, readCommandWaitDeadline, } from "../command-wait-restore.js";
1
2
  import { dispatchDecision, } from "../../authority/dispatch-decision.js";
2
3
  import { integer, optionalInteger, optionalText, text, } from "../../storage/domain-rows.js";
3
4
  import { budgetRow } from "../../storage/effect-rows.js";
4
5
  import { effectInputDigest, storedBudget } from "../effect-restore.js";
5
6
  import { settlement } from "./adapter-outcomes.js";
6
7
  import { pinned } from "./pin-check.js";
8
+ import { commandLimits } from "../../command-settings.js";
7
9
  const absent = {
8
10
  attempt: undefined,
9
11
  released: false,
@@ -15,11 +17,16 @@ const absent = {
15
17
  budget: undefined,
16
18
  };
17
19
  async function dispatchRead(connection, attempt) {
18
- const row = await connection.get("SELECT d.outcome, d.input_digest, a.lease_generation, o.released_sequence, r.status, r.workflow, p.status AS operation_status, p.capability, p.units, l.operation_id AS lease_owner, l.generation, l.expires_at, l.state AS lease_state, b.run_id, b.effect_limit, b.spent, b.capabilities, b.exhausted_sequence FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id JOIN dispatch_attempts a ON a.effect_id = d.effect_id JOIN operations p ON p.operation_id = d.operation_id JOIN leases l ON l.resource_key = p.lease_key JOIN run_budgets b ON b.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [attempt.effectId, attempt.intent.operationId]);
20
+ const row = await connection.get("SELECT d.outcome, d.input_digest, a.lease_generation, o.released_sequence, r.status, r.workflow, p.status AS operation_status, p.capability, p.units, p.method, p.target, p.payload, l.operation_id AS lease_owner, l.generation, l.expires_at, l.state AS lease_state, b.run_id, b.effect_limit, b.spent, b.capabilities, b.exhausted_sequence FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id JOIN dispatch_attempts a ON a.effect_id = d.effect_id JOIN operations p ON p.operation_id = d.operation_id JOIN leases l ON l.resource_key = p.lease_key JOIN run_budgets b ON b.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [attempt.effectId, attempt.intent.operationId]);
19
21
  if (row === undefined)
20
22
  return absent;
21
23
  const workflow = text(row, "workflow");
22
24
  return {
25
+ ...(await dispatchCommandWait(connection, {
26
+ runId: attempt.intent.runId,
27
+ workflow,
28
+ operationId: attempt.intent.operationId,
29
+ })),
23
30
  attempt: {
24
31
  outcome: optionalText(row, "outcome"),
25
32
  inputDigest: text(row, "input_digest"),
@@ -36,6 +43,9 @@ async function dispatchRead(connection, attempt) {
36
43
  status: text(row, "operation_status"),
37
44
  capability: text(row, "capability"),
38
45
  units: integer(row, "units"),
46
+ method: text(row, "method"),
47
+ target: text(row, "target"),
48
+ payload: text(row, "payload"),
39
49
  },
40
50
  budget: storedBudget(budgetRow(row)),
41
51
  lease: {
@@ -51,7 +61,10 @@ async function called(parts, call) {
51
61
  const adapterCall = parts.delivery[name]?.bind(parts.delivery);
52
62
  if (adapterCall === undefined)
53
63
  return { kind: "unknown", reason: "stop-not-supported" };
54
- return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall(intent, signal)), parts.effects.resultBytes);
64
+ const deadline = await parts.reader.connection((connection) => readCommandWaitDeadline(connection, intent));
65
+ return settlement(await parts.calls.call(intent.operationId, (signal) => adapterCall({ ...intent, ...deadline }, signal)), intent.capability === "command"
66
+ ? commandLimits.resultBytes
67
+ : parts.effects.resultBytes);
55
68
  }
56
69
  const confirmations = ["stopped", "completed", "failed"];
57
70
  async function stopRequested(parts, intent) {
@@ -123,5 +136,8 @@ export function protectedArguments(value) {
123
136
  method: text(value, "method"),
124
137
  target: text(value, "target"),
125
138
  payload: text(value, "payload"),
139
+ ...(typeof value["commandDeadline"] === "string"
140
+ ? { commandDeadline: value["commandDeadline"] }
141
+ : {}),
126
142
  };
127
143
  }
@@ -1,3 +1,5 @@
1
+ import { operationPhase } from "../../operation-identity.js";
2
+ import { endedCommandWaitCheck } from "../../authority/command-waits.js";
1
3
  import { isInstant } from "../../authority/instants.js";
2
4
  import { promotions } from "../../authority/leases.js";
3
5
  import { execute } from "../../authority/reducer.js";
@@ -45,7 +47,9 @@ function closure(state, operation) {
45
47
  return ["run-ended"];
46
48
  const exhausted = (state.effects.budgets[operation.runId]?.exhaustedSequence ?? null) !==
47
49
  null;
48
- return exhausted ? ["budget-exhausted"] : [];
50
+ return exhausted && operationPhase(operation.operationId) !== "command-wait"
51
+ ? ["budget-exhausted"]
52
+ : [];
49
53
  }
50
54
  function unblocked(state, followUp) {
51
55
  const steps = [];
@@ -95,6 +99,9 @@ const outcomes = {
95
99
  }),
96
100
  completed: (attempt) => stated({
97
101
  outcome: "completed",
102
+ ...(attempt.worker === "command"
103
+ ? { commandOutput: attempt.result }
104
+ : {}),
98
105
  result: attempt.result === null ? null : documentDigest(attempt.result),
99
106
  reason: attempt.reason,
100
107
  ...identified(attempt),
@@ -155,7 +162,9 @@ function acceptedNow(reconciling) {
155
162
  export function reconciliations(state, reconciling) {
156
163
  const accepted = acceptedNow(reconciling);
157
164
  const rejected = rejectedReports(reconciling.results);
158
- const due = (operation) => state.runs[operation.runId]?.status !== "cancelled" && live(operation);
165
+ const due = (operation) => state.runs[operation.runId]?.status !== "cancelled" &&
166
+ !endedCommandWaitCheck(state.commandWaits ?? {}, operation.operationId) &&
167
+ live(operation);
159
168
  const live = (operation) => (operation.status === "recovering" &&
160
169
  !accepted.has(operation.operationId)) ||
161
170
  (operation.status === "blocked" && rejected.has(operation.operationId));
@@ -8,6 +8,10 @@ export interface OperationView extends OperationRow {
8
8
  }
9
9
  export type StoredDisposition = Omit<Evidence, "sequence">;
10
10
  export interface EffectQueries {
11
+ readonly workerTurns: (window: {
12
+ readonly after: string;
13
+ readonly through: string;
14
+ }) => Promise<readonly OperationView[]>;
11
15
  readonly operation: (operationId: string) => Promise<OperationView | undefined>;
12
16
  readonly operations: (runId: string) => Promise<readonly OperationView[]>;
13
17
  readonly evidence: (runId: string) => Promise<readonly number[]>;
@@ -16,6 +20,7 @@ export interface EffectQueries {
16
20
  readonly dueLeases: (instant: string) => Promise<readonly DueLease[]>;
17
21
  readonly stops: (runId: string) => Promise<readonly string[]>;
18
22
  readonly closure: (runId: string) => Promise<RunClosure>;
23
+ readonly settledAt: (runId: string) => Promise<number | null>;
19
24
  }
20
25
  export interface DueLease {
21
26
  readonly runId: string;
@@ -3,6 +3,12 @@ import { integer, optionalInteger, optionalText, text, } from "../../storage/dom
3
3
  import { budgetColumns, budgetRow, evidenceColumns, evidenceRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
4
4
  import { storedBudget } from "../effect-restore.js";
5
5
  import { stopping } from "./stop-turn.js";
6
+ async function settledAt(connection, runId) {
7
+ const rows = await connection.all("SELECT recorded_at FROM events WHERE sequence IN (SELECT settled_sequence FROM operations WHERE run_id = ? UNION ALL SELECT min(e.sequence) FROM events e JOIN stopped_operations s ON s.run_id = e.run_id AND s.operation_id = json_extract(e.payload, '$.operationId') WHERE e.run_id = ? AND (EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = s.operation_id AND d.outcome = 'sent') OR (SELECT d.outcome FROM deliveries d WHERE d.operation_id = s.operation_id ORDER BY d.staged_sequence DESC, d.rowid DESC LIMIT 1) NOT IN ('withheld', 'blocked', 'absent')) AND ((e.type = 'run.observed' AND json_extract(e.payload, '$.condition') = 'stopped') OR (e.type = 'operation.reconciled' AND json_extract(e.payload, '$.outcome') = 'stopped')) GROUP BY s.operation_id)", [runId, runId]);
8
+ if (rows.length === 0)
9
+ return null;
10
+ return rows.reduce((latest, row) => Math.max(latest, Date.parse(text(row, "recorded_at"))), -Infinity);
11
+ }
6
12
  async function storedClosure(connection, scope) {
7
13
  const { subjects, cancelledSequence } = await stopping(connection, scope.runId);
8
14
  return runClosure(subjects, {
@@ -28,7 +34,9 @@ const viewColumns = operationColumns
28
34
  .map((name) => `o.${name}`)
29
35
  .join(", ");
30
36
  const waitCause = "CASE WHEN o.status != 'waiting' THEN NULL WHEN r.status != 'running' THEN 'run-not-running' WHEN EXISTS (SELECT 1 FROM leases h WHERE h.resource_key = o.lease_key AND h.state != 'released') THEN 'resource' ELSE 'ready' END";
31
- const viewed = `SELECT ${viewColumns}, l.generation AS lease_generation, ${waitCause} AS wait_cause FROM operations o JOIN runs r ON r.run_id = o.run_id LEFT JOIN leases l ON l.resource_key = o.lease_key AND l.operation_id = o.operation_id AND l.state != 'released'`;
37
+ const viewSelection = `SELECT ${viewColumns}, l.generation AS lease_generation, ${waitCause} AS wait_cause`;
38
+ const viewJoins = "JOIN runs r ON r.run_id = o.run_id LEFT JOIN leases l ON l.resource_key = o.lease_key AND l.operation_id = o.operation_id AND l.state != 'released'";
39
+ const viewed = `${viewSelection} FROM operations o ${viewJoins}`;
32
40
  function operationView(row) {
33
41
  return {
34
42
  ...operationRow(row),
@@ -46,6 +54,11 @@ async function operations(connection, runId) {
46
54
  const rows = await connection.all(`${viewed} WHERE o.run_id = ? ORDER BY o.requested_sequence`, [runId]);
47
55
  return rows.map(operationView);
48
56
  }
57
+ async function workerTurns(connection, window) {
58
+ const settled = await connection.all(`${viewSelection} FROM events e CROSS JOIN operations o ${viewJoins} WHERE o.settled_sequence = e.sequence AND o.capability = 'claude' AND julianday(e.recorded_at) > julianday(?) AND julianday(e.recorded_at) <= julianday(?)`, [window.after, window.through]);
59
+ const open = await connection.all(`${viewSelection} FROM operations o INDEXED BY operations_worker_open ${viewJoins} WHERE o.capability = 'claude' AND o.settled_sequence IS NULL AND o.status NOT IN ('refused', 'completed', 'failed', 'stopped', 'cancelled')`);
60
+ return [...settled, ...open].map(operationView);
61
+ }
49
62
  async function evidence(connection, runId) {
50
63
  const rows = await connection.all("SELECT e.sequence FROM effect_evidence e JOIN events v ON v.sequence = e.sequence WHERE e.run_id = ? AND (e.disposition IN ('rejected', 'denied', 'refused') OR (v.type = 'operation.reconciled' AND json_extract(v.payload, '$.outcome') = 'unknown')) ORDER BY e.sequence", [runId]);
51
64
  return rows.map((row) => integer(row, "sequence"));
@@ -68,8 +81,10 @@ async function budget(connection, runId) {
68
81
  }
69
82
  export function effectQueries(read, settings) {
70
83
  return {
84
+ workerTurns: (window) => read((connection) => workerTurns(connection, window)),
71
85
  stops: (runId) => read((connection) => stops(connection, runId)),
72
86
  closure: (runId) => read((connection) => storedClosure(connection, { runId, stopLimit: settings.stopLimit })),
87
+ settledAt: (runId) => read((connection) => settledAt(connection, runId)),
73
88
  budget: (runId) => read((connection) => budget(connection, runId)),
74
89
  dueLeases: (instant) => read((connection) => dueLeases(connection, instant)),
75
90
  operation: (operationId) => read((connection) => operation(connection, operationId)),