cloving 0.3.20 → 1.1.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 (515) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +606 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +271 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +29 -0
  32. package/dist/src/authority/reconciliation.js +156 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +124 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +67 -0
  78. package/dist/src/broker/actor/authority-session.js +251 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/analysis-batches.d.ts +24 -0
  138. package/dist/src/chats/analysis-batches.js +83 -0
  139. package/dist/src/chats/analysis-contract.d.ts +80 -0
  140. package/dist/src/chats/analysis-contract.js +16 -0
  141. package/dist/src/chats/analysis-data.d.ts +3 -0
  142. package/dist/src/chats/analysis-data.js +85 -0
  143. package/dist/src/chats/analysis-input.d.ts +12 -0
  144. package/dist/src/chats/analysis-input.js +83 -0
  145. package/dist/src/chats/analysis-links.d.ts +2 -0
  146. package/dist/src/chats/analysis-links.js +25 -0
  147. package/dist/src/chats/analysis-prompt.d.ts +10 -0
  148. package/dist/src/chats/analysis-prompt.js +16 -0
  149. package/dist/src/chats/analysis-proposal.d.ts +2 -0
  150. package/dist/src/chats/analysis-proposal.js +32 -0
  151. package/dist/src/chats/analysis-provenance.d.ts +4 -0
  152. package/dist/src/chats/analysis-provenance.js +99 -0
  153. package/dist/src/chats/analysis-shape.d.ts +3 -0
  154. package/dist/src/chats/analysis-shape.js +228 -0
  155. package/dist/src/chats/analysis.d.ts +3 -0
  156. package/dist/src/chats/analysis.js +42 -0
  157. package/dist/src/chats/corpus-input.d.ts +5 -0
  158. package/dist/src/chats/corpus-input.js +288 -0
  159. package/dist/src/chats/destination.d.ts +4 -0
  160. package/dist/src/chats/destination.js +96 -0
  161. package/dist/src/chats/import.d.ts +15 -0
  162. package/dist/src/chats/import.js +243 -0
  163. package/dist/src/chats/input-file.d.ts +3 -0
  164. package/dist/src/chats/input-file.js +32 -0
  165. package/dist/src/chats/normalize.d.ts +29 -0
  166. package/dist/src/chats/normalize.js +155 -0
  167. package/dist/src/chats/previous-import.d.ts +5 -0
  168. package/dist/src/chats/previous-import.js +34 -0
  169. package/dist/src/chats/reader.d.ts +21 -0
  170. package/dist/src/chats/reader.js +118 -0
  171. package/dist/src/chats/redact-import.d.ts +14 -0
  172. package/dist/src/chats/redact-import.js +141 -0
  173. package/dist/src/chats/redaction.d.ts +41 -0
  174. package/dist/src/chats/redaction.js +161 -0
  175. package/dist/src/chats/revision-input.d.ts +3 -0
  176. package/dist/src/chats/revision-input.js +180 -0
  177. package/dist/src/chats/revision.d.ts +48 -0
  178. package/dist/src/chats/revision.js +94 -0
  179. package/dist/src/chats/selection.d.ts +25 -0
  180. package/dist/src/chats/selection.js +109 -0
  181. package/dist/src/chats/source.d.ts +23 -0
  182. package/dist/src/chats/source.js +135 -0
  183. package/dist/src/chats/structure.d.ts +57 -0
  184. package/dist/src/chats/structure.js +216 -0
  185. package/dist/src/cli/arguments.d.ts +31 -0
  186. package/dist/src/cli/arguments.js +235 -0
  187. package/dist/src/cli/client.d.ts +16 -0
  188. package/dist/src/cli/client.js +159 -0
  189. package/dist/src/cli/commands.d.ts +17 -0
  190. package/dist/src/cli/commands.js +271 -0
  191. package/dist/src/cli/main.d.ts +2 -0
  192. package/dist/src/cli/main.js +127 -0
  193. package/dist/src/cli/render.d.ts +10 -0
  194. package/dist/src/cli/render.js +254 -0
  195. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  196. package/dist/src/cli/runtime-arguments.js +248 -0
  197. package/dist/src/cli/runtime-directory.d.ts +4 -0
  198. package/dist/src/cli/runtime-directory.js +25 -0
  199. package/dist/src/cli/toolchain.d.ts +3 -0
  200. package/dist/src/cli/toolchain.js +74 -0
  201. package/dist/src/cli/usage-render.d.ts +3 -0
  202. package/dist/src/cli/usage-render.js +28 -0
  203. package/dist/src/cli/usage.d.ts +5 -0
  204. package/dist/src/cli/usage.js +156 -0
  205. package/dist/src/cli/validate.d.ts +38 -0
  206. package/dist/src/cli/validate.js +116 -0
  207. package/dist/src/cli/watch-actions.d.ts +10 -0
  208. package/dist/src/cli/watch-actions.js +58 -0
  209. package/dist/src/cli/watch-board-view.d.ts +54 -0
  210. package/dist/src/cli/watch-board-view.js +201 -0
  211. package/dist/src/cli/watch-board.d.ts +15 -0
  212. package/dist/src/cli/watch-board.js +179 -0
  213. package/dist/src/cli/watch-card-client.d.ts +1 -0
  214. package/dist/src/cli/watch-card-client.js +44 -0
  215. package/dist/src/cli/watch-card-forms.d.ts +2 -0
  216. package/dist/src/cli/watch-card-forms.js +33 -0
  217. package/dist/src/cli/watch-card-reply.d.ts +5 -0
  218. package/dist/src/cli/watch-card-reply.js +34 -0
  219. package/dist/src/cli/watch-card-view.d.ts +40 -0
  220. package/dist/src/cli/watch-card-view.js +86 -0
  221. package/dist/src/cli/watch-client.d.ts +1 -0
  222. package/dist/src/cli/watch-client.js +118 -0
  223. package/dist/src/cli/watch-element.d.ts +11 -0
  224. package/dist/src/cli/watch-element.js +6 -0
  225. package/dist/src/cli/watch-model.d.ts +29 -0
  226. package/dist/src/cli/watch-model.js +278 -0
  227. package/dist/src/cli/watch-navigation.d.ts +9 -0
  228. package/dist/src/cli/watch-navigation.js +40 -0
  229. package/dist/src/cli/watch-page.d.ts +1 -0
  230. package/dist/src/cli/watch-page.js +258 -0
  231. package/dist/src/cli/watch-paths.d.ts +2 -0
  232. package/dist/src/cli/watch-paths.js +52 -0
  233. package/dist/src/cli/watch-phases.d.ts +7 -0
  234. package/dist/src/cli/watch-phases.js +148 -0
  235. package/dist/src/cli/watch-pr-board.d.ts +3 -0
  236. package/dist/src/cli/watch-pr-board.js +26 -0
  237. package/dist/src/cli/watch-pr-command.d.ts +15 -0
  238. package/dist/src/cli/watch-pr-command.js +37 -0
  239. package/dist/src/cli/watch-pr-identity.d.ts +20 -0
  240. package/dist/src/cli/watch-pr-identity.js +62 -0
  241. package/dist/src/cli/watch-pr-observer.d.ts +19 -0
  242. package/dist/src/cli/watch-pr-observer.js +108 -0
  243. package/dist/src/cli/watch-pr-settings.d.ts +8 -0
  244. package/dist/src/cli/watch-pr-settings.js +47 -0
  245. package/dist/src/cli/watch-reads.d.ts +28 -0
  246. package/dist/src/cli/watch-reads.js +248 -0
  247. package/dist/src/cli/watch-render.d.ts +153 -0
  248. package/dist/src/cli/watch-render.js +102 -0
  249. package/dist/src/cli/watch-run-input.d.ts +14 -0
  250. package/dist/src/cli/watch-run-input.js +49 -0
  251. package/dist/src/cli/watch-server.d.ts +13 -0
  252. package/dist/src/cli/watch-server.js +214 -0
  253. package/dist/src/cli/watch-start-view.d.ts +18 -0
  254. package/dist/src/cli/watch-start-view.js +77 -0
  255. package/dist/src/cli/watch-stream.d.ts +11 -0
  256. package/dist/src/cli/watch-stream.js +128 -0
  257. package/dist/src/cli/watch-turn.d.ts +30 -0
  258. package/dist/src/cli/watch-turn.js +135 -0
  259. package/dist/src/cli/watch-usage.d.ts +6 -0
  260. package/dist/src/cli/watch-usage.js +65 -0
  261. package/dist/src/cli/watch-view.d.ts +54 -0
  262. package/dist/src/cli/watch-view.js +267 -0
  263. package/dist/src/cli.d.ts +2 -0
  264. package/dist/src/cli.js +104 -0
  265. package/dist/src/daemon/analysis-launch.d.ts +5 -0
  266. package/dist/src/daemon/analysis-launch.js +81 -0
  267. package/dist/src/daemon/analysis-token.d.ts +6 -0
  268. package/dist/src/daemon/analysis-token.js +88 -0
  269. package/dist/src/daemon/analysis-worker.d.ts +22 -0
  270. package/dist/src/daemon/analysis-worker.js +219 -0
  271. package/dist/src/daemon/chats-files.d.ts +15 -0
  272. package/dist/src/daemon/chats-files.js +113 -0
  273. package/dist/src/daemon/chats-worker.d.ts +12 -0
  274. package/dist/src/daemon/chats-worker.js +200 -0
  275. package/dist/src/daemon/claude-turn.d.ts +38 -0
  276. package/dist/src/daemon/claude-turn.js +216 -0
  277. package/dist/src/daemon/claude-worker.d.ts +29 -0
  278. package/dist/src/daemon/claude-worker.js +276 -0
  279. package/dist/src/daemon/codex-stream.d.ts +4 -0
  280. package/dist/src/daemon/codex-stream.js +129 -0
  281. package/dist/src/daemon/daemon.d.ts +49 -0
  282. package/dist/src/daemon/daemon.js +195 -0
  283. package/dist/src/daemon/delivery-router.d.ts +10 -0
  284. package/dist/src/daemon/delivery-router.js +34 -0
  285. package/dist/src/daemon/github-calls.d.ts +29 -0
  286. package/dist/src/daemon/github-calls.js +127 -0
  287. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  288. package/dist/src/daemon/github-issue-methods.js +99 -0
  289. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  290. package/dist/src/daemon/github-issue-privacy.js +131 -0
  291. package/dist/src/daemon/github-merge.d.ts +18 -0
  292. package/dist/src/daemon/github-merge.js +259 -0
  293. package/dist/src/daemon/github-methods.d.ts +5 -0
  294. package/dist/src/daemon/github-methods.js +202 -0
  295. package/dist/src/daemon/github-operation.d.ts +38 -0
  296. package/dist/src/daemon/github-operation.js +57 -0
  297. package/dist/src/daemon/github-ticket-status.d.ts +3 -0
  298. package/dist/src/daemon/github-ticket-status.js +268 -0
  299. package/dist/src/daemon/github-worker.d.ts +17 -0
  300. package/dist/src/daemon/github-worker.js +281 -0
  301. package/dist/src/daemon/host-environment.d.ts +8 -0
  302. package/dist/src/daemon/host-environment.js +14 -0
  303. package/dist/src/daemon/issue-queue.d.ts +10 -0
  304. package/dist/src/daemon/issue-queue.js +254 -0
  305. package/dist/src/daemon/notify-message.d.ts +14 -0
  306. package/dist/src/daemon/notify-message.js +48 -0
  307. package/dist/src/daemon/notify.d.ts +12 -0
  308. package/dist/src/daemon/notify.js +161 -0
  309. package/dist/src/daemon/operation-journal.d.ts +43 -0
  310. package/dist/src/daemon/operation-journal.js +55 -0
  311. package/dist/src/daemon/retrying-turn.d.ts +9 -0
  312. package/dist/src/daemon/retrying-turn.js +185 -0
  313. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  314. package/dist/src/daemon/ticket-registration.js +177 -0
  315. package/dist/src/daemon/ticket-source.d.ts +17 -0
  316. package/dist/src/daemon/ticket-source.js +36 -0
  317. package/dist/src/daemon/work-tree.d.ts +26 -0
  318. package/dist/src/daemon/work-tree.js +206 -0
  319. package/dist/src/effect-authorization.d.ts +21 -0
  320. package/dist/src/effect-authorization.js +14 -0
  321. package/dist/src/execution-pin.d.ts +4 -0
  322. package/dist/src/execution-pin.js +68 -0
  323. package/dist/src/host/start-delivery.d.ts +41 -0
  324. package/dist/src/host/start-delivery.js +68 -0
  325. package/dist/src/host/step-bridge-host.d.ts +79 -0
  326. package/dist/src/host/step-bridge-host.js +205 -0
  327. package/dist/src/host/step-claims.d.ts +31 -0
  328. package/dist/src/host/step-claims.js +85 -0
  329. package/dist/src/host/world-host.d.ts +21 -0
  330. package/dist/src/host/world-host.js +51 -0
  331. package/dist/src/host/world-reconciliation.d.ts +39 -0
  332. package/dist/src/host/world-reconciliation.js +81 -0
  333. package/dist/src/host/world-runs.d.ts +14 -0
  334. package/dist/src/host/world-runs.js +69 -0
  335. package/dist/src/operation-identity.d.ts +7 -0
  336. package/dist/src/operation-identity.js +59 -0
  337. package/dist/src/protocol.d.ts +35 -0
  338. package/dist/src/protocol.js +64 -0
  339. package/dist/src/resource-files.d.ts +1 -0
  340. package/dist/src/resource-files.js +29 -0
  341. package/dist/src/service/changes.d.ts +11 -0
  342. package/dist/src/service/changes.js +32 -0
  343. package/dist/src/service/decision-handler.d.ts +9 -0
  344. package/dist/src/service/decision-handler.js +233 -0
  345. package/dist/src/service/event-handler.d.ts +10 -0
  346. package/dist/src/service/event-handler.js +70 -0
  347. package/dist/src/service/expiry.d.ts +13 -0
  348. package/dist/src/service/expiry.js +53 -0
  349. package/dist/src/service/gateway.d.ts +21 -0
  350. package/dist/src/service/gateway.js +120 -0
  351. package/dist/src/service/registry.d.ts +40 -0
  352. package/dist/src/service/registry.js +13 -0
  353. package/dist/src/service/replies.d.ts +26 -0
  354. package/dist/src/service/replies.js +56 -0
  355. package/dist/src/service/run-handlers.d.ts +4 -0
  356. package/dist/src/service/run-handlers.js +263 -0
  357. package/dist/src/service/service.d.ts +58 -0
  358. package/dist/src/service/service.js +212 -0
  359. package/dist/src/service/submission-handler.d.ts +4 -0
  360. package/dist/src/service/submission-handler.js +206 -0
  361. package/dist/src/service/transport.d.ts +16 -0
  362. package/dist/src/service/transport.js +141 -0
  363. package/dist/src/service/worker-port.d.ts +85 -0
  364. package/dist/src/service/worker-port.js +126 -0
  365. package/dist/src/service/worker-totals.d.ts +3 -0
  366. package/dist/src/service/worker-totals.js +28 -0
  367. package/dist/src/step-bridge.d.ts +57 -0
  368. package/dist/src/step-bridge.js +4 -0
  369. package/dist/src/steps/decision-gate.d.ts +2 -0
  370. package/dist/src/steps/decision-gate.js +8 -0
  371. package/dist/src/steps/load-cycle.d.ts +10 -0
  372. package/dist/src/steps/load-cycle.js +11 -0
  373. package/dist/src/steps/protected-effect.d.ts +2 -0
  374. package/dist/src/steps/protected-effect.js +8 -0
  375. package/dist/src/storage/decision-rows.d.ts +54 -0
  376. package/dist/src/storage/decision-rows.js +72 -0
  377. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  378. package/dist/src/storage/decision-snapshots.js +25 -0
  379. package/dist/src/storage/domain-changes.d.ts +48 -0
  380. package/dist/src/storage/domain-changes.js +213 -0
  381. package/dist/src/storage/domain-rows.d.ts +85 -0
  382. package/dist/src/storage/domain-rows.js +129 -0
  383. package/dist/src/storage/domain-schema.d.ts +32 -0
  384. package/dist/src/storage/domain-schema.js +193 -0
  385. package/dist/src/storage/effect-changes.d.ts +5 -0
  386. package/dist/src/storage/effect-changes.js +105 -0
  387. package/dist/src/storage/effect-rows.d.ts +67 -0
  388. package/dist/src/storage/effect-rows.js +74 -0
  389. package/dist/src/storage/effect-schema.d.ts +1 -0
  390. package/dist/src/storage/effect-schema.js +59 -0
  391. package/dist/src/storage/statements.d.ts +9 -0
  392. package/dist/src/storage/statements.js +8 -0
  393. package/dist/src/submission.d.ts +42 -0
  394. package/dist/src/submission.js +71 -0
  395. package/dist/src/ticket-status.d.ts +8 -0
  396. package/dist/src/ticket-status.js +45 -0
  397. package/dist/src/token-prices.d.ts +19 -0
  398. package/dist/src/token-prices.js +76 -0
  399. package/dist/src/turn-profile.d.ts +13 -0
  400. package/dist/src/turn-profile.js +100 -0
  401. package/dist/src/worker-usage.d.ts +22 -0
  402. package/dist/src/worker-usage.js +44 -0
  403. package/dist/src/workflow-admission.d.ts +45 -0
  404. package/dist/src/workflow-admission.js +151 -0
  405. package/dist/src/workflow-candidate.d.ts +29 -0
  406. package/dist/src/workflow-candidate.js +59 -0
  407. package/dist/src/workflow-contracts.d.ts +29 -0
  408. package/dist/src/workflow-contracts.js +110 -0
  409. package/dist/src/workflow-declaration.d.ts +11 -0
  410. package/dist/src/workflow-declaration.js +59 -0
  411. package/dist/src/workflow-resources.d.ts +8 -0
  412. package/dist/src/workflow-resources.js +14 -0
  413. package/dist/src/workflows.d.ts +6 -0
  414. package/dist/src/workflows.js +4 -0
  415. package/dist/tools/compile-workflows.d.ts +1 -0
  416. package/dist/tools/compile-workflows.js +33 -0
  417. package/dist/tools/self-host-processes.d.ts +10 -0
  418. package/dist/tools/self-host-processes.js +156 -0
  419. package/dist/tools/self-host-workflows.d.ts +15 -0
  420. package/dist/tools/self-host-workflows.js +78 -0
  421. package/dist/tools/self-host.d.ts +1 -0
  422. package/dist/tools/self-host.js +261 -0
  423. package/dist/tools/self-update-host.d.ts +13 -0
  424. package/dist/tools/self-update-host.js +88 -0
  425. package/dist/tools/self-update.d.ts +11 -0
  426. package/dist/tools/self-update.js +177 -0
  427. package/dist/tools/workflow-manifest.d.ts +3 -0
  428. package/dist/tools/workflow-manifest.js +34 -0
  429. package/dist/workflows/analyze-chats.d.ts +10 -0
  430. package/dist/workflows/analyze-chats.declaration.json +9 -0
  431. package/dist/workflows/analyze-chats.js +73 -0
  432. package/dist/workflows/develop-prd.d.ts +7 -0
  433. package/dist/workflows/develop-prd.js +97 -0
  434. package/dist/workflows/develop-ticket.d.ts +9 -0
  435. package/dist/workflows/develop-ticket.js +202 -0
  436. package/dist/workflows/issue-labels.d.ts +16 -0
  437. package/dist/workflows/issue-labels.js +70 -0
  438. package/dist/workflows/ticket-prompts.d.ts +35 -0
  439. package/dist/workflows/ticket-prompts.js +133 -0
  440. package/package.json +84 -75
  441. package/dist/abstract_gpt/index.js +0 -55
  442. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  443. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  444. package/dist/cloving_gpt/adapters/claude.js +0 -128
  445. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  446. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  447. package/dist/cloving_gpt/adapters/index.js +0 -2
  448. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  449. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  450. package/dist/cloving_gpt/adapters/openai.js +0 -100
  451. package/dist/cloving_gpt/index.js +0 -192
  452. package/dist/commands/analyze.js +0 -47
  453. package/dist/commands/chat.js +0 -14
  454. package/dist/commands/check.js +0 -7
  455. package/dist/commands/commit.js +0 -44
  456. package/dist/commands/config.js +0 -167
  457. package/dist/commands/describe.js +0 -235
  458. package/dist/commands/generate/code.js +0 -21
  459. package/dist/commands/generate/commit.js +0 -11
  460. package/dist/commands/generate/context.js +0 -82
  461. package/dist/commands/generate/docs.js +0 -11
  462. package/dist/commands/generate/documentation.js +0 -11
  463. package/dist/commands/generate/fizzbuzz.js +0 -35
  464. package/dist/commands/generate/init.js +0 -15
  465. package/dist/commands/generate/review.js +0 -11
  466. package/dist/commands/generate/sh.js +0 -95
  467. package/dist/commands/generate/shell.js +0 -11
  468. package/dist/commands/generate/unit_tests.js +0 -11
  469. package/dist/commands/init.js +0 -13
  470. package/dist/commands/models.js +0 -22
  471. package/dist/commands/project/build.js +0 -88
  472. package/dist/commands/project/complete.js +0 -12
  473. package/dist/commands/project/init.js +0 -82
  474. package/dist/commands/project/plan.js +0 -108
  475. package/dist/commands/proxy.js +0 -11
  476. package/dist/commands/review.js +0 -50
  477. package/dist/commands/tokens.js +0 -75
  478. package/dist/commands/unit_tests.js +0 -150
  479. package/dist/commands/update.js +0 -7
  480. package/dist/file2.js +0 -4
  481. package/dist/index.js +0 -136
  482. package/dist/managers/BlockManager.js +0 -120
  483. package/dist/managers/ChatManager.js +0 -653
  484. package/dist/managers/ChunkManager.js +0 -32
  485. package/dist/managers/CodeManager.js +0 -185
  486. package/dist/managers/CommitManager.js +0 -78
  487. package/dist/managers/DocsManager.js +0 -88
  488. package/dist/managers/DocumentationManager.js +0 -114
  489. package/dist/managers/InitManager.js +0 -230
  490. package/dist/managers/ProxyManager.js +0 -210
  491. package/dist/managers/ReviewManager.js +0 -131
  492. package/dist/managers/ShellManager.js +0 -163
  493. package/dist/managers/StreamManager.js +0 -308
  494. package/dist/managers/UnitTestManager.js +0 -243
  495. package/dist/managers/src/managers/ProxyManager.js +0 -1
  496. package/dist/newfile.js +0 -2
  497. package/dist/package.json +0 -86
  498. package/dist/utils/command_utils.js +0 -384
  499. package/dist/utils/config_utils.js +0 -249
  500. package/dist/utils/gitUtils.js +0 -42
  501. package/dist/utils/git_utils.js +0 -217
  502. package/dist/utils/modelUtils.js +0 -7
  503. package/dist/utils/model_utils.js +0 -7
  504. package/dist/utils/prompt_utils.js +0 -333
  505. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  506. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  507. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  508. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  509. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  510. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  511. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  512. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  513. package/dist/utils/prompts/index.js +0 -27
  514. package/dist/utils/string_utils.js +0 -505
  515. package/dist/utils/types.js +0 -2
