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
@@ -0,0 +1,4 @@
1
+ export function repositoryFileName(identity) {
2
+ const name = identity.name.replace(/[^A-Za-z0-9_-]/g, "").slice(0, 24);
3
+ return `${name}-${identity.sha256.slice(0, 8)}`;
4
+ }
@@ -0,0 +1,41 @@
1
+ export interface CommitReviewSubject {
2
+ readonly commit: string;
3
+ readonly target: string;
4
+ readonly number?: number;
5
+ }
6
+ export interface DraftReviewSubject {
7
+ readonly draft: string;
8
+ readonly commit?: string;
9
+ }
10
+ export type ReviewSubject = CommitReviewSubject | DraftReviewSubject;
11
+ export type Reviewer = {
12
+ readonly kind: "greptile";
13
+ } | {
14
+ readonly kind: "turn";
15
+ readonly profile: string;
16
+ };
17
+ export interface ReviewResult {
18
+ readonly accepted: boolean;
19
+ readonly feedback: string;
20
+ readonly commit: string | null;
21
+ readonly subjectDigest: string;
22
+ }
23
+ export declare function reviewSubjectText(subject: ReviewSubject): string;
24
+ export declare function commitId(value: unknown): value is string;
25
+ export interface ReviewSnapshot {
26
+ readonly commit: string | null;
27
+ readonly subjectDigest: string;
28
+ readonly prompt: string;
29
+ }
30
+ export type ReviewVerdict = "accept" | "change";
31
+ export declare function reviewReport(text: string): {
32
+ readonly reviewVerdict: ReviewVerdict | null;
33
+ readonly feedback: string;
34
+ };
35
+ export declare function reviewReportStream(limit: number): {
36
+ write: (chunk: string) => void;
37
+ result: () => {
38
+ reviewVerdict: ReviewVerdict | null;
39
+ feedback: string;
40
+ };
41
+ };
@@ -0,0 +1,91 @@
1
+ import { record } from "./protocol.js";
2
+ export function reviewSubjectText(subject) {
3
+ if (record(subject) === undefined)
4
+ throw new Error("invalid-review-subject");
5
+ if ("draft" in subject)
6
+ return draftReviewText(subject);
7
+ if (!commitId(subject.commit) ||
8
+ typeof subject.target !== "string" ||
9
+ subject.target.trim() === "")
10
+ throw new Error("invalid-review-subject");
11
+ const identity = [
12
+ "cloving-review-subject",
13
+ 1,
14
+ "commit",
15
+ subject.target,
16
+ subject.commit,
17
+ ];
18
+ if (subject.number !== undefined)
19
+ identity.push(subject.number);
20
+ return JSON.stringify(identity);
21
+ }
22
+ function draftReviewText(subject) {
23
+ if (typeof subject.draft !== "string" ||
24
+ subject.draft.trim() === "" ||
25
+ (subject.commit !== undefined && !commitId(subject.commit)))
26
+ throw new Error("invalid-review-subject");
27
+ return JSON.stringify([
28
+ "cloving-review-subject",
29
+ 1,
30
+ "draft",
31
+ subject.commit ?? null,
32
+ subject.draft,
33
+ ]);
34
+ }
35
+ export function commitId(value) {
36
+ return (typeof value === "string" && /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(value));
37
+ }
38
+ export function reviewReport(text) {
39
+ const trimmed = text.trimEnd();
40
+ const start = trimmed.lastIndexOf("\n") + 1;
41
+ const line = trimmed.slice(start);
42
+ const verdict = line.slice("Review verdict: ".length);
43
+ if (!line.startsWith("Review verdict: ") ||
44
+ (verdict !== "accept" && verdict !== "change"))
45
+ return { reviewVerdict: null, feedback: text };
46
+ return {
47
+ reviewVerdict: verdict,
48
+ feedback: trimmed.slice(0, start).trimEnd(),
49
+ };
50
+ }
51
+ export function reviewReportStream(limit) {
52
+ let text = "";
53
+ let trailing = "";
54
+ let prefix = "";
55
+ let length = 0;
56
+ let contentLength = 0;
57
+ let verdict = null;
58
+ const finish = () => {
59
+ if (contentLength > 0)
60
+ verdict =
61
+ contentLength > 24
62
+ ? null
63
+ : reviewReport(prefix.slice(0, contentLength)).reviewVerdict;
64
+ prefix = "";
65
+ length = 0;
66
+ contentLength = 0;
67
+ };
68
+ return {
69
+ write: (chunk) => {
70
+ const trimmed = chunk.trimEnd();
71
+ if (trimmed === "")
72
+ trailing = (trailing + chunk).slice(-limit);
73
+ if (trimmed !== "") {
74
+ text = (text + trailing + trimmed).slice(-limit);
75
+ trailing = chunk.slice(trimmed.length).slice(-limit);
76
+ }
77
+ for (const [index, part] of chunk.split("\n").entries()) {
78
+ if (index > 0)
79
+ finish();
80
+ if (part.trimEnd() !== "")
81
+ contentLength = Math.min(25, length + part.trimEnd().length);
82
+ prefix = (prefix + part).slice(0, 24);
83
+ length = Math.min(25, length + part.length);
84
+ }
85
+ },
86
+ result: () => {
87
+ finish();
88
+ return { reviewVerdict: verdict, feedback: reviewReport(text).feedback };
89
+ },
90
+ };
91
+ }
@@ -0,0 +1,23 @@
1
+ import type { RunWaitOutcome, RunWaitRequest } from "./step-bridge.ts";
2
+ export interface RunWaitTarget {
3
+ readonly parentRunId: string | null;
4
+ readonly status: string;
5
+ readonly endedAt: number | null;
6
+ readonly outcome: RunWaitOutcome | null;
7
+ }
8
+ export type RunWaitResult = {
9
+ readonly kind: "waiting";
10
+ readonly deadline: number;
11
+ } | {
12
+ readonly kind: "completed";
13
+ readonly outcome: RunWaitOutcome;
14
+ } | {
15
+ readonly kind: "refused";
16
+ readonly reason: string;
17
+ };
18
+ export declare function runWaitResult(request: RunWaitRequest, context: {
19
+ readonly callerRunId: string;
20
+ readonly startedAt: number;
21
+ readonly now: number;
22
+ readonly target: RunWaitTarget | undefined;
23
+ }): RunWaitResult;
@@ -0,0 +1,20 @@
1
+ function validSeconds(seconds) {
2
+ return Number.isInteger(seconds) && seconds >= 1 && seconds <= 86400;
3
+ }
4
+ export function runWaitResult(request, context) {
5
+ const { target, callerRunId, startedAt, now } = context;
6
+ const seconds = request.maximumWaitSeconds;
7
+ if (!validSeconds(seconds) ||
8
+ target?.parentRunId !== callerRunId ||
9
+ request.runId === callerRunId)
10
+ return { kind: "refused", reason: "run-wait-refused" };
11
+ const deadline = startedAt + seconds * 1000;
12
+ if (["completed", "failed", "cancelled"].includes(target.status) &&
13
+ target.outcome !== null &&
14
+ target.endedAt !== null &&
15
+ target.endedAt <= deadline)
16
+ return { kind: "completed", outcome: target.outcome };
17
+ if (now >= deadline)
18
+ return { kind: "refused", reason: "run-wait-timeout" };
19
+ return { kind: "waiting", deadline };
20
+ }
@@ -0,0 +1,4 @@
1
+ import { type Fields } from "../protocol.ts";
2
+ import type { ServiceContext } from "./replies.ts";
3
+ export declare function activeWorkflow(context: ServiceContext, workflowId: string): Promise<Fields[]>;
4
+ export declare function queueOverview(context: ServiceContext): Promise<Fields>;
@@ -0,0 +1,49 @@
1
+ import { record } from "../protocol.js";
2
+ export async function activeWorkflow(context, workflowId) {
3
+ const workflows = await context.authority.queries.workflowIds();
4
+ const state = await context.authority.state();
5
+ const queueRun = async (runId) => workflows[runId] === "develop-issue" ||
6
+ (await context.authority.queries.manifest(runId))?.queue === true;
7
+ const runs = Object.values(state.runs).filter((run) => !["completed", "failed", "cancelled"].includes(run.status));
8
+ const own = runs.filter((run) => workflows[run.runId] === workflowId);
9
+ const queued = workflowId === "develop-issue" ||
10
+ context.registry.byId(workflowId)?.queue === true ||
11
+ (await Promise.all(own.map((run) => queueRun(run.runId)))).includes(true);
12
+ const active = await Promise.all(runs.map(async (run) => {
13
+ if (workflows[run.runId] !== workflowId &&
14
+ !(queued && (await queueRun(run.runId))))
15
+ return undefined;
16
+ return storedTicket(context, state.details[run.runId]?.input);
17
+ }));
18
+ return active.filter((input) => input !== undefined);
19
+ }
20
+ export async function queueOverview(context) {
21
+ const workflow = context.registry.workflowIds
22
+ .map((id) => context.registry.byId(id))
23
+ .find((workflow) => workflow?.admission !== undefined);
24
+ if (workflow?.admission === undefined)
25
+ return {};
26
+ const active = await activeWorkflow(context, workflow.workflowId);
27
+ return {
28
+ queue: {
29
+ lanes: workflow.admission === "when-idle" ? 1 : workflow.admission,
30
+ busy: active.length,
31
+ skipped: [
32
+ ...active.flatMap((input) => typeof input["ticketId"] === "string"
33
+ ? [{ ticketId: input["ticketId"], reason: "ticket-active" }]
34
+ : []),
35
+ ...(workflow.resolver.skippedTickets?.() ?? []),
36
+ ],
37
+ },
38
+ };
39
+ }
40
+ async function storedTicket(context, digest) {
41
+ const text = digest
42
+ ? await context.authority.queries.document(digest)
43
+ : undefined;
44
+ const input = record(JSON.parse(text ?? "null")) ?? {};
45
+ const ticket = record(record(input["input"])?.["ticket"]);
46
+ return ticket === undefined
47
+ ? input
48
+ : { ...input, ticketId: ticket["id"], ticket: ticket["text"] };
49
+ }
@@ -0,0 +1,4 @@
1
+ import type { ServiceContext } from "./replies.ts";
2
+ import type { Fields } from "../protocol.ts";
3
+ import type { OperationView } from "../broker/actor/authority.ts";
4
+ export declare function commandFields(context: ServiceContext, operations: readonly OperationView[]): Promise<Fields>;
@@ -0,0 +1,16 @@
1
+ export async function commandFields(context, operations) {
2
+ const effects = operations
3
+ .filter((operation) => operation.capability === "command")
4
+ .map((operation) => ({
5
+ operationId: operation.operationId,
6
+ name: operation.method.slice(4),
7
+ state: operation.status,
8
+ exitCode: null,
9
+ durationMilliseconds: null,
10
+ }));
11
+ if (effects.length === 0)
12
+ return {};
13
+ return {
14
+ commandEffects: (await context.commandEffects?.(effects)) ?? effects,
15
+ };
16
+ }
@@ -5,5 +5,9 @@ export declare function feedbackOf(context: ServiceContext, scope: {
5
5
  readonly state: StoredState;
6
6
  readonly runId: string;
7
7
  }): Promise<readonly Fields[]>;
