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,14 @@
1
+ import { workflowSchedules } from "./workflow-schedules.ts";
2
+ interface LoopSettings extends ParametersOfSchedules {
3
+ readonly notifyCommand?: readonly string[];
4
+ readonly notifyMilliseconds?: number;
5
+ readonly queueMilliseconds?: number;
6
+ readonly queueLanes?: number;
7
+ readonly resetQueue?: boolean;
8
+ readonly queueWorkflowId: string;
9
+ }
10
+ type ParametersOfSchedules = Parameters<typeof workflowSchedules>[0];
11
+ export declare function daemonLoops(settings: LoopSettings): Promise<{
12
+ readonly stop: () => Promise<void>;
13
+ }>;
14
+ export {};
@@ -0,0 +1,39 @@
1
+ import { workflowSchedules } from "./workflow-schedules.js";
2
+ import { issueQueue } from "./issue-queue.js";
3
+ import { notifyRuns } from "./notify.js";
4
+ export async function daemonLoops(settings) {
5
+ const schedules = await workflowSchedules(settings);
6
+ try {
7
+ const notifier = settings.notifyCommand === undefined
8
+ ? undefined
9
+ : await notifyRuns({
10
+ directory: settings.directory,
11
+ runtimeDirectory: settings.runtimeDirectory,
12
+ command: settings.notifyCommand,
13
+ ...(settings.notifyMilliseconds === undefined
14
+ ? {}
15
+ : { intervalMilliseconds: settings.notifyMilliseconds }),
16
+ });
17
+ const queue = settings.queueMilliseconds === undefined
18
+ ? undefined
19
+ : issueQueue({
20
+ directory: settings.directory,
21
+ runtimeDirectory: settings.runtimeDirectory,
22
+ intervalMilliseconds: settings.queueMilliseconds,
23
+ lanes: settings.queueLanes ?? 1,
24
+ resetQueue: settings.resetQueue ?? false,
25
+ workflowId: settings.queueWorkflowId,
26
+ });
27
+ return {
28
+ stop: async () => {
29
+ await schedules.stop();
30
+ await notifier?.stop();
31
+ await queue?.stop();
32
+ },
33
+ };
34
+ }
35
+ catch (error) {
36
+ await schedules.stop();
37
+ throw error;
38
+ }
39
+ }
@@ -1,32 +1,5 @@
1
- import { type WorkflowFunction } from "../host/start-delivery.ts";
2
- import { type WorkflowHandler } from "../host/world-host.ts";
3
- import type { TurnProfiles } from "../turn-profile.ts";
4
- import type { TokenPrices } from "../token-prices.ts";
5
- import type { DeclaredWorkflow } from "../workflow-declaration.ts";
6
- import type { Worker } from "./claude-turn.ts";
7
- export interface DaemonSettings {
8
- readonly tokenPrices?: TokenPrices;
9
- readonly worker?: Worker;
10
- readonly profiles?: TurnProfiles;
11
- readonly directory: string;
12
- readonly runtimeDirectory: string;
13
- readonly repository: string;
14
- readonly manifests: Readonly<Record<string, string | undefined>>;
15
- readonly declarations?: readonly DeclaredWorkflow[];
16
- readonly workflows: Readonly<Record<string, WorkflowFunction | undefined>>;
17
- readonly handler: WorkflowHandler;
18
- readonly command: readonly string[];
19
- readonly ticketCommand?: readonly string[];
20
- readonly nextCommand?: readonly string[];
21
- readonly notifyCommand?: readonly string[];
22
- readonly notifyMilliseconds?: number;
23
- readonly queueMilliseconds?: number;
24
- readonly resetQueue?: boolean;
25
- readonly githubCommand?: readonly string[];
26
- readonly checkCommand?: readonly string[];
27
- readonly privateTexts?: readonly string[];
28
- readonly concurrency: number;
29
- }
1
+ import { type DaemonSettings } from "./daemon-adapters.ts";
2
+ export type { DaemonSettings } from "./daemon-adapters.ts";
30
3
  export interface Daemon {
31
4
  readonly socket: string;
32
5
  readonly close: () => Promise<void>;
@@ -46,4 +19,4 @@ export declare const bridgeTiming: {
46
19
  pollMilliseconds: number;
47
20
  retryMilliseconds: number;
48
21
  };
49
- export declare function startDaemon(settings: DaemonSettings): Promise<DaemonOpening>;
22
+ export declare function startDaemon(givenSettings: DaemonSettings): Promise<DaemonOpening>;
@@ -1,19 +1,19 @@
1
- import { mkdir } from "node:fs/promises";
1
+ import { adapters, recoverCommands, } from "./daemon-adapters.js";
2
+ import { mkdir, realpath } from "node:fs/promises";
2
3
  import { join } from "node:path";
3
- import { startDelivery, } from "../host/start-delivery.js";
4
4
  import { registerStepBridge, sdkStepCall, stepBridge, } from "../host/step-bridge-host.js";
5
5
  import { startHost } from "../host/world-host.js";
6
6
  import { worldLoop } from "../host/world-reconciliation.js";
7
- import { cancelled, workflowOutcome, taggedRun, taggedRuns, } from "../host/world-runs.js";
8
- import { startService, } from "../service/service.js";
9
- import { claudeWorker } from "./claude-worker.js";
7
+ import { workflowOutcome, taggedRun, taggedRuns } from "../host/world-runs.js";
8
+ import { startService, serviceLimits, } from "../service/service.js";
9
+ import { workflowGenerations, prepareWorkflowGenerations, } from "./workflow-generations.js";
10
10
  import { deliveryRouter } from "./delivery-router.js";
11
- import { githubWorker } from "./github-worker.js";
12
- import { chatsWorker } from "./chats-worker.js";
11
+ import { commandEffects } from "./command-journal.js";
13
12
  import { worldDirectory } from "./host-environment.js";
14
- import { issueQueue } from "./issue-queue.js";
15
- import { notifyRuns } from "./notify.js";
16
- import { ticketRegistrations, ticketRegistrationTable, } from "./ticket-registration.js";
13
+ import { pinnedWorkflowHandler } from "./workflow-replay.js";
14
+ import { scheduledDeclarations } from "./workflow-schedules.js";
15
+ import { daemonLoops } from "./daemon-loops.js";
16
+ import { ticketRegistrations, ticketRegistrationTable, issueWorkflow, } from "./ticket-registration.js";
17
17
  export const turnLeaseMilliseconds = 4 * 3_600_000;
18
18
  export const loopMilliseconds = 250;
19
19
  export const bridgeTiming = {
@@ -21,11 +21,23 @@ export const bridgeTiming = {
21
21
  pollMilliseconds: 250,
22
22
  retryMilliseconds: 1_000,
23
23
  };
24
- async function hosted(settings, ports) {
24
+ async function hosted(settings, hosting) {
25
+ const { ports, generations } = hosting;
26
+ await prepareWorkflowGenerations(ports, generations);
25
27
  const opening = await startHost({
26
28
  dataDirectory: worldDirectory(settings.directory),
27
29
  concurrency: settings.concurrency,
28
- handler: settings.handler,
30
+ handler: pinnedWorkflowHandler(async (request, runId) => {
31
+ const generation = await generations.resolve(await ports.workflow.manifest(runId));
32
+ return generation === undefined
33
+ ? new Response("pinned-workflow-unavailable", { status: 503 })
34
+ : generation.handler(request);
35
+ }, {
36
+ state: ports.state,
37
+ run: taggedRun,
38
+ available: ports.workflow.available,
39
+ submit: ports.submit,
40
+ }),
29
41
  });
30
42
  if (opening.kind === "refused")
31
43
  throw new Error(`${opening.reason}: ${opening.detail}`);
@@ -53,143 +65,153 @@ async function hosted(settings, ports) {
53
65
  },
54
66
  };
55
67
  }
56
- function githubOf(settings, given) {
57
- const { directory, repository, checkCommand } = settings;
58
- return githubWorker({
59
- document: async (digest) => (await given).document(digest),
60
- report: async (effect) => (await given).reportEffect(effect),
61
- operationStatus: async (operationId) => (await (await given).operation(operationId))?.status,
62
- runStatus: async (runId) => (await (await given).state()).runs[runId]?.status,
63
- repository,
64
- gh: settings.githubCommand ?? ["gh"],
65
- worktrees: join(directory, "worktrees"),
66
- journal: join(directory, "github"),
67
- ...(settings.privateTexts === undefined
68
+ async function daemonRegistrations(settings) {
69
+ const conflict = settings.workflowRefusals?.find((refusal) => refusal.codes.includes("queue-workflow-conflict"));
70
+ if (conflict !== undefined)
71
+ return {
72
+ table: [],
73
+ admitted: {
74
+ kind: "rejected",
75
+ detail: `queue-workflow-conflict: ${conflict.scope} ${conflict.label}`,
76
+ },
77
+ };
78
+ const table = ticketRegistrationTable({
79
+ repository: settings.repository,
80
+ command: settings.ticketCommand,
81
+ nextCommand: settings.nextCommand,
82
+ githubCommand: settings.githubCommand,
83
+ }, settings.declarations);
84
+ const admitted = await ticketRegistrations(settings.manifests, {
85
+ table,
86
+ commands: settings.commands ?? {},
87
+ ...(settings.bundleDigest === undefined
68
88
  ? {}
69
- : { privateTexts: settings.privateTexts }),
70
- ...(checkCommand === undefined ? {} : { check: checkCommand }),
89
+ : { bundleDigest: settings.bundleDigest }),
71
90
  });
91
+ return {
92
+ table,
93
+ admitted: admitted.kind === "rejected"
94
+ ? admitted
95
+ : {
96
+ ...admitted,
97
+ registrations: admitted.registrations.map((registration) => ({
98
+ ...registration,
99
+ ...(settings.queueMilliseconds !== undefined &&
100
+ registration.workflowId === queueWorkflowId(settings)
101
+ ? { admission: settings.queueLanes ?? 1, queue: true }
102
+ : {}),
103
+ })),
104
+ },
105
+ };
72
106
  }
73
- function adapters(settings, options) {
74
- const { directory, repository, command } = settings;
75
- const { given, table } = options;
76
- const workflows = Object.fromEntries(table.map((row) => [row.workflowId, settings.workflows[row.functionName]]));
77
- const document = async (digest) => (await given).document(digest);
78
- const report = async (effect) => (await given).reportEffect(effect);
79
- const worker = claudeWorker({
80
- tokenPrices: settings.tokenPrices ?? {},
81
- worker: settings.worker ?? "claude",
82
- profiles: settings.profiles ?? {},
83
- workflowId: async (runId) => (await given).workflowId(runId),
107
+ export async function startDaemon(givenSettings) {
108
+ const repository = await realpath(givenSettings.repository);
109
+ const scheduled = scheduledDeclarations(givenSettings, {
84
110
  repository,
85
- command,
86
- document,
87
- report,
88
- worktrees: join(directory, "worktrees"),
89
- journal: join(directory, "journal"),
90
- });
91
- const github = githubOf(settings, given);
92
- const chats = chatsWorker({
93
- runtimeDirectory: settings.runtimeDirectory,
94
- document,
95
- workflowId: async (runId) => (await given).workflowId(runId),
111
+ documentBytes: serviceLimits.documentBytes,
96
112
  });
97
- const runs = startDelivery({
98
- document,
99
- runs: taggedRuns,
100
- cancel: cancelled,
101
- input: async (runId) => (await given).input(runId),
102
- workflow: async (runId) => workflows[String(await (await given).workflowId(runId))],
113
+ if (scheduled.kind === "refused")
114
+ return scheduled;
115
+ return openDaemon({
116
+ ...givenSettings,
117
+ declarations: scheduled.declarations,
118
+ repository,
103
119
  });
104
- return { worker, github, runs, chats };
105
120
  }
106
- export async function startDaemon(settings) {
107
- const { directory } = settings;
108
- const table = ticketRegistrationTable({
109
- repository: settings.repository,
110
- command: settings.ticketCommand,
111
- nextCommand: settings.nextCommand,
112
- }, settings.declarations);
113
- const admitted = await ticketRegistrations(settings.manifests, { table });
121
+ async function openDaemon(settings) {
122
+ const { table, admitted } = await daemonRegistrations(settings);
114
123
  if (admitted.kind === "rejected")
115
124
  return {
116
125
  kind: "refused",
117
- reason: "workflow-rejected",
126
+ reason: admitted.detail.startsWith("queue-workflow-conflict")
127
+ ? "queue-workflow-conflict"
128
+ : "workflow-rejected",
118
129
  detail: admitted.detail,
119
130
  };
120
131
  const given = Promise.withResolvers();
121
- const { worker, github, runs, chats } = adapters(settings, {
122
- given: given.promise,
132
+ const generations = workflowGenerations({
133
+ ...settings,
134
+ registrations: admitted.registrations,
123
135
  table,
124
136
  });
125
- await mkdir(join(directory, "state"), { recursive: true });
137
+ const resources = adapters(settings, { given: given.promise, generations });
138
+ const { worker, github, runs, handoff, commands } = resources;
139
+ await mkdir(join(settings.directory, "state"), { recursive: true });
126
140
  await mkdir(settings.runtimeDirectory, { recursive: true, mode: 0o700 });
127
141
  const opening = await startService({
128
- stateDirectory: join(directory, "state"),
142
+ workerHarness: worker.harness,
143
+ commandEffects: commandEffects(join(settings.directory, "commands")),
144
+ stateDirectory: join(settings.directory, "state"),
129
145
  runtimeDirectory: settings.runtimeDirectory,
130
- workflows: admitted.registrations.map((registration) => ({
131
- ...registration,
132
- ...(settings.queueMilliseconds !== undefined &&
133
- registration.workflowId === "develop-issue"
134
- ? { admission: "when-idle" }
135
- : {}),
136
- })),
146
+ workflowBundles: {
147
+ directory: join(settings.directory, "workflow-bundles"),
148
+ repository: settings.repository,
149
+ },
150
+ workflowRefusals: settings.workflowRefusals ?? [],
151
+ workflows: admitted.registrations,
152
+ retainedWorkflow: generations.available,
137
153
  delivery: deliveryRouter({
138
154
  runs,
139
- effects: { claude: worker, github, chats },
155
+ effects: { claude: worker, github, handoff, command: commands },
140
156
  }),
141
157
  effects: { leaseMilliseconds: turnLeaseMilliseconds },
142
158
  host: (ports) => {
143
159
  given.resolve(ports);
144
- return hosted(settings, ports);
160
+ return hosted(settings, { ports, generations });
145
161
  },
146
162
  });
147
163
  if (opening.kind === "refused") {
148
- await Promise.all([worker.close(), github.close(), chats.close()]);
164
+ await closeWorkers(resources);
149
165
  return opening;
150
166
  }
167
+ const running = { ...resources, service: opening.service };
168
+ await recoverWorkers(running, given.promise);
151
169
  return {
152
170
  kind: "started",
153
- daemon: await runningDaemon(settings, {
154
- service: opening.service,
155
- worker,
156
- github,
157
- chats,
158
- }),
171
+ daemon: await runningDaemon(settings, running),
159
172
  };
160
173
  }
174
+ async function recoverWorkers(resources, ports) {
175
+ try {
176
+ await recoverCommands(resources.commands, await ports);
177
+ }
178
+ catch (error) {
179
+ await Promise.allSettled([
180
+ closeWorkers(resources),
181
+ resources.service.close(),
182
+ ]);
183
+ throw error;
184
+ }
185
+ }
186
+ async function closeWorkers(resources) {
187
+ await Promise.all([
188
+ resources.worker.close(),
189
+ resources.github.close(),
190
+ resources.commands.close(),
191
+ ]);
192
+ }
161
193
  async function runningDaemon(settings, resources) {
162
- const { service, worker, github, chats } = resources;
194
+ const { service, github } = resources;
163
195
  await github.scan();
164
- const notifier = settings.notifyCommand === undefined
165
- ? undefined
166
- : await notifyRuns({
167
- directory: settings.directory,
168
- runtimeDirectory: settings.runtimeDirectory,
169
- command: settings.notifyCommand,
170
- ...(settings.notifyMilliseconds === undefined
171
- ? {}
172
- : { intervalMilliseconds: settings.notifyMilliseconds }),
173
- }).catch(async (error) => {
174
- await Promise.all([worker.close(), github.close(), chats.close()]);
175
- await service.close();
176
- throw error;
177
- });
178
- const queue = settings.queueMilliseconds === undefined
179
- ? undefined
180
- : issueQueue({
181
- directory: settings.directory,
182
- runtimeDirectory: settings.runtimeDirectory,
183
- intervalMilliseconds: settings.queueMilliseconds,
184
- resetQueue: settings.resetQueue ?? false,
185
- });
196
+ const loops = await daemonLoops({
197
+ ...settings,
198
+ submit: service.worker.submit,
199
+ queueWorkflowId: queueWorkflowId(settings),
200
+ }).catch(async (error) => {
201
+ await closeWorkers(resources);
202
+ await service.close();
203
+ throw error;
204
+ });
186
205
  return {
187
206
  socket: service.socket,
188
207
  close: async () => {
189
- await notifier?.stop();
190
- await queue?.stop();
191
- await Promise.all([worker.close(), github.close(), chats.close()]);
208
+ await loops.stop();
209
+ await closeWorkers(resources);
192
210
  await service.close();
193
211
  },
194
212
  };
195
213
  }
214
+ function queueWorkflowId(settings) {
215
+ return (settings.declarations?.find((declaration) => declaration.queue === true)
216
+ ?.workflowId ?? issueWorkflow);
217
+ }
@@ -0,0 +1,3 @@
1
+ import type { Fields } from "../protocol.ts";
2
+ import type { ResolutionRequest } from "../service/registry.ts";
3
+ export declare function declaredInput(repository: string, request: Pick<ResolutionRequest, "commandId" | "submission">): Fields;
@@ -0,0 +1,9 @@
1
+ import { createHash } from "node:crypto";
2
+ export function declaredInput(repository, request) {
3
+ const digest = createHash("sha256").update(request.commandId).digest("hex");
4
+ return {
5
+ cycleId: `task-${digest.slice(0, 12)}`,
6
+ repository,
7
+ input: request.submission,
8
+ };
9
+ }
@@ -17,7 +17,7 @@ export function deliveryRouter(routes) {
17
17
  return {
18
18
  deliver: (intent, signal) => {
19
19
  if (!protectedEffect(intent))
20
- return runs.deliver(intent);
20
+ return runs.deliver(intent, signal);
21
21
  return workerOf(routes, intent)?.deliver(intent, signal) ?? refusal();
22
22
  },
23
23
  reconcile: (intent, signal) => {
@@ -25,6 +25,12 @@ export function deliveryRouter(routes) {
25
25
  return runs.reconcile(intent);
26
26
  return workerOf(routes, intent)?.reconcile(intent, signal) ?? refusal();
27
27
  },
28
+ retry: (intent, signal) => {
29
+ if (!protectedEffect(intent))
30
+ return refusal();
31
+ return (workerOf(routes, intent)?.retry?.(intent, signal) ??
32
+ Promise.resolve({ kind: "unknown" }));
33
+ },
28
34
  stop: (intent, signal) => {
29
35
  if (!protectedEffect(intent))
30
36
  return runs.stop(intent);
@@ -0,0 +1,4 @@
1
+ export declare function geminiStream(): {
2
+ readonly line: (line: string) => readonly string[];
3
+ readonly result: (exitCode: number | null) => string;
4
+ };
@@ -0,0 +1,129 @@
1
+ import { record } from "../protocol.js";
2
+ import { sumUsage, usageOf, } from "../worker-usage.js";
3
+ function parsed(line) {
4
+ try {
5
+ return record(JSON.parse(line)) ?? {};
6
+ }
7
+ catch {
8
+ return {};
9
+ }
10
+ }
11
+ function text(value) {
12
+ return typeof value === "string" ? value : "";
13
+ }
14
+ function usage(value) {
15
+ const fields = record(value) ?? {};
16
+ return usageOf({
17
+ input_tokens: fields["input_tokens"],
18
+ output_tokens: fields["output_tokens"],
19
+ cache_read_input_tokens: fields["cached"],
20
+ });
21
+ }
22
+ function statistics(event, state) {
23
+ const stats = record(event["stats"]);
24
+ const models = record(stats?.["models"]);
25
+ state.models =
26
+ models === undefined
27
+ ? undefined
28
+ : Object.entries(models).map(([model, counts]) => ({
29
+ model,
30
+ usage: usage(counts),
31
+ }));
32
+ state.usage =
33
+ state.models === undefined
34
+ ? usage(stats)
35
+ : sumUsage(state.models.map((entry) => entry.usage));
36
+ }
37
+ function completed(event, state) {
38
+ statistics(event, state);
39
+ state.success = event["status"] === "success";
40
+ if (!state.success)
41
+ state.failure =
42
+ text(record(event["error"])?.["message"]) ||
43
+ "Gemini result was not successful";
44
+ }
45
+ function message(event, state) {
46
+ if (event["role"] === "user")
47
+ state.continuing = false;
48
+ if (event["role"] !== "assistant")
49
+ return [];
50
+ const content = text(event["content"]);
51
+ state.message =
52
+ state.continuing && event["delta"] === true
53
+ ? state.message + content
54
+ : content;
55
+ state.continuing = true;
56
+ return [
57
+ JSON.stringify({
58
+ type: "assistant",
59
+ message: { content: [{ type: "text", text: content }] },
60
+ }),
61
+ ];
62
+ }
63
+ function toolUse(event) {
64
+ return [
65
+ JSON.stringify({
66
+ type: "assistant",
67
+ message: {
68
+ content: [
69
+ {
70
+ type: "tool_use",
71
+ name: text(event["tool_name"]),
72
+ input: record(event["parameters"]) ?? {},
73
+ },
74
+ ],
75
+ },
76
+ }),
77
+ ];
78
+ }
79
+ function received(event, state) {
80
+ if (event["severity"] === "error")
81
+ state.failure = text(event["message"]) || "Gemini error";
82
+ switch (event["type"]) {
83
+ case "init":
84
+ state.model = text(event["model"]) || null;
85
+ state.sessionId = text(event["session_id"]) || null;
86
+ break;
87
+ case "result":
88
+ completed(event, state);
89
+ break;
90
+ case "message":
91
+ return message(event, state);
92
+ case "tool_use":
93
+ state.continuing = false;
94
+ return toolUse(event);
95
+ case "tool_result":
96
+ state.continuing = false;
97
+ }
98
+ return [];
99
+ }
100
+ export function geminiStream() {
101
+ const state = {
102
+ model: null,
103
+ sessionId: null,
104
+ message: "",
105
+ continuing: false,
106
+ success: false,
107
+ failure: null,
108
+ models: undefined,
109
+ usage: usageOf(null),
110
+ };
111
+ return {
112
+ line: (line) => received(parsed(line), state),
113
+ result: (exitCode) => {
114
+ const success = exitCode === 0 && state.success && state.failure === null;
115
+ return JSON.stringify({
116
+ type: "result",
117
+ is_error: !success,
118
+ result: success
119
+ ? state.message
120
+ : (state.failure ??
121
+ `gemini ended with code ${String(exitCode)} without a successful result`),
122
+ model: state.model,
123
+ session_id: state.sessionId,
124
+ usage: state.usage,
125
+ models: state.models,
126
+ });
127
+ },
128
+ };
129
+ }
@@ -24,6 +24,10 @@ export interface Finding {
24
24
  readonly line: number | null;
25
25
  readonly body: string;
26
26
  }
27
+ export declare function githubText(text: string, settings: {
28
+ readonly environment?: NodeJS.ProcessEnv;
29
+ readonly privateTexts?: readonly string[];
30
+ }): string;
27
31
  export declare function calls(settings: CallSettings, signal: AbortSignal): Calls;
28
32
  export declare function scoreOf(comments: unknown, commit: string): Scored | undefined;
29
33
  export declare function findingsOf(comments: unknown, commit: string): readonly Finding[];
@@ -22,17 +22,26 @@ function privateEnvironment(environment) {
22
22
  function failureDetail(error, place) {
23
23
  const stderr = field(error, "stderr");
24
24
  const text = typeof stderr === "string" ? stderr : "";
25
- const secrets = Object.entries(place.environment)
25
+ return {
26
+ detail: githubText(text, place).slice(-2_000),
27
+ status: Number(/\(HTTP (\d{3})\)/.exec(text)?.[1]),
28
+ };
29
+ }
30
+ export function githubText(text, settings) {
31
+ const environment = { ...process.env, ...settings.environment };
32
+ const secrets = Object.entries(environment)
26
33
  .filter(([name]) => /TOKEN|SECRET|PASSWORD|KEY/i.test(name))
27
34
  .map(([, value]) => value);
28
- const hidden = [...secrets, ...place.privateTexts]
35
+ const privateTexts = [
36
+ ...(settings.privateTexts ?? []),
37
+ ...privateEnvironment(environment),
38
+ ];
39
+ const hidden = [...secrets, ...privateTexts]
29
40
  .filter((value) => typeof value === "string" && value !== "")
30
41
  .sort((left, right) => right.length - left.length);
31
- const detail = hidden.reduce((redacted, value) => redacted.replaceAll(value, "[hidden]"), text);
32
- return {
33
- detail: detail.slice(-2_000),
34
- status: Number(/\(HTTP (\d{3})\)/.exec(text)?.[1]),
35
- };
42
+ return hidden.reduce((redacted, value) => redacted.replaceAll(privateTexts.includes(value)
43
+ ? new RegExp(value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi")
44
+ : value, "[hidden]"), text);
36
45
  }
37
46
  async function output(command, place) {
38
47
  try {
@@ -0,0 +1,26 @@
1
+ import { type Operation } from "./github-operation.ts";
2
+ export interface CiRerun {
3
+ readonly run: string;
4
+ readonly requestedAt: number;
5
+ readonly output: string;
6
+ }
7
+ export interface CiWait {
8
+ readonly commit: string;
9
+ readonly startedAt: number;
10
+ readonly reruns: CiRerun[];
11
+ }
12
+ export declare function ciWait(operation: Operation, commit: string): Promise<CiWait>;
13
+ export declare function workflowAttempt(operation: Operation, run: string): Promise<{
14
+ readonly attempt: number;
15
+ readonly status: string;
16
+ }>;
17
+ export declare function attemptChecks(operation: Operation, workflow: {
18
+ readonly run: string;
19
+ readonly attempt: number;
20
+ }): Promise<ReadonlySet<number>>;
21
+ export declare function rerunCi(operation: Operation, request: {
22
+ readonly wait: CiWait;
23
+ readonly rerun: CiRerun;
24
+ readonly deadline: number;
25
+ }): Promise<void>;
26
+ export declare function attemptOutput(attempts: readonly string[]): string;