cloving 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/README.md +525 -185
  2. package/dist/src/agent-harness-shell.d.ts +12 -0
  3. package/dist/src/agent-harness-shell.js +90 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/commands.d.ts +1 -0
  9. package/dist/src/authority/commands.js +24 -4
  10. package/dist/src/authority/gate-reduction.d.ts +1 -0
  11. package/dist/src/authority/gate-reduction.js +18 -3
  12. package/dist/src/authority/gates.d.ts +2 -1
  13. package/dist/src/authority/gates.js +5 -1
  14. package/dist/src/authority/operations.js +1 -1
  15. package/dist/src/authority/reduction.d.ts +1 -1
  16. package/dist/src/authority/reduction.js +6 -1
  17. package/dist/src/authority/status-input.d.ts +1 -1
  18. package/dist/src/authority/status.d.ts +1 -0
  19. package/dist/src/authority/status.js +27 -3
  20. package/dist/src/authority/transitions.d.ts +5 -5
  21. package/dist/src/authority/transitions.js +6 -0
  22. package/dist/src/broker/actor/authority-delivery.js +1 -0
  23. package/dist/src/broker/actor/authority-queries.d.ts +7 -1
  24. package/dist/src/broker/actor/authority-queries.js +17 -2
  25. package/dist/src/broker/actor/authority-receipts.js +11 -1
  26. package/dist/src/broker/actor/authority-session.js +2 -2
  27. package/dist/src/broker/actor/authority-settings.js +4 -0
  28. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  29. package/dist/src/broker/actor/delivery-intents.js +4 -4
  30. package/dist/src/broker/actor/effect-delivery.js +4 -1
  31. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  32. package/dist/src/broker/actor/effect-queries.js +7 -0
  33. package/dist/src/broker/actor/pin-check.js +1 -1
  34. package/dist/src/broker/actor/stop-plan.js +1 -1
  35. package/dist/src/broker/actor/turn-state.js +1 -1
  36. package/dist/src/broker/authority-admission.js +22 -9
  37. package/dist/src/broker/authority-restore.js +1 -0
  38. package/dist/src/broker/decision-restore.js +4 -4
  39. package/dist/src/broker/socket-address.d.ts +3 -1
  40. package/dist/src/broker/socket-address.js +2 -2
  41. package/dist/src/cli/arguments.d.ts +11 -13
  42. package/dist/src/cli/arguments.js +37 -107
  43. package/dist/src/cli/command-effects.d.ts +7 -0
  44. package/dist/src/cli/command-effects.js +39 -0
  45. package/dist/src/cli/commands.js +11 -4
  46. package/dist/src/cli/config-arguments.d.ts +11 -0
  47. package/dist/src/cli/config-arguments.js +59 -0
  48. package/dist/src/cli/config-command.d.ts +2 -0
  49. package/dist/src/cli/config-command.js +105 -0
  50. package/dist/src/cli/config-file.d.ts +3 -0
  51. package/dist/src/cli/config-file.js +50 -0
  52. package/dist/src/cli/config-lock.d.ts +7 -0
  53. package/dist/src/cli/config-lock.js +61 -0
  54. package/dist/src/cli/config-notice.d.ts +5 -0
  55. package/dist/src/cli/config-notice.js +46 -0
  56. package/dist/src/cli/doctor-github.d.ts +9 -0
  57. package/dist/src/cli/doctor-github.js +138 -0
  58. package/dist/src/cli/doctor-harness.d.ts +13 -0
  59. package/dist/src/cli/doctor-harness.js +242 -0
  60. package/dist/src/cli/doctor-local.d.ts +18 -0
  61. package/dist/src/cli/doctor-local.js +77 -0
  62. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  63. package/dist/src/cli/doctor-runtime.js +176 -0
  64. package/dist/src/cli/doctor-service.d.ts +1 -0
  65. package/dist/src/cli/doctor-service.js +11 -0
  66. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  67. package/dist/src/cli/doctor-workflows.js +45 -0
  68. package/dist/src/cli/doctor.d.ts +15 -0
  69. package/dist/src/cli/doctor.js +190 -0
  70. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  71. package/dist/src/cli/github-ci-progress.js +83 -0
  72. package/dist/src/cli/github-retry.d.ts +6 -0
  73. package/dist/src/cli/github-retry.js +47 -0
  74. package/dist/src/cli/harness-probes.d.ts +22 -0
  75. package/dist/src/cli/harness-probes.js +183 -0
  76. package/dist/src/cli/main.d.ts +7 -1
  77. package/dist/src/cli/main.js +39 -61
  78. package/dist/src/cli/phone-arguments.d.ts +14 -0
  79. package/dist/src/cli/phone-arguments.js +37 -0
  80. package/dist/src/cli/phone-client.d.ts +2 -0
  81. package/dist/src/cli/phone-client.js +32 -0
  82. package/dist/src/cli/phone-command.d.ts +13 -0
  83. package/dist/src/cli/phone-command.js +101 -0
  84. package/dist/src/cli/probe-command.d.ts +36 -0
  85. package/dist/src/cli/probe-command.js +59 -0
  86. package/dist/src/cli/project-settings.d.ts +4 -0
  87. package/dist/src/cli/project-settings.js +33 -0
  88. package/dist/src/cli/render.d.ts +2 -1
  89. package/dist/src/cli/render.js +44 -28
  90. package/dist/src/cli/report-github.d.ts +18 -0
  91. package/dist/src/cli/report-github.js +200 -0
  92. package/dist/src/cli/report.d.ts +17 -0
  93. package/dist/src/cli/report.js +192 -0
  94. package/dist/src/cli/repository-arguments.d.ts +5 -0
  95. package/dist/src/cli/repository-arguments.js +34 -0
  96. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  97. package/dist/src/cli/runtime-arguments.js +15 -0
  98. package/dist/src/cli/runtime-directory.d.ts +6 -2
  99. package/dist/src/cli/runtime-directory.js +72 -14
  100. package/dist/src/cli/toolchain.d.ts +2 -0
  101. package/dist/src/cli/toolchain.js +22 -2
  102. package/dist/src/cli/usage-render.d.ts +5 -0
  103. package/dist/src/cli/usage-render.js +40 -1
  104. package/dist/src/cli/usage.d.ts +3 -3
  105. package/dist/src/cli/usage.js +70 -44
  106. package/dist/src/cli/watch-actions.d.ts +2 -0
  107. package/dist/src/cli/watch-actions.js +4 -4
  108. package/dist/src/cli/watch-board-view.d.ts +1 -1
  109. package/dist/src/cli/watch-board-view.js +8 -2
  110. package/dist/src/cli/watch-board.js +23 -10
  111. package/dist/src/cli/watch-card-forms.js +2 -2
  112. package/dist/src/cli/watch-client.d.ts +1 -1
  113. package/dist/src/cli/watch-client.js +7 -2
  114. package/dist/src/cli/watch-header-view.d.ts +27 -0
  115. package/dist/src/cli/watch-header-view.js +116 -0
  116. package/dist/src/cli/watch-model.js +17 -4
  117. package/dist/src/cli/watch-page.js +48 -12
  118. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  119. package/dist/src/cli/watch-phone-client.js +84 -0
  120. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  121. package/dist/src/cli/watch-phone-view.js +113 -0
  122. package/dist/src/cli/watch-phone.d.ts +5 -0
  123. package/dist/src/cli/watch-phone.js +53 -0
  124. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  125. package/dist/src/cli/watch-pull-request.js +4 -0
  126. package/dist/src/cli/watch-render.d.ts +9 -1
  127. package/dist/src/cli/watch-server.js +23 -5
  128. package/dist/src/cli/watch-turn.d.ts +4 -1
  129. package/dist/src/cli/watch-turn.js +37 -1
  130. package/dist/src/cli/watch-usage.js +5 -1
  131. package/dist/src/cli/watch-view.d.ts +6 -20
  132. package/dist/src/cli/watch-view.js +14 -106
  133. package/dist/src/cli.js +106 -23
  134. package/dist/src/command-settings.d.ts +16 -0
  135. package/dist/src/command-settings.js +42 -0
  136. package/dist/src/configuration-change.d.ts +11 -0
  137. package/dist/src/configuration-change.js +62 -0
  138. package/dist/src/configuration-display.d.ts +21 -0
  139. package/dist/src/configuration-display.js +69 -0
  140. package/dist/src/configuration-schema.d.ts +49 -0
  141. package/dist/src/configuration-schema.js +159 -0
  142. package/dist/src/daemon/claude-turn.d.ts +19 -5
  143. package/dist/src/daemon/claude-turn.js +116 -53
  144. package/dist/src/daemon/claude-worker.d.ts +3 -3
  145. package/dist/src/daemon/claude-worker.js +65 -76
  146. package/dist/src/daemon/command-journal.d.ts +5 -0
  147. package/dist/src/daemon/command-journal.js +50 -0
  148. package/dist/src/daemon/command-process.d.ts +28 -0
  149. package/dist/src/daemon/command-process.js +164 -0
  150. package/dist/src/daemon/command-worker.d.ts +19 -0
  151. package/dist/src/daemon/command-worker.js +182 -0
  152. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  153. package/dist/src/daemon/cursor-stream.js +154 -0
  154. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  155. package/dist/src/daemon/daemon-adapters.js +102 -0
  156. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  157. package/dist/src/daemon/daemon-loops.js +39 -0
  158. package/dist/src/daemon/daemon.d.ts +2 -33
  159. package/dist/src/daemon/daemon.js +126 -132
  160. package/dist/src/daemon/declared-input.d.ts +3 -0
  161. package/dist/src/daemon/declared-input.js +9 -0
  162. package/dist/src/daemon/delivery-router.js +1 -1
  163. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  164. package/dist/src/daemon/gemini-stream.js +129 -0
  165. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  166. package/dist/src/daemon/github-ci-rerun.js +92 -0
  167. package/dist/src/daemon/github-ci.js +89 -8
  168. package/dist/src/daemon/github-merge-call.d.ts +2 -0
  169. package/dist/src/daemon/github-merge.js +7 -3
  170. package/dist/src/daemon/github-methods.js +10 -0
  171. package/dist/src/daemon/github-operation.d.ts +1 -0
  172. package/dist/src/daemon/github-retry.js +8 -44
  173. package/dist/src/daemon/issue-queue.d.ts +1 -0
  174. package/dist/src/daemon/issue-queue.js +3 -26
  175. package/dist/src/daemon/notify.js +2 -1
  176. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  177. package/dist/src/daemon/opencode-stream.js +87 -0
  178. package/dist/src/daemon/queue-status.d.ts +4 -0
  179. package/dist/src/daemon/queue-status.js +38 -0
  180. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  181. package/dist/src/daemon/retry-worktree.js +139 -0
  182. package/dist/src/daemon/retrying-turn.d.ts +2 -0
  183. package/dist/src/daemon/retrying-turn.js +108 -30
  184. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  185. package/dist/src/daemon/schedule-journal.js +57 -0
  186. package/dist/src/daemon/text-output.d.ts +18 -0
  187. package/dist/src/daemon/text-output.js +44 -0
  188. package/dist/src/daemon/ticket-registration.d.ts +5 -7
  189. package/dist/src/daemon/ticket-registration.js +85 -40
  190. package/dist/src/daemon/turn-command.d.ts +10 -0
  191. package/dist/src/daemon/turn-command.js +33 -0
  192. package/dist/src/daemon/turn-report.d.ts +18 -0
  193. package/dist/src/daemon/turn-report.js +79 -0
  194. package/dist/src/daemon/work-tree.d.ts +2 -1
  195. package/dist/src/daemon/work-tree.js +15 -12
  196. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  197. package/dist/src/daemon/workflow-generations.js +57 -0
  198. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  199. package/dist/src/daemon/workflow-replay.js +58 -0
  200. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  201. package/dist/src/daemon/workflow-schedules.js +185 -0
  202. package/dist/src/decision-wait.d.ts +1 -0
  203. package/dist/src/decision-wait.js +3 -0
  204. package/dist/src/delivery-backoff.d.ts +1 -0
  205. package/dist/src/delivery-backoff.js +3 -0
  206. package/dist/src/doctor-report.d.ts +24 -0
  207. package/dist/src/doctor-report.js +70 -0
  208. package/dist/src/execution-pin.d.ts +5 -0
  209. package/dist/src/execution-pin.js +67 -4
  210. package/dist/src/grok-result.d.ts +12 -0
  211. package/dist/src/grok-result.js +61 -0
  212. package/dist/src/harness-defaults.d.ts +35 -0
  213. package/dist/src/harness-defaults.js +121 -0
  214. package/dist/src/host/decision-resume.d.ts +35 -0
  215. package/dist/src/host/decision-resume.js +86 -0
  216. package/dist/src/host/gate-bridge.d.ts +48 -0
  217. package/dist/src/host/gate-bridge.js +124 -0
  218. package/dist/src/host/run-wait.d.ts +26 -0
  219. package/dist/src/host/run-wait.js +37 -0
  220. package/dist/src/host/start-delivery.d.ts +1 -1
  221. package/dist/src/host/start-delivery.js +10 -3
  222. package/dist/src/host/step-bridge-host.d.ts +6 -20
  223. package/dist/src/host/step-bridge-host.js +44 -58
  224. package/dist/src/merge-request.d.ts +19 -0
  225. package/dist/src/merge-request.js +32 -0
  226. package/dist/src/phone/canonical-json.d.ts +1 -0
  227. package/dist/src/phone/canonical-json.js +16 -0
  228. package/dist/src/phone/phone-link.d.ts +7 -0
  229. package/dist/src/phone/phone-link.js +21 -0
  230. package/dist/src/phone/qr-data.d.ts +8 -0
  231. package/dist/src/phone/qr-data.js +133 -0
  232. package/dist/src/phone/qr-matrix.d.ts +6 -0
  233. package/dist/src/phone/qr-matrix.js +175 -0
  234. package/dist/src/phone/qr-penalty.d.ts +3 -0
  235. package/dist/src/phone/qr-penalty.js +67 -0
  236. package/dist/src/phone/qr-picture.d.ts +5 -0
  237. package/dist/src/phone/qr-picture.js +24 -0
  238. package/dist/src/private-config.schema.json +263 -0
  239. package/dist/src/project-config.schema.json +65 -0
  240. package/dist/src/project-settings.d.ts +19 -0
  241. package/dist/src/project-settings.js +131 -0
  242. package/dist/src/relay/answer-check.d.ts +24 -0
  243. package/dist/src/relay/answer-check.js +145 -0
  244. package/dist/src/relay/answer-inbox.d.ts +15 -0
  245. package/dist/src/relay/answer-inbox.js +173 -0
  246. package/dist/src/relay/daemon-keys.d.ts +16 -0
  247. package/dist/src/relay/daemon-keys.js +75 -0
  248. package/dist/src/relay/decision-check.d.ts +3 -0
  249. package/dist/src/relay/decision-check.js +77 -0
  250. package/dist/src/relay/decision-close.d.ts +6 -0
  251. package/dist/src/relay/decision-close.js +72 -0
  252. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  253. package/dist/src/relay/decision-envelopes.js +93 -0
  254. package/dist/src/relay/decision-watch.d.ts +14 -0
  255. package/dist/src/relay/decision-watch.js +68 -0
  256. package/dist/src/relay/envelope-post.d.ts +8 -0
  257. package/dist/src/relay/envelope-post.js +71 -0
  258. package/dist/src/relay/envelope.d.ts +28 -0
  259. package/dist/src/relay/envelope.js +53 -0
  260. package/dist/src/relay/hpke.d.ts +25 -0
  261. package/dist/src/relay/hpke.js +108 -0
  262. package/dist/src/relay/pairing-checks.d.ts +42 -0
  263. package/dist/src/relay/pairing-checks.js +172 -0
  264. package/dist/src/relay/pairing-follow.d.ts +8 -0
  265. package/dist/src/relay/pairing-follow.js +95 -0
  266. package/dist/src/relay/pairing-session.d.ts +29 -0
  267. package/dist/src/relay/pairing-session.js +87 -0
  268. package/dist/src/relay/phone-delivery.d.ts +51 -0
  269. package/dist/src/relay/phone-delivery.js +139 -0
  270. package/dist/src/relay/phone-devices.d.ts +36 -0
  271. package/dist/src/relay/phone-devices.js +46 -0
  272. package/dist/src/relay/phone-inbox.d.ts +18 -0
  273. package/dist/src/relay/phone-inbox.js +17 -0
  274. package/dist/src/relay/phone-operations.d.ts +18 -0
  275. package/dist/src/relay/phone-operations.js +121 -0
  276. package/dist/src/relay/phone-outbox.d.ts +21 -0
  277. package/dist/src/relay/phone-outbox.js +25 -0
  278. package/dist/src/relay/phone-socket.d.ts +6 -0
  279. package/dist/src/relay/phone-socket.js +63 -0
  280. package/dist/src/relay/relay-control.d.ts +7 -0
  281. package/dist/src/relay/relay-control.js +24 -0
  282. package/dist/src/relay/relay-files.d.ts +2 -0
  283. package/dist/src/relay/relay-files.js +23 -0
  284. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  285. package/dist/src/relay/relay-heartbeat.js +81 -0
  286. package/dist/src/relay/relay-http.d.ts +14 -0
  287. package/dist/src/relay/relay-http.js +63 -0
  288. package/dist/src/relay/relay-registration.d.ts +15 -0
  289. package/dist/src/relay/relay-registration.js +63 -0
  290. package/dist/src/relay/relay-service.d.ts +25 -0
  291. package/dist/src/relay/relay-service.js +216 -0
  292. package/dist/src/relay/relay-store.d.ts +48 -0
  293. package/dist/src/relay/relay-store.js +131 -0
  294. package/dist/src/relay/sealed-post.d.ts +25 -0
  295. package/dist/src/relay/sealed-post.js +52 -0
  296. package/dist/src/relay.d.ts +1 -0
  297. package/dist/src/relay.js +8 -0
  298. package/dist/src/report-statistics.d.ts +50 -0
  299. package/dist/src/report-statistics.js +70 -0
  300. package/dist/src/report.d.ts +171 -0
  301. package/dist/src/report.js +119 -0
  302. package/dist/src/repository-identity.d.ts +4 -0
  303. package/dist/src/repository-identity.js +4 -0
  304. package/dist/src/review-subject.d.ts +41 -0
  305. package/dist/src/review-subject.js +91 -0
  306. package/dist/src/run-wait.d.ts +23 -0
  307. package/dist/src/run-wait.js +20 -0
  308. package/dist/src/service/active-tickets.d.ts +4 -0
  309. package/dist/src/service/active-tickets.js +49 -0
  310. package/dist/src/service/command-effects.d.ts +4 -0
  311. package/dist/src/service/command-effects.js +16 -0
  312. package/dist/src/service/decision-handler.d.ts +4 -0
  313. package/dist/src/service/decision-handler.js +39 -4
  314. package/dist/src/service/gateway.js +18 -3
  315. package/dist/src/service/registry.d.ts +16 -3
  316. package/dist/src/service/registry.js +34 -3
  317. package/dist/src/service/replies.d.ts +9 -1
  318. package/dist/src/service/replies.js +12 -0
  319. package/dist/src/service/run-handlers.js +14 -55
  320. package/dist/src/service/run-metadata.d.ts +8 -0
  321. package/dist/src/service/run-metadata.js +53 -0
  322. package/dist/src/service/run-waits.d.ts +3 -0
  323. package/dist/src/service/run-waits.js +41 -0
  324. package/dist/src/service/service.d.ts +18 -2
  325. package/dist/src/service/service.js +23 -7
  326. package/dist/src/service/submission-handler.d.ts +0 -1
  327. package/dist/src/service/submission-handler.js +6 -34
  328. package/dist/src/service/worker-port.d.ts +1 -0
  329. package/dist/src/service/worker-totals.js +8 -23
  330. package/dist/src/step-bridge.d.ts +23 -0
  331. package/dist/src/steps/decision-gate.d.ts +2 -1
  332. package/dist/src/steps/decision-gate.js +7 -0
  333. package/dist/src/steps/merge-by-person.d.ts +2 -0
  334. package/dist/src/steps/merge-by-person.js +18 -0
  335. package/dist/src/steps/merge-when-green.d.ts +2 -0
  336. package/dist/src/steps/merge-when-green.js +62 -0
  337. package/dist/src/steps/review-by-agent.d.ts +5 -0
  338. package/dist/src/steps/review-by-agent.js +124 -0
  339. package/dist/src/steps/review-by-person.d.ts +4 -0
  340. package/dist/src/steps/review-by-person.js +16 -0
  341. package/dist/src/steps/review-subject.d.ts +2 -0
  342. package/dist/src/steps/review-subject.js +11 -0
  343. package/dist/src/steps/run-command.d.ts +2 -0
  344. package/dist/src/steps/run-command.js +15 -0
  345. package/dist/src/steps/sleep.d.ts +3 -0
  346. package/dist/src/steps/sleep.js +19 -0
  347. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  348. package/dist/src/steps/wait-for-decision.js +71 -0
  349. package/dist/src/steps/wait-for-run.d.ts +5 -0
  350. package/dist/src/steps/wait-for-run.js +9 -0
  351. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  352. package/dist/src/storage/decision-snapshots.js +7 -1
  353. package/dist/src/submission.d.ts +4 -0
  354. package/dist/src/submission.js +6 -2
  355. package/dist/src/testing.d.ts +29 -0
  356. package/dist/src/testing.js +264 -0
  357. package/dist/src/ticket-status-stream.d.ts +9 -0
  358. package/dist/src/ticket-status-stream.js +94 -0
  359. package/dist/src/token-prices.d.ts +12 -4
  360. package/dist/src/token-prices.js +15 -2
  361. package/dist/src/turn-profile.d.ts +1 -0
  362. package/dist/src/turn-profile.js +8 -1
  363. package/dist/src/worker-usage.d.ts +16 -0
  364. package/dist/src/worker-usage.js +57 -0
  365. package/dist/src/workflow-admission.d.ts +5 -0
  366. package/dist/src/workflow-candidate.d.ts +7 -2
  367. package/dist/src/workflow-candidate.js +47 -5
  368. package/dist/src/workflow-declaration.d.ts +21 -3
  369. package/dist/src/workflow-declaration.js +77 -9
  370. package/dist/src/workflow-discovery.d.ts +2 -1
  371. package/dist/src/workflow-discovery.js +4 -1
  372. package/dist/src/workflow-refusals.js +3 -0
  373. package/dist/src/workflow-schedule.d.ts +22 -0
  374. package/dist/src/workflow-schedule.js +53 -0
  375. package/dist/src/workflows.d.ts +11 -1
  376. package/dist/src/workflows.js +8 -0
  377. package/dist/tools/admit-workflow.d.ts +1 -0
  378. package/dist/tools/admit-workflow.js +18 -5
  379. package/dist/tools/doctor-adoption.d.ts +1 -0
  380. package/dist/tools/doctor-adoption.js +11 -0
  381. package/dist/tools/project-configuration.d.ts +4 -0
  382. package/dist/tools/project-configuration.js +47 -0
  383. package/dist/tools/self-host-processes.d.ts +1 -0
  384. package/dist/tools/self-host-processes.js +33 -22
  385. package/dist/tools/self-host-project.d.ts +4 -0
  386. package/dist/tools/self-host-project.js +61 -14
  387. package/dist/tools/self-host-runtime.d.ts +16 -0
  388. package/dist/tools/self-host-runtime.js +60 -0
  389. package/dist/tools/self-host-workflows.d.ts +1 -0
  390. package/dist/tools/self-host-workflows.js +36 -1
  391. package/dist/tools/self-host.js +86 -61
  392. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  393. package/dist/tools/workflow-candidate-counts.js +31 -16
  394. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  395. package/dist/tools/workflow-candidate-fields.js +24 -0
  396. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  397. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  398. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  399. package/dist/tools/workflow-candidate-program.js +36 -8
  400. package/dist/tools/workflow-candidate-source.js +77 -15
  401. package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
  402. package/dist/tools/workflow-candidate-syntax.js +70 -26
  403. package/dist/tools/workflow-command.d.ts +1 -0
  404. package/dist/tools/workflow-command.js +143 -0
  405. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  406. package/dist/tools/workflow-folder-capture.js +47 -2
  407. package/dist/tools/workflow-folders.d.ts +17 -1
  408. package/dist/tools/workflow-folders.js +59 -6
  409. package/dist/tools/workflow-test-hook.d.ts +7 -0
  410. package/dist/tools/workflow-test-hook.js +16 -0
  411. package/dist/tools/workflow-test-loader.d.ts +1 -0
  412. package/dist/tools/workflow-test-loader.js +10 -0
  413. package/dist/workflows/develop-ticket.js +1 -1
  414. package/dist/workflows/ticket-prompts.js +5 -1
  415. package/package.json +46 -4
  416. package/templates/develop/README.md +78 -0
  417. package/templates/develop/develop/accept.ts +11 -0
  418. package/templates/develop/develop/flow-tests.ts +357 -0
  419. package/templates/develop/develop/local.ts +40 -0
  420. package/templates/develop/develop/option-tests.ts +174 -0
  421. package/templates/develop/develop/partial-choice.ts +29 -0
  422. package/templates/develop/develop/partial.ts +28 -0
  423. package/templates/develop/develop/pull.ts +152 -0
  424. package/templates/develop/develop/queue-partial.ts +39 -0
  425. package/templates/develop/develop/refusal-tests.ts +174 -0
  426. package/templates/develop/develop/report.ts +156 -0
  427. package/templates/develop/develop/round.ts +40 -0
  428. package/templates/develop/develop/scenarios.ts +87 -0
  429. package/templates/develop/develop/turn.ts +67 -0
  430. package/templates/develop/develop.declaration.json +24 -0
  431. package/templates/develop/develop.test.ts +287 -0
  432. package/templates/develop/develop.ts +30 -0
  433. package/templates/develop/template.json +153 -0
  434. package/dist/src/chats/analysis-batches.d.ts +0 -42
  435. package/dist/src/chats/analysis-batches.js +0 -97
  436. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  437. package/dist/src/chats/analysis-checkpoint.js +0 -31
  438. package/dist/src/chats/analysis-contract.d.ts +0 -80
  439. package/dist/src/chats/analysis-contract.js +0 -16
  440. package/dist/src/chats/analysis-data.d.ts +0 -3
  441. package/dist/src/chats/analysis-data.js +0 -85
  442. package/dist/src/chats/analysis-input.d.ts +0 -18
  443. package/dist/src/chats/analysis-input.js +0 -97
  444. package/dist/src/chats/analysis-links.d.ts +0 -2
  445. package/dist/src/chats/analysis-links.js +0 -25
  446. package/dist/src/chats/analysis-merge.d.ts +0 -16
  447. package/dist/src/chats/analysis-merge.js +0 -134
  448. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  449. package/dist/src/chats/analysis-prompt.js +0 -42
  450. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  451. package/dist/src/chats/analysis-proposal.js +0 -41
  452. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  453. package/dist/src/chats/analysis-provenance.js +0 -99
  454. package/dist/src/chats/analysis-shape.d.ts +0 -4
  455. package/dist/src/chats/analysis-shape.js +0 -235
  456. package/dist/src/chats/analysis.d.ts +0 -3
  457. package/dist/src/chats/analysis.js +0 -42
  458. package/dist/src/chats/corpus-input.d.ts +0 -5
  459. package/dist/src/chats/corpus-input.js +0 -288
  460. package/dist/src/chats/destination.d.ts +0 -4
  461. package/dist/src/chats/destination.js +0 -96
  462. package/dist/src/chats/import.d.ts +0 -15
  463. package/dist/src/chats/import.js +0 -243
  464. package/dist/src/chats/input-file.d.ts +0 -3
  465. package/dist/src/chats/input-file.js +0 -32
  466. package/dist/src/chats/normalize.d.ts +0 -29
  467. package/dist/src/chats/normalize.js +0 -155
  468. package/dist/src/chats/previous-import.d.ts +0 -5
  469. package/dist/src/chats/previous-import.js +0 -34
  470. package/dist/src/chats/reader.d.ts +0 -21
  471. package/dist/src/chats/reader.js +0 -118
  472. package/dist/src/chats/redact-import.d.ts +0 -14
  473. package/dist/src/chats/redact-import.js +0 -141
  474. package/dist/src/chats/redaction.d.ts +0 -41
  475. package/dist/src/chats/redaction.js +0 -161
  476. package/dist/src/chats/reference-mapping.d.ts +0 -16
  477. package/dist/src/chats/reference-mapping.js +0 -153
  478. package/dist/src/chats/revision-input.d.ts +0 -3
  479. package/dist/src/chats/revision-input.js +0 -180
  480. package/dist/src/chats/revision.d.ts +0 -48
  481. package/dist/src/chats/revision.js +0 -94
  482. package/dist/src/chats/selection.d.ts +0 -25
  483. package/dist/src/chats/selection.js +0 -109
  484. package/dist/src/chats/source.d.ts +0 -23
  485. package/dist/src/chats/source.js +0 -135
  486. package/dist/src/chats/structure.d.ts +0 -57
  487. package/dist/src/chats/structure.js +0 -216
  488. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  489. package/dist/src/chats/workflow-generation-projection.js +0 -75
  490. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  491. package/dist/src/chats/workflow-generation-source.js +0 -124
  492. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  493. package/dist/src/chats/workflow-generation-text.js +0 -74
  494. package/dist/src/chats/workflow-generation.d.ts +0 -69
  495. package/dist/src/chats/workflow-generation.js +0 -142
  496. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  497. package/dist/src/daemon/analysis-launch.js +0 -81
  498. package/dist/src/daemon/analysis-token.d.ts +0 -6
  499. package/dist/src/daemon/analysis-token.js +0 -88
  500. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  501. package/dist/src/daemon/analysis-worker.js +0 -271
  502. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  503. package/dist/src/daemon/chats-batch-binding.js +0 -99
  504. package/dist/src/daemon/chats-capture.d.ts +0 -18
  505. package/dist/src/daemon/chats-capture.js +0 -194
  506. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  507. package/dist/src/daemon/chats-checkpoints.js +0 -186
  508. package/dist/src/daemon/chats-files.d.ts +0 -42
  509. package/dist/src/daemon/chats-files.js +0 -252
  510. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  511. package/dist/src/daemon/chats-follow-up.js +0 -180
  512. package/dist/src/daemon/chats-question.d.ts +0 -15
  513. package/dist/src/daemon/chats-question.js +0 -93
  514. package/dist/src/daemon/chats-worker.d.ts +0 -13
  515. package/dist/src/daemon/chats-worker.js +0 -201
  516. package/dist/workflows/analyze-chats.d.ts +0 -15
  517. package/dist/workflows/analyze-chats.declaration.json +0 -22
  518. package/dist/workflows/analyze-chats.js +0 -250
