cloving 1.1.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 (568) hide show
  1. package/README.md +584 -144
  2. package/assets/watch-fonts/fira-code-OFL.md +93 -0
  3. package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
  4. package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
  5. package/assets/watch-fonts/heebo-OFL.md +93 -0
  6. package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
  7. package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
  8. package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
  9. package/assets/watch-fonts/manifest.json +112 -0
  10. package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
  11. package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
  12. package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
  13. package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
  14. package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
  15. package/dist/src/agent-harness-shell.d.ts +12 -0
  16. package/dist/src/agent-harness-shell.js +90 -0
  17. package/dist/src/agent-harness-versions.d.ts +8 -0
  18. package/dist/src/agent-harness-versions.js +49 -0
  19. package/dist/src/agent-harnesses.d.ts +4 -0
  20. package/dist/src/agent-harnesses.js +13 -0
  21. package/dist/src/authority/commands.d.ts +2 -0
  22. package/dist/src/authority/commands.js +49 -8
  23. package/dist/src/authority/dispatch-decision.d.ts +1 -0
  24. package/dist/src/authority/dispatch-decision.js +7 -4
  25. package/dist/src/authority/events.js +2 -2
  26. package/dist/src/authority/gate-reduction.d.ts +1 -0
  27. package/dist/src/authority/gate-reduction.js +18 -3
  28. package/dist/src/authority/gates.d.ts +2 -1
  29. package/dist/src/authority/gates.js +5 -1
  30. package/dist/src/authority/handoff-chain.d.ts +24 -0
  31. package/dist/src/authority/handoff-chain.js +46 -0
  32. package/dist/src/authority/operations.js +1 -1
  33. package/dist/src/authority/reconciliation.d.ts +1 -0
  34. package/dist/src/authority/reconciliation.js +18 -11
  35. package/dist/src/authority/reduction.d.ts +1 -1
  36. package/dist/src/authority/reduction.js +6 -1
  37. package/dist/src/authority/status-input.d.ts +1 -1
  38. package/dist/src/authority/status.d.ts +1 -0
  39. package/dist/src/authority/status.js +27 -3
  40. package/dist/src/authority/transitions.d.ts +5 -5
  41. package/dist/src/authority/transitions.js +9 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +11 -1
  44. package/dist/src/broker/actor/authority-queries.js +67 -3
  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/delivery-intents.d.ts +3 -1
  49. package/dist/src/broker/actor/delivery-intents.js +4 -4
  50. package/dist/src/broker/actor/effect-delivery.js +13 -1
  51. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  52. package/dist/src/broker/actor/effect-queries.js +7 -0
  53. package/dist/src/broker/actor/pin-check.js +1 -1
  54. package/dist/src/broker/actor/stop-plan.js +1 -1
  55. package/dist/src/broker/actor/turn-state.js +1 -1
  56. package/dist/src/broker/authority-admission.js +26 -5
  57. package/dist/src/broker/authority-restore.js +1 -0
  58. package/dist/src/broker/decision-restore.js +4 -4
  59. package/dist/src/broker/socket-address.d.ts +3 -1
  60. package/dist/src/broker/socket-address.js +2 -2
  61. package/dist/src/cli/arguments.d.ts +11 -13
  62. package/dist/src/cli/arguments.js +37 -107
  63. package/dist/src/cli/command-effects.d.ts +7 -0
  64. package/dist/src/cli/command-effects.js +39 -0
  65. package/dist/src/cli/commands.js +11 -4
  66. package/dist/src/cli/config-arguments.d.ts +11 -0
  67. package/dist/src/cli/config-arguments.js +59 -0
  68. package/dist/src/cli/config-command.d.ts +2 -0
  69. package/dist/src/cli/config-command.js +105 -0
  70. package/dist/src/cli/config-file.d.ts +3 -0
  71. package/dist/src/cli/config-file.js +50 -0
  72. package/dist/src/cli/config-lock.d.ts +7 -0
  73. package/dist/src/cli/config-lock.js +61 -0
  74. package/dist/src/cli/config-notice.d.ts +5 -0
  75. package/dist/src/cli/config-notice.js +46 -0
  76. package/dist/src/cli/doctor-github.d.ts +9 -0
  77. package/dist/src/cli/doctor-github.js +138 -0
  78. package/dist/src/cli/doctor-harness.d.ts +13 -0
  79. package/dist/src/cli/doctor-harness.js +242 -0
  80. package/dist/src/cli/doctor-local.d.ts +18 -0
  81. package/dist/src/cli/doctor-local.js +77 -0
  82. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  83. package/dist/src/cli/doctor-runtime.js +176 -0
  84. package/dist/src/cli/doctor-service.d.ts +1 -0
  85. package/dist/src/cli/doctor-service.js +11 -0
  86. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  87. package/dist/src/cli/doctor-workflows.js +45 -0
  88. package/dist/src/cli/doctor.d.ts +15 -0
  89. package/dist/src/cli/doctor.js +190 -0
  90. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  91. package/dist/src/cli/github-ci-progress.js +83 -0
  92. package/dist/src/cli/github-retry.d.ts +6 -0
  93. package/dist/src/cli/github-retry.js +47 -0
  94. package/dist/src/cli/harness-probes.d.ts +22 -0
  95. package/dist/src/cli/harness-probes.js +183 -0
  96. package/dist/src/cli/main.d.ts +7 -1
  97. package/dist/src/cli/main.js +39 -61
  98. package/dist/src/cli/phone-arguments.d.ts +14 -0
  99. package/dist/src/cli/phone-arguments.js +37 -0
  100. package/dist/src/cli/phone-client.d.ts +2 -0
  101. package/dist/src/cli/phone-client.js +32 -0
  102. package/dist/src/cli/phone-command.d.ts +13 -0
  103. package/dist/src/cli/phone-command.js +101 -0
  104. package/dist/src/cli/probe-command.d.ts +36 -0
  105. package/dist/src/cli/probe-command.js +59 -0
  106. package/dist/src/cli/project-settings.d.ts +4 -0
  107. package/dist/src/cli/project-settings.js +33 -0
  108. package/dist/src/cli/render.d.ts +3 -1
  109. package/dist/src/cli/render.js +102 -39
  110. package/dist/src/cli/report-github.d.ts +18 -0
  111. package/dist/src/cli/report-github.js +200 -0
  112. package/dist/src/cli/report.d.ts +17 -0
  113. package/dist/src/cli/report.js +192 -0
  114. package/dist/src/cli/repository-arguments.d.ts +5 -0
  115. package/dist/src/cli/repository-arguments.js +34 -0
  116. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  117. package/dist/src/cli/runtime-arguments.js +15 -0
  118. package/dist/src/cli/runtime-directory.d.ts +6 -2
  119. package/dist/src/cli/runtime-directory.js +72 -14
  120. package/dist/src/cli/toolchain.d.ts +2 -0
  121. package/dist/src/cli/toolchain.js +22 -2
  122. package/dist/src/cli/usage-render.d.ts +5 -0
  123. package/dist/src/cli/usage-render.js +40 -1
  124. package/dist/src/cli/usage.d.ts +3 -3
  125. package/dist/src/cli/usage.js +74 -45
  126. package/dist/src/cli/watch-actions.d.ts +2 -0
  127. package/dist/src/cli/watch-actions.js +4 -4
  128. package/dist/src/cli/watch-board-view.d.ts +12 -1
  129. package/dist/src/cli/watch-board-view.js +64 -12
  130. package/dist/src/cli/watch-board.d.ts +7 -1
  131. package/dist/src/cli/watch-board.js +61 -16
  132. package/dist/src/cli/watch-card-forms.js +2 -2
  133. package/dist/src/cli/watch-client.d.ts +1 -1
  134. package/dist/src/cli/watch-client.js +12 -3
  135. package/dist/src/cli/watch-header-view.d.ts +27 -0
  136. package/dist/src/cli/watch-header-view.js +116 -0
  137. package/dist/src/cli/watch-model.d.ts +10 -4
  138. package/dist/src/cli/watch-model.js +49 -59
  139. package/dist/src/cli/watch-page.js +67 -14
  140. package/dist/src/cli/watch-phases.js +3 -3
  141. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  142. package/dist/src/cli/watch-phone-client.js +84 -0
  143. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  144. package/dist/src/cli/watch-phone-view.js +113 -0
  145. package/dist/src/cli/watch-phone.d.ts +5 -0
  146. package/dist/src/cli/watch-phone.js +53 -0
  147. package/dist/src/cli/watch-pr-command.d.ts +5 -2
  148. package/dist/src/cli/watch-pr-command.js +41 -4
  149. package/dist/src/cli/watch-pr-identity.d.ts +14 -2
  150. package/dist/src/cli/watch-pr-identity.js +25 -0
  151. package/dist/src/cli/watch-pr-observer.d.ts +1 -0
  152. package/dist/src/cli/watch-pr-observer.js +48 -6
  153. package/dist/src/cli/watch-pull-request.d.ts +12 -0
  154. package/dist/src/cli/watch-pull-request.js +134 -0
  155. package/dist/src/cli/watch-reads.d.ts +7 -1
  156. package/dist/src/cli/watch-reads.js +42 -20
  157. package/dist/src/cli/watch-render.d.ts +23 -2
  158. package/dist/src/cli/watch-render.js +2 -1
  159. package/dist/src/cli/watch-server.js +56 -7
  160. package/dist/src/cli/watch-turn.d.ts +4 -1
  161. package/dist/src/cli/watch-turn.js +38 -2
  162. package/dist/src/cli/watch-usage.js +5 -1
  163. package/dist/src/cli/watch-view.d.ts +10 -17
  164. package/dist/src/cli/watch-view.js +33 -77
  165. package/dist/src/cli.js +106 -23
  166. package/dist/src/command-settings.d.ts +16 -0
  167. package/dist/src/command-settings.js +42 -0
  168. package/dist/src/configuration-change.d.ts +11 -0
  169. package/dist/src/configuration-change.js +62 -0
  170. package/dist/src/configuration-display.d.ts +21 -0
  171. package/dist/src/configuration-display.js +69 -0
  172. package/dist/src/configuration-schema.d.ts +49 -0
  173. package/dist/src/configuration-schema.js +159 -0
  174. package/dist/src/daemon/claude-turn.d.ts +20 -5
  175. package/dist/src/daemon/claude-turn.js +116 -53
  176. package/dist/src/daemon/claude-worker.d.ts +3 -5
  177. package/dist/src/daemon/claude-worker.js +64 -80
  178. package/dist/src/daemon/command-journal.d.ts +5 -0
  179. package/dist/src/daemon/command-journal.js +50 -0
  180. package/dist/src/daemon/command-process.d.ts +28 -0
  181. package/dist/src/daemon/command-process.js +164 -0
  182. package/dist/src/daemon/command-worker.d.ts +19 -0
  183. package/dist/src/daemon/command-worker.js +182 -0
  184. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  185. package/dist/src/daemon/cursor-stream.js +154 -0
  186. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  187. package/dist/src/daemon/daemon-adapters.js +102 -0
  188. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  189. package/dist/src/daemon/daemon-loops.js +39 -0
  190. package/dist/src/daemon/daemon.d.ts +3 -30
  191. package/dist/src/daemon/daemon.js +132 -110
  192. package/dist/src/daemon/declared-input.d.ts +3 -0
  193. package/dist/src/daemon/declared-input.js +9 -0
  194. package/dist/src/daemon/delivery-router.js +7 -1
  195. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  196. package/dist/src/daemon/gemini-stream.js +129 -0
  197. package/dist/src/daemon/github-calls.d.ts +4 -0
  198. package/dist/src/daemon/github-calls.js +16 -7
  199. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  200. package/dist/src/daemon/github-ci-rerun.js +92 -0
  201. package/dist/src/daemon/github-ci.d.ts +6 -0
  202. package/dist/src/daemon/github-ci.js +251 -0
  203. package/dist/src/daemon/github-merge-call.d.ts +16 -0
  204. package/dist/src/daemon/github-merge-call.js +73 -0
  205. package/dist/src/daemon/github-merge.d.ts +3 -5
  206. package/dist/src/daemon/github-merge.js +59 -98
  207. package/dist/src/daemon/github-methods.d.ts +28 -0
  208. package/dist/src/daemon/github-methods.js +90 -16
  209. package/dist/src/daemon/github-operation.d.ts +3 -0
  210. package/dist/src/daemon/github-retry.d.ts +6 -0
  211. package/dist/src/daemon/github-retry.js +13 -0
  212. package/dist/src/daemon/github-ticket-status.js +27 -1
  213. package/dist/src/daemon/github-worker.js +2 -1
  214. package/dist/src/daemon/handoff-worker.d.ts +10 -0
  215. package/dist/src/daemon/handoff-worker.js +232 -0
  216. package/dist/src/daemon/issue-queue.d.ts +2 -0
  217. package/dist/src/daemon/issue-queue.js +92 -63
  218. package/dist/src/daemon/notify-journal.d.ts +18 -0
  219. package/dist/src/daemon/notify-journal.js +108 -0
  220. package/dist/src/daemon/notify-message.js +2 -1
  221. package/dist/src/daemon/notify.js +177 -37
  222. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  223. package/dist/src/daemon/opencode-stream.js +87 -0
  224. package/dist/src/daemon/queue-status.d.ts +4 -0
  225. package/dist/src/daemon/queue-status.js +38 -0
  226. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  227. package/dist/src/daemon/retry-worktree.js +139 -0
  228. package/dist/src/daemon/retrying-turn.d.ts +5 -0
  229. package/dist/src/daemon/retrying-turn.js +145 -21
  230. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  231. package/dist/src/daemon/schedule-journal.js +57 -0
  232. package/dist/src/daemon/text-output.d.ts +18 -0
  233. package/dist/src/daemon/text-output.js +44 -0
  234. package/dist/src/daemon/ticket-dependency-waits.d.ts +18 -0
  235. package/dist/src/daemon/ticket-dependency-waits.js +60 -0
  236. package/dist/src/daemon/ticket-registration.d.ts +10 -8
  237. package/dist/src/daemon/ticket-registration.js +146 -47
  238. package/dist/src/daemon/ticket-source.d.ts +4 -1
  239. package/dist/src/daemon/ticket-source.js +8 -2
  240. package/dist/src/daemon/turn-command.d.ts +10 -0
  241. package/dist/src/daemon/turn-command.js +33 -0
  242. package/dist/src/daemon/turn-report.d.ts +18 -0
  243. package/dist/src/daemon/turn-report.js +79 -0
  244. package/dist/src/daemon/work-tree.d.ts +2 -1
  245. package/dist/src/daemon/work-tree.js +15 -12
  246. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  247. package/dist/src/daemon/workflow-generations.js +57 -0
  248. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  249. package/dist/src/daemon/workflow-replay.js +58 -0
  250. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  251. package/dist/src/daemon/workflow-schedules.js +185 -0
  252. package/dist/src/decision-visibility.d.ts +2 -0
  253. package/dist/src/decision-visibility.js +10 -0
  254. package/dist/src/decision-wait.d.ts +1 -0
  255. package/dist/src/decision-wait.js +3 -0
  256. package/dist/src/delivery-backoff.d.ts +1 -0
  257. package/dist/src/delivery-backoff.js +3 -0
  258. package/dist/src/doctor-report.d.ts +24 -0
  259. package/dist/src/doctor-report.js +70 -0
  260. package/dist/src/execution-pin.d.ts +9 -0
  261. package/dist/src/execution-pin.js +86 -2
  262. package/dist/src/grok-result.d.ts +12 -0
  263. package/dist/src/grok-result.js +61 -0
  264. package/dist/src/harness-defaults.d.ts +35 -0
  265. package/dist/src/harness-defaults.js +121 -0
  266. package/dist/src/host/decision-resume.d.ts +35 -0
  267. package/dist/src/host/decision-resume.js +86 -0
  268. package/dist/src/host/gate-bridge.d.ts +48 -0
  269. package/dist/src/host/gate-bridge.js +124 -0
  270. package/dist/src/host/run-wait.d.ts +26 -0
  271. package/dist/src/host/run-wait.js +37 -0
  272. package/dist/src/host/start-delivery.d.ts +3 -2
  273. package/dist/src/host/start-delivery.js +11 -4
  274. package/dist/src/host/step-bridge-host.d.ts +6 -19
  275. package/dist/src/host/step-bridge-host.js +57 -55
  276. package/dist/src/host/world-reconciliation.d.ts +1 -0
  277. package/dist/src/host/world-reconciliation.js +3 -0
  278. package/dist/src/host/world-runs.js +5 -0
  279. package/dist/src/issue-identity.d.ts +6 -0
  280. package/dist/src/issue-identity.js +23 -0
  281. package/dist/src/merge-request.d.ts +19 -0
  282. package/dist/src/merge-request.js +32 -0
  283. package/dist/src/phone/canonical-json.d.ts +1 -0
  284. package/dist/src/phone/canonical-json.js +16 -0
  285. package/dist/src/phone/phone-link.d.ts +7 -0
  286. package/dist/src/phone/phone-link.js +21 -0
  287. package/dist/src/phone/qr-data.d.ts +8 -0
  288. package/dist/src/phone/qr-data.js +133 -0
  289. package/dist/src/phone/qr-matrix.d.ts +6 -0
  290. package/dist/src/phone/qr-matrix.js +175 -0
  291. package/dist/src/phone/qr-penalty.d.ts +3 -0
  292. package/dist/src/phone/qr-penalty.js +67 -0
  293. package/dist/src/phone/qr-picture.d.ts +5 -0
  294. package/dist/src/phone/qr-picture.js +24 -0
  295. package/dist/src/private-config.schema.json +263 -0
  296. package/dist/src/project-config.schema.json +65 -0
  297. package/dist/src/project-settings.d.ts +19 -0
  298. package/dist/src/project-settings.js +131 -0
  299. package/dist/src/relay/answer-check.d.ts +24 -0
  300. package/dist/src/relay/answer-check.js +145 -0
  301. package/dist/src/relay/answer-inbox.d.ts +15 -0
  302. package/dist/src/relay/answer-inbox.js +173 -0
  303. package/dist/src/relay/daemon-keys.d.ts +16 -0
  304. package/dist/src/relay/daemon-keys.js +75 -0
  305. package/dist/src/relay/decision-check.d.ts +3 -0
  306. package/dist/src/relay/decision-check.js +77 -0
  307. package/dist/src/relay/decision-close.d.ts +6 -0
  308. package/dist/src/relay/decision-close.js +72 -0
  309. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  310. package/dist/src/relay/decision-envelopes.js +93 -0
  311. package/dist/src/relay/decision-watch.d.ts +14 -0
  312. package/dist/src/relay/decision-watch.js +68 -0
  313. package/dist/src/relay/envelope-post.d.ts +8 -0
  314. package/dist/src/relay/envelope-post.js +71 -0
  315. package/dist/src/relay/envelope.d.ts +28 -0
  316. package/dist/src/relay/envelope.js +53 -0
  317. package/dist/src/relay/hpke.d.ts +25 -0
  318. package/dist/src/relay/hpke.js +108 -0
  319. package/dist/src/relay/pairing-checks.d.ts +42 -0
  320. package/dist/src/relay/pairing-checks.js +172 -0
  321. package/dist/src/relay/pairing-follow.d.ts +8 -0
  322. package/dist/src/relay/pairing-follow.js +95 -0
  323. package/dist/src/relay/pairing-session.d.ts +29 -0
  324. package/dist/src/relay/pairing-session.js +87 -0
  325. package/dist/src/relay/phone-delivery.d.ts +51 -0
  326. package/dist/src/relay/phone-delivery.js +139 -0
  327. package/dist/src/relay/phone-devices.d.ts +36 -0
  328. package/dist/src/relay/phone-devices.js +46 -0
  329. package/dist/src/relay/phone-inbox.d.ts +18 -0
  330. package/dist/src/relay/phone-inbox.js +17 -0
  331. package/dist/src/relay/phone-operations.d.ts +18 -0
  332. package/dist/src/relay/phone-operations.js +121 -0
  333. package/dist/src/relay/phone-outbox.d.ts +21 -0
  334. package/dist/src/relay/phone-outbox.js +25 -0
  335. package/dist/src/relay/phone-socket.d.ts +6 -0
  336. package/dist/src/relay/phone-socket.js +63 -0
  337. package/dist/src/relay/relay-control.d.ts +7 -0
  338. package/dist/src/relay/relay-control.js +24 -0
  339. package/dist/src/relay/relay-files.d.ts +2 -0
  340. package/dist/src/relay/relay-files.js +23 -0
  341. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  342. package/dist/src/relay/relay-heartbeat.js +81 -0
  343. package/dist/src/relay/relay-http.d.ts +14 -0
  344. package/dist/src/relay/relay-http.js +63 -0
  345. package/dist/src/relay/relay-registration.d.ts +15 -0
  346. package/dist/src/relay/relay-registration.js +63 -0
  347. package/dist/src/relay/relay-service.d.ts +25 -0
  348. package/dist/src/relay/relay-service.js +216 -0
  349. package/dist/src/relay/relay-store.d.ts +48 -0
  350. package/dist/src/relay/relay-store.js +131 -0
  351. package/dist/src/relay/sealed-post.d.ts +25 -0
  352. package/dist/src/relay/sealed-post.js +52 -0
  353. package/dist/src/relay.d.ts +1 -0
  354. package/dist/src/relay.js +8 -0
  355. package/dist/src/report-statistics.d.ts +50 -0
  356. package/dist/src/report-statistics.js +70 -0
  357. package/dist/src/report.d.ts +171 -0
  358. package/dist/src/report.js +119 -0
  359. package/dist/src/repository-identity.d.ts +4 -0
  360. package/dist/src/repository-identity.js +4 -0
  361. package/dist/src/review-subject.d.ts +41 -0
  362. package/dist/src/review-subject.js +91 -0
  363. package/dist/src/run-wait.d.ts +23 -0
  364. package/dist/src/run-wait.js +20 -0
  365. package/dist/src/service/active-tickets.d.ts +4 -0
  366. package/dist/src/service/active-tickets.js +49 -0
  367. package/dist/src/service/command-effects.d.ts +4 -0
  368. package/dist/src/service/command-effects.js +16 -0
  369. package/dist/src/service/decision-handler.d.ts +4 -0
  370. package/dist/src/service/decision-handler.js +39 -4
  371. package/dist/src/service/gateway.js +18 -3
  372. package/dist/src/service/queue-runs.d.ts +3 -0
  373. package/dist/src/service/queue-runs.js +39 -0
  374. package/dist/src/service/registry.d.ts +22 -3
  375. package/dist/src/service/registry.js +51 -8
  376. package/dist/src/service/replies.d.ts +10 -0
  377. package/dist/src/service/replies.js +12 -0
  378. package/dist/src/service/run-handlers.js +45 -54
  379. package/dist/src/service/run-metadata.d.ts +8 -0
  380. package/dist/src/service/run-metadata.js +53 -0
  381. package/dist/src/service/run-waits.d.ts +3 -0
  382. package/dist/src/service/run-waits.js +41 -0
  383. package/dist/src/service/service.d.ts +21 -2
  384. package/dist/src/service/service.js +23 -5
  385. package/dist/src/service/submission-handler.js +70 -19
  386. package/dist/src/service/worker-port.d.ts +1 -0
  387. package/dist/src/service/worker-totals.js +10 -1
  388. package/dist/src/step-bridge.d.ts +32 -0
  389. package/dist/src/steps/decision-gate.d.ts +2 -1
  390. package/dist/src/steps/decision-gate.js +7 -0
  391. package/dist/src/steps/handoff.d.ts +2 -0
  392. package/dist/src/steps/handoff.js +13 -0
  393. package/dist/src/steps/merge-by-person.d.ts +2 -0
  394. package/dist/src/steps/merge-by-person.js +18 -0
  395. package/dist/src/steps/merge-when-green.d.ts +2 -0
  396. package/dist/src/steps/merge-when-green.js +62 -0
  397. package/dist/src/steps/review-by-agent.d.ts +5 -0
  398. package/dist/src/steps/review-by-agent.js +124 -0
  399. package/dist/src/steps/review-by-person.d.ts +4 -0
  400. package/dist/src/steps/review-by-person.js +16 -0
  401. package/dist/src/steps/review-subject.d.ts +2 -0
  402. package/dist/src/steps/review-subject.js +11 -0
  403. package/dist/src/steps/run-command.d.ts +2 -0
  404. package/dist/src/steps/run-command.js +15 -0
  405. package/dist/src/steps/sleep.d.ts +3 -0
  406. package/dist/src/steps/sleep.js +19 -0
  407. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  408. package/dist/src/steps/wait-for-decision.js +71 -0
  409. package/dist/src/steps/wait-for-run.d.ts +5 -0
  410. package/dist/src/steps/wait-for-run.js +9 -0
  411. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  412. package/dist/src/storage/decision-snapshots.js +7 -1
  413. package/dist/src/submission.d.ts +4 -0
  414. package/dist/src/submission.js +6 -2
  415. package/dist/src/testing.d.ts +29 -0
  416. package/dist/src/testing.js +264 -0
  417. package/dist/src/ticket-dependencies.d.ts +1 -0
  418. package/dist/src/ticket-dependencies.js +15 -0
  419. package/dist/src/ticket-status-stream.d.ts +9 -0
  420. package/dist/src/ticket-status-stream.js +94 -0
  421. package/dist/src/ticket-status.js +7 -4
  422. package/dist/src/token-prices.d.ts +14 -4
  423. package/dist/src/token-prices.js +56 -11
  424. package/dist/src/turn-profile.d.ts +1 -0
  425. package/dist/src/turn-profile.js +8 -1
  426. package/dist/src/worker-usage.d.ts +25 -0
  427. package/dist/src/worker-usage.js +58 -1
  428. package/dist/src/workflow-admission.d.ts +6 -0
  429. package/dist/src/workflow-candidate.d.ts +7 -2
  430. package/dist/src/workflow-candidate.js +48 -5
  431. package/dist/src/workflow-contracts.d.ts +2 -0
  432. package/dist/src/workflow-contracts.js +8 -3
  433. package/dist/src/workflow-declaration.d.ts +31 -2
  434. package/dist/src/workflow-declaration.js +140 -16
  435. package/dist/src/workflow-discovery.d.ts +19 -0
  436. package/dist/src/workflow-discovery.js +36 -0
  437. package/dist/src/workflow-refusals.d.ts +6 -0
  438. package/dist/src/workflow-refusals.js +42 -0
  439. package/dist/src/workflow-schedule.d.ts +22 -0
  440. package/dist/src/workflow-schedule.js +53 -0
  441. package/dist/src/workflows.d.ts +12 -1
  442. package/dist/src/workflows.js +9 -0
  443. package/dist/tools/admit-workflow.d.ts +14 -0
  444. package/dist/tools/admit-workflow.js +107 -0
  445. package/dist/tools/doctor-adoption.d.ts +1 -0
  446. package/dist/tools/doctor-adoption.js +11 -0
  447. package/dist/tools/project-configuration.d.ts +4 -0
  448. package/dist/tools/project-configuration.js +47 -0
  449. package/dist/tools/self-host-processes.d.ts +1 -0
  450. package/dist/tools/self-host-processes.js +33 -22
  451. package/dist/tools/self-host-project.d.ts +21 -0
  452. package/dist/tools/self-host-project.js +224 -0
  453. package/dist/tools/self-host-runtime.d.ts +16 -0
  454. package/dist/tools/self-host-runtime.js +60 -0
  455. package/dist/tools/self-host-workflows.d.ts +1 -0
  456. package/dist/tools/self-host-workflows.js +36 -1
  457. package/dist/tools/self-host.js +106 -135
  458. package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
  459. package/dist/tools/workflow-bundle-dependencies.js +93 -0
  460. package/dist/tools/workflow-bundles.d.ts +20 -0
  461. package/dist/tools/workflow-bundles.js +173 -0
  462. package/dist/tools/workflow-candidate-counts.d.ts +12 -0
  463. package/dist/tools/workflow-candidate-counts.js +266 -0
  464. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  465. package/dist/tools/workflow-candidate-fields.js +24 -0
  466. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  467. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  468. package/dist/tools/workflow-candidate-program.d.ts +13 -0
  469. package/dist/tools/workflow-candidate-program.js +106 -0
  470. package/dist/tools/workflow-candidate-source.d.ts +6 -0
  471. package/dist/tools/workflow-candidate-source.js +169 -0
  472. package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
  473. package/dist/tools/workflow-candidate-syntax.js +263 -0
  474. package/dist/tools/workflow-command.d.ts +1 -0
  475. package/dist/tools/workflow-command.js +143 -0
  476. package/dist/tools/workflow-folder-capture.d.ts +18 -0
  477. package/dist/tools/workflow-folder-capture.js +261 -0
  478. package/dist/tools/workflow-folders.d.ts +49 -0
  479. package/dist/tools/workflow-folders.js +203 -0
  480. package/dist/tools/workflow-source-effects.d.ts +10 -0
  481. package/dist/tools/workflow-source-effects.js +213 -0
  482. package/dist/tools/workflow-test-hook.d.ts +7 -0
  483. package/dist/tools/workflow-test-hook.js +16 -0
  484. package/dist/tools/workflow-test-loader.d.ts +1 -0
  485. package/dist/tools/workflow-test-loader.js +10 -0
  486. package/dist/workflows/develop-prd.js +71 -3
  487. package/dist/workflows/develop-ticket.js +6 -1
  488. package/dist/workflows/ticket-prompts.js +17 -3
  489. package/package.json +66 -6
  490. package/templates/develop/README.md +78 -0
  491. package/templates/develop/develop/accept.ts +11 -0
  492. package/templates/develop/develop/flow-tests.ts +357 -0
  493. package/templates/develop/develop/local.ts +40 -0
  494. package/templates/develop/develop/option-tests.ts +174 -0
  495. package/templates/develop/develop/partial-choice.ts +29 -0
  496. package/templates/develop/develop/partial.ts +28 -0
  497. package/templates/develop/develop/pull.ts +152 -0
  498. package/templates/develop/develop/queue-partial.ts +39 -0
  499. package/templates/develop/develop/refusal-tests.ts +174 -0
  500. package/templates/develop/develop/report.ts +156 -0
  501. package/templates/develop/develop/round.ts +40 -0
  502. package/templates/develop/develop/scenarios.ts +87 -0
  503. package/templates/develop/develop/turn.ts +67 -0
  504. package/templates/develop/develop.declaration.json +24 -0
  505. package/templates/develop/develop.test.ts +287 -0
  506. package/templates/develop/develop.ts +30 -0
  507. package/templates/develop/template.json +153 -0
  508. package/dist/src/chats/analysis-batches.d.ts +0 -24
  509. package/dist/src/chats/analysis-batches.js +0 -83
  510. package/dist/src/chats/analysis-contract.d.ts +0 -80
  511. package/dist/src/chats/analysis-contract.js +0 -16
  512. package/dist/src/chats/analysis-data.d.ts +0 -3
  513. package/dist/src/chats/analysis-data.js +0 -85
  514. package/dist/src/chats/analysis-input.d.ts +0 -12
  515. package/dist/src/chats/analysis-input.js +0 -83
  516. package/dist/src/chats/analysis-links.d.ts +0 -2
  517. package/dist/src/chats/analysis-links.js +0 -25
  518. package/dist/src/chats/analysis-prompt.d.ts +0 -10
  519. package/dist/src/chats/analysis-prompt.js +0 -16
  520. package/dist/src/chats/analysis-proposal.d.ts +0 -2
  521. package/dist/src/chats/analysis-proposal.js +0 -32
  522. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  523. package/dist/src/chats/analysis-provenance.js +0 -99
  524. package/dist/src/chats/analysis-shape.d.ts +0 -3
  525. package/dist/src/chats/analysis-shape.js +0 -228
  526. package/dist/src/chats/analysis.d.ts +0 -3
  527. package/dist/src/chats/analysis.js +0 -42
  528. package/dist/src/chats/corpus-input.d.ts +0 -5
  529. package/dist/src/chats/corpus-input.js +0 -288
  530. package/dist/src/chats/destination.d.ts +0 -4
  531. package/dist/src/chats/destination.js +0 -96
  532. package/dist/src/chats/import.d.ts +0 -15
  533. package/dist/src/chats/import.js +0 -243
  534. package/dist/src/chats/input-file.d.ts +0 -3
  535. package/dist/src/chats/input-file.js +0 -32
  536. package/dist/src/chats/normalize.d.ts +0 -29
  537. package/dist/src/chats/normalize.js +0 -155
  538. package/dist/src/chats/previous-import.d.ts +0 -5
  539. package/dist/src/chats/previous-import.js +0 -34
  540. package/dist/src/chats/reader.d.ts +0 -21
  541. package/dist/src/chats/reader.js +0 -118
  542. package/dist/src/chats/redact-import.d.ts +0 -14
  543. package/dist/src/chats/redact-import.js +0 -141
  544. package/dist/src/chats/redaction.d.ts +0 -41
  545. package/dist/src/chats/redaction.js +0 -161
  546. package/dist/src/chats/revision-input.d.ts +0 -3
  547. package/dist/src/chats/revision-input.js +0 -180
  548. package/dist/src/chats/revision.d.ts +0 -48
  549. package/dist/src/chats/revision.js +0 -94
  550. package/dist/src/chats/selection.d.ts +0 -25
  551. package/dist/src/chats/selection.js +0 -109
  552. package/dist/src/chats/source.d.ts +0 -23
  553. package/dist/src/chats/source.js +0 -135
  554. package/dist/src/chats/structure.d.ts +0 -57
  555. package/dist/src/chats/structure.js +0 -216
  556. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  557. package/dist/src/daemon/analysis-launch.js +0 -81
  558. package/dist/src/daemon/analysis-token.d.ts +0 -6
  559. package/dist/src/daemon/analysis-token.js +0 -88
  560. package/dist/src/daemon/analysis-worker.d.ts +0 -22
  561. package/dist/src/daemon/analysis-worker.js +0 -219
  562. package/dist/src/daemon/chats-files.d.ts +0 -15
  563. package/dist/src/daemon/chats-files.js +0 -113
  564. package/dist/src/daemon/chats-worker.d.ts +0 -12
  565. package/dist/src/daemon/chats-worker.js +0 -200
  566. package/dist/workflows/analyze-chats.d.ts +0 -10
  567. package/dist/workflows/analyze-chats.declaration.json +0 -9
  568. package/dist/workflows/analyze-chats.js +0 -73
