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,261 @@
1
+ import { isProfilesFile } from "../src/turn-profile.js";
2
+ import { parseTokenPrices } from "../src/token-prices.js";
3
+ import { execFileSync, spawn } from "node:child_process";
4
+ import { copyFile, mkdir, readFile, rm, symlink, writeFile, } from "node:fs/promises";
5
+ import { dirname, extname, join, resolve } from "node:path";
6
+ import packageMetadata from "#package" with { type: "json" };
7
+ import { findPackageJSON } from "node:module";
8
+ import { pathToFileURL } from "node:url";
9
+ import { workflowDeclarations, workflowFiles, workflowManifests, } from "./self-host-workflows.js";
10
+ import { isWorkflowManifest } from "./workflow-manifest.js";
11
+ import { selfUpdateMilliseconds } from "./self-update-host.js";
12
+ import { hostedPrograms } from "./self-host-processes.js";
13
+ const product = resolve(import.meta.dirname, "..");
14
+ const flags = process.argv.slice(2);
15
+ function flag(name) {
16
+ const index = flags.lastIndexOf(name);
17
+ return index === -1 ? undefined : flags[index + 1];
18
+ }
19
+ function topLevel(given) {
20
+ try {
21
+ return execFileSync("git", ["-C", given, "rev-parse", "--show-toplevel"], {
22
+ encoding: "utf8",
23
+ stdio: ["ignore", "pipe", "ignore"],
24
+ }).trim();
25
+ }
26
+ catch {
27
+ return given;
28
+ }
29
+ }
30
+ const runtimeArgument = flag("--runtime");
31
+ if (runtimeArgument === undefined)
32
+ throw new Error("The start program needs --runtime. Use: cloving start");
33
+ const runtime = resolve(runtimeArgument);
34
+ const directory = dirname(runtime);
35
+ const repository = topLevel(resolve(flag("--repository") ?? process.cwd()));
36
+ const updateMilliseconds = await selfUpdateMilliseconds({
37
+ seconds: process.env["CLOVING_SELF_UPDATE_SECONDS"],
38
+ repository,
39
+ product: extname(import.meta.filename) === ".ts" ? topLevel(product) : product,
40
+ });
41
+ const client = flag("--client") ?? "cloving";
42
+ const project = join(directory, "project");
43
+ const concurrency = Number(process.env["CLOVING_HOST_BOUND"] ?? "8");
44
+ const leaseText = process.env["CLOVING_OWNERSHIP_LEASE_SECONDS"];
45
+ const leaseSeconds = leaseText === undefined ? undefined : Number(leaseText);
46
+ const defaultCommand = [
47
+ "claude",
48
+ "-p",
49
+ "--output-format",
50
+ "stream-json",
51
+ "--verbose",
52
+ "--permission-mode",
53
+ "acceptEdits",
54
+ "--allowedTools",
55
+ "Bash,Read,Edit,Write,Glob,Grep,WebSearch,WebFetch",
56
+ "--max-budget-usd",
57
+ "5",
58
+ ];
59
+ const defaultCodexCommand = [
60
+ "codex",
61
+ "exec",
62
+ "--json",
63
+ "--dangerously-bypass-approvals-and-sandbox",
64
+ "--skip-git-repo-check",
65
+ "-",
66
+ ];
67
+ function selectedWorker() {
68
+ const worker = process.env["CLOVING_WORKER"] ?? "claude";
69
+ if (worker === "claude" || worker === "codex")
70
+ return worker;
71
+ throw new Error(`The daemon did not start: invalid-worker: ${worker}`);
72
+ }
73
+ async function profilesFile() {
74
+ const path = process.env["CLOVING_PROFILES"];
75
+ if (path === undefined)
76
+ return {};
77
+ try {
78
+ const value = JSON.parse(await readFile(path, "utf8"));
79
+ if (isProfilesFile(value))
80
+ return value.profiles;
81
+ }
82
+ catch {
83
+ throw new Error("The daemon did not start: invalid-profiles");
84
+ }
85
+ throw new Error("The daemon did not start: invalid-profiles");
86
+ }
87
+ function queueInterval(commands) {
88
+ const value = process.env["CLOVING_QUEUE_SECONDS"];
89
+ if (value === undefined)
90
+ return undefined;
91
+ const seconds = Number(value);
92
+ if (!/^\d+$/.test(value) ||
93
+ !Number.isInteger(seconds) ||
94
+ seconds < 10 ||
95
+ seconds > 3600)
96
+ throw new Error("The daemon did not start: invalid-queue-seconds");
97
+ if (!commands.nextCommand?.length)
98
+ throw new Error("The daemon did not start: queue-needs-next-command");
99
+ if (!commands.ticketCommand?.length)
100
+ throw new Error("The daemon did not start: queue-needs-ticket-command");
101
+ return seconds * 1000;
102
+ }
103
+ function listed(name) {
104
+ const given = process.env[name];
105
+ if (given === undefined)
106
+ return undefined;
107
+ const list = JSON.parse(given);
108
+ if (!Array.isArray(list) || !list.every((part) => typeof part === "string"))
109
+ throw new Error(`${name} is not a JSON list of texts.`);
110
+ return list.map(String);
111
+ }
112
+ function record(value) {
113
+ return typeof value === "object" && value !== null ? { ...value } : {};
114
+ }
115
+ function ended(argumentsList, environment) {
116
+ return new Promise((settle, reject) => {
117
+ const child = spawn(process.execPath, argumentsList, {
118
+ cwd: project,
119
+ env: environment,
120
+ stdio: "inherit",
121
+ });
122
+ for (const signal of ["SIGINT", "SIGTERM"])
123
+ process.on(signal, () => child.kill(signal));
124
+ child.once("error", reject);
125
+ child.once("close", (status) => {
126
+ settle(status ?? 1);
127
+ });
128
+ });
129
+ }
130
+ async function linkedPackages() {
131
+ const modules = join(project, "node_modules");
132
+ await mkdir(join(modules, "cloving"), { recursive: true });
133
+ for (const name of Object.keys(packageMetadata.dependencies)) {
134
+ const location = findPackageJSON(name, join(product, "package.json"));
135
+ if (location === undefined)
136
+ throw new Error(`missing-runtime-dependency: ${name}`);
137
+ await mkdir(dirname(join(modules, name)), { recursive: true });
138
+ await symlink(dirname(location), join(modules, name));
139
+ }
140
+ const manifest = record(packageMetadata);
141
+ const exported = Object.keys(record(manifest["exports"])).filter((subpath) => subpath.startsWith("./workflows"));
142
+ await symlink(join(product, "src"), join(modules, "cloving", "src"));
143
+ await writeFile(join(modules, "cloving", "package.json"), JSON.stringify({
144
+ name: manifest["name"],
145
+ version: manifest["version"],
146
+ type: "module",
147
+ exports: Object.fromEntries(exported.map((subpath) => [
148
+ subpath,
149
+ `./src/${subpath.slice("./workflows/".length) || "workflows"}${extname(import.meta.filename)}`,
150
+ ])),
151
+ }));
152
+ }
153
+ async function registered() {
154
+ const compiled = JSON.parse(await readFile(join(project, "artifacts/manifest.json"), "utf8"));
155
+ if (!isWorkflowManifest(compiled))
156
+ throw new Error("The compiled workflow manifest is invalid.");
157
+ const manifests = workflowManifests(compiled);
158
+ const declarations = await workflowDeclarations(join(product, "workflows"), manifests);
159
+ const paths = new Map();
160
+ for (const [functionName, manifest] of Object.entries(workflowManifests(compiled, declarations))) {
161
+ const path = join(project, `${manifest.name}.workflow.json`);
162
+ await writeFile(path, JSON.stringify(manifest));
163
+ paths.set(functionName, path);
164
+ }
165
+ return { manifests: Object.fromEntries(paths), declarations };
166
+ }
167
+ function source(file) {
168
+ return JSON.stringify(pathToFileURL(join(product, file.replace(/\.ts$/, extname(import.meta.filename)))).href);
169
+ }
170
+ async function launchers(commands, workflows) {
171
+ const settings = {
172
+ ...commands,
173
+ directory,
174
+ repository,
175
+ concurrency,
176
+ runtimeDirectory: runtime,
177
+ ...workflows,
178
+ };
179
+ await writeFile(join(project, "start.mjs"), `import { hostEnvironment } from ${source("src/daemon/host-environment.ts")};
180
+ Object.assign(process.env, hostEnvironment(${JSON.stringify({ directory, concurrency, leaseSeconds })}));
181
+ await import("./main.mjs");
182
+ `);
183
+ await writeFile(join(project, "main.mjs"), `import * as workflows from "./artifacts/client.mjs";
184
+ import { POST } from "./artifacts/flow.mjs";
185
+ import { startDaemon } from ${source("src/daemon/daemon.ts")};
186
+ const opening = await startDaemon({ ...JSON.parse(${JSON.stringify(JSON.stringify(settings))}), workflows, handler: POST });
187
+ if (opening.kind !== "started") {
188
+ process.stderr.write("The daemon did not start: " + opening.reason + ": " + opening.detail + "\\n");
189
+ process.exit(1);
190
+ }
191
+ process.stdout.write(${JSON.stringify(guide())});
192
+ const stop = async () => { await opening.daemon.close(); process.exit(0); };
193
+ process.once("SIGINT", stop);
194
+ process.once("SIGTERM", stop);
195
+ `);
196
+ }
197
+ function guide() {
198
+ return [
199
+ "Cloving runs. Stop it with Control-C.",
200
+ `Repository: ${repository}`,
201
+ `Work trees: ${join(directory, "worktrees")}`,
202
+ "Commands for a second terminal:",
203
+ ` ${client} run develop-ticket --ticket <ticket-id>`,
204
+ ` ${client} run develop-issue --ticket <ticket-id>`,
205
+ ` ${client} run develop-prompt --prompt "<the text of the task>"`,
206
+ ` ${client} run develop-prd --prompt "<the idea>"`,
207
+ ` ${client} status`,
208
+ ` ${client} questions`,
209
+ ` ${client} watch`,
210
+ "",
211
+ ].join("\n");
212
+ }
213
+ async function prepared() {
214
+ await rm(project, { recursive: true, force: true });
215
+ await mkdir(join(project, "workflows"), { recursive: true });
216
+ await writeFile(join(project, "package.json"), '{"name":"cloving-self-host","private":true,"type":"module"}');
217
+ for (const file of await workflowFiles(join(product, "workflows")))
218
+ await copyFile(join(product, "workflows", file), join(project, "workflows", file));
219
+ await linkedPackages();
220
+ const compiled = await ended([
221
+ join(product, `tools/compile-workflows${extname(import.meta.filename)}`),
222
+ "workflows",
223
+ "artifacts",
224
+ ], process.env);
225
+ if (compiled !== 0)
226
+ throw new Error("The workflows did not compile.");
227
+ return registered();
228
+ }
229
+ const tokenPrices = parseTokenPrices(process.env["CLOVING_TOKEN_PRICES"]);
230
+ const profiles = await profilesFile();
231
+ const worker = selectedWorker();
232
+ const command = worker === "codex"
233
+ ? (listed("CLOVING_CODEX_COMMAND") ?? defaultCodexCommand)
234
+ : (listed("CLOVING_CLAUDE_COMMAND") ?? defaultCommand);
235
+ const nextCommand = listed("CLOVING_NEXT_COMMAND");
236
+ const ticketCommand = listed("CLOVING_TICKET_COMMAND");
237
+ const queueMilliseconds = queueInterval({ nextCommand, ticketCommand });
238
+ const manifests = await prepared();
239
+ await launchers({
240
+ tokenPrices,
241
+ worker,
242
+ profiles,
243
+ command,
244
+ ticketCommand,
245
+ nextCommand,
246
+ queueMilliseconds,
247
+ resetQueue: flags.includes("--reset-queue"),
248
+ notifyCommand: listed("CLOVING_NOTIFY_COMMAND"),
249
+ githubCommand: listed("CLOVING_GH_COMMAND"),
250
+ checkCommand: listed("CLOVING_CHECK_COMMAND"),
251
+ privateTexts: listed("CLOVING_PRIVATE_TEXTS"),
252
+ }, manifests);
253
+ process.exitCode = await hostedPrograms({
254
+ project,
255
+ product,
256
+ runtime,
257
+ directory,
258
+ repository,
259
+ updateMilliseconds,
260
+ watchPort: process.env["CLOVING_WATCH_PORT"] ?? "3663",
261
+ });
@@ -0,0 +1,13 @@
1
+ interface ActivitySettings {
2
+ readonly directory: string;
3
+ readonly runtimeDirectory: string;
4
+ readonly signal?: AbortSignal;
5
+ }
6
+ export declare function selfUpdateActive(settings: ActivitySettings): Promise<boolean>;
7
+ export declare function selfUpdateMilliseconds(settings: {
8
+ readonly seconds: string | undefined;
9
+ readonly repository: string;
10
+ readonly product: string;
11
+ }): Promise<number | undefined>;
12
+ export declare function workerTurnActive(directory: string): Promise<boolean>;
13
+ export {};
@@ -0,0 +1,88 @@
1
+ import { access, readdir, realpath } from "node:fs/promises";
2
+ import { execFile } from "node:child_process";
3
+ import { extname, join } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { record } from "../src/protocol.js";
6
+ async function runPage(settings, after) {
7
+ const output = await promisify(execFile)(process.execPath, [
8
+ join(import.meta.dirname, `../src/cli${extname(import.meta.filename)}`),
9
+ "status",
10
+ "--json",
11
+ "--limit",
12
+ "500",
13
+ ...(after === "" ? [] : ["--after", after]),
14
+ ], {
15
+ env: { ...process.env, CLOVING_RUNTIME_DIR: settings.runtimeDirectory },
16
+ encoding: "utf8",
17
+ timeout: 30000,
18
+ signal: settings.signal,
19
+ });
20
+ const page = record(JSON.parse(output.stdout));
21
+ if (!page)
22
+ throw new Error("invalid-run-list");
23
+ return page;
24
+ }
25
+ export async function selfUpdateActive(settings) {
26
+ if (await present(join(settings.directory, "queue-submission")))
27
+ return true;
28
+ if (await workerTurnActive(settings.directory))
29
+ return true;
30
+ let after = "";
31
+ do {
32
+ const page = await runPage(settings, after);
33
+ const runs = page["runs"];
34
+ if (!Array.isArray(runs))
35
+ throw new Error("invalid-run-list");
36
+ if (runs.some((value) => {
37
+ const run = record(value);
38
+ if (!run)
39
+ throw new Error("invalid-run-status");
40
+ return !["completed", "failed", "cancelled"].includes(String(run["state"]));
41
+ }))
42
+ return true;
43
+ const next = page["next"];
44
+ if (next !== null && (typeof next !== "string" || next <= after))
45
+ throw new Error("invalid-run-page");
46
+ after = next;
47
+ } while (after !== null);
48
+ return false;
49
+ }
50
+ export async function selfUpdateMilliseconds(settings) {
51
+ const { seconds } = settings;
52
+ if (seconds === undefined)
53
+ return;
54
+ const value = Number(seconds);
55
+ if (!/^\d+$/.test(seconds) ||
56
+ !Number.isInteger(value) ||
57
+ value < 30 ||
58
+ value > 3600)
59
+ throw new Error("The daemon did not start: invalid-self-update-seconds");
60
+ if ((await realpath(settings.repository)) !== (await realpath(settings.product)))
61
+ throw new Error("The daemon did not start: self-update-needs-own-repository");
62
+ return value * 1000;
63
+ }
64
+ async function present(path) {
65
+ try {
66
+ await access(path);
67
+ return true;
68
+ }
69
+ catch (error) {
70
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
71
+ return false;
72
+ throw error;
73
+ }
74
+ }
75
+ export async function workerTurnActive(directory) {
76
+ const journal = join(directory, "journal");
77
+ if (!(await present(journal)))
78
+ return false;
79
+ for (const entry of await readdir(journal, { withFileTypes: true })) {
80
+ if (!entry.isDirectory())
81
+ continue;
82
+ const turn = join(journal, entry.name);
83
+ if ((await present(join(turn, "started.json"))) &&
84
+ !(await present(join(turn, "result.json"))))
85
+ return true;
86
+ }
87
+ return false;
88
+ }
@@ -0,0 +1,11 @@
1
+ export interface SelfUpdateSettings {
2
+ readonly directory: string;
3
+ readonly git: (argumentsList: readonly string[]) => Promise<string>;
4
+ readonly active: () => Promise<boolean>;
5
+ readonly stop: () => Promise<void>;
6
+ readonly error: (line: string) => void;
7
+ }
8
+ export declare function lockRequiresInstall(before: string, after: string): boolean;
9
+ export declare function selfUpdater(settings: SelfUpdateSettings): {
10
+ readonly check: () => Promise<number | undefined>;
11
+ };
@@ -0,0 +1,177 @@
1
+ export function lockRequiresInstall(before, after) {
2
+ try {
3
+ return !isDeepStrictEqual(lockPackages(before), lockPackages(after));
4
+ }
5
+ catch {
6
+ return true;
7
+ }
8
+ }
9
+ function lockPackages(text) {
10
+ const lock = JSON.parse(text);
11
+ if (typeof lock !== "object" || lock === null || !("packages" in lock))
12
+ throw new Error("invalid package lock");
13
+ const packages = lock.packages;
14
+ if (typeof packages !== "object" ||
15
+ packages === null ||
16
+ Array.isArray(packages))
17
+ throw new Error("invalid package lock packages");
18
+ return Object.fromEntries(Object.entries(packages).filter(([path]) => path !== ""));
19
+ }
20
+ async function clean(git) {
21
+ const status = await git([
22
+ "status",
23
+ "--porcelain",
24
+ "--untracked-files=all",
25
+ "--ignore-submodules=none",
26
+ ]);
27
+ if (status.length > 0)
28
+ return false;
29
+ return !/^[a-zS] /m.test(await git(["ls-files", "-v"]));
30
+ }
31
+ async function installRequired(git, update) {
32
+ try {
33
+ await git([
34
+ "diff",
35
+ "--exit-code",
36
+ update.head,
37
+ update.target,
38
+ "--",
39
+ "package-lock.json",
40
+ ]);
41
+ return false;
42
+ }
43
+ catch {
44
+ const before = await git(["show", `${update.head}:package-lock.json`]);
45
+ const after = await git(["show", `${update.target}:package-lock.json`]);
46
+ return lockRequiresInstall(before, after);
47
+ }
48
+ }
49
+ async function candidate(settings) {
50
+ const git = settings.git;
51
+ await git(["fetch", "origin"]);
52
+ await git(["remote", "set-head", "origin", "--auto"]);
53
+ const remoteBranch = (await git(["symbolic-ref", "refs/remotes/origin/HEAD"])).trim();
54
+ if (!remoteBranch.startsWith("refs/remotes/origin/"))
55
+ return;
56
+ const branch = remoteBranch.replace("refs/remotes/origin/", "refs/heads/");
57
+ if ((await git(["symbolic-ref", "HEAD"])).trim() !== branch)
58
+ return;
59
+ const head = (await git(["rev-parse", "HEAD"])).trim();
60
+ const target = (await git(["rev-parse", remoteBranch])).trim();
61
+ if (head === target)
62
+ return;
63
+ await git(["merge-base", "--is-ancestor", head, target]);
64
+ if (!(await clean(git)))
65
+ return;
66
+ await markPending(settings.directory);
67
+ if (await settings.active())
68
+ return "waiting";
69
+ return { branch, head, target };
70
+ }
71
+ async function markPending(directory, publication = "initial") {
72
+ if (publication === "renew") {
73
+ const timestamp = Number(await readFile(join(directory, "pending-self-update"), "utf8"));
74
+ if (timestamp > 0 && Date.now() - timestamp < 30 * 60 * 1000)
75
+ return;
76
+ }
77
+ await mkdir(directory, { recursive: true });
78
+ const temporary = join(directory, `pending-self-update-${randomUUID()}.tmp`);
79
+ try {
80
+ await writeFile(temporary, `${String(Date.now())}\n`, {
81
+ flag: "wx",
82
+ mode: 0o600,
83
+ flush: true,
84
+ });
85
+ if (publication === "renew") {
86
+ await rename(temporary, join(directory, "pending-self-update"));
87
+ return;
88
+ }
89
+ await link(temporary, join(directory, "pending-self-update")).catch((error) => {
90
+ if (!(error instanceof Error) ||
91
+ !("code" in error) ||
92
+ error.code !== "EEXIST")
93
+ throw error;
94
+ });
95
+ }
96
+ finally {
97
+ await rm(temporary, { force: true });
98
+ }
99
+ }
100
+ async function failedTargets(directory) {
101
+ try {
102
+ return (await readFile(join(directory, "failed-self-updates"), "utf8")).split("\n");
103
+ }
104
+ catch (error) {
105
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
106
+ return [];
107
+ throw error;
108
+ }
109
+ }
110
+ async function updated(settings, update) {
111
+ await settings.stop();
112
+ try {
113
+ if (!(await clean(settings.git)))
114
+ throw new Error("checkout changed after stop");
115
+ if ((await settings.git(["symbolic-ref", "HEAD"])).trim() !== update.branch ||
116
+ (await settings.git(["rev-parse", "HEAD"])).trim() !== update.head)
117
+ throw new Error("checkout changed after stop");
118
+ await settings.git([
119
+ "merge",
120
+ "--ff-only",
121
+ "--no-overwrite-ignore",
122
+ update.target,
123
+ ]);
124
+ }
125
+ catch (error) {
126
+ settings.error(`Self-update failed: ${String(error).replace(/[\r\n]+/g, " ")}\n`);
127
+ await mkdir(settings.directory, { recursive: true });
128
+ await appendFile(join(settings.directory, "failed-self-updates"), `${update.target}\n`);
129
+ }
130
+ return 75;
131
+ }
132
+ export function selfUpdater(settings) {
133
+ let disabled = false;
134
+ let checking = false;
135
+ return {
136
+ check: async () => {
137
+ if (disabled || checking)
138
+ return;
139
+ checking = true;
140
+ let waiting = false;
141
+ try {
142
+ const update = await candidate(settings).catch(() => undefined);
143
+ if (update === "waiting") {
144
+ waiting = true;
145
+ return;
146
+ }
147
+ if (!update)
148
+ return;
149
+ if (await installRequired(settings.git, update).catch(() => true)) {
150
+ disabled = true;
151
+ settings.error("Self-update disabled: package-lock.json changed; update and install by hand.\n");
152
+ return;
153
+ }
154
+ const failed = await failedTargets(settings.directory).catch(() => undefined);
155
+ if (!failed || failed.includes(update.target))
156
+ return;
157
+ await markPending(settings.directory, "renew");
158
+ waiting = await settings.active().catch(() => true);
159
+ if (waiting)
160
+ return;
161
+ disabled = true;
162
+ return await updated(settings, update);
163
+ }
164
+ finally {
165
+ checking = false;
166
+ if (!waiting)
167
+ await rm(join(settings.directory, "pending-self-update"), {
168
+ force: true,
169
+ });
170
+ }
171
+ },
172
+ };
173
+ }
174
+ import { randomUUID } from "node:crypto";
175
+ import { appendFile, link, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
176
+ import { join } from "node:path";
177
+ import { isDeepStrictEqual } from "node:util";
@@ -0,0 +1,3 @@
1
+ import type { WorkflowManifest } from "@workflow/builders";
2
+ export declare function isWorkflowManifest(value: unknown): value is WorkflowManifest;
3
+ export declare function serializeManifest(manifest: WorkflowManifest): string;
@@ -0,0 +1,34 @@
1
+ export function isWorkflowManifest(value) {
2
+ if (!isRecord(value))
3
+ return false;
4
+ return ((!("workflows" in value) ||
5
+ hasIdentities(value["workflows"], "workflowId")) &&
6
+ (!("steps" in value) || hasIdentities(value["steps"], "stepId")) &&
7
+ (!("classes" in value) || hasIdentities(value["classes"], "classId")));
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function hasIdentities(value, identifier) {
13
+ if (!isRecord(value))
14
+ return false;
15
+ return Object.values(value).every((entries) => isRecord(entries) &&
16
+ Object.values(entries).every((entry) => isRecord(entry) && typeof entry[identifier] === "string"));
17
+ }
18
+ export function serializeManifest(manifest) {
19
+ const categories = orderedEntries(manifest).map(([kind, files]) => [
20
+ kind,
21
+ Object.fromEntries(orderedEntries(files).map(([file, entries]) => [
22
+ file,
23
+ Object.fromEntries(orderedEntries(entries)),
24
+ ])),
25
+ ]);
26
+ return JSON.stringify(Object.fromEntries(categories), null, 2);
27
+ }
28
+ function orderedEntries(value) {
29
+ return Object.entries(value).sort(([first], [second]) => {
30
+ if (first === second)
31
+ return 0;
32
+ return first < second ? -1 : 1;
33
+ });
34
+ }
@@ -0,0 +1,10 @@
1
+ import type { CycleOutcome } from "cloving/workflows";
2
+ interface AnalysisInput {
3
+ readonly cycleId: string;
4
+ readonly repository: string;
5
+ readonly input: {
6
+ readonly importId: string;
7
+ };
8
+ }
9
+ export declare function analyzeChats(input: AnalysisInput): Promise<CycleOutcome>;
10
+ export {};
@@ -0,0 +1,9 @@
1
+ {
2
+ "workflowId": "analyze-chats",
3
+ "effectLimit": 3,
4
+ "capabilities": ["chats", "claude"],
5
+ "input": {
6
+ "maximumBytes": 4096,
7
+ "fields": { "importId": { "type": "string" } }
8
+ }
9
+ }