@@ -0,0 +1,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,36 +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 { WorkflowRefusal } from "../workflow-refusals.ts";
7
- import type { Worker } from "./claude-turn.ts";
8
- export interface DaemonSettings {
9
- readonly fallbackModels?: readonly string[];
10
- readonly tokenPrices?: TokenPrices;
11
- readonly worker?: Worker;
12
- readonly profiles?: TurnProfiles;
13
- readonly directory: string;
14
- readonly runtimeDirectory: string;
15
- readonly repository: string;
16
- readonly manifests: Readonly<Record<string, string | undefined>>;
17
- readonly declarations?: readonly DeclaredWorkflow[];
18
- readonly workflowRefusals?: readonly WorkflowRefusal[];
19
- readonly workflows: Readonly<Record<string, WorkflowFunction | undefined>>;
20
- readonly handler: WorkflowHandler;
21
- readonly command: readonly string[];
22
- readonly ticketCommand?: readonly string[];
23
- readonly nextCommand?: readonly string[];
24
- readonly notifyCommand?: readonly string[];
25
- readonly notifyMilliseconds?: number;
26
- readonly queueMilliseconds?: number;
27
- readonly queueLanes?: number;
28
- readonly resetQueue?: boolean;
29
- readonly githubCommand?: readonly string[];
30
- readonly checkCommand?: readonly string[];
31
- readonly privateTexts?: readonly string[];
32
- readonly concurrency: number;
33
- }
1
+ import { type DaemonSettings } from "./daemon-adapters.ts";
2
+ export type { DaemonSettings } from "./daemon-adapters.ts";
34
3
  export interface Daemon {
35
4
  readonly socket: string;
36
5
  readonly close: () => Promise<void>;
@@ -1,21 +1,19 @@
1
+ import { adapters, recoverCommands, } from "./daemon-adapters.js";
1
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 { workflowPin } from "../broker/workflow-pin.js";
10
- 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";
11
10
  import { deliveryRouter } from "./delivery-router.js";
12
- import { handoffWorker } from "./handoff-worker.js";
13
- import { githubWorker } from "./github-worker.js";
14
- import { chatsWorker } from "./chats-worker.js";
11
+ import { commandEffects } from "./command-journal.js";
15
12
  import { worldDirectory } from "./host-environment.js";
16
- import { issueQueue } from "./issue-queue.js";
17
- import { notifyRuns } from "./notify.js";
18
- 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";
19
17
  export const turnLeaseMilliseconds = 4 * 3_600_000;
20
18
  export const loopMilliseconds = 250;
21
19
  export const bridgeTiming = {
@@ -23,11 +21,23 @@ export const bridgeTiming = {
23
21
  pollMilliseconds: 250,
24
22
  retryMilliseconds: 1_000,
25
23
  };
26
- async function hosted(settings, ports) {
24
+ async function hosted(settings, hosting) {
25
+ const { ports, generations } = hosting;
26
+ await prepareWorkflowGenerations(ports, generations);
27
27
  const opening = await startHost({
28
28
  dataDirectory: worldDirectory(settings.directory),
29
29
  concurrency: settings.concurrency,
30
- 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
+ }),
31
41
  });
32
42
  if (opening.kind === "refused")
33
43
  throw new Error(`${opening.reason}: ${opening.detail}`);
@@ -55,169 +65,153 @@ async function hosted(settings, ports) {
55
65
  },
56
66
  };
57
67
  }