@@ -0,0 +1,268 @@
1
+ import { issuePrivacy } from "./github-issue-privacy.js";
2
+ import { field, text } from "./github-operation.js";
3
+ import { ticketLimits } from "./ticket-source.js";
4
+ const privateRemaining = "Remaining work is in the private run report.";
5
+ const issueBodyBytes = ticketLimits.textBytes - 2_048;
6
+ const workflowLabels = [
7
+ "cloving: ready",
8
+ "cloving: blocked",
9
+ "cloving: in progress",
10
+ ];
11
+ function positiveInteger(operation, name) {
12
+ const value = operation.payload[name];
13
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1)
14
+ throw new Error("invalid-payload");
15
+ return value;
16
+ }
17
+ function issuePath(operation) {
18
+ const repository = `${text(operation, "owner")}/${text(operation, "repository")}`;
19
+ if (!/^[\w.-]+\/[\w.-]+$/.test(repository))
20
+ throw new Error("invalid-payload");
21
+ return `repos/${repository}/issues/${String(positiveInteger(operation, "number"))}`;
22
+ }
23
+ function labelsOf(issue) {
24
+ const labels = field(issue, "labels");
25
+ if (!Array.isArray(labels))
26
+ throw new Error("github-call-failed");
27
+ return labels.map((item) => {
28
+ const name = typeof item === "string" ? item : field(item, "name");
29
+ if (typeof name !== "string")
30
+ throw new Error("github-call-failed");
31
+ return name;
32
+ });
33
+ }
34
+ async function readIssue(operation, path) {
35
+ const issue = JSON.parse(await operation.calls.gh(["api", path]));
36
+ const body = field(issue, "body");
37
+ if ((body !== null && typeof body !== "string") ||
38
+ field(issue, "number") !== positiveInteger(operation, "number") ||
39
+ !["open", "closed"].includes(String(field(issue, "state"))) ||
40
+ field(issue, "pull_request") !== undefined)
41
+ throw new Error("github-call-failed");
42
+ return {
43
+ state: field(issue, "state"),
44
+ reason: field(issue, "state_reason"),
45
+ body: typeof body === "string" ? body : "",
46
+ labels: labelsOf(issue),
47
+ };
48
+ }
49
+ function isPositiveInteger(value) {
50
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
51
+ }
52
+ function isRemaining(value) {
53
+ return (Array.isArray(value) &&
54
+ value.length > 0 &&
55
+ value.every((item) => typeof item === "string" && item.trim() !== "" && !/[\r\n]/.test(item)));
56
+ }
57
+ function isPartialRun(value) {
58
+ return (isPositiveInteger(field(value, "pullRequest")) &&
59
+ isRemaining(field(value, "remaining")));
60
+ }
61
+ function historyOf(json) {
62
+ try {
63
+ const value = JSON.parse(json);
64
+ const partialRuns = field(value, "partialRuns");
65
+ const completedPullRequest = field(value, "completedPullRequest");
66
+ if (field(value, "version") !== 1 ||
67
+ !Array.isArray(partialRuns) ||
68
+ !partialRuns.every(isPartialRun) ||
69
+ new Set(partialRuns.map((run) => run.pullRequest)).size !==
70
+ partialRuns.length ||
71
+ (completedPullRequest !== undefined &&
72
+ !isPositiveInteger(completedPullRequest)))
73
+ return undefined;
74
+ return {
75
+ version: 1,
76
+ partialRuns,
77
+ ...(completedPullRequest === undefined ? {} : { completedPullRequest }),
78
+ };
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ function statusText(history) {
85
+ const lines = history.partialRuns.map((run) => `- Pull request #${String(run.pullRequest)}: partial. Remaining: ${run.remaining.join("; ")}`);
86
+ if (history.completedPullRequest !== undefined)
87
+ lines.push(`Completed in pull request #${String(history.completedPullRequest)}.`);
88
+ return `## Cloving status\n${lines.join("\n")}\n\n`;
89
+ }
90
+ function statusSection(body) {
91
+ const empty = { version: 1, partialRuns: [] };
92
+ const marker = /^<!-- cloving-status(?=\s|-->|$)/gm;
93
+ const start = [...body.matchAll(marker)].at(-1)?.index;
94
+ if (start === undefined)
95
+ return { outside: body, history: empty };
96
+ const tail = body.slice(start);
97
+ const end = tail.indexOf("-->");
98
+ if (end !== -1 && tail.slice(end + 3).trim() !== "")
99
+ return { outside: body, history: empty };
100
+ const outside = body.slice(0, start);
101
+ if (end === -1)
102
+ return { outside, history: empty };
103
+ const history = historyOf(tail.slice("<!-- cloving-status".length, end).trim());
104
+ if (history === undefined)
105
+ return { outside, history: empty };
106
+ const section = statusText(history);
107
+ return {
108
+ outside: outside.endsWith(section)
109
+ ? outside.slice(0, -section.length)
110
+ : outside,
111
+ history,
112
+ };
113
+ }
114
+ function withStatus(outside, history) {
115
+ const separator = "\n".repeat(Math.max(0, 2 - (outside.match(/\n*$/)?.[0].length ?? 0)));
116
+ const json = JSON.stringify(history)
117
+ .replace(/--/g, "\\u002d\\u002d")
118
+ .replace(/>/g, "\\u003e");
119
+ return `${outside}${outside === "" ? "" : separator}${statusText(history)}<!-- cloving-status\n${json}\n-->\n`;
120
+ }
121
+ async function writeIssue(operation, update) {
122
+ const { path, body, labels } = update;
123
+ const latest = await readIssue(operation, path);
124
+ if (latest.body !== update.originalBody)
125
+ throw new Error("github-issue-conflict");
126
+ const fields = update.fields ?? [];
127
+ if (body !== latest.body || fields.length > 0)
128
+ await operation.calls.gh([
129
+ "api",
130
+ "-X",
131
+ "PATCH",
132
+ path,
133
+ "-f",
134
+ `body=${body}`,
135
+ ...fields,
136
+ ]);
137
+ const add = workflowLabels.filter((name) => labels.includes(name) && !latest.labels.includes(name));
138
+ const remove = workflowLabels.filter((name) => !labels.includes(name) && latest.labels.includes(name));
139
+ if (add.length === 0 && remove.length === 0)
140
+ return;
141
+ await operation.calls.gh([
142
+ "issue",
143
+ "edit",
144
+ String(positiveInteger(operation, "number")),
145
+ "--repo",
146
+ `${text(operation, "owner")}/${text(operation, "repository")}`,
147
+ ...add.flatMap((name) => ["--add-label", name]),
148
+ ...remove.flatMap((name) => ["--remove-label", name]),
149
+ ]);
150
+ }
151
+ function sameLabels(first, second) {
152
+ return JSON.stringify(first.toSorted()) === JSON.stringify(second.toSorted());
153
+ }
154
+ export async function closeIssue(operation) {
155
+ const path = issuePath(operation);
156
+ const pull = positiveInteger(operation, "pullRequest");
157
+ const issue = await readIssue(operation, path);
158
+ const section = statusSection(issue.body);
159
+ const body = withStatus(section.outside, {
160
+ ...section.history,
161
+ completedPullRequest: pull,
162
+ });
163
+ const labels = issue.labels.filter((name) => !["cloving: ready", "cloving: blocked", "cloving: in progress"].includes(name));
164
+ if (body === issue.body &&
165
+ sameLabels(issue.labels, labels) &&
166
+ issue.state === "closed" &&
167
+ issue.reason === "completed")
168
+ return {
169
+ number: positiveInteger(operation, "number"),
170
+ ticketStatus: "complete",
171
+ };
172
+ await writeIssue(operation, {
173
+ path,
174
+ originalBody: issue.body,
175
+ body,
176
+ labels,
177
+ fields: issue.state === "closed" && issue.reason === "completed"
178
+ ? []
179
+ : ["-f", "state=closed", "-f", "state_reason=completed"],
180
+ });
181
+ return {
182
+ number: positiveInteger(operation, "number"),
183
+ ticketStatus: "complete",
184
+ };
185
+ }
186
+ function remainingItems(operation) {
187
+ const items = operation.payload["remaining"];
188
+ if (!Array.isArray(items) ||
189
+ items.length === 0 ||
190
+ items.some((item) => typeof item !== "string" || item.trim() === "" || /[\r\n]/.test(item)))
191
+ throw new Error("invalid-payload");
192
+ return items.map(String);
193
+ }
194
+ function publicRemaining(operation) {
195
+ const remaining = remainingItems(operation);
196
+ try {
197
+ issuePrivacy(remaining.join("; "), {
198
+ settings: operation.settings,
199
+ repository: `${text(operation, "owner")}/${text(operation, "repository")}`,
200
+ });
201
+ return remaining;
202
+ }
203
+ catch {
204
+ return [privateRemaining];
205
+ }
206
+ }
207
+ function partialHistory(section, status) {
208
+ const recorded = section.history.partialRuns.some((run) => run.pullRequest === status.pull);
209
+ for (const remaining of [status.remaining, [privateRemaining]]) {
210
+ const history = {
211
+ ...section.history,
212
+ partialRuns: recorded
213
+ ? section.history.partialRuns
214
+ : [
215
+ ...section.history.partialRuns,
216
+ { pullRequest: status.pull, remaining },
217
+ ],
218
+ };
219
+ if (Buffer.byteLength(withStatus(section.outside, history)) <= issueBodyBytes)
220
+ return history;
221
+ }
222
+ throw new Error("github-issue-too-large");
223
+ }
224
+ export async function partialIssue(operation) {
225
+ const path = issuePath(operation);
226
+ const pull = positiveInteger(operation, "pullRequest");
227
+ const remaining = publicRemaining(operation);
228
+ const issue = await readIssue(operation, path);
229
+ const section = statusSection(issue.body);
230
+ const history = partialHistory(section, { pull, remaining });
231
+ const count = history.partialRuns.length;
232
+ const label = count >= 3 ? "cloving: blocked" : "cloving: ready";
233
+ const body = withStatus(section.outside, history);
234
+ const labels = [
235
+ ...issue.labels.filter((name) => ![
236
+ "cloving: ready",
237
+ "cloving: blocked",
238
+ "cloving: in progress",
239
+ ].includes(name)),
240
+ label,
241
+ ];
242
+ if (body === issue.body && sameLabels(issue.labels, labels))
243
+ return {
244
+ number: positiveInteger(operation, "number"),
245
+ ticketStatus: "partial",
246
+ };
247
+ const repository = `${text(operation, "owner")}/${text(operation, "repository")}`;
248
+ await operation.calls.gh([
249
+ "label",
250
+ "create",
251
+ label,
252
+ "--repo",
253
+ repository,
254
+ "--color",
255
+ "ededed",
256
+ "--force",
257
+ ]);
258
+ await writeIssue(operation, {
259
+ path,
260
+ originalBody: issue.body,
261
+ body,
262
+ labels,
263
+ });
264
+ return {
265
+ number: positiveInteger(operation, "number"),
266
+ ticketStatus: "partial",
267
+ };
268
+ }
@@ -0,0 +1,17 @@
1
+ import type { Delivery } from "../broker/actor/delivery-intents.ts";
2
+ import { type MethodSettings } from "./github-methods.ts";
3
+ import { type WorkerReport } from "./operation-journal.ts";
4
+ export type { GithubTiming } from "./github-methods.ts";
5
+ export interface GithubWorkerSettings extends MethodSettings {
6
+ readonly journal: string;
7
+ readonly document: (digest: string) => Promise<string | undefined>;
8
+ readonly report: (report: WorkerReport) => Promise<unknown>;
9
+ readonly operationStatus: (operationId: string) => Promise<string | undefined>;
10
+ readonly runStatus: (runId: string) => Promise<string | undefined>;
11
+ }
12
+ export interface GithubWorker extends Delivery {
13
+ readonly stop: NonNullable<Delivery["stop"]>;
14
+ readonly scan: () => Promise<void>;
15
+ readonly close: () => Promise<void>;
16
+ }
17
+ export declare function githubWorker(settings: GithubWorkerSettings): GithubWorker;
@@ -0,0 +1,281 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { calls } from "./github-calls.js";
4
+ import { methodReasons, methods, } from "./github-methods.js";
5
+ import { interrupted, located, readRecord, replied, reportOf, writeRecord, } from "./operation-journal.js";
6
+ const worker = "github";
7
+ const closing = "github-worker-closed";
8
+ const endedRuns = new Set([
9
+ "cancelled",
10
+ "failed",
11
+ "completed",
12
+ ]);
13
+ const unsettledOperations = new Set([
14
+ "dispatch-pending",
15
+ "running",
16
+ "recovering",
17
+ "blocked",
18
+ ]);
19
+ const outcomes = ["completed", "failed", "stopped"];
20
+ function placed(parts, intent) {
21
+ return located(parts.settings.journal, intent.operationId);
22
+ }
23
+ async function reconciled(parts, intent) {
24
+ const { key, folder } = placed(parts, intent);
25
+ const identity = { receipt: key, worker };
26
+ const result = await readRecord(folder, "result.json");
27
+ if (result !== undefined)
28
+ return replied(identity, result);
29
+ if (parts.active.has(key))
30
+ return { kind: "accepted", ...identity };
31
+ if ((await readRecord(folder, "started.json")) === undefined)
32
+ return { kind: "absent" };
33
+ const ending = interrupted("github-call-interrupted");
34
+ await writeRecord(folder, { name: "result.json", value: ending });
35
+ return replied(identity, ending);
36
+ }
37
+ async function outcome(parts, run) {
38
+ const { intent, method, payload, signal } = run;
39
+ const { settings } = parts;
40
+ if (intent.target.startsWith("branch:"))
41
+ return interrupted("branch-target-not-supported");
42
+ try {
43
+ const result = await method({
44
+ settings,
45
+ folder: run.folder,
46
+ calls: calls(settings, signal),
47
+ target: intent.target,
48
+ payload,
49
+ signal,
50
+ });
51
+ return {
52
+ outcome: "completed",
53
+ result: JSON.stringify(result),
54
+ endedAt: new Date().toISOString(),
55
+ };
56
+ }
57
+ catch (error) {
58
+ if (signal.aborted)
59
+ return { outcome: "stopped", endedAt: new Date().toISOString() };
60
+ const reason = String(Reflect.get(Object(error), "message"));
61
+ const detail = Reflect.get(Object(error), "detail");
62
+ return {
63
+ ...interrupted(methodReasons.has(reason) ? reason : "github-call-failed"),
64
+ ...(typeof detail === "string" ? { detail } : {}),
65
+ };
66
+ }
67
+ }
68
+ async function reported(parts, ending) {
69
+ const { start, recorded } = ending;
70
+ const { key, intent } = start;
71
+ await parts.settings.report(reportOf({ intent, commandId: `github:${key}`, worker }, recorded));
72
+ }
73
+ async function ended(parts, ending) {
74
+ const { start, recorded } = ending;
75
+ await writeRecord(start.folder, { name: "result.json", value: recorded });
76
+ await reported(parts, ending);
77
+ }
78
+ function begun(parts, start) {
79
+ const { key } = start;
80
+ const stopping = new AbortController();
81
+ const concluded = (async () => {
82
+ const recorded = await outcome(parts, {
83
+ ...start,
84
+ signal: stopping.signal,
85
+ });
86
+ if (stopping.signal.reason === closing)
87
+ return;
88
+ await ended(parts, { start, recorded });
89
+ })()
90
+ .catch(() => undefined)
91
+ .finally(() => parts.active.delete(key));
92
+ parts.active.set(key, { stopping, concluded });
93
+ }
94
+ function ownIntent(intent) {
95
+ return (intent.capability === worker &&
96
+ intent.method !== undefined &&
97
+ intent.target !== undefined &&
98
+ intent.payload !== undefined &&
99
+ intent.leaseGeneration !== undefined);
100
+ }
101
+ function payloadOf(text) {
102
+ try {
103
+ const value = JSON.parse(text);
104
+ return typeof value === "object" && value !== null && !Array.isArray(value)
105
+ ? { ...value }
106
+ : undefined;
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ function failure(reason) {
113
+ return { kind: "failed", reason };
114
+ }
115
+ async function delivered(parts, intent) {
116
+ if (!ownIntent(intent))
117
+ return failure("unsupported-effect");
118
+ if (intent.target.startsWith("branch:"))
119
+ return failure("branch-target-not-supported");
120
+ const method = methods.get(intent.method);
121
+ if (method === undefined)
122
+ return failure("unsupported-effect");
123
+ const known = await reconciled(parts, intent);
124
+ if (known.kind !== "absent")
125
+ return known;
126
+ const text = await parts.settings.document(intent.payload);
127
+ if (text === undefined)
128
+ return failure("payload-not-available");
129
+ const payload = payloadOf(text);
130
+ if (payload === undefined)
131
+ return failure("invalid-payload");
132
+ const place = placed(parts, intent);
133
+ await writeRecord(place.folder, {
134
+ name: "started.json",
135
+ value: {
136
+ operationId: intent.operationId,
137
+ method: intent.method,
138
+ target: intent.target,
139
+ startedAt: new Date().toISOString(),
140
+ runId: intent.runId,
141
+ inputDigest: intent.inputDigest,
142
+ leaseGeneration: intent.leaseGeneration,
143
+ payloadText: text,
144
+ },
145
+ });
146
+ begun(parts, { ...place, intent, method, payload });
147
+ return { receipt: place.key, worker };
148
+ }
149
+ async function halted(active, reason) {
150
+ active.stopping.abort(reason);
151
+ await active.concluded;
152
+ }
153
+ async function stopped(parts, intent) {
154
+ const active = parts.active.get(placed(parts, intent).key);
155
+ if (active !== undefined)
156
+ await halted(active, "github-operation-stopped");
157
+ return reconciled(parts, intent);
158
+ }
159
+ function textOf(value, name) {
160
+ const item = Reflect.get(Object(value), name);
161
+ return typeof item === "string" ? item : "";
162
+ }
163
+ function keptOf(value) {
164
+ const leaseGeneration = Reflect.get(Object(value), "leaseGeneration");
165
+ const kept = {
166
+ operationId: textOf(value, "operationId"),
167
+ runId: textOf(value, "runId"),
168
+ inputDigest: textOf(value, "inputDigest"),
169
+ method: textOf(value, "method"),
170
+ target: textOf(value, "target"),
171
+ payloadText: textOf(value, "payloadText"),
172
+ };
173
+ if (typeof leaseGeneration !== "number" || Object.values(kept).includes(""))
174
+ return undefined;
175
+ return { ...kept, leaseGeneration };
176
+ }
177
+ function startOf(parts, value) {
178
+ const kept = keptOf(value);
179
+ if (kept === undefined)
180
+ return undefined;
181
+ const method = methods.get(kept.method);
182
+ const payload = payloadOf(kept.payloadText);
183
+ if (method === undefined || payload === undefined)
184
+ return undefined;
185
+ const place = located(parts.settings.journal, kept.operationId);
186
+ return { ...place, intent: kept, method, payload };
187
+ }
188
+ function recordOf(value) {
189
+ const outcome = outcomes.find((item) => item === textOf(value, "outcome"));
190
+ if (outcome === undefined)
191
+ return undefined;
192
+ const result = Reflect.get(Object(value), "result");
193
+ const reason = Reflect.get(Object(value), "reason");
194
+ return {
195
+ outcome,
196
+ endedAt: textOf(value, "endedAt"),
197
+ ...(typeof result === "string" ? { result } : {}),
198
+ ...(typeof reason === "string" ? { reason } : {}),
199
+ };
200
+ }
201
+ async function unsettled(parts, kept) {
202
+ const status = await parts.settings.operationStatus(kept.operationId);
203
+ return unsettledOperations.has(status ?? "");
204
+ }
205
+ async function live(parts, kept) {
206
+ if (!(await unsettled(parts, kept)))
207
+ return false;
208
+ const run = await parts.settings.runStatus(kept.runId);
209
+ return run !== undefined && !endedRuns.has(run);
210
+ }
211
+ async function resent(parts, saved) {
212
+ const recorded = recordOf(saved.result);
213
+ if (recorded === undefined)
214
+ return;
215
+ if (!(await unsettled(parts, saved.start.intent)))
216
+ return;
217
+ await reported(parts, { start: saved.start, recorded });
218
+ }
219
+ async function continued(parts, start) {
220
+ if (await live(parts, start.intent)) {
221
+ begun(parts, start);
222
+ return;
223
+ }
224
+ const recorded = {
225
+ outcome: "stopped",
226
+ endedAt: new Date().toISOString(),
227
+ };
228
+ await ended(parts, { start, recorded });
229
+ }
230
+ async function resumed(parts, folder) {
231
+ const started = await readRecord(folder, "started.json");
232
+ if (started === undefined)
233
+ return;
234
+ const result = await readRecord(folder, "result.json");
235
+ const start = startOf(parts, started);
236
+ if (start !== undefined && result !== undefined) {
237
+ await resent(parts, { start, result });
238
+ return;
239
+ }
240
+ if (start !== undefined) {
241
+ await continued(parts, start);
242
+ return;
243
+ }
244
+ if (result !== undefined)
245
+ return;
246
+ const ending = interrupted("github-call-interrupted");
247
+ await writeRecord(folder, { name: "result.json", value: ending });
248
+ }
249
+ async function scanned(parts) {
250
+ const { journal } = parts.settings;
251
+ const entries = await readdir(journal).catch(() => []);
252
+ await Promise.all(entries.map((entry) => resumed(parts, join(journal, entry)).catch(() => undefined)));
253
+ }
254
+ function scanning(parts) {
255
+ const scan = scanned(parts).finally(() => {
256
+ parts.scanned.resolve();
257
+ });
258
+ parts.scans.push(scan);
259
+ return scan;
260
+ }
261
+ export function githubWorker(settings) {
262
+ if (settings.gh.length === 0)
263
+ throw new Error("invalid-github-command");
264
+ const parts = {
265
+ settings,
266
+ active: new Map(),
267
+ scanned: Promise.withResolvers(),
268
+ scans: [],
269
+ };
270
+ const after = (call) => parts.scanned.promise.then(call);
271
+ return {
272
+ deliver: (intent) => after(() => delivered(parts, intent)),
273
+ reconcile: (intent) => after(() => reconciled(parts, intent)),
274
+ stop: (intent) => after(() => stopped(parts, intent)),
275
+ scan: () => scanning(parts),
276
+ close: async () => {
277
+ await Promise.all(parts.scans);
278
+ await Promise.all([...parts.active.values()].map((active) => halted(active, closing)));
279
+ },
280
+ };
281
+ }
@@ -0,0 +1,8 @@
1
+ export interface HostPlace {
2
+ readonly directory: string;
3
+ readonly concurrency: number;
4
+ readonly leaseSeconds?: number;
5
+ }
6
+ export declare const ownershipLeaseSeconds = 15;
7
+ export declare function worldDirectory(directory: string): string;
8
+ export declare function hostEnvironment(place: HostPlace): Readonly<Record<string, string>>;
@@ -0,0 +1,14 @@
1
+ import { join } from "node:path";
2
+ export const ownershipLeaseSeconds = 15;
3
+ export function worldDirectory(directory) {
4
+ return join(directory, "world");
5
+ }
6
+ export function hostEnvironment(place) {
7
+ return {
8
+ WORKFLOW_TARGET_WORLD: "local",
9
+ WORKFLOW_LOCAL_DATA_DIR: worldDirectory(place.directory),
10
+ WORKFLOW_LOCAL_BASE_URL: "http://127.0.0.1:1",
11
+ WORKFLOW_LOCAL_QUEUE_CONCURRENCY: String(place.concurrency),
12
+ WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS: String(place.leaseSeconds ?? ownershipLeaseSeconds),
13
+ };
14
+ }
@@ -0,0 +1,10 @@
1
+ interface QueueSettings {
2
+ readonly directory: string;
3
+ readonly runtimeDirectory: string;
4
+ readonly intervalMilliseconds: number;
5
+ readonly resetQueue?: boolean;
6
+ }
7
+ export declare function issueQueue(settings: QueueSettings): {
8
+ readonly stop: () => Promise<void>;
9
+ };
10
+ export {};