@@ -6,3 +6,10 @@ export async function decisionGate(request) {
6
6
  return { kind: "unavailable", reason: "cloving-host-unavailable" };
7
7
  return await bridge.gate(request);
8
8
  }
9
+ export async function openDecisionWait(request) {
10
+ "use step";
11
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
12
+ if (!isStepBridge(bridge) || bridge.waitForDecision === undefined)
13
+ throw new Error("cloving-host-unavailable");
14
+ return await bridge.waitForDecision(request);
15
+ }
@@ -0,0 +1,2 @@
1
+ import { type HandoffRequest } from "../step-bridge.ts";
2
+ export declare function handoff(request: HandoffRequest): Promise<string>;
@@ -0,0 +1,13 @@
1
+ import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
2
+ export async function handoff(request) {
3
+ "use step";
4
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
5
+ if (!isStepBridge(bridge) || bridge.handoff === undefined)
6
+ throw new Error("cloving-host-unavailable");
7
+ const result = await bridge.handoff(request);
8
+ if (result.kind !== "completed")
9
+ throw new Error(result.reason ?? result.kind);
10
+ if (result.result === null)
11
+ throw new Error("handoff-result-missing");
12
+ return result.result;
13
+ }
@@ -0,0 +1,2 @@
1
+ import { type MergeRequest, type MergeResult } from "../merge-request.ts";
2
+ export declare function mergeByPerson(request: MergeRequest): Promise<MergeResult>;
@@ -0,0 +1,18 @@
1
+ import { mergeRequest, } from "../merge-request.js";
2
+ import { mergeWhenGreen } from "./merge-when-green.js";
3
+ import { waitForDecision } from "./wait-for-decision.js";
4
+ export async function mergeByPerson(request) {
5
+ const { pull, check, round } = mergeRequest(request);
6
+ const decision = await waitForDecision({
7
+ gateId: `merge:${String(pull.number)}:${pull.commit}`,
8
+ kind: "approval",
9
+ prompt: `Merge pull request #${String(pull.number)} (${pull.url}) at commit ${pull.commit} ${check === null ? "with no local check" : `after the local check ${check}`}.`,
10
+ });
11
+ if (decision.decision !== "approved")
12
+ return {
13
+ merged: false,
14
+ reason: "not-approved",
15
+ output: decision.answer ?? "",
16
+ };
17
+ return await mergeWhenGreen({ pull, check, round });
18
+ }
@@ -0,0 +1,2 @@
1
+ import { type MergeRequest, type MergeResult } from "../merge-request.ts";
2
+ export declare function mergeWhenGreen(request: MergeRequest): Promise<MergeResult>;
@@ -0,0 +1,62 @@
1
+ import { mergeRequest, } from "../merge-request.js";
2
+ import { record } from "../protocol.js";
3
+ import { protectedEffect } from "./protected-effect.js";
4
+ const repairReasons = [
5
+ "check-failed",
6
+ "merge-conflict",
7
+ "ci-failed",
8
+ "ci-pending",
9
+ ];
10
+ export async function mergeWhenGreen(request) {
11
+ const { pull, check, round } = mergeRequest(request);
12
+ const effect = await protectedEffect({
13
+ capability: "github",
14
+ method: "merge",
15
+ target: pull.target,
16
+ payload: JSON.stringify({
17
+ number: pull.number,
18
+ commit: pull.commit,
19
+ check,
20
+ }),
21
+ scope: {
22
+ phase: "merge",
23
+ operation: "merge",
24
+ round,
25
+ key: `${String(pull.number)}:${pull.commit}`,
26
+ },
27
+ units: 1,
28
+ });
29
+ return mergeOutcome(effect, pull);
30
+ }
31
+ function mergeOutcome(effect, pull) {
32
+ if (effect.kind !== "completed")
33
+ return notMerged(effect);
34
+ const result = parsedResult(effect.result);
35
+ const reason = repairReasons.find((name) => name === result["reason"]);
36
+ if (reason !== undefined && typeof result["output"] === "string")
37
+ return { merged: false, reason, output: result["output"] };
38
+ if (result["reason"] !== undefined ||
39
+ result["number"] !== pull.number ||
40
+ result["commit"] !== pull.commit ||
41
+ typeof result["merged"] !== "string")
42
+ throw new Error("invalid-merge-result");
43
+ return { merged: true, reason: null, output: "" };
44
+ }
45
+ function notMerged(effect) {
46
+ if (effect.kind === "failed" && effect.reason === "check-not-configured")
47
+ return { merged: false, reason: "check-not-configured", output: "" };
48
+ throw new Error(effect.reason ?? effect.kind);
49
+ }
50
+ function parsedResult(text) {
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(text ?? "null");
54
+ }
55
+ catch {
56
+ throw new Error("invalid-merge-result");
57
+ }
58
+ const result = record(parsed);
59
+ if (result === undefined)
60
+ throw new Error("invalid-merge-result");
61
+ return result;
62
+ }
@@ -0,0 +1,5 @@
1
+ import type { ReviewResult, ReviewSubject, Reviewer } from "../review-subject.ts";
2
+ export declare function reviewByAgent(request: {
3
+ readonly subject: ReviewSubject;
4
+ readonly reviewer: Reviewer;
5
+ }): Promise<ReviewResult>;
@@ -0,0 +1,124 @@
1
+ import { record } from "../protocol.js";
2
+ import { protectedEffect } from "./protected-effect.js";
3
+ import { snapshotReviewSubject } from "./review-subject.js";
4
+ export async function reviewByAgent(request) {
5
+ const reviewer = selectedReviewer(request.reviewer);
6
+ const subject = { ...request.subject };
7
+ const snapshot = await snapshotReviewSubject(subject);
8
+ const effect = await protectedEffect({
9
+ ...reviewEffect({ subject, snapshot, reviewer }),
10
+ scope: {
11
+ phase: "review",
12
+ operation: reviewer.kind === "greptile" ? "greptile" : `turn:${reviewer.profile}`,
13
+ round: 1,
14
+ key: snapshot.subjectDigest,
15
+ },
16
+ units: 1,
17
+ });
18
+ if (effect.kind !== "completed")
19
+ throw new Error(effect.reason ?? effect.kind);
20
+ let parsed;
21
+ try {
22
+ parsed = JSON.parse(effect.result ?? "null");
23
+ }
24
+ catch {
25
+ throw new Error("invalid-review-result");
26
+ }
27
+ return {
28
+ ...(reviewer.kind === "turn"
29
+ ? turnResult(parsed)
30
+ : greptileFeedback(parsed, subject)),
31
+ commit: snapshot.commit,
32
+ subjectDigest: snapshot.subjectDigest,
33
+ };
34
+ }
35
+ function selectedReviewer(value) {
36
+ const reviewer = record(value);
37
+ if (reviewer?.["kind"] === "greptile")
38
+ return { kind: "greptile" };
39
+ if (reviewer?.["kind"] === "turn" &&
40
+ typeof reviewer["profile"] === "string" &&
41
+ /^[A-Za-z0-9_-]{1,119}$/.test(reviewer["profile"]))
42
+ return { kind: "turn", profile: reviewer["profile"] };
43
+ throw new Error("invalid-reviewer");
44
+ }
45
+ function reviewEffect(input) {
46
+ const { subject, snapshot, reviewer } = input;
47
+ if (reviewer.kind === "turn")
48
+ return {
49
+ capability: "claude",
50
+ method: `run-turn:${reviewer.profile}`,
51
+ target: "draft" in subject ? snapshot.subjectDigest : subject.target,
52
+ payload: `Review only this immutable subject. Do not change it. For a commit, inspect that exact commit, not the current branch head.\n${snapshot.prompt}\nEnd your report with exactly one of these lines:\nReview verdict: accept\nReview verdict: change`,
53
+ };
54
+ if ("draft" in subject ||
55
+ !Number.isSafeInteger(subject.number) ||
56
+ Number(subject.number) < 1)
57
+ throw new Error("invalid-greptile-subject");
58
+ return {
59
+ capability: "github",
60
+ method: "wait-review",
61
+ target: subject.target,
62
+ payload: JSON.stringify({ number: subject.number, commit: subject.commit }),
63
+ };
64
+ }
65
+ function turnResult(parsed) {
66
+ const result = record(parsed);
67
+ if (result &&
68
+ (result["reviewVerdict"] === null || result["reviewVerdict"] === undefined))
69
+ return {
70
+ accepted: false,
71
+ feedback: "The review turn has no verdict line.",
72
+ };
73
+ if (!result ||
74
+ typeof result["summary"] !== "string" ||
75
+ (result["reviewVerdict"] !== "accept" &&
76
+ result["reviewVerdict"] !== "change"))
77
+ throw new Error("invalid-review-result");
78
+ return {
79
+ accepted: result["reviewVerdict"] === "accept",
80
+ feedback: result["summary"],
81
+ };
82
+ }
83
+ function greptileFeedback(parsed, subject) {
84
+ if ("draft" in subject)
85
+ throw new Error("invalid-greptile-subject");
86
+ const result = greptileResult(parsed, subject);
87
+ return {
88
+ accepted: result.score === 5,
89
+ feedback: [result.summary, ...result.findings].filter(Boolean).join("\n\n"),
90
+ };
91
+ }
92
+ function greptileResult(parsed, subject) {
93
+ const result = record(parsed);
94
+ if (!result)
95
+ throw new Error("invalid-review-result");
96
+ const score = result["score"];
97
+ const summary = result["summary"];
98
+ const findings = result["findings"];
99
+ if (result["number"] !== subject.number ||
100
+ result["commit"] !== subject.commit ||
101
+ typeof score !== "number" ||
102
+ !Number.isInteger(score) ||
103
+ score < 0 ||
104
+ score > 5 ||
105
+ typeof summary !== "string" ||
106
+ !Array.isArray(findings))
107
+ throw new Error("invalid-review-result");
108
+ return {
109
+ score,
110
+ summary,
111
+ findings: findings.map((value) => {
112
+ const finding = record(value);
113
+ if (!finding)
114
+ throw new Error("invalid-review-result");
115
+ const { path, line, body } = finding;
116
+ if (typeof path !== "string" ||
117
+ typeof body !== "string" ||
118
+ !(line === null ||
119
+ (typeof line === "number" && Number.isSafeInteger(line) && line > 0)))
120
+ throw new Error("invalid-review-result");
121
+ return `${path}${line === null ? "" : `:${String(line)}`}\n${body}`;
122
+ }),
123
+ };
124
+ }
@@ -0,0 +1,4 @@
1
+ import type { ReviewResult, ReviewSubject } from "../review-subject.ts";
2
+ export declare function reviewByPerson(request: {
3
+ readonly subject: ReviewSubject;
4
+ }): Promise<ReviewResult>;
@@ -0,0 +1,16 @@
1
+ import { snapshotReviewSubject } from "./review-subject.js";
2
+ import { waitForDecision } from "./wait-for-decision.js";
3
+ export async function reviewByPerson(request) {
4
+ const snapshot = await snapshotReviewSubject(request.subject);
5
+ const decision = await waitForDecision({
6
+ gateId: `review:${snapshot.subjectDigest}`,
7
+ kind: "approval",
8
+ prompt: `Review this subject:\n${snapshot.prompt}`,
9
+ });
10
+ return {
11
+ accepted: decision.decision === "approved",
12
+ feedback: decision.answer ?? "",
13
+ commit: snapshot.commit,
14
+ subjectDigest: snapshot.subjectDigest,
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ import { type ReviewSubject, type ReviewSnapshot } from "../review-subject.ts";
2
+ export declare function snapshotReviewSubject(subject: ReviewSubject): Promise<ReviewSnapshot>;
@@ -0,0 +1,11 @@
1
+ import { operationDigest } from "../broker/operation-digest.js";
2
+ import { reviewSubjectText, } from "../review-subject.js";
3
+ export async function snapshotReviewSubject(subject) {
4
+ "use step";
5
+ const prompt = reviewSubjectText(subject);
6
+ return Promise.resolve({
7
+ commit: "draft" in subject ? null : subject.commit,
8
+ subjectDigest: `sha256:${operationDigest(prompt)}`,
9
+ prompt,
10
+ });
11
+ }
@@ -0,0 +1,2 @@
1
+ import { type CommandRequest, type ProtectedResult } from "../step-bridge.ts";
2
+ export declare function runCommand(request: CommandRequest): Promise<ProtectedResult>;
@@ -0,0 +1,15 @@
1
+ import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
2
+ export async function runCommand(request) {
3
+ "use step";
4
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
5
+ if (!isStepBridge(bridge))
6
+ return { kind: "unavailable", reason: "cloving-host-unavailable" };
7
+ return await bridge.effect({
8
+ scope: request.scope,
9
+ capability: "command",
10
+ method: `run:${request.name}`,
11
+ target: request.name,
12
+ payload: JSON.stringify(request.input),
13
+ units: 1,
14
+ });
15
+ }
@@ -0,0 +1,3 @@
1
+ export declare function sleep(request: {
2
+ readonly seconds: number;
3
+ }): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { sleep as sdkSleep } from "workflow";
2
+ export async function sleep(request) {
3
+ await sdkSleep(sleepSeconds(request) * 1000);
4
+ }
5
+ function sleepSeconds(request) {
6
+ if (typeof request !== "object" ||
7
+ request === null ||
8
+ Reflect.ownKeys(request).length !== 1)
9
+ throw new Error("invalid-sleep-seconds");
10
+ const field = Object.getOwnPropertyDescriptor(request, "seconds") ?? {};
11
+ const seconds = field.value;
12
+ if (field.enumerable !== true ||
13
+ typeof seconds !== "number" ||
14
+ !Number.isInteger(seconds) ||
15
+ seconds < 1 ||
16
+ seconds > 86400)
17
+ throw new Error("invalid-sleep-seconds");
18
+ return seconds;
19
+ }
@@ -0,0 +1,2 @@
1
+ import type { DecisionResult, GateRequest } from "../step-bridge.ts";
2
+ export declare function waitForDecision(request: GateRequest): Promise<DecisionResult>;
@@ -0,0 +1,71 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { createHook } from "workflow";
54
+ import { openDecisionWait } from "./decision-gate.js";
55
+ export async function waitForDecision(request) {
56
+ const env_1 = { stack: [], error: void 0, hasError: false };
57
+ try {
58
+ const wait = await openDecisionWait(request);
59
+ if ("decision" in wait)
60
+ return wait;
61
+ const hook = __addDisposableResource(env_1, createHook({ token: wait.token }), false);
62
+ return await hook;
63
+ }
64
+ catch (e_1) {
65
+ env_1.error = e_1;
66
+ env_1.hasError = true;
67
+ }
68
+ finally {
69
+ __disposeResources(env_1);
70
+ }
71
+ }
@@ -0,0 +1,5 @@
1
+ import { type RunWaitOutcome, type RunWaitRequest } from "../step-bridge.ts";
2
+ export declare function waitForRun(request: RunWaitRequest): Promise<RunWaitOutcome>;
3
+ export declare namespace waitForRun {
4
+ var maxRetries: number;
5
+ }
@@ -0,0 +1,9 @@
1
+ import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
2
+ export async function waitForRun(request) {
3
+ "use step";
4
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
5
+ if (!isStepBridge(bridge) || bridge.waitForRun === undefined)
6
+ throw new Error("cloving-host-unavailable");
7
+ return await bridge.waitForRun(request);
8
+ }
9
+ waitForRun.maxRetries = 86401;
@@ -12,6 +12,7 @@ export interface DecidedSnapshot extends DomainSnapshot, DecisionRows {
12
12
  export interface CurrentSnapshot extends DecidedSnapshot {
13
13
  readonly effects: EffectRows;
14
14
  }
15
+ export declare function loadOperationSnapshot(connection: SqlConnection): Promise<Pick<ProjectionSnapshot, "outbox" | "deliveries">>;
15
16
  export declare function loadProjections(connection: SqlConnection): Promise<ProjectionSnapshot>;
16
17
  export declare function loadDecided(connection: SqlConnection): Promise<DecidedSnapshot>;
17
18
  export declare function loadCurrent(connection: SqlConnection): Promise<CurrentSnapshot>;
@@ -1,6 +1,12 @@
1
1
  import { loadDecisions, loadDocuments, } from "./decision-rows.js";
2
- import { latestSequence, loadAttempts, loadSnapshot, projectionRows, text, } from "./domain-rows.js";
2
+ import { latestSequence, loadAttempts, loadSnapshot, outboxRow, projectionRows, text, } from "./domain-rows.js";
3
3
  import { loadEffects } from "./effect-rows.js";
4
+ export async function loadOperationSnapshot(connection) {
5
+ return {
6
+ outbox: (await connection.all("SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox ORDER BY created_sequence, rowid")).map(outboxRow),
7
+ deliveries: await loadAttempts(connection),
8
+ };
9
+ }
4
10
  export async function loadProjections(connection) {
5
11
  return {
6
12
  ...(await projectionRows(connection)),
@@ -5,6 +5,9 @@ export type SubmissionField = {
5
5
  } | {
6
6
  readonly type: "boolean";
7
7
  readonly optional?: boolean;
8
+ } | {
9
+ readonly type: "ticket";
10
+ readonly optional?: boolean;
8
11
  } | {
9
12
  readonly type: "integer";
10
13
  readonly optional?: boolean;
@@ -15,6 +18,7 @@ export interface SubmissionContract {
15
18
  readonly maximumBytes: number;
16
19
  readonly fields: Readonly<Record<string, "string" | SubmissionField>>;
17
20
  }
21
+ export declare function hasTicketField(contract: SubmissionContract | undefined): boolean;
18
22
  export type SubmissionCheck = {
19
23
  readonly kind: "valid";
20
24
  readonly normalized: string;
@@ -1,4 +1,8 @@
1
1
  import { record } from "./protocol.js";
2
+ export function hasTicketField(contract) {
3
+ const rule = contract?.fields["ticket"];
4
+ return rule !== undefined && rule !== "string" && rule.type === "ticket";
5
+ }
2
6
  function rejected(code, detail) {
3
7
  return { kind: "rejected", code, detail };
4
8
  }
@@ -14,11 +18,11 @@ function invalidField(contract, submission) {
14
18
  return Object.entries(contract.fields).find(([key, rule]) => {
15
19
  if (rule !== "string" && rule.optional && !Object.hasOwn(submission, key))
16
20
  return false;
17
- return !validValue(rule, submission[key]);
21
+ return !validValue(rule === "string" ? { type: "string" } : rule, submission[key]);
18
22
  })?.[0];
19
23
  }
20
24
  function validValue(rule, value) {
21
- if (rule === "string" || rule.type === "string")
25
+ if (rule.type === "string" || rule.type === "ticket")
22
26
  return typeof value === "string" && value.trim().length > 0;
23
27
  if (rule.type === "boolean")
24
28
  return typeof value === "boolean";
@@ -0,0 +1,29 @@
1
+ import { type HandoffValue, type ProtectedResult, type GateResult, type DecisionResult, type RunWaitOutcome, type ProtectedRequest, type GateRequest, type HandoffRequest, type RunWaitRequest } from "./step-bridge.ts";
2
+ export interface StepScenario {
3
+ readonly turn?: ProtectedResult;
4
+ readonly effects?: Readonly<Record<string, readonly ProtectedResult[]>>;
5
+ readonly gate?: GateResult;
6
+ readonly waits?: readonly RunWaitOutcome[];
7
+ readonly decisions?: readonly DecisionResult[];
8
+ readonly effectLimit?: number;
9
+ }
10
+ export interface WorkflowScenario extends StepScenario {
11
+ readonly workflow: string;
12
+ readonly exportName: string;
13
+ readonly input: HandoffValue;
14
+ readonly decision?: HandoffValue;
15
+ }
16
+ export type ScenarioRequest = readonly ["effect", ProtectedRequest] | readonly ["gate", GateRequest] | readonly ["waitForDecision", GateRequest] | readonly ["handoff", HandoffRequest] | readonly ["waitForRun", RunWaitRequest] | readonly ["sleep", {
17
+ readonly seconds: number;
18
+ }];
19
+ export interface ScenarioResult {
20
+ readonly spent?: number;
21
+ readonly outcome: unknown;
22
+ readonly requests: readonly ScenarioRequest[];
23
+ }
24
+ export declare function fakeStepBridge(scenario: StepScenario): {
25
+ requests: ScenarioRequest[];
26
+ readonly spent: number;
27
+ [Symbol.dispose](): void;
28
+ };
29
+ export declare function runScenario(scenario: WorkflowScenario): Promise<ScenarioResult>;