58
- function githubOf(settings, given) {
59
- const { directory, repository, checkCommand } = settings;
60
- return githubWorker({
61
- document: async (digest) => (await given).document(digest),
62
- report: async (effect) => (await given).reportEffect(effect),
63
- operationStatus: async (operationId) => (await (await given).operation(operationId))?.status,
64
- runStatus: async (runId) => (await (await given).state()).runs[runId]?.status,
65
- repository,
66
- gh: settings.githubCommand ?? ["gh"],
67
- worktrees: join(directory, "worktrees"),
68
- journal: join(directory, "github"),
69
- ...(settings.privateTexts === undefined
70
- ? {}
71
- : { privateTexts: settings.privateTexts }),
72
- ...(checkCommand === undefined ? {} : { check: checkCommand }),
73
- });
74
- }
75
- function adapters(settings, options) {
76
- const { directory, repository, command } = settings;
77
- const { given, table, registrations } = options;
78
- const functions = Object.fromEntries(table.map((row) => [row.workflowId, settings.workflows[row.functionName]]));
79
- const workflows = Object.fromEntries(registrations.map((registration) => [
80
- workflowPin(registration.manifest),
81
- functions[registration.workflowId],
82
- ]));
83
- const document = async (digest) => (await given).document(digest);
84
- const report = async (effect) => (await given).reportEffect(effect);
85
- const worker = claudeWorker({
86
- fallbackModels: settings.fallbackModels ?? [],
87
- tokenPrices: settings.tokenPrices ?? {},
88
- worker: settings.worker ?? "claude",
89
- profiles: settings.profiles ?? {},
90
- workflowId: async (runId) => (await given).workflowId(runId),
91
- repository,
92
- command,
93
- document,
94
- report,
95
- worktrees: join(directory, "worktrees"),
96
- journal: join(directory, "journal"),
97
- });
98
- const github = githubOf(settings, given);
99
- const chats = chatsWorker({
100
- runtimeDirectory: settings.runtimeDirectory,
101
- document,
102
- workflowId: async (runId) => (await given).workflowId(runId),
103
- });
104
- const runs = startDelivery({
105
- document,
106
- runs: taggedRuns,
107
- cancel: cancelled,
108
- input: async (runId) => (await given).input(runId),
109
- workflow: ({ workflow }) => Promise.resolve(workflows[workflow]),
110
- });
111
- const handoff = handoffOf(settings, given);
112
- return { worker, github, runs, chats, handoff };
113
- }
114
- function handoffOf(settings, given) {
115
- return handoffWorker({
116
- runtimeDirectory: settings.runtimeDirectory,
117
- journal: join(settings.directory, "handoffs"),
118
- document: async (digest) => (await given).document(digest),
119
- runStatus: async (runId) => (await (await given).state()).runs[runId]?.status,
120
- });
121
- }
122
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
+ };
123
78
  const table = ticketRegistrationTable({
124
79
  repository: settings.repository,
125
80
  command: settings.ticketCommand,
126
81
  nextCommand: settings.nextCommand,
127
82
  githubCommand: settings.githubCommand,
128
83
  }, settings.declarations);
