cloving 1.2.0 → 1.3.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 (518) hide show
  1. package/README.md +525 -185
  2. package/dist/src/agent-harness-shell.d.ts +12 -0
  3. package/dist/src/agent-harness-shell.js +90 -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/commands.d.ts +1 -0
  9. package/dist/src/authority/commands.js +24 -4
  10. package/dist/src/authority/gate-reduction.d.ts +1 -0
  11. package/dist/src/authority/gate-reduction.js +18 -3
  12. package/dist/src/authority/gates.d.ts +2 -1
  13. package/dist/src/authority/gates.js +5 -1
  14. package/dist/src/authority/operations.js +1 -1
  15. package/dist/src/authority/reduction.d.ts +1 -1
  16. package/dist/src/authority/reduction.js +6 -1
  17. package/dist/src/authority/status-input.d.ts +1 -1
  18. package/dist/src/authority/status.d.ts +1 -0
  19. package/dist/src/authority/status.js +27 -3
  20. package/dist/src/authority/transitions.d.ts +5 -5
  21. package/dist/src/authority/transitions.js +6 -0
  22. package/dist/src/broker/actor/authority-delivery.js +1 -0
  23. package/dist/src/broker/actor/authority-queries.d.ts +7 -1
  24. package/dist/src/broker/actor/authority-queries.js +17 -2
  25. package/dist/src/broker/actor/authority-receipts.js +11 -1
  26. package/dist/src/broker/actor/authority-session.js +2 -2
  27. package/dist/src/broker/actor/authority-settings.js +4 -0
  28. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  29. package/dist/src/broker/actor/delivery-intents.js +4 -4
  30. package/dist/src/broker/actor/effect-delivery.js +4 -1
  31. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  32. package/dist/src/broker/actor/effect-queries.js +7 -0
  33. package/dist/src/broker/actor/pin-check.js +1 -1
  34. package/dist/src/broker/actor/stop-plan.js +1 -1
  35. package/dist/src/broker/actor/turn-state.js +1 -1
  36. package/dist/src/broker/authority-admission.js +22 -9
  37. package/dist/src/broker/authority-restore.js +1 -0
  38. package/dist/src/broker/decision-restore.js +4 -4
  39. package/dist/src/broker/socket-address.d.ts +3 -1
  40. package/dist/src/broker/socket-address.js +2 -2
  41. package/dist/src/cli/arguments.d.ts +11 -13
  42. package/dist/src/cli/arguments.js +37 -107
  43. package/dist/src/cli/command-effects.d.ts +7 -0
  44. package/dist/src/cli/command-effects.js +39 -0
  45. package/dist/src/cli/commands.js +11 -4
  46. package/dist/src/cli/config-arguments.d.ts +11 -0
  47. package/dist/src/cli/config-arguments.js +59 -0
  48. package/dist/src/cli/config-command.d.ts +2 -0
  49. package/dist/src/cli/config-command.js +105 -0
  50. package/dist/src/cli/config-file.d.ts +3 -0
  51. package/dist/src/cli/config-file.js +50 -0
  52. package/dist/src/cli/config-lock.d.ts +7 -0
  53. package/dist/src/cli/config-lock.js +61 -0
  54. package/dist/src/cli/config-notice.d.ts +5 -0
  55. package/dist/src/cli/config-notice.js +46 -0
  56. package/dist/src/cli/doctor-github.d.ts +9 -0
  57. package/dist/src/cli/doctor-github.js +138 -0
  58. package/dist/src/cli/doctor-harness.d.ts +13 -0
  59. package/dist/src/cli/doctor-harness.js +242 -0
  60. package/dist/src/cli/doctor-local.d.ts +18 -0
  61. package/dist/src/cli/doctor-local.js +77 -0
  62. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  63. package/dist/src/cli/doctor-runtime.js +176 -0
  64. package/dist/src/cli/doctor-service.d.ts +1 -0
  65. package/dist/src/cli/doctor-service.js +11 -0
  66. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  67. package/dist/src/cli/doctor-workflows.js +45 -0
  68. package/dist/src/cli/doctor.d.ts +15 -0
  69. package/dist/src/cli/doctor.js +190 -0
  70. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  71. package/dist/src/cli/github-ci-progress.js +83 -0
  72. package/dist/src/cli/github-retry.d.ts +6 -0
  73. package/dist/src/cli/github-retry.js +47 -0
  74. package/dist/src/cli/harness-probes.d.ts +22 -0
  75. package/dist/src/cli/harness-probes.js +183 -0
  76. package/dist/src/cli/main.d.ts +7 -1
  77. package/dist/src/cli/main.js +39 -61
  78. package/dist/src/cli/phone-arguments.d.ts +14 -0
  79. package/dist/src/cli/phone-arguments.js +37 -0
  80. package/dist/src/cli/phone-client.d.ts +2 -0
  81. package/dist/src/cli/phone-client.js +32 -0
  82. package/dist/src/cli/phone-command.d.ts +13 -0
  83. package/dist/src/cli/phone-command.js +101 -0
  84. package/dist/src/cli/probe-command.d.ts +36 -0
  85. package/dist/src/cli/probe-command.js +59 -0
  86. package/dist/src/cli/project-settings.d.ts +4 -0
  87. package/dist/src/cli/project-settings.js +33 -0
  88. package/dist/src/cli/render.d.ts +2 -1
  89. package/dist/src/cli/render.js +44 -28
  90. package/dist/src/cli/report-github.d.ts +18 -0
  91. package/dist/src/cli/report-github.js +200 -0
  92. package/dist/src/cli/report.d.ts +17 -0
  93. package/dist/src/cli/report.js +192 -0
  94. package/dist/src/cli/repository-arguments.d.ts +5 -0
  95. package/dist/src/cli/repository-arguments.js +34 -0
  96. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  97. package/dist/src/cli/runtime-arguments.js +15 -0
  98. package/dist/src/cli/runtime-directory.d.ts +6 -2
  99. package/dist/src/cli/runtime-directory.js +72 -14
  100. package/dist/src/cli/toolchain.d.ts +2 -0
  101. package/dist/src/cli/toolchain.js +22 -2
  102. package/dist/src/cli/usage-render.d.ts +5 -0
  103. package/dist/src/cli/usage-render.js +40 -1
  104. package/dist/src/cli/usage.d.ts +3 -3
  105. package/dist/src/cli/usage.js +70 -44
  106. package/dist/src/cli/watch-actions.d.ts +2 -0
  107. package/dist/src/cli/watch-actions.js +4 -4
  108. package/dist/src/cli/watch-board-view.d.ts +1 -1
  109. package/dist/src/cli/watch-board-view.js +8 -2
  110. package/dist/src/cli/watch-board.js +23 -10
  111. package/dist/src/cli/watch-card-forms.js +2 -2
  112. package/dist/src/cli/watch-client.d.ts +1 -1
  113. package/dist/src/cli/watch-client.js +7 -2
  114. package/dist/src/cli/watch-header-view.d.ts +27 -0
  115. package/dist/src/cli/watch-header-view.js +116 -0
  116. package/dist/src/cli/watch-model.js +17 -4
  117. package/dist/src/cli/watch-page.js +48 -12
  118. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  119. package/dist/src/cli/watch-phone-client.js +84 -0
  120. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  121. package/dist/src/cli/watch-phone-view.js +113 -0
  122. package/dist/src/cli/watch-phone.d.ts +5 -0
  123. package/dist/src/cli/watch-phone.js +53 -0
  124. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  125. package/dist/src/cli/watch-pull-request.js +4 -0
  126. package/dist/src/cli/watch-render.d.ts +9 -1
  127. package/dist/src/cli/watch-server.js +23 -5
  128. package/dist/src/cli/watch-turn.d.ts +4 -1
  129. package/dist/src/cli/watch-turn.js +37 -1
  130. package/dist/src/cli/watch-usage.js +5 -1
  131. package/dist/src/cli/watch-view.d.ts +6 -20
  132. package/dist/src/cli/watch-view.js +14 -106
  133. package/dist/src/cli.js +106 -23
  134. package/dist/src/command-settings.d.ts +16 -0
  135. package/dist/src/command-settings.js +42 -0
  136. package/dist/src/configuration-change.d.ts +11 -0
  137. package/dist/src/configuration-change.js +62 -0
  138. package/dist/src/configuration-display.d.ts +21 -0
  139. package/dist/src/configuration-display.js +69 -0
  140. package/dist/src/configuration-schema.d.ts +49 -0
  141. package/dist/src/configuration-schema.js +159 -0
  142. package/dist/src/daemon/claude-turn.d.ts +19 -5
  143. package/dist/src/daemon/claude-turn.js +116 -53
  144. package/dist/src/daemon/claude-worker.d.ts +3 -3
  145. package/dist/src/daemon/claude-worker.js +65 -76
  146. package/dist/src/daemon/command-journal.d.ts +5 -0
  147. package/dist/src/daemon/command-journal.js +50 -0
  148. package/dist/src/daemon/command-process.d.ts +28 -0
  149. package/dist/src/daemon/command-process.js +164 -0
  150. package/dist/src/daemon/command-worker.d.ts +19 -0
  151. package/dist/src/daemon/command-worker.js +182 -0
  152. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  153. package/dist/src/daemon/cursor-stream.js +154 -0
  154. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  155. package/dist/src/daemon/daemon-adapters.js +102 -0
  156. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  157. package/dist/src/daemon/daemon-loops.js +39 -0
  158. package/dist/src/daemon/daemon.d.ts +2 -33
  159. package/dist/src/daemon/daemon.js +126 -132
  160. package/dist/src/daemon/declared-input.d.ts +3 -0
  161. package/dist/src/daemon/declared-input.js +9 -0
  162. package/dist/src/daemon/delivery-router.js +1 -1
  163. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  164. package/dist/src/daemon/gemini-stream.js +129 -0
  165. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  166. package/dist/src/daemon/github-ci-rerun.js +92 -0
  167. package/dist/src/daemon/github-ci.js +89 -8
  168. package/dist/src/daemon/github-merge-call.d.ts +2 -0
  169. package/dist/src/daemon/github-merge.js +7 -3
  170. package/dist/src/daemon/github-methods.js +10 -0
  171. package/dist/src/daemon/github-operation.d.ts +1 -0
  172. package/dist/src/daemon/github-retry.js +8 -44
  173. package/dist/src/daemon/issue-queue.d.ts +1 -0
  174. package/dist/src/daemon/issue-queue.js +3 -26
  175. package/dist/src/daemon/notify.js +2 -1
  176. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  177. package/dist/src/daemon/opencode-stream.js +87 -0
  178. package/dist/src/daemon/queue-status.d.ts +4 -0
  179. package/dist/src/daemon/queue-status.js +38 -0
  180. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  181. package/dist/src/daemon/retry-worktree.js +139 -0
  182. package/dist/src/daemon/retrying-turn.d.ts +2 -0
  183. package/dist/src/daemon/retrying-turn.js +108 -30
  184. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  185. package/dist/src/daemon/schedule-journal.js +57 -0
  186. package/dist/src/daemon/text-output.d.ts +18 -0
  187. package/dist/src/daemon/text-output.js +44 -0
  188. package/dist/src/daemon/ticket-registration.d.ts +5 -7
  189. package/dist/src/daemon/ticket-registration.js +85 -40
  190. package/dist/src/daemon/turn-command.d.ts +10 -0
  191. package/dist/src/daemon/turn-command.js +33 -0
  192. package/dist/src/daemon/turn-report.d.ts +18 -0
  193. package/dist/src/daemon/turn-report.js +79 -0
  194. package/dist/src/daemon/work-tree.d.ts +2 -1
  195. package/dist/src/daemon/work-tree.js +15 -12
  196. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  197. package/dist/src/daemon/workflow-generations.js +57 -0
  198. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  199. package/dist/src/daemon/workflow-replay.js +58 -0
  200. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  201. package/dist/src/daemon/workflow-schedules.js +185 -0
  202. package/dist/src/decision-wait.d.ts +1 -0
  203. package/dist/src/decision-wait.js +3 -0
  204. package/dist/src/delivery-backoff.d.ts +1 -0
  205. package/dist/src/delivery-backoff.js +3 -0
  206. package/dist/src/doctor-report.d.ts +24 -0
  207. package/dist/src/doctor-report.js +70 -0
  208. package/dist/src/execution-pin.d.ts +5 -0
  209. package/dist/src/execution-pin.js +67 -4
  210. package/dist/src/grok-result.d.ts +12 -0
  211. package/dist/src/grok-result.js +61 -0
  212. package/dist/src/harness-defaults.d.ts +35 -0
  213. package/dist/src/harness-defaults.js +121 -0
  214. package/dist/src/host/decision-resume.d.ts +35 -0
  215. package/dist/src/host/decision-resume.js +86 -0
  216. package/dist/src/host/gate-bridge.d.ts +48 -0
  217. package/dist/src/host/gate-bridge.js +124 -0
  218. package/dist/src/host/run-wait.d.ts +26 -0
  219. package/dist/src/host/run-wait.js +37 -0
  220. package/dist/src/host/start-delivery.d.ts +1 -1
  221. package/dist/src/host/start-delivery.js +10 -3
  222. package/dist/src/host/step-bridge-host.d.ts +6 -20
  223. package/dist/src/host/step-bridge-host.js +44 -58
  224. package/dist/src/merge-request.d.ts +19 -0
  225. package/dist/src/merge-request.js +32 -0
  226. package/dist/src/phone/canonical-json.d.ts +1 -0
  227. package/dist/src/phone/canonical-json.js +16 -0
  228. package/dist/src/phone/phone-link.d.ts +7 -0
  229. package/dist/src/phone/phone-link.js +21 -0
  230. package/dist/src/phone/qr-data.d.ts +8 -0
  231. package/dist/src/phone/qr-data.js +133 -0
  232. package/dist/src/phone/qr-matrix.d.ts +6 -0
  233. package/dist/src/phone/qr-matrix.js +175 -0
  234. package/dist/src/phone/qr-penalty.d.ts +3 -0
  235. package/dist/src/phone/qr-penalty.js +67 -0
  236. package/dist/src/phone/qr-picture.d.ts +5 -0
  237. package/dist/src/phone/qr-picture.js +24 -0
  238. package/dist/src/private-config.schema.json +263 -0
  239. package/dist/src/project-config.schema.json +65 -0
  240. package/dist/src/project-settings.d.ts +19 -0
  241. package/dist/src/project-settings.js +131 -0
  242. package/dist/src/relay/answer-check.d.ts +24 -0
  243. package/dist/src/relay/answer-check.js +145 -0
  244. package/dist/src/relay/answer-inbox.d.ts +15 -0
  245. package/dist/src/relay/answer-inbox.js +173 -0
  246. package/dist/src/relay/daemon-keys.d.ts +16 -0
  247. package/dist/src/relay/daemon-keys.js +75 -0
  248. package/dist/src/relay/decision-check.d.ts +3 -0
  249. package/dist/src/relay/decision-check.js +77 -0
  250. package/dist/src/relay/decision-close.d.ts +6 -0
  251. package/dist/src/relay/decision-close.js +72 -0
  252. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  253. package/dist/src/relay/decision-envelopes.js +93 -0
  254. package/dist/src/relay/decision-watch.d.ts +14 -0
  255. package/dist/src/relay/decision-watch.js +68 -0
  256. package/dist/src/relay/envelope-post.d.ts +8 -0
  257. package/dist/src/relay/envelope-post.js +71 -0
  258. package/dist/src/relay/envelope.d.ts +28 -0
  259. package/dist/src/relay/envelope.js +53 -0
  260. package/dist/src/relay/hpke.d.ts +25 -0
  261. package/dist/src/relay/hpke.js +108 -0
  262. package/dist/src/relay/pairing-checks.d.ts +42 -0
  263. package/dist/src/relay/pairing-checks.js +172 -0
  264. package/dist/src/relay/pairing-follow.d.ts +8 -0
  265. package/dist/src/relay/pairing-follow.js +95 -0
  266. package/dist/src/relay/pairing-session.d.ts +29 -0
  267. package/dist/src/relay/pairing-session.js +87 -0
  268. package/dist/src/relay/phone-delivery.d.ts +51 -0
  269. package/dist/src/relay/phone-delivery.js +139 -0
  270. package/dist/src/relay/phone-devices.d.ts +36 -0
  271. package/dist/src/relay/phone-devices.js +46 -0
  272. package/dist/src/relay/phone-inbox.d.ts +18 -0
  273. package/dist/src/relay/phone-inbox.js +17 -0
  274. package/dist/src/relay/phone-operations.d.ts +18 -0
  275. package/dist/src/relay/phone-operations.js +121 -0
  276. package/dist/src/relay/phone-outbox.d.ts +21 -0
  277. package/dist/src/relay/phone-outbox.js +25 -0
  278. package/dist/src/relay/phone-socket.d.ts +6 -0
  279. package/dist/src/relay/phone-socket.js +63 -0
  280. package/dist/src/relay/relay-control.d.ts +7 -0
  281. package/dist/src/relay/relay-control.js +24 -0
  282. package/dist/src/relay/relay-files.d.ts +2 -0
  283. package/dist/src/relay/relay-files.js +23 -0
  284. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  285. package/dist/src/relay/relay-heartbeat.js +81 -0
  286. package/dist/src/relay/relay-http.d.ts +14 -0
  287. package/dist/src/relay/relay-http.js +63 -0
  288. package/dist/src/relay/relay-registration.d.ts +15 -0
  289. package/dist/src/relay/relay-registration.js +63 -0
  290. package/dist/src/relay/relay-service.d.ts +25 -0
  291. package/dist/src/relay/relay-service.js +216 -0
  292. package/dist/src/relay/relay-store.d.ts +48 -0
  293. package/dist/src/relay/relay-store.js +131 -0
  294. package/dist/src/relay/sealed-post.d.ts +25 -0
  295. package/dist/src/relay/sealed-post.js +52 -0
  296. package/dist/src/relay.d.ts +1 -0
  297. package/dist/src/relay.js +8 -0
  298. package/dist/src/report-statistics.d.ts +50 -0
  299. package/dist/src/report-statistics.js +70 -0
  300. package/dist/src/report.d.ts +171 -0
  301. package/dist/src/report.js +119 -0
  302. package/dist/src/repository-identity.d.ts +4 -0
  303. package/dist/src/repository-identity.js +4 -0
  304. package/dist/src/review-subject.d.ts +41 -0
  305. package/dist/src/review-subject.js +91 -0
  306. package/dist/src/run-wait.d.ts +23 -0
  307. package/dist/src/run-wait.js +20 -0
  308. package/dist/src/service/active-tickets.d.ts +4 -0
  309. package/dist/src/service/active-tickets.js +49 -0
  310. package/dist/src/service/command-effects.d.ts +4 -0
  311. package/dist/src/service/command-effects.js +16 -0
  312. package/dist/src/service/decision-handler.d.ts +4 -0
  313. package/dist/src/service/decision-handler.js +39 -4
  314. package/dist/src/service/gateway.js +18 -3
  315. package/dist/src/service/registry.d.ts +16 -3
  316. package/dist/src/service/registry.js +34 -3
  317. package/dist/src/service/replies.d.ts +9 -1
  318. package/dist/src/service/replies.js +12 -0
  319. package/dist/src/service/run-handlers.js +14 -55
  320. package/dist/src/service/run-metadata.d.ts +8 -0
  321. package/dist/src/service/run-metadata.js +53 -0
  322. package/dist/src/service/run-waits.d.ts +3 -0
  323. package/dist/src/service/run-waits.js +41 -0
  324. package/dist/src/service/service.d.ts +18 -2
  325. package/dist/src/service/service.js +23 -7
  326. package/dist/src/service/submission-handler.d.ts +0 -1
  327. package/dist/src/service/submission-handler.js +6 -34
  328. package/dist/src/service/worker-port.d.ts +1 -0
  329. package/dist/src/service/worker-totals.js +8 -23
  330. package/dist/src/step-bridge.d.ts +23 -0
  331. package/dist/src/steps/decision-gate.d.ts +2 -1
  332. package/dist/src/steps/decision-gate.js +7 -0
  333. package/dist/src/steps/merge-by-person.d.ts +2 -0
  334. package/dist/src/steps/merge-by-person.js +18 -0
  335. package/dist/src/steps/merge-when-green.d.ts +2 -0
  336. package/dist/src/steps/merge-when-green.js +62 -0
  337. package/dist/src/steps/review-by-agent.d.ts +5 -0
  338. package/dist/src/steps/review-by-agent.js +124 -0
  339. package/dist/src/steps/review-by-person.d.ts +4 -0
  340. package/dist/src/steps/review-by-person.js +16 -0
  341. package/dist/src/steps/review-subject.d.ts +2 -0
  342. package/dist/src/steps/review-subject.js +11 -0
  343. package/dist/src/steps/run-command.d.ts +2 -0
  344. package/dist/src/steps/run-command.js +15 -0
  345. package/dist/src/steps/sleep.d.ts +3 -0
  346. package/dist/src/steps/sleep.js +19 -0
  347. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  348. package/dist/src/steps/wait-for-decision.js +71 -0
  349. package/dist/src/steps/wait-for-run.d.ts +5 -0
  350. package/dist/src/steps/wait-for-run.js +9 -0
  351. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  352. package/dist/src/storage/decision-snapshots.js +7 -1
  353. package/dist/src/submission.d.ts +4 -0
  354. package/dist/src/submission.js +6 -2
  355. package/dist/src/testing.d.ts +29 -0
  356. package/dist/src/testing.js +264 -0
  357. package/dist/src/ticket-status-stream.d.ts +9 -0
  358. package/dist/src/ticket-status-stream.js +94 -0
  359. package/dist/src/token-prices.d.ts +12 -4
  360. package/dist/src/token-prices.js +15 -2
  361. package/dist/src/turn-profile.d.ts +1 -0
  362. package/dist/src/turn-profile.js +8 -1
  363. package/dist/src/worker-usage.d.ts +16 -0
  364. package/dist/src/worker-usage.js +57 -0
  365. package/dist/src/workflow-admission.d.ts +5 -0
  366. package/dist/src/workflow-candidate.d.ts +7 -2
  367. package/dist/src/workflow-candidate.js +47 -5
  368. package/dist/src/workflow-declaration.d.ts +21 -3
  369. package/dist/src/workflow-declaration.js +77 -9
  370. package/dist/src/workflow-discovery.d.ts +2 -1
  371. package/dist/src/workflow-discovery.js +4 -1
  372. package/dist/src/workflow-refusals.js +3 -0
  373. package/dist/src/workflow-schedule.d.ts +22 -0
  374. package/dist/src/workflow-schedule.js +53 -0
  375. package/dist/src/workflows.d.ts +11 -1
  376. package/dist/src/workflows.js +8 -0
  377. package/dist/tools/admit-workflow.d.ts +1 -0
  378. package/dist/tools/admit-workflow.js +18 -5
  379. package/dist/tools/doctor-adoption.d.ts +1 -0
  380. package/dist/tools/doctor-adoption.js +11 -0
  381. package/dist/tools/project-configuration.d.ts +4 -0
  382. package/dist/tools/project-configuration.js +47 -0
  383. package/dist/tools/self-host-processes.d.ts +1 -0
  384. package/dist/tools/self-host-processes.js +33 -22
  385. package/dist/tools/self-host-project.d.ts +4 -0
  386. package/dist/tools/self-host-project.js +61 -14
  387. package/dist/tools/self-host-runtime.d.ts +16 -0
  388. package/dist/tools/self-host-runtime.js +60 -0
  389. package/dist/tools/self-host-workflows.d.ts +1 -0
  390. package/dist/tools/self-host-workflows.js +36 -1
  391. package/dist/tools/self-host.js +86 -61
  392. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  393. package/dist/tools/workflow-candidate-counts.js +31 -16
  394. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  395. package/dist/tools/workflow-candidate-fields.js +24 -0
  396. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  397. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  398. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  399. package/dist/tools/workflow-candidate-program.js +36 -8
  400. package/dist/tools/workflow-candidate-source.js +77 -15
  401. package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
  402. package/dist/tools/workflow-candidate-syntax.js +70 -26
  403. package/dist/tools/workflow-command.d.ts +1 -0
  404. package/dist/tools/workflow-command.js +143 -0
  405. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  406. package/dist/tools/workflow-folder-capture.js +47 -2
  407. package/dist/tools/workflow-folders.d.ts +17 -1
  408. package/dist/tools/workflow-folders.js +59 -6
  409. package/dist/tools/workflow-test-hook.d.ts +7 -0
  410. package/dist/tools/workflow-test-hook.js +16 -0
  411. package/dist/tools/workflow-test-loader.d.ts +1 -0
  412. package/dist/tools/workflow-test-loader.js +10 -0
  413. package/dist/workflows/develop-ticket.js +1 -1
  414. package/dist/workflows/ticket-prompts.js +5 -1
  415. package/package.json +46 -4
  416. package/templates/develop/README.md +78 -0
  417. package/templates/develop/develop/accept.ts +11 -0
  418. package/templates/develop/develop/flow-tests.ts +357 -0
  419. package/templates/develop/develop/local.ts +40 -0
  420. package/templates/develop/develop/option-tests.ts +174 -0
  421. package/templates/develop/develop/partial-choice.ts +29 -0
  422. package/templates/develop/develop/partial.ts +28 -0
  423. package/templates/develop/develop/pull.ts +152 -0
  424. package/templates/develop/develop/queue-partial.ts +39 -0
  425. package/templates/develop/develop/refusal-tests.ts +174 -0
  426. package/templates/develop/develop/report.ts +156 -0
  427. package/templates/develop/develop/round.ts +40 -0
  428. package/templates/develop/develop/scenarios.ts +87 -0
  429. package/templates/develop/develop/turn.ts +67 -0
  430. package/templates/develop/develop.declaration.json +24 -0
  431. package/templates/develop/develop.test.ts +287 -0
  432. package/templates/develop/develop.ts +30 -0
  433. package/templates/develop/template.json +153 -0
  434. package/dist/src/chats/analysis-batches.d.ts +0 -42
  435. package/dist/src/chats/analysis-batches.js +0 -97
  436. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  437. package/dist/src/chats/analysis-checkpoint.js +0 -31
  438. package/dist/src/chats/analysis-contract.d.ts +0 -80
  439. package/dist/src/chats/analysis-contract.js +0 -16
  440. package/dist/src/chats/analysis-data.d.ts +0 -3
  441. package/dist/src/chats/analysis-data.js +0 -85
  442. package/dist/src/chats/analysis-input.d.ts +0 -18
  443. package/dist/src/chats/analysis-input.js +0 -97
  444. package/dist/src/chats/analysis-links.d.ts +0 -2
  445. package/dist/src/chats/analysis-links.js +0 -25
  446. package/dist/src/chats/analysis-merge.d.ts +0 -16
  447. package/dist/src/chats/analysis-merge.js +0 -134
  448. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  449. package/dist/src/chats/analysis-prompt.js +0 -42
  450. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  451. package/dist/src/chats/analysis-proposal.js +0 -41
  452. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  453. package/dist/src/chats/analysis-provenance.js +0 -99
  454. package/dist/src/chats/analysis-shape.d.ts +0 -4
  455. package/dist/src/chats/analysis-shape.js +0 -235
  456. package/dist/src/chats/analysis.d.ts +0 -3
  457. package/dist/src/chats/analysis.js +0 -42
  458. package/dist/src/chats/corpus-input.d.ts +0 -5
  459. package/dist/src/chats/corpus-input.js +0 -288
  460. package/dist/src/chats/destination.d.ts +0 -4
  461. package/dist/src/chats/destination.js +0 -96
  462. package/dist/src/chats/import.d.ts +0 -15
  463. package/dist/src/chats/import.js +0 -243
  464. package/dist/src/chats/input-file.d.ts +0 -3
  465. package/dist/src/chats/input-file.js +0 -32
  466. package/dist/src/chats/normalize.d.ts +0 -29
  467. package/dist/src/chats/normalize.js +0 -155
  468. package/dist/src/chats/previous-import.d.ts +0 -5
  469. package/dist/src/chats/previous-import.js +0 -34
  470. package/dist/src/chats/reader.d.ts +0 -21
  471. package/dist/src/chats/reader.js +0 -118
  472. package/dist/src/chats/redact-import.d.ts +0 -14
  473. package/dist/src/chats/redact-import.js +0 -141
  474. package/dist/src/chats/redaction.d.ts +0 -41
  475. package/dist/src/chats/redaction.js +0 -161
  476. package/dist/src/chats/reference-mapping.d.ts +0 -16
  477. package/dist/src/chats/reference-mapping.js +0 -153
  478. package/dist/src/chats/revision-input.d.ts +0 -3
  479. package/dist/src/chats/revision-input.js +0 -180
  480. package/dist/src/chats/revision.d.ts +0 -48
  481. package/dist/src/chats/revision.js +0 -94
  482. package/dist/src/chats/selection.d.ts +0 -25
  483. package/dist/src/chats/selection.js +0 -109
  484. package/dist/src/chats/source.d.ts +0 -23
  485. package/dist/src/chats/source.js +0 -135
  486. package/dist/src/chats/structure.d.ts +0 -57
  487. package/dist/src/chats/structure.js +0 -216
  488. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  489. package/dist/src/chats/workflow-generation-projection.js +0 -75
  490. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  491. package/dist/src/chats/workflow-generation-source.js +0 -124
  492. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  493. package/dist/src/chats/workflow-generation-text.js +0 -74
  494. package/dist/src/chats/workflow-generation.d.ts +0 -69
  495. package/dist/src/chats/workflow-generation.js +0 -142
  496. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  497. package/dist/src/daemon/analysis-launch.js +0 -81
  498. package/dist/src/daemon/analysis-token.d.ts +0 -6
  499. package/dist/src/daemon/analysis-token.js +0 -88
  500. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  501. package/dist/src/daemon/analysis-worker.js +0 -271
  502. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  503. package/dist/src/daemon/chats-batch-binding.js +0 -99
  504. package/dist/src/daemon/chats-capture.d.ts +0 -18
  505. package/dist/src/daemon/chats-capture.js +0 -194
  506. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  507. package/dist/src/daemon/chats-checkpoints.js +0 -186
  508. package/dist/src/daemon/chats-files.d.ts +0 -42
  509. package/dist/src/daemon/chats-files.js +0 -252
  510. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  511. package/dist/src/daemon/chats-follow-up.js +0 -180
  512. package/dist/src/daemon/chats-question.d.ts +0 -15
  513. package/dist/src/daemon/chats-question.js +0 -93
  514. package/dist/src/daemon/chats-worker.d.ts +0 -13
  515. package/dist/src/daemon/chats-worker.js +0 -201
  516. package/dist/workflows/analyze-chats.d.ts +0 -15
  517. package/dist/workflows/analyze-chats.declaration.json +0 -22
  518. package/dist/workflows/analyze-chats.js +0 -250