8
+ export declare function decidedOf(context: ServiceContext, scope: {
9
+ readonly state: StoredState;
10
+ readonly runId: string;
11
+ }): Promise<readonly Fields[]>;
8
12
  export declare function questions(context: ServiceContext, parameters: Fields): Promise<Reply>;
9
13
  export declare function decision(context: ServiceContext, parameters: Fields): Promise<Reply>;
@@ -1,5 +1,6 @@
1
- import { continues, gateKey } from "../authority/gates.js";
2
- import { gateContinuation } from "../authority/reduction.js";
1
+ import { delivers, gateKey } from "../authority/gates.js";
2
+ import { isDeviceActor } from "../authority/commands.js";
3
+ import { gateDelivery } from "../authority/reduction.js";
3
4
  import { documentDigest } from "../broker/decision-restore.js";
4
5
  import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, wholeNumber, } from "./replies.js";
5
6
  const decisions = {
@@ -43,6 +44,25 @@ export async function feedbackOf(context, scope) {
43
44
  }
44
45
  return shown;
45
46
  }
47
+ export async function decidedOf(context, scope) {
48
+ const decided = typed(scope.state).filter((gate) => gate.runId === scope.runId &&
49
+ gate.outcome !== null &&
50
+ gate.outcome.decision !== null);
51
+ const shown = [];
52
+ for (const gate of decided) {
53
+ const page = await context.authority.queries.eventsAfter({
54
+ after: (gate.outcome?.sequence ?? 1) - 1,
55
+ limit: 1,
56
+ });
57
+ const actor = page.events[0]?.payload["actor"];
58
+ shown.push({
59
+ decisionId: decisionId(gate),
60
+ decision: gate.outcome?.decision ?? null,
61
+ actor: typeof actor === "string" ? actor : "local",
62
+ });
63
+ }
64
+ return shown;
65
+ }
46
66
  async function described(context, shown) {
47
67
  const { state, gate } = shown;
48
68
  const { queries } = context.authority;
@@ -120,7 +140,20 @@ function textLimit(context, command) {
120
140
  ? { bytes: feedbackBytes, name: "A feedback text" }
121
141
  : { bytes: context.textBytes, name: "An answer" };
122
142
  }
143
+ function actorOf(parameters) {
144
+ const actor = parameters["actor"] ?? null;
145
+ if (actor === null)
146
+ return null;
147
+ return isDeviceActor(actor) ? actor : undefined;
148
+ }
123
149
  function decisionRequest(parameters) {
150
+ const actor = actorOf(parameters);
151
+ const fields = decisionFields(parameters);
152
+ if (actor === undefined || fields === undefined)
153
+ return undefined;
154
+ return { ...fields, actor };
155
+ }
156
+ function decisionFields(parameters) {
124
157
  const { command, reference, expectedRevision, generation } = parameters;
125
158
  const { subjectDigest, commandId } = parameters;
126
159
  const text = parameters["text"] ?? null;
@@ -183,6 +216,7 @@ export async function decision(context, parameters) {
183
216
  generation: request.generation,
184
217
  subject: request.subjectDigest,
185
218
  ...(text === null ? {} : { answer: documentDigest(text) }),
219
+ ...(request.actor === null ? {} : { actor: request.actor }),
186
220
  },
187
221
  documents: text === null ? [] : [text],
188
222
  });