129
- const admitted = await ticketRegistrations(settings.manifests, { table });
130
- return { table, admitted };
84
+ const admitted = await ticketRegistrations(settings.manifests, {
85
+ table,
86
+ commands: settings.commands ?? {},
87
+ ...(settings.bundleDigest === undefined
88
+ ? {}
89
+ : { bundleDigest: settings.bundleDigest }),
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
+ };
131
106
  }
132
107
  export async function startDaemon(givenSettings) {
133
- const settings = {
108
+ const repository = await realpath(givenSettings.repository);
109
+ const scheduled = scheduledDeclarations(givenSettings, {
110
+ repository,
111
+ documentBytes: serviceLimits.documentBytes,
112
+ });
113
+ if (scheduled.kind === "refused")
114
+ return scheduled;
115
+ return openDaemon({
134
116
  ...givenSettings,
135
- repository: await realpath(givenSettings.repository),
136
- };
137
- const { directory } = settings;
117
+ declarations: scheduled.declarations,
118
+ repository,
119
+ });
120
+ }
121
+ async function openDaemon(settings) {
138
122
  const { table, admitted } = await daemonRegistrations(settings);
139
123
  if (admitted.kind === "rejected")
140
124
  return {
141
125
  kind: "refused",
142
- reason: "workflow-rejected",
126
+ reason: admitted.detail.startsWith("queue-workflow-conflict")
127
+ ? "queue-workflow-conflict"
128
+ : "workflow-rejected",
143
129
  detail: admitted.detail,
144
130
  };
145
131
  const given = Promise.withResolvers();
146
- const { worker, github, runs, chats, handoff } = adapters(settings, {
147
- given: given.promise,
148
- table,
132
+ const generations = workflowGenerations({
133
+ ...settings,
149
134
  registrations: admitted.registrations,
135
+ table,
150
136
  });
151
- 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 });
152
140
  await mkdir(settings.runtimeDirectory, { recursive: true, mode: 0o700 });
153
141
  const opening = await startService({
154
- stateDirectory: join(directory, "state"),
142
+ workerHarness: worker.harness,
143
+ commandEffects: commandEffects(join(settings.directory, "commands")),
144
+ stateDirectory: join(settings.directory, "state"),
155
145
  runtimeDirectory: settings.runtimeDirectory,
146
+ workflowBundles: {
147
+ directory: join(settings.directory, "workflow-bundles"),
148
+ repository: settings.repository,
149
+ },
156
150
  workflowRefusals: settings.workflowRefusals ?? [],
157
- workflows: admitted.registrations.map((registration) => ({
158
- ...registration,
159
- ...(settings.queueMilliseconds !== undefined &&
160
- registration.workflowId === "develop-issue"
161
- ? { admission: settings.queueLanes ?? 1 }
162
- : {}),
163
- })),
151
+ workflows: admitted.registrations,
152
+ retainedWorkflow: generations.available,
164
153
  delivery: deliveryRouter({
165
154
  runs,
166
- effects: { claude: worker, github, chats, handoff },
155
+ effects: { claude: worker, github, handoff, command: commands },
167
156
  }),
168
157
  effects: { leaseMilliseconds: turnLeaseMilliseconds },
169
158
  host: (ports) => {
170
159
  given.resolve(ports);
171
- return hosted(settings, ports);
160
+ return hosted(settings, { ports, generations });
172
161
  },
173
162
  });
174
163
  if (opening.kind === "refused") {
175
- await Promise.all([worker.close(), github.close(), chats.close()]);
164
+ await closeWorkers(resources);
176
165
  return opening;
177
166
  }
167
+ const running = { ...resources, service: opening.service };
168
+ await recoverWorkers(running, given.promise);
178
169
  return {
179
170
  kind: "started",
180
- daemon: await runningDaemon(settings, {
181
- service: opening.service,
182
- worker,
183
- github,
184
- chats,
185
- }),
171
+ daemon: await runningDaemon(settings, running),
186
172
  };
187
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
+ }
188
193
  async function runningDaemon(settings, resources) {
189
- const { service, worker, github, chats } = resources;
194
+ const { service, github } = resources;
190
195
  await github.scan();
191
- const notifier = settings.notifyCommand === undefined
192
- ? undefined
193
- : await notifyRuns({
194
- directory: settings.directory,
195
- runtimeDirectory: settings.runtimeDirectory,
196
- command: settings.notifyCommand,
197
- ...(settings.notifyMilliseconds === undefined
198
- ? {}
199
- : { intervalMilliseconds: settings.notifyMilliseconds }),
200
- }).catch(async (error) => {
201
- await Promise.all([worker.close(), github.close(), chats.close()]);
202
- await service.close();
203
- throw error;
204
- });
205
- const queue = settings.queueMilliseconds === undefined
206
- ? undefined
207
- : issueQueue({
208
- directory: settings.directory,
209
- runtimeDirectory: settings.runtimeDirectory,
210
- intervalMilliseconds: settings.queueMilliseconds,
211
- lanes: settings.queueLanes ?? 1,
212
- resetQueue: settings.resetQueue ?? false,
213
- });
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
+ });
214
205
  return {
215
206
  socket: service.socket,
216
207
  close: async () => {
217
- await notifier?.stop();
218
- await queue?.stop();
219
- await Promise.all([worker.close(), github.close(), chats.close()]);
208
+ await loops.stop();
209
+ await closeWorkers(resources);
220
210
  await service.close();
221
211
  },
222
212
  };
223
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) => {
@@ -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
+ }
@@ -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;