@@ -0,0 +1,12 @@
1
+ export declare const shellTurnScript = "\nset +m\nbuiltin unset GH_TOKEN GITHUB_TOKEN GH_ENTERPRISE_TOKEN GITHUB_ENTERPRISE_TOKEN || exit\nbuiltin export GH_CONFIG_DIR=\"$1\" || exit\nshift\nif [ -n \"${ZSH_VERSION-}\" ] && (( ${+aliases[$1]} )); then\n alias_command=\"${aliases[$1]}\"\n builtin unalias -- \"$1\"\n shift\n eval -- \"$alias_command\"' \"$@\"'\nelif [ -n \"${BASH_VERSION-}\" ] && alias_value=$(builtin alias -- \"$1\" 2>/dev/null); then\n eval -- \"alias_command=${alias_value#*=}\"\n builtin unalias -- \"$1\"\n shift\n eval -- \"$alias_command\"' \"$@\"'\nelse\n \"$@\"\nfi\n";
2
+ export declare const shellDiscoveryScript = "\nset +m\nif [ -z \"${ZSH_VERSION-}\" ] && [ -z \"${BASH_VERSION-}\" ]; then exit 64; fi\nprintf '__CLOVING_HARNESS_START_-1__\\n%s\\n\\n__CLOVING_HARNESS_END_-1__\\n' \"${BASH_VERSION:+bash}\"\nindex=0\nfor name in \"$@\"; do\n printf '__CLOVING_HARNESS_START_%s__\\n' \"$index\"\n if [ -n \"${ZSH_VERSION-}\" ]; then\n kind=$(whence -w -- \"$name\" 2>/dev/null) || kind=\n printf '%s\\n' \"${kind##*: }\"\n file=$(whence -p -- \"$name\" 2>/dev/null) || file=\n else\n kind=$(builtin type -t -- \"$name\" 2>/dev/null) || kind=\n printf '%s\\n' \"$kind\"\n file=$(builtin type -P -- \"$name\" 2>/dev/null) || file=\n fi\n case \"$file\" in /*|\"\") ;; *) file=\"$PWD/$file\" ;; esac\n printf '%s\\n' \"$file\"\n printf '\\n__CLOVING_HARNESS_END_%s__\\n' \"$index\"\n index=$((index + 1))\ndone\nexit 0\n";
3
+ export declare const shellProbeScript = "\nset +m\nprintf '__CLOVING_HARNESS_START_0__\\n'\nif [ \"$2\" = file ]; then\n command -- \"$1\" --version\nelif [ -n \"${ZSH_VERSION-}\" ] && (( ${+aliases[$1]} )); then\n alias_command=\"${aliases[$1]}\"\n builtin unalias -- \"$1\"\n eval -- \"$alias_command\"' --version'\nelif [ -n \"${BASH_VERSION-}\" ] && alias_value=$(builtin alias -- \"$1\" 2>/dev/null); then\n eval -- \"alias_command=${alias_value#*=}\"\n builtin unalias -- \"$1\"\n eval -- \"$alias_command\"' --version'\nelif [ -n \"${ZSH_VERSION-}\" ] || [ -n \"${BASH_VERSION-}\" ]; then\n \"$1\" --version\nelse\n exit 64\nfi\nprobe_status=$?\nprintf '\\n__CLOVING_HARNESS_END_0__\\n'\nexit \"$probe_status\"\n";
4
+ export declare function shellBlock(output: string, index: number): string | null;
5
+ export interface ShellEntry {
6
+ readonly name: string;
7
+ readonly kind: "file" | "shell";
8
+ readonly path: string;
9
+ }
10
+ export declare function shellEntries(output: string, names: readonly string[]): ShellEntry[] | null;
11
+ export type ShellMode = "login" | "interactive";
12
+ export declare function shellArguments(mode: ShellMode): string[];
@@ -0,0 +1,90 @@
1
+ export const shellTurnScript = `
2
+ set +m
3
+ builtin unset GH_TOKEN GITHUB_TOKEN GH_ENTERPRISE_TOKEN GITHUB_ENTERPRISE_TOKEN || exit
4
+ builtin export GH_CONFIG_DIR="$1" || exit
5
+ shift
6
+ if [ -n "\${ZSH_VERSION-}" ] && (( \${+aliases[$1]} )); then
7
+ alias_command="\${aliases[$1]}"
8
+ builtin unalias -- "$1"
9
+ shift
10
+ eval -- "$alias_command"' "$@"'
11
+ elif [ -n "\${BASH_VERSION-}" ] && alias_value=$(builtin alias -- "$1" 2>/dev/null); then
12
+ eval -- "alias_command=\${alias_value#*=}"
13
+ builtin unalias -- "$1"
14
+ shift
15
+ eval -- "$alias_command"' "$@"'
16
+ else
17
+ "$@"
18
+ fi
19
+ `;
20
+ export const shellDiscoveryScript = `
21
+ set +m
22
+ if [ -z "\${ZSH_VERSION-}" ] && [ -z "\${BASH_VERSION-}" ]; then exit 64; fi
23
+ printf '__CLOVING_HARNESS_START_-1__\\n%s\\n\\n__CLOVING_HARNESS_END_-1__\\n' "\${BASH_VERSION:+bash}"
24
+ index=0
25
+ for name in "$@"; do
26
+ printf '__CLOVING_HARNESS_START_%s__\\n' "$index"
27
+ if [ -n "\${ZSH_VERSION-}" ]; then
28
+ kind=$(whence -w -- "$name" 2>/dev/null) || kind=
29
+ printf '%s\\n' "\${kind##*: }"
30
+ file=$(whence -p -- "$name" 2>/dev/null) || file=
31
+ else
32
+ kind=$(builtin type -t -- "$name" 2>/dev/null) || kind=
33
+ printf '%s\\n' "$kind"
34
+ file=$(builtin type -P -- "$name" 2>/dev/null) || file=
35
+ fi
36
+ case "$file" in /*|"") ;; *) file="$PWD/$file" ;; esac
37
+ printf '%s\\n' "$file"
38
+ printf '\\n__CLOVING_HARNESS_END_%s__\\n' "$index"
39
+ index=$((index + 1))
40
+ done
41
+ exit 0
42
+ `;
43
+ export const shellProbeScript = `
44
+ set +m
45
+ printf '__CLOVING_HARNESS_START_0__\\n'
46
+ if [ "$2" = file ]; then
47
+ command -- "$1" --version
48
+ elif [ -n "\${ZSH_VERSION-}" ] && (( \${+aliases[$1]} )); then
49
+ alias_command="\${aliases[$1]}"
50
+ builtin unalias -- "$1"
51
+ eval -- "$alias_command"' --version'
52
+ elif [ -n "\${BASH_VERSION-}" ] && alias_value=$(builtin alias -- "$1" 2>/dev/null); then
53
+ eval -- "alias_command=\${alias_value#*=}"
54
+ builtin unalias -- "$1"
55
+ eval -- "$alias_command"' --version'
56
+ elif [ -n "\${ZSH_VERSION-}" ] || [ -n "\${BASH_VERSION-}" ]; then
57
+ "$1" --version
58
+ else
59
+ exit 64
60
+ fi
61
+ probe_status=$?
62
+ printf '\\n__CLOVING_HARNESS_END_0__\\n'
63
+ exit "$probe_status"
64
+ `;
65
+ export function shellBlock(output, index) {
66
+ const start = `__CLOVING_HARNESS_START_${String(index)}__\n`;
67
+ const end = `\n__CLOVING_HARNESS_END_${String(index)}__\n`;
68
+ const began = output.indexOf(start);
69
+ if (began < 0)
70
+ return null;
71
+ const finished = output.indexOf(end, began + start.length);
72
+ return finished < 0 ? null : output.slice(began + start.length, finished);
73
+ }
74
+ export function shellEntries(output, names) {
75
+ const blocks = names.map((_, index) => shellBlock(output, index));
76
+ if (blocks.some((block) => block === null))
77
+ return null;
78
+ return names.flatMap((name, index) => {
79
+ const [kind, path] = (blocks[index] ?? "").split("\n");
80
+ const entries = [];
81
+ if (path)
82
+ entries.push({ name, kind: "file", path });
83
+ if (kind === "function" || kind === "alias")
84
+ entries.push({ name, kind: "shell", path: name });
85
+ return entries;
86
+ });
87
+ }
88
+ export function shellArguments(mode) {
89
+ return [...(mode === "login" ? ["-l"] : []), "-i", "+m", "-c"];
90
+ }
@@ -0,0 +1,8 @@
1
+ export interface KnownHarness {
2
+ readonly name: string;
3
+ readonly versionOption: string;
4
+ readonly versionPattern: string;
5
+ }
6
+ export declare const knownHarnesses: readonly KnownHarness[];
7
+ export declare function harnessDefinition(name: string): KnownHarness;
8
+ export declare function harnessVersion(output: string, pattern: string): string | null;
@@ -0,0 +1,49 @@
1
+ const semanticVersion = String.raw `\d+\.\d+\.\d+(?:[-+][\w.+-]+)?`;
2
+ const fallbackVersion = String.raw `\d+\.\d+`;
3
+ export const knownHarnesses = [
4
+ {
5
+ name: "claude",
6
+ versionOption: "--version",
7
+ versionPattern: `^${semanticVersion} \\(Claude Code\\)$`,
8
+ },
9
+ {
10
+ name: "codex",
11
+ versionOption: "--version",
12
+ versionPattern: `^codex-cli ${semanticVersion}$`,
13
+ },
14
+ {
15
+ name: "gemini",
16
+ versionOption: "--version",
17
+ versionPattern: `^${semanticVersion}$`,
18
+ },
19
+ {
20
+ name: "opencode",
21
+ versionOption: "--version",
22
+ versionPattern: `^(?:opencode v)?${semanticVersion}$`,
23
+ },
24
+ {
25
+ name: "grok",
26
+ versionOption: "--version",
27
+ versionPattern: `^${semanticVersion}$`,
28
+ },
29
+ {
30
+ name: "cursor-agent",
31
+ versionOption: "--version",
32
+ versionPattern: String.raw `^\d{4}\.\d{2}\.\d{2}-[\w.-]+$`,
33
+ },
34
+ { name: "pi", versionOption: "--version", versionPattern: fallbackVersion },
35
+ { name: "amp", versionOption: "--version", versionPattern: fallbackVersion },
36
+ ];
37
+ export function harnessDefinition(name) {
38
+ return (knownHarnesses.find((entry) => entry.name === name) ?? {
39
+ name,
40
+ versionOption: "--version",
41
+ versionPattern: fallbackVersion,
42
+ });
43
+ }
44
+ export function harnessVersion(output, pattern) {
45
+ const line = output.split(/\r?\n/, 1)[0] ?? "";
46
+ if (/\b(?:error|unavailable|not found)\b/i.test(line))
47
+ return null;
48
+ return new RegExp(pattern).test(line) ? line : null;
49
+ }
@@ -0,0 +1,4 @@
1
+ import { type HarnessOptions } from "./cli/harness-probes.ts";
2
+ export type { HarnessEntry, HarnessDiscovery, HarnessOptions, } from "./cli/harness-probes.ts";
3
+ export declare function discoverHarnesses(options?: HarnessOptions): Promise<import("./cli/harness-probes.ts").HarnessDiscovery>;
4
+ export declare function probeHarness(target: string, options?: HarnessOptions): Promise<import("./cli/harness-probes.ts").HarnessDiscovery>;
@@ -0,0 +1,13 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createProbeRunner } from "./cli/probe-command.js";
3
+ import { discoverHarnesses as discover, probeHarness as probe, } from "./cli/harness-probes.js";
4
+ const runner = createProbeRunner({
5
+ spawn: (input) => spawn(input.executable, input.arguments, input.options),
6
+ kill: (identifier, signal) => process.kill(identifier, signal),
7
+ });
8
+ export function discoverHarnesses(options = {}) {
9
+ return discover({ ...options, probe: runner });
10
+ }
11
+ export function probeHarness(target, options = {}) {
12
+ return probe(target, { ...options, probe: runner });
13
+ }
@@ -3,6 +3,7 @@ export declare const commandEvents: Readonly<Record<string, EventType>>;
3
3
  export declare function parseCommand(value: unknown): AuthorityCommand | null;