@@ -203,9 +237,9 @@ export async function decision(context, parameters) {
203
237
  }
204
238
  async function continuationState(context, decided) {
205
239
  const { gate, run } = decided;
206
- if (!continues(gate))
240
+ if (!delivers(gate))
207
241
  return "held";
208
- const { operationId } = gateContinuation(gate);
242
+ const { operationId } = gateDelivery(gate);
209
243
  const operation = (await context.authority.operations()).find((item) => item.operationId === operationId);
210
244
  if (operation?.deliveries.some((delivery) => delivery.outcome === "sent"))
211
245
  return "admitted";
@@ -224,6 +258,7 @@ async function recorded(context, outcome) {
224
258
  decisionId: decisionId(gate),
225
259
  runId,
226
260
  decision: gate.outcome?.decision ?? null,
261
+ actor: stored.command.actor ?? null,
227
262
  commandId,
228
263
  replayed: outcome.replayed,
229
264
  receipt: publicReceipt(stored),
@@ -1,5 +1,6 @@
1
1
  import { invalidCommand, serializable, textList, unserializable, } from "../broker/actor/authority-receipts.js";
2
2
  import { record } from "../protocol.js";
3
+ import { commandLimits } from "../command-settings.js";
3
4
  export const workerCommandBound = 1_000;
4
5
  const permitted = {
5
6
  operator: [
@@ -10,6 +11,7 @@ const permitted = {
10
11
  "cancel-run",
11
12
  ],
12
13
  worker: [
14
+ "record-schedule-skip",
13
15
  "mark-started",
14
16
  "open-gate",
15
17
  "register-wait",
@@ -64,8 +66,17 @@ function refusal(submission, textBytes) {
64
66
  };
65
67
  return undefined;
66
68
  }
69
+ async function reportLimit(parts, submission) {
70
+ if (submission.command["kind"] !== "report-effect" ||
71
+ !submission.documents.some((text) => Buffer.byteLength(text) > parts.textBytes))
72
+ return parts.textBytes;
73
+ const operation = await parts.authority.effects.operation(String(submission.command["operationId"]));
74
+ return operation?.capability === "command"
75
+ ? commandLimits.resultBytes
76
+ : parts.textBytes;
77
+ }
67
78
  export function commandGateway(parts) {
68
- const { authority, registry, clock, textBytes } = parts;
79
+ const { authority, registry, clock } = parts;
69
80
  const bound = parts.pendingWorkerCommands ?? workerCommandBound;
70
81
  let pending = 0;
71
82
  async function manifest(command) {
@@ -74,7 +85,11 @@ export function commandGateway(parts) {
74
85
  return registry.byPin(String(command["workflow"]))?.manifest;
75
86
  if (!pinned.includes(kind))
76
87
  return undefined;
77
- const run = (await authority.state()).runs[String(command["runId"])];
88
+ const runId = String(command["runId"]);
89
+ const stored = await authority.queries.manifest(runId);
90
+ if (stored?.bundleDigest !== undefined)
91
+ return stored;
92
+ const run = (await authority.state()).runs[runId];
78
93
  return registry.byPin(run?.workflow ?? "")?.manifest;
79
94
  }
80
95
  async function forwarded(submission) {
@@ -109,7 +124,7 @@ export function commandGateway(parts) {
109
124
  const submission = checked(given.principal, copy);
110
125
  if (submission === undefined)
111
126
  return invalidCommand;
112
- const refused = refusal(submission, textBytes);
127
+ const refused = refusal(submission, await reportLimit(parts, submission));
113
128
  if (refused !== undefined)
114
129
  return refused;
115
130
  return submission.principal === "worker"
@@ -0,0 +1,3 @@
1
+ import type { Reply } from "../protocol.ts";
2
+ import { type ServiceContext } from "./replies.ts";
3
+ export declare function queueRunStatuses(context: ServiceContext, runIds: unknown): Promise<Reply>;
@@ -0,0 +1,39 @@
1
+ import { failed, invalidRequest, isIdentifier, result, } from "./replies.js";
2
+ export async function queueRunStatuses(context, runIds) {
3
+ if (!Array.isArray(runIds) ||
4
+ runIds.length === 0 ||
5
+ runIds.length > 4 ||
6
+ !runIds.every(isIdentifier))
7
+ return invalidRequest("A queue status batch needs one to four run IDs.");
8
+ const state = await context.authority.state();
9
+ const runs = [];
10
+ for (const runId of runIds) {
11
+ const run = state.runs[runId];
12
+ if (run === undefined)
13
+ return failed("unknown-run", { detail: `No run has the ID ${runId}.` });
14
+ runs.push(await queuedRun(context, {
15
+ runId,
16
+ status: run.status,
17
+ sequence: state.sequence,
18
+ }));
19
+ }
20
+ return result("queue-run-statuses", { runs });
21
+ }
22
+ async function queuedRun(context, run) {
23
+ const event = await context.authority.queries.latestCompletion({
24
+ runId: run.runId,
25
+ atOrBefore: run.sequence,
26
+ terminal: true,
27
+ });
28
+ return {
29
+ runId: run.runId,
30
+ state: run.status,
31
+ terminalSequence: event?.sequence ?? null,
32
+ outcome: event?.type === "run.completed"
33
+ ? {
34
+ kind: event.payload["outcome"],
35
+ issueUpdate: event.payload["issueUpdate"],
36
+ }
37
+ : null,
38
+ };
39
+ }
@@ -1,5 +1,11 @@
1
+ import type { CommandWaits, WorkflowStage, WorkflowStages } from "../workflow-declaration.ts";
1
2
  import type { SubmissionContract } from "../submission.ts";
2
3
  import type { ExecutionManifest } from "../workflow-admission.ts";
4
+ import type { AvailableManifest } from "../broker/actor/delivery-intents.ts";
5
+ export interface WorkflowBundleStore {
6
+ readonly directory: string;
7
+ readonly repository: string;
8
+ }
3
9
  export type Resolution = {
4
10
  readonly kind: "resolved";
5
11
  readonly input: unknown;
@@ -13,28 +19,41 @@ export interface ResolutionRequest {
13
19
  readonly submission: Readonly<Record<string, unknown>>;
14
20
  readonly commandId: string;
15
21
  readonly signal: AbortSignal;
22
+ readonly activeTickets?: readonly Readonly<Record<string, unknown>>[];
16
23
  }
17
24
  export interface Resolver {
18
25
  readonly id: string;
19
26
  readonly version: string;
20
27
  readonly resolve: (request: ResolutionRequest) => Promise<Resolution>;
28
+ readonly skippedTickets?: () => readonly Readonly<Record<string, unknown>>[];
21
29
  }
22
30
  export interface WorkflowRegistration {
31
+ readonly queue?: boolean;
23
32
  readonly workflowId: string;
24
33
  readonly manifest: ExecutionManifest;
25
34
  readonly availability: "available" | "unavailable";
26
35
  readonly submission: SubmissionContract;
27
36
  readonly resolver: Resolver;
28
37
  readonly effectLimit?: number;
29
- readonly admission?: "when-idle";
38
+ readonly stages?: readonly WorkflowStage[];
39
+ readonly handoffs?: readonly string[];
40
+ readonly commands?: readonly string[];
41
+ readonly commandWaits?: CommandWaits;
42
+ readonly admission?: "when-idle" | number;
30
43
  }
31
44
  export interface Registered extends WorkflowRegistration {
32
45
  readonly pin: string;
33
46
  }
34
47
  export interface Registry {
35
48
  readonly workflowIds: readonly string[];
49
+ readonly workflowStages: WorkflowStages;
36
50
  readonly byId: (workflowId: string) => Registered | undefined;
37
51
  readonly byPin: (pin: string) => Registered | undefined;
38
- readonly available: (pinned: ExecutionManifest) => ExecutionManifest | undefined;
52
+ readonly bundle: (pinned: ExecutionManifest) => Promise<string | undefined>;
53
+ readonly available: AvailableManifest;
39
54
  }
40
- export declare function workflowRegistry(workflows: readonly WorkflowRegistration[]): Registry;
55
+ export declare function workflowRegistry(workflows: readonly WorkflowRegistration[], options?: {
56
+ readonly retainedWorkflows?: readonly WorkflowRegistration[];
57
+ readonly workflowBundles?: WorkflowBundleStore;
58
+ readonly retainedWorkflow?: AvailableManifest;
59
+ }): Registry;
@@ -1,13 +1,56 @@
1
1
  import { workflowPin } from "../broker/workflow-pin.js";
2
- export function workflowRegistry(workflows) {
3
- const registered = workflows.map((workflow) => ({
2
+ import { declaredManifest } from "../execution-pin.js";
3
+ import { readRetainedWorkflowBundle } from "../../tools/workflow-bundles.js";
4
+ function registered(workflow) {
5
+ const manifest = declaredManifest(workflow.manifest, workflow);
6
+ return {
4
7
  ...workflow,
5
- pin: workflowPin(workflow.manifest),
6
- }));
8
+ ...(manifest.handoffs === undefined ? {} : { handoffs: manifest.handoffs }),
9
+ manifest,
10
+ pin: workflowPin(manifest),
11
+ };
12
+ }
13
+ function availableVersions(workflow) {
14
+ if (workflow.availability !== "available")
15
+ return [];
16
+ if (workflow.manifest.bundleDigest === undefined)
17
+ return [workflow];
18
+ const manifest = { ...workflow.manifest };
19
+ delete manifest.bundleDigest;
20
+ return [workflow, { ...workflow, manifest, pin: workflowPin(manifest) }];
21
+ }
22
+ export function workflowRegistry(workflows, options = {}) {
23
+ const current = workflows.map(registered);
24
+ const available = [
25
+ ...current,
26
+ ...(options.retainedWorkflows ?? []).map(registered),
27
+ ].flatMap(availableVersions);
28
+ const byPin = (pin) => available.find((workflow) => workflow.pin === pin);
29
+ const bundle = async (pinned) => {
30
+ if (pinned.bundleDigest === undefined ||
31
+ options.workflowBundles === undefined)
32
+ return undefined;
33
+ const retained = await readRetainedWorkflowBundle({
34
+ ...options.workflowBundles,
35
+ id: pinned.bundleDigest,
36
+ });
37
+ return retained.kind === "available" ? retained.directory : undefined;
38
+ };
7
39
  return {
8
- workflowIds: registered.map((workflow) => workflow.workflowId),
9
- byId: (workflowId) => registered.find((workflow) => workflow.workflowId === workflowId),
10
- byPin: (pin) => registered.find((workflow) => workflow.pin === pin),
11
- available: (pinned) => registered.find((workflow) => workflow.manifest.workflowId === pinned.workflowId)?.manifest,
40
+ workflowIds: current.map((workflow) => workflow.workflowId),
41
+ workflowStages: Object.fromEntries(current.flatMap((workflow) => workflow.stages === undefined
42
+ ? []
43
+ : [[workflow.workflowId, workflow.stages]])),
44
+ byId: (workflowId) => current.find((workflow) => workflow.workflowId === workflowId),
45
+ byPin,
46
+ bundle,
47
+ available: (pinned) => {
48
+ const manifest = byPin(workflowPin(pinned))?.manifest;
49
+ if (pinned.bundleDigest === undefined)
50
+ return manifest;
51
+ return bundle(pinned).then((directory) => directory !== undefined
52
+ ? (manifest ?? options.retainedWorkflow?.(pinned))
53
+ : undefined);
54
+ },
12
55
  };
13
56
  }
@@ -3,9 +3,14 @@ import type { Fields, Reply } from "../protocol.ts";
3
3
  import type { ChangeSignal } from "./changes.ts";
4
4
  import type { Gateway } from "./gateway.ts";
5
5
  import type { Registry } from "./registry.ts";
6
+ import { type WorkflowRefusal } from "../workflow-refusals.ts";
7
+ import type { CommandEffects } from "../command-settings.ts";
6
8
  export interface ServiceContext {
9
+ readonly workerHarness?: (operationId: string) => Promise<string | undefined>;
10
+ readonly commandEffects?: CommandEffects;
7
11
  readonly authority: Authority;
8
12
  readonly registry: Registry;
13
+ readonly workflowRefusals?: readonly WorkflowRefusal[];
9
14
  readonly gateway: Gateway;
10
15
  readonly clock: () => string;
11
16
  readonly livenessMilliseconds: number;
@@ -16,6 +21,11 @@ export interface ServiceContext {
16
21
  readonly worldReports?: () => readonly unknown[];
17
22
  readonly changed?: ChangeSignal["next"];
18
23
  }
24
+ export declare function queryMetadata(options: {
25
+ readonly workerHarness?: ServiceContext["workerHarness"];
26
+ readonly commandEffects?: CommandEffects;
27
+ readonly workflowRefusals?: readonly WorkflowRefusal[];
28
+ }): Pick<ServiceContext, "workerHarness" | "commandEffects" | "workflowRefusals">;
19
29
  export declare function result(kind: string, fields: Fields): Reply;
20
30
  export declare function failed(code: string, extra: Fields): Reply;
21
31
  export declare function invalidRequest(detail: string): Reply;
@@ -1,4 +1,16 @@
1
1
  import { isRecordKey } from "../authority/commands.js";
2
+ import { workflowRefusals, } from "../workflow-refusals.js";
3
+ export function queryMetadata(options) {
4
+ return {
5
+ ...(options.workerHarness === undefined
6
+ ? {}
7
+ : { workerHarness: options.workerHarness }),
8
+ ...(options.commandEffects === undefined
9
+ ? {}
10
+ : { commandEffects: options.commandEffects }),
11
+ workflowRefusals: workflowRefusals(options.workflowRefusals),
12
+ };
13
+ }
2
14
  const codes = {
3
15
  "invalid-command": "invalid-request",
4
16
  "request-too-large": "input-too-large",