4
4
  export declare const recoveryBound = 10;
5
5
  export declare function isCapabilityList(value: unknown): value is string;
6
+ export declare function isDeviceActor(value: unknown): value is string;
6
7
  export declare function isIdentifier(value: unknown): value is string;
7
8
  export declare function isRecordKey(value: unknown): value is string;
8
9
  export declare function isCommandId(value: unknown): value is string;
@@ -25,9 +25,14 @@ export const commandEvents = {
25
25
  "expire-lease": "lease.expired",
26
26
  "report-effect": "effect.reported",
27
27
  "record-outcome": "operation.reconciled",
28
+ "record-schedule-skip": "schedule.skipped",
28
29
  };
29
30
  const revised = { required: ["expectedRevision"] };
30
31
  const shapes = {
32
+ "record-schedule-skip": {
33
+ required: ["workflowId", "slot"],
34
+ validators: { slot: positive },
35
+ },
31
36
  "admit-run": {
32
37
  required: ["workflow"],
33
38
  optional: [
@@ -48,14 +53,16 @@ const shapes = {
48
53
  "mark-started": revised,
49
54
  "open-gate": {
50
55
  required: ["gateId", "expectedRevision"],
51
- optional: ["gateKind", "subject", "prompt", "expiresAt"],
56
+ optional: ["gateKind", "subject", "prompt", "expiresAt", "waitMode"],
57
+ validators: { waitMode: (value) => value === "hook" },
52
58
  groups: [["gateKind", "subject", "prompt"]],
53
- consistent: (fields) => fields["expiresAt"] === undefined || fields["gateKind"] !== undefined,
59
+ consistent: (fields) => (fields["expiresAt"] === undefined && fields["waitMode"] === undefined) ||
60
+ fields["gateKind"] !== undefined,
54
61
  },
55
62
  "register-wait": { required: ["gateId"] },
56
63
  "decide-gate": {
57
64
  required: ["gateId", "decision", "expectedRevision"],
58
- optional: ["generation", "subject", "answer"],
65
+ optional: ["generation", "subject", "answer", "actor"],
59
66
  groups: [["generation", "subject"]],
60
67
  consistent: (fields) => {
61
68
  const typed = fields["generation"] !== undefined;
@@ -97,7 +104,14 @@ const shapes = {
97
104
  "cancel-run": revised,
98
105
  "report-observation": {
99
106
  required: ["condition", "reason"],
100
- optional: ["evidence", "retryAt", "attempt", "limit", "operationId"],
107
+ optional: [
108
+ "evidence",
109
+ "retryAt",
110
+ "attempt",
111
+ "limit",
112
+ "operationId",
113
+ "expectedObservation",
114
+ ],
101
115
  groups: [["attempt", "limit"]],
102
116
  },
103
117
  "record-dispatch": { required: ["operationId", "receipt"] },
@@ -150,6 +164,7 @@ const reportedOutcomes = ["completed", "failed", "stopped"];
150
164
  const outcomes = [...reportedOutcomes, "accepted", "not-started", "unknown"];
151
165
  const conditions = [
152
166
  "working",
167
+ "waiting-run",
153
168
  "quota-wait",
154
169
  "infrastructure-failure",
155
170
  "code-failure",
@@ -250,6 +265,7 @@ export function isCapabilityList(value) {
250
265
  }
251
266
  const validators = {
252
267
  expectedRevision: positive,
268
+ expectedObservation: whole,
253
269
  generation: positive,
254
270
  attempt: positive,
255
271
  limit: positive,
@@ -274,7 +290,11 @@ const validators = {
274
290
  condition: (value) => typeof value === "string" && conditions.includes(value),
275
291
  expiresAt: isInstant,
276
292
  retryAt: isInstant,
293
+ actor: isDeviceActor,
277
294
  };
295
+ export function isDeviceActor(value) {
296
+ return (typeof value === "string" && /^device:[A-Za-z0-9_-]{1,64}$/.test(value));
297
+ }
278
298
  export function isIdentifier(value) {
279
299
  return typeof value === "string" && identifier.test(value);
280
300
  }
@@ -2,6 +2,7 @@ import { type SettledGate } from "./gates.ts";
2
2
  import { type Recorded, type Reduction } from "./reduction-state.ts";
3
3
  import { type AuthorityState, type EffectIntent } from "./transitions.ts";
4
4
  export declare function gateContinuation(gate: SettledGate): EffectIntent;
5
+ export declare function gateDelivery(gate: SettledGate): EffectIntent;
5
6
  export declare function opened(state: AuthorityState, recorded: Recorded): Reduction;
6
7
  export declare function decided(state: AuthorityState, recorded: Recorded): Reduction;
7
8
  export declare function expired(state: AuthorityState, recorded: Recorded): Reduction;
@@ -1,4 +1,4 @@
1
- import { continues, decisionRefusal, expiryRefusal, gateKey, openedGate, reusable, settled, } from "./gates.js";
1
+ import { delivers, decisionRefusal, expiryRefusal, gateKey, openedGate, reusable, settled, } from "./gates.js";
2
2
  import { applied, identity, invalid, text, } from "./reduction-state.js";
3
3
  import { terminal, transition, } from "./transitions.js";
4
4
  export function gateContinuation(gate) {
@@ -14,8 +14,23 @@ export function gateContinuation(gate) {
14
14
  }),
15
15
  };
16
16
  }
17
+ export function gateDelivery(gate) {
18
+ if (gate.wait !== "hook")
19
+ return gateContinuation(gate);
20
+ return {
21
+ kind: "resume-hook",
22
+ runId: gate.runId,
23
+ operationId: identity({
24
+ run: gate.runId,
25
+ phase: "gate",
26
+ round: gate.outcome.sequence,
27
+ operation: "resume-hook",
28
+ key: gate.gateId,
29
+ }),
30
+ };
31
+ }
17
32
  function continuations(gate) {
18
- return continues(gate) ? [gateContinuation(gate)] : [];
33
+ return delivers(gate) ? [gateDelivery(gate)] : [];
19
34
  }
20
35
  export function opened(state, recorded) {
21
36
  const { event, run } = recorded;
@@ -98,7 +113,7 @@ export function registered(state, recorded) {
98
113
  const gate = gateOf(state, event);
99
114
  if (gate === undefined)
100
115
  return invalid("unknown-gate");
101
- if (gate.wait === "registered")
116
+ if (gate.wait !== "pending")
102
117
  return invalid("wait-already-registered");
103
118
  const next = { ...gate, wait: "registered" };
104
119
  return applied(state, {
@@ -14,7 +14,7 @@ export interface GateState {
14
14
  readonly expiresAt: string | null;
15
15
  readonly generation: number;
16
16
  readonly revision: number;
17
- readonly wait: "registered" | "pending";
17
+ readonly wait: "registered" | "pending" | "hook";
18
18
  readonly outcome: GateOutcome | null;
19
19
  readonly openedSequence: number;
20
20
  }
@@ -45,4 +45,5 @@ export type ContinuingGate = GateState & {
45
45
  };
46
46
  };
47
47
  export declare function continues(gate: GateState): gate is ContinuingGate;
48
+ export declare function delivers(gate: GateState): gate is ContinuingGate;
48
49
  export {};
@@ -22,6 +22,7 @@ export function gateKey(runId, gateId) {
22
22
  export function openedGate(opening) {
23
23
  const { payload } = opening;
24
24
  const kind = kinds[payload["gateKind"] ?? ""] ?? "untyped";
25
+ const wait = kind === "untyped" ? "registered" : "pending";
25
26
  return {
26
27
  runId: opening.runId,
27
28
  gateId: payload["gateId"] ?? "",
@@ -32,7 +33,7 @@ export function openedGate(opening) {
32
33
  expiresAt: payload["expiresAt"] ?? null,
33
34
  generation: opening.generation,
34
35
  revision: 1,
35
- wait: kind === "untyped" ? "registered" : "pending",
36
+ wait: payload["waitMode"] === "hook" ? "hook" : wait,
36
37
  outcome: null,
37
38
  openedSequence: opening.sequence,
38
39
  };
@@ -75,3 +76,6 @@ export function continues(gate) {
75
76
  isSettled(gate) &&
76
77
  gate.outcome.decision !== null);
77
78
  }
79
+ export function delivers(gate) {
80
+ return (gate.wait !== "pending" && isSettled(gate) && gate.outcome.decision !== null);
81
+ }
@@ -24,7 +24,7 @@ const finalStatuses = [
24
24
  "stopped",
25
25
  "cancelled",
26
26
  ];
27
- export const runOperations = ["start-run", "continue-run"];
27
+ export const runOperations = ["start-run", "continue-run", "resume-hook"];
28
28
  export function namesRunIntent(operationId, runId) {
29
29
  const scope = operationScope(operationId);
30
30
  return scope?.run === runId && runOperations.includes(scope.operation);
@@ -1,6 +1,6 @@
1
1
  import { type Reduction } from "./reduction-state.ts";
2
2
  import { type AuthorityEvent, type AuthorityState } from "./transitions.ts";
3
- export { gateContinuation } from "./gate-reduction.ts";
3
+ export { gateContinuation, gateDelivery } from "./gate-reduction.ts";
4
4
  export type { Reduction } from "./reduction-state.ts";
5
5
  export declare function startOperation(runId: string): string;
6
6
  export declare function reduce(state: AuthorityState, event: AuthorityEvent): Reduction;
@@ -7,7 +7,7 @@ import { decided, expired, opened, registered } from "./gate-reduction.js";
7
7
  import { expired as leaseExpired, granted } from "./leases.js";
8
8
  import { applied, identity, invalid, text, } from "./reduction-state.js";
9
9
  import { transition, } from "./transitions.js";
10
- export { gateContinuation } from "./gate-reduction.js";
10
+ export { gateContinuation, gateDelivery } from "./gate-reduction.js";
11
11
  function moved(type) {
12
12
  return (state, recorded) => {
13
13
  const result = transition(recorded.run, {
@@ -36,6 +36,10 @@ function closed(type) {
36
36
  };
37
37
  }
38
38
  function observation(state, recorded) {
39
+ const expected = recorded.event.payload["expectedObservation"];
40
+ if (expected !== undefined &&
41
+ expected !== String(recorded.details.observation?.sequence ?? 0))
42
+ return invalid("stale-observation");
39
43
  return applied(state, {
40
44
  ...recorded,
41
45
  observed: observed(recorded.details, recorded.event),
@@ -75,6 +79,7 @@ function effect(rule) {
75
79
  };
76
80
  }
77
81
  const handlers = {
82
+ "schedule.skipped": applied,
78
83
  "effect.requested": effect(requested),
79
84
  "lease.granted": effect(granted),
80
85
  "lease.expired": effect(leaseExpired),
@@ -4,7 +4,7 @@ import type { RunClosure } from "./stop-sequence.ts";
4
4
  import type { RunState } from "./transitions.ts";
5
5
  export interface OperationSummary {
6
6
  readonly operationId: string;
7
- readonly kind: "start-run" | "continue-run" | "protected-effect";
7
+ readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
8
8
  readonly releasedSequence: number | null;
9
9
  readonly outcomes: readonly (string | null)[];
10
10
  }
@@ -9,6 +9,7 @@ export interface RunView {
9
9
  readonly workflow: string;
10
10
  readonly state: RunStatus;
11
11
  readonly condition: string;
12
+ readonly awaitedRunId: string | null;
12
13
  readonly revision: number;
13
14
  readonly latestSequence: number;
14
15
  readonly pendingDecisions: readonly string[];
@@ -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
@@ -254,3 +273,8 @@ export function runView(input) {
254
273
  humanInputCanHelp: assessment.humanInputCanHelp,
255
274
  };
256
275
  }
276
+ function awaitedRun(assessment, observation) {
277
+ return assessment.condition === "waiting-run"
278
+ ? (observation?.evidence ?? null)
279
+ : null;
280
+ }
@@ -11,7 +11,7 @@ export interface RunState {
11
11
  readonly gates: readonly string[];
12
12
  }
13
13
  export interface EffectIntent {
14
- readonly kind: "start-run" | "continue-run" | "protected-effect";
14
+ readonly kind: "start-run" | "continue-run" | "resume-hook" | "protected-effect";
15
15
  readonly runId: string;
16
16
  readonly operationId: string;
17
17
  }
@@ -28,7 +28,7 @@ export interface AuthorityState {
28
28
  readonly questions: number;
29
29
  readonly effects: EffectState;
30
30
  }
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"];
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", "schedule.skipped"];
32
32
  export type EventType = (typeof eventTypes)[number];
33
33
  export interface AuthorityEvent {
34
34
  readonly sequence: number;
@@ -39,8 +39,8 @@ export interface AuthorityEvent {
39
39
  readonly request: string;
40
40
  readonly payload: Readonly<Record<string, string>>;
41
41
  }
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"];
42
+ export declare const numberFields: readonly ["expectedRevision", "expectedObservation", "generation", "attempt", "limit", "effectLimit", "units", "recoveryLimit", "leaseGeneration", "sourceGeneration", "capacity", "slot"];
43
+ 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"];
44
44
  export type NumberField = (typeof numberFields)[number];
45
45
  export type TextField = (typeof textFields)[number];
46
46
  export type AuthorityCommand = {
@@ -48,7 +48,7 @@ export type AuthorityCommand = {
48
48
  readonly commandId: string;
49
49
  readonly runId: string;
50
50
  } & 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">;
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" | "schedule.skipped">;
52
52
  export declare const terminal: readonly RunStatus[];
53
53
  export type Transition = {
54
54
  readonly kind: "moved";
@@ -17,9 +17,11 @@ export const eventTypes = [
17
17
  "lease.expired",
18
18
  "effect.reported",
19
19
  "operation.reconciled",
20
+ "schedule.skipped",
20
21
  ];
21
22
  export const numberFields = [
22
23
  "expectedRevision",
24
+ "expectedObservation",
23
25
  "generation",
24
26
  "attempt",
25
27
  "limit",
@@ -29,16 +31,19 @@ export const numberFields = [
29
31
  "leaseGeneration",
30
32
  "sourceGeneration",
31
33
  "capacity",
34
+ "slot",
32
35
  ];
33
36
  export const textFields = [
34
37
  "parentRunId",
35
38
  "chainId",
36
39
  "workflow",
40
+ "workflowId",
37
41
  "submission",
38
42
  "input",
39
43
  "resolver",
40
44
  "gateId",
41
45
  "gateKind",
46
+ "waitMode",
42
47
  "subject",
43
48
  "prompt",
44
49
  "expiresAt",
@@ -66,6 +71,7 @@ export const textFields = [
66
71
  "ticketStatus",
67
72
  "issueUpdate",
68
73
  "result",
74
+ "actor",
69
75
  ];
70
76
  export const terminal = [
71
77
  "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,7 +32,12 @@ export interface CompletionCursor {
31
32
  readonly atOrBefore: number;
32
33
  readonly terminal?: boolean;
33
34
  }
35
+ export interface RunRecord extends RunState {
36
+ readonly sequence: number;
37
+ }
34
38
  export interface AuthorityQueries {
39
+ readonly run: (runId: string) => Promise<RunRecord | undefined>;
40
+ readonly manifest: (runId: string) => Promise<ExecutionManifest | undefined>;
35
41
  readonly document: (digest: string) => Promise<string | undefined>;
36
42
  readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
37
43
  readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
@@ -1,9 +1,17 @@
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 run_id, status, revision, workflow, paused_from, gates, sequence FROM runs WHERE run_id = ?", [runId]);
10
+ if (row === undefined)
11
+ return undefined;
12
+ const record = runRow(row);
13
+ return { ...storedRun(record), sequence: record.sequence };
14
+ }
7
15
  async function runOrigins(connection, cursor) {
8
16
  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
17
  return Object.fromEntries(rows.map((row) => [
@@ -122,6 +130,13 @@ export function authorityQueries(read) {
122
130
  return links;
123
131
  };
124
132
  return {
133
+ run: (runId) => read((connection) => run(connection, runId)),
134
+ manifest: (runId) => read(async (connection) => {
135
+ const row = await connection.get("SELECT d.manifest FROM runs r JOIN definitions d ON d.pin = r.workflow WHERE r.run_id = ?", [runId]);
136
+ return row === undefined
137
+ ? undefined
138
+ : readExecutionManifest(JSON.parse(text(row, "manifest")));
139
+ }),
125
140
  document: (digest) => read((connection) => documentBody(connection, digest)),
126
141
  receipt: (commandId) => read((connection) => receipt(connection, commandId)),
127
142
  eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),