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,29 @@
1
+ import { type WorkflowDeclaration } from "./workflow-declaration.ts";
2
+ export interface CandidateDeclaration {
3
+ readonly workflow: WorkflowDeclaration;
4
+ readonly methods: Readonly<Record<string, readonly string[]>>;
5
+ }
6
+ export interface CandidateImport {
7
+ readonly module: string;
8
+ readonly names: readonly string[];
9
+ }
10
+ export interface CandidateEffect {
11
+ readonly capability: string | null;
12
+ readonly method: string | null;
13
+ }
14
+ export interface CandidateAnalysis {
15
+ readonly imports: readonly CandidateImport[];
16
+ readonly effects: readonly CandidateEffect[];
17
+ readonly directEffects: readonly string[];
18
+ readonly unsupportedForms: readonly string[];
19
+ readonly knownCallCount: number;
20
+ readonly knownUnitTotal: number;
21
+ }
22
+ export type InstalledWorkflowExports = Readonly<Record<string, readonly string[]>>;
23
+ export type WorkflowCandidateCode = "invalid-declaration" | "forbidden-import" | "missing-export" | "unsupported-source" | "dynamic-effect" | "undeclared-effect" | "effect-limit" | "direct-effect";
24
+ export interface WorkflowCandidateInput {
25
+ readonly declaration: unknown;
26
+ readonly analysis: CandidateAnalysis;
27
+ readonly installedExports: InstalledWorkflowExports;
28
+ }
29
+ export declare function checkWorkflowCandidate(input: WorkflowCandidateInput): readonly WorkflowCandidateCode[];
@@ -0,0 +1,59 @@
1
+ import { record } from "./protocol.js";
2
+ import { isWorkflowDeclaration, } from "./workflow-declaration.js";
3
+ const workflowModules = [
4
+ "cloving/workflows",
5
+ "cloving/workflows/steps/decision-gate",
6
+ "cloving/workflows/steps/load-cycle",
7
+ "cloving/workflows/steps/protected-effect",
8
+ ];
9
+ function isMethodList(value) {
10
+ return (Array.isArray(value) &&
11
+ value.length > 0 &&
12
+ Array.from(value).every((method) => typeof method === "string" && method.trim().length > 0) &&
13
+ new Set(value).size === value.length);
14
+ }
15
+ function isCandidateDeclaration(value) {
16
+ const fields = record(value);
17
+ if (!fields ||
18
+ Object.keys(fields).some((key) => key !== "workflow" && key !== "methods"))
19
+ return false;
20
+ const workflow = fields["workflow"];
21
+ const methods = record(fields["methods"]);
22
+ if (!isWorkflowDeclaration(workflow) || !methods)
23
+ return false;
24
+ const capabilities = workflow.capabilities;
25
+ return (Object.keys(methods).every((key) => capabilities.includes(key)) &&
26
+ capabilities.every((capability) => isMethodList(methods[capability])));
27
+ }
28
+ export function checkWorkflowCandidate(input) {
29
+ if (!isCandidateDeclaration(input.declaration))
30
+ return ["invalid-declaration"];
31
+ const { analysis, declaration, installedExports } = input;
32
+ const codes = [];
33
+ if (analysis.imports.some((entry) => !workflowModules.includes(entry.module)))
34
+ codes.push("forbidden-import");
35
+ if (analysis.imports.some((entry) => {
36
+ if (!workflowModules.includes(entry.module))
37
+ return false;
38
+ const names = installedExports[entry.module];
39
+ return (names === undefined || entry.names.some((name) => !names.includes(name)));
40
+ }))
41
+ codes.push("missing-export");
42
+ if (analysis.effects.some((effect) => effect.capability !== null &&
43
+ effect.method !== null &&
44
+ (!Object.hasOwn(declaration.methods, effect.capability) ||
45
+ !declaration.methods[effect.capability]?.includes(effect.method))))
46
+ codes.push("undeclared-effect");
47
+ if (analysis.effects.some((effect) => effect.capability === null || effect.method === null))
48
+ codes.push("dynamic-effect");
49
+ const counts = [analysis.knownCallCount, analysis.knownUnitTotal];
50
+ if (counts.some((count) => !Number.isSafeInteger(count) || count < 0))
51
+ codes.push("unsupported-source");
52
+ else if (counts.some((count) => count > declaration.workflow.effectLimit))
53
+ codes.push("effect-limit");
54
+ if (analysis.directEffects.length > 0)
55
+ codes.push("direct-effect");
56
+ if (analysis.unsupportedForms.length > 0)
57
+ codes.push("unsupported-source");
58
+ return [...new Set(codes)].sort();
59
+ }
@@ -0,0 +1,29 @@
1
+ export interface DevelopmentInput {
2
+ readonly cycleId: string;
3
+ }
4
+ export type CycleOutcome = {
5
+ readonly kind: "waiting_for_decision";
6
+ readonly cycleId: string;
7
+ readonly decisionId: string;
8
+ } | {
9
+ readonly kind: "blocked";
10
+ readonly cycleId: string;
11
+ readonly reason: string;
12
+ readonly evidenceId: string;
13
+ } | {
14
+ readonly kind: "handoff_requested";
15
+ readonly cycleId: string;
16
+ readonly promotionId: string;
17
+ readonly ticketStatus?: "complete" | "partial";
18
+ readonly issueUpdate?: "failed";
19
+ };
20
+ export type Validation<Value> = {
21
+ readonly kind: "valid";
22
+ readonly value: Value;
23
+ } | {
24
+ readonly kind: "invalid";
25
+ readonly reason: string;
26
+ };
27
+ export declare function isBlockedReason(value: unknown): value is string;
28
+ export declare function validateDevelopmentInput(value: unknown): Validation<DevelopmentInput>;
29
+ export declare function validateCycleOutcome(value: unknown, input: DevelopmentInput): Validation<CycleOutcome>;
@@ -0,0 +1,110 @@
1
+ import { isTicketStatus } from "./ticket-status.js";
2
+ const identifier = /^[A-Za-z0-9._:-]{1,128}$/;
3
+ const reason = /^\S[\s\S]{0,255}$/;
4
+ export function isBlockedReason(value) {
5
+ return typeof value === "string" && reason.test(value);
6
+ }
7
+ const outcomes = {
8
+ waiting_for_decision: {
9
+ keys: ["cycleId", "decisionId", "kind"],
10
+ parse: (fields) => {
11
+ const cycleId = textField(fields, {
12
+ key: "cycleId",
13
+ pattern: identifier,
14
+ });
15
+ const decisionId = textField(fields, {
16
+ key: "decisionId",
17
+ pattern: identifier,
18
+ });
19
+ if (cycleId === null || decisionId === null)
20
+ return null;
21
+ return { kind: "waiting_for_decision", cycleId, decisionId };
22
+ },
23
+ },
24
+ blocked: {
25
+ keys: ["cycleId", "evidenceId", "kind", "reason"],
26
+ parse: (fields) => {
27
+ const cycleId = textField(fields, {
28
+ key: "cycleId",
29
+ pattern: identifier,
30
+ });
31
+ const evidenceId = textField(fields, {
32
+ key: "evidenceId",
33
+ pattern: identifier,
34
+ });
35
+ const blocker = fields["reason"];
36
+ if (cycleId === null || evidenceId === null || !isBlockedReason(blocker))
37
+ return null;
38
+ return { kind: "blocked", cycleId, reason: blocker, evidenceId };
39
+ },
40
+ },
41
+ handoff_requested: {
42
+ keys: ["cycleId", "kind", "promotionId"],
43
+ optional: ["ticketStatus", "issueUpdate"],
44
+ parse: (fields) => {
45
+ const cycleId = textField(fields, {
46
+ key: "cycleId",
47
+ pattern: identifier,
48
+ });
49
+ const promotionId = textField(fields, {
50
+ key: "promotionId",
51
+ pattern: identifier,
52
+ });
53
+ if (cycleId === null || promotionId === null)
54
+ return null;
55
+ const ticketStatus = fields["ticketStatus"];
56
+ const issueUpdate = fields["issueUpdate"];
57
+ if (issueUpdate !== undefined && issueUpdate !== "failed")
58
+ return null;
59
+ if (ticketStatus !== undefined && !isTicketStatus(ticketStatus))
60
+ return null;
61
+ return {
62
+ kind: "handoff_requested",
63
+ cycleId,
64
+ promotionId,
65
+ ...(issueUpdate === "failed" ? { issueUpdate } : {}),
66
+ ...(ticketStatus === undefined ? {} : { ticketStatus }),
67
+ };
68
+ },
69
+ },
70
+ };
71
+ export function validateDevelopmentInput(value) {
72
+ const fields = exactFields(value, { required: ["cycleId"] });
73
+ const cycleId = fields && textField(fields, { key: "cycleId", pattern: identifier });
74
+ if (!cycleId)
75
+ return { kind: "invalid", reason: "invalid-development-input" };
76
+ return { kind: "valid", value: { cycleId } };
77
+ }
78
+ export function validateCycleOutcome(value, input) {
79
+ const kind = exactFields(value, null)?.["kind"];
80
+ const contract = typeof kind === "string" && Object.hasOwn(outcomes, kind)
81
+ ? outcomes[kind]
82
+ : undefined;
83
+ const fields = contract &&
84
+ exactFields(value, {
85
+ required: contract.keys,
86
+ optional: contract.optional ?? [],
87
+ });
88
+ const outcome = fields && contract.parse(fields);
89
+ if (!outcome || outcome.cycleId !== input.cycleId)
90
+ return { kind: "invalid", reason: "invalid-cycle-outcome" };
91
+ return { kind: "valid", value: outcome };
92
+ }
93
+ function exactFields(value, shape) {
94
+ if (!value || typeof value !== "object" || Array.isArray(value))
95
+ return null;
96
+ const fields = Object.fromEntries(Object.entries(value));
97
+ const keys = shape?.required;
98
+ const optional = shape?.optional ?? [];
99
+ if (keys &&
100
+ JSON.stringify(Object.keys(fields)
101
+ .filter((key) => !optional.includes(key))
102
+ .sort()) !== JSON.stringify(keys))
103
+ return null;
104
+ return fields;
105
+ }
106
+ function textField(fields, field) {
107
+ const { key, pattern } = field;
108
+ const value = fields[key];
109
+ return typeof value === "string" && pattern.test(value) ? value : null;
110
+ }
@@ -0,0 +1,11 @@
1
+ import type { SubmissionContract } from "./submission.ts";
2
+ export interface WorkflowDeclaration {
3
+ readonly workflowId: string;
4
+ readonly effectLimit: number;
5
+ readonly capabilities: readonly ("claude" | "github" | "chats")[];
6
+ readonly input: SubmissionContract;
7
+ }
8
+ export interface DeclaredWorkflow extends WorkflowDeclaration {
9
+ readonly functionName: string;
10
+ }
11
+ export declare function isWorkflowDeclaration(value: unknown): value is WorkflowDeclaration;
@@ -0,0 +1,59 @@
1
+ import { record } from "./protocol.js";
2
+ function keys(fields, allowed) {
3
+ return Object.keys(fields).every((key) => allowed.includes(key));
4
+ }
5
+ function integer(value, bounds) {
6
+ return (typeof value === "number" &&
7
+ Number.isInteger(value) &&
8
+ value >= bounds.minimum &&
9
+ value <= bounds.maximum);
10
+ }
11
+ function integerBounds(fields) {
12
+ const { minimum, maximum } = fields;
13
+ if (minimum !== undefined && !Number.isInteger(minimum))
14
+ return false;
15
+ if (maximum !== undefined && !Number.isInteger(maximum))
16
+ return false;
17
+ return (typeof minimum !== "number" ||
18
+ typeof maximum !== "number" ||
19
+ minimum <= maximum);
20
+ }
21
+ function isField(value) {
22
+ const fields = record(value);
23
+ if (fields === undefined ||
24
+ !keys(fields, ["type", "optional", "minimum", "maximum"]))
25
+ return false;
26
+ if (fields["optional"] !== undefined &&
27
+ typeof fields["optional"] !== "boolean")
28
+ return false;
29
+ if (fields["type"] === "integer")
30
+ return integerBounds(fields);
31
+ return ((fields["type"] === "string" || fields["type"] === "boolean") &&
32
+ !Object.hasOwn(fields, "minimum") &&
33
+ !Object.hasOwn(fields, "maximum"));
34
+ }
35
+ function isInput(value) {
36
+ const input = record(value);
37
+ if (input === undefined || !keys(input, ["maximumBytes", "fields"]))
38
+ return false;
39
+ const fields = record(input["fields"]);
40
+ return (integer(input["maximumBytes"], { minimum: 1, maximum: 1_048_576 }) &&
41
+ fields !== undefined &&
42
+ Object.values(fields).every(isField));
43
+ }
44
+ export function isWorkflowDeclaration(value) {
45
+ const declaration = record(value);
46
+ if (declaration === undefined ||
47
+ !keys(declaration, ["workflowId", "effectLimit", "capabilities", "input"]))
48
+ return false;
49
+ const { workflowId, effectLimit, capabilities, input } = declaration;
50
+ return (typeof workflowId === "string" &&
51
+ /^[A-Za-z0-9-]{1,64}$/.test(workflowId) &&
52
+ integer(effectLimit, { minimum: 1, maximum: 100 }) &&
53
+ Array.isArray(capabilities) &&
54
+ capabilities.length > 0 &&
55
+ capabilities.every((capability) => capability === "claude" ||
56
+ capability === "github" ||
57
+ capability === "chats") &&
58
+ isInput(input));
59
+ }
@@ -0,0 +1,8 @@
1
+ export type ResolvedResources = {
2
+ readonly kind: "resolved";
3
+ readonly resources: Readonly<Record<string, string>>;
4
+ } | {
5
+ readonly kind: "inaccessible";
6
+ readonly path: string;
7
+ };
8
+ export declare function resolveResources(declared: readonly string[], discovered: unknown): ResolvedResources;
@@ -0,0 +1,14 @@
1
+ const digest = /^[0-9a-f]{64}$/;
2
+ export function resolveResources(declared, discovered) {
3
+ const available = discovered && typeof discovered === "object" && !Array.isArray(discovered)
4
+ ? Object.fromEntries(Object.entries(discovered))
5
+ : {};
6
+ const entries = [];
7
+ for (const path of declared) {
8
+ const value = Object.hasOwn(available, path) ? available[path] : undefined;
9
+ if (typeof value !== "string" || !digest.test(value))
10
+ return { kind: "inaccessible", path };
11
+ entries.push([path, value]);
12
+ }
13
+ return { kind: "resolved", resources: Object.fromEntries(entries) };
14
+ }
@@ -0,0 +1,6 @@
1
+ export { loadCycle, type CycleLoad } from "./steps/load-cycle.ts";
2
+ export { protectedEffect } from "./steps/protected-effect.ts";
3
+ export { decisionGate } from "./steps/decision-gate.ts";
4
+ export type { GateRequest, GateResult, ProtectedRequest, ProtectedResult, ProtectedScope, } from "./step-bridge.ts";
5
+ export type { CycleOutcome, DevelopmentInput } from "./workflow-contracts.ts";
6
+ export { ticketStatus, type TicketStatus } from "./ticket-status.ts";
@@ -0,0 +1,4 @@
1
+ export { loadCycle } from "./steps/load-cycle.js";
2
+ export { protectedEffect } from "./steps/protected-effect.js";
3
+ export { decisionGate } from "./steps/decision-gate.js";
4
+ export { ticketStatus } from "./ticket-status.js";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { BaseBuilder } from "@workflow/builders";
4
+ import { serializeManifest } from "./workflow-manifest.js";
5
+ const [sourceDirectory, outputDirectory] = process.argv.slice(2);
6
+ if (!sourceDirectory || !outputDirectory) {
7
+ throw new Error("Usage: npm run build:workflows -- SOURCE_DIRECTORY OUTPUT_DIRECTORY");
8
+ }
9
+ const output = resolve(outputDirectory);
10
+ class WorkflowBuilder extends BaseBuilder {
11
+ async build() {
12
+ const inputFiles = await this.getInputFiles();
13
+ await mkdir(output, { recursive: true });
14
+ const result = await this.createCombinedBundle({
15
+ inputFiles,
16
+ stepsOutfile: resolve(output, "steps.mjs"),
17
+ flowOutfile: resolve(output, "flow.mjs"),
18
+ format: "esm",
19
+ });
20
+ await writeFile(resolve(output, "manifest.json"), serializeManifest(result.manifest));
21
+ await this.createClientLibrary();
22
+ }
23
+ }
24
+ await new WorkflowBuilder({
25
+ buildTarget: "standalone",
26
+ workingDir: process.cwd(),
27
+ dirs: [resolve(sourceDirectory)],
28
+ stepsBundlePath: resolve(output, "steps.mjs"),
29
+ workflowsBundlePath: resolve(output, "flow.mjs"),
30
+ webhookBundlePath: resolve(output, "webhook.mjs"),
31
+ clientBundlePath: resolve(output, "client.mjs"),
32
+ sourcemap: false,
33
+ }).build();
@@ -0,0 +1,10 @@
1
+ export interface HostProcesses {
2
+ readonly project: string;
3
+ readonly product: string;
4
+ readonly runtime: string;
5
+ readonly directory: string;
6
+ readonly repository: string;
7
+ readonly watchPort: string;
8
+ readonly updateMilliseconds: number | undefined;
9
+ }
10
+ export declare function hostedPrograms(settings: HostProcesses): Promise<number>;
@@ -0,0 +1,156 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { addAbortListener } from "node:events";
3
+ import { extname, join } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { promisify } from "node:util";
6
+ import { selfUpdater } from "./self-update.js";
7
+ import { selfUpdateActive } from "./self-update-host.js";
8
+ function launched(argumentsList, settings) {
9
+ const child = spawn(process.execPath, argumentsList, {
10
+ cwd: settings.directory,
11
+ env: settings.environment,
12
+ stdio: "inherit",
13
+ });
14
+ const ended = new Promise((settle, reject) => {
15
+ child.once("error", reject);
16
+ child.once("close", (status) => {
17
+ settle(status ?? 1);
18
+ });
19
+ });
20
+ return { child, ended };
21
+ }
22
+ async function stopped(programs) {
23
+ for (const program of programs)
24
+ program.child.kill("SIGTERM");
25
+ await Promise.all(programs.map((program) => program.ended));
26
+ }
27
+ function updatingGit(settings, stopping) {
28
+ const git = promisify(execFile);
29
+ return async (argumentsList) => {
30
+ if (argumentsList[0] === "merge")
31
+ return (await git("git", ["-C", settings.repository, ...argumentsList], {
32
+ encoding: "utf8",
33
+ })).stdout;
34
+ const command = git("git", ["-C", settings.repository, ...argumentsList], {
35
+ encoding: "utf8",
36
+ signal: stopping,
37
+ killSignal: "SIGKILL",
38
+ timeout: argumentsList[0] === "fetch" || argumentsList[0] === "remote"
39
+ ? 30000
40
+ : 0,
41
+ });
42
+ const listener = addAbortListener(stopping, () => {
43
+ command.child.kill("SIGKILL");
44
+ });
45
+ try {
46
+ return (await command).stdout;
47
+ }
48
+ finally {
49
+ listener[Symbol.dispose]();
50
+ }
51
+ };
52
+ }
53
+ async function polled(settings, lifecycle) {
54
+ if (settings.updateMilliseconds === undefined)
55
+ return;
56
+ const cancelled = () => lifecycle.stopping.aborted;
57
+ const updater = selfUpdater({
58
+ directory: settings.directory,
59
+ git: updatingGit(settings, lifecycle.stopping),
60
+ active: async () => lifecycle.stopping.aborted ||
61
+ (await selfUpdateActive({
62
+ directory: settings.directory,
63
+ runtimeDirectory: settings.runtime,
64
+ signal: lifecycle.stopping,
65
+ })),
66
+ stop: async () => {
67
+ if (lifecycle.stopping.aborted)
68
+ throw new Error("self-update-stopped");
69
+ await lifecycle.stop();
70
+ },
71
+ error: (line) => {
72
+ process.stderr.write(line);
73
+ },
74
+ });
75
+ while (!cancelled()) {
76
+ await delay(settings.updateMilliseconds, undefined, {
77
+ signal: lifecycle.stopping,
78
+ }).catch((error) => {
79
+ if (!(error instanceof Error) || error.name !== "AbortError")
80
+ throw error;
81
+ });
82
+ if (cancelled())
83
+ return;
84
+ const status = await updater.check();
85
+ if (status !== undefined)
86
+ return status;
87
+ }
88
+ return undefined;
89
+ }
90
+ function hostedChildren(settings) {
91
+ const daemon = launched([join(settings.project, "start.mjs")], {
92
+ directory: settings.project,
93
+ environment: process.env,
94
+ });
95
+ if (settings.watchPort === "off")
96
+ return [daemon];
97
+ return [
98
+ daemon,
99
+ launched([
100
+ join(settings.product, `src/cli${extname(import.meta.filename)}`),
101
+ "watch",
102
+ "--port",
103
+ settings.watchPort,
104
+ ], {
105
+ directory: settings.product,
106
+ environment: {
107
+ ...process.env,
108
+ CLOVING_RUNTIME_DIR: settings.runtime,
109
+ CLOVING_WATCH_REPOSITORY: settings.repository,
110
+ },
111
+ }),
112
+ ];
113
+ }
114
+ export async function hostedPrograms(settings) {
115
+ const programs = hostedChildren(settings);
116
+ const daemon = programs[0];
117
+ const stopping = new AbortController();
118
+ let updating = false;
119
+ const interrupt = () => {
120
+ stopping.abort();
121
+ for (const program of programs)
122
+ program.child.kill("SIGINT");
123
+ };
124
+ const terminate = () => {
125
+ stopping.abort();
126
+ for (const program of programs)
127
+ program.child.kill("SIGTERM");
128
+ };
129
+ process.on("SIGINT", interrupt);
130
+ process.on("SIGTERM", terminate);
131
+ const polling = polled(settings, {
132
+ stopping: stopping.signal,
133
+ stop: async () => {
134
+ updating = true;
135
+ await stopped(programs);
136
+ },
137
+ });
138
+ try {
139
+ const [status, updateStatus] = await Promise.all([
140
+ daemon.ended.then((status) => {
141
+ if (!updating)
142
+ stopping.abort();
143
+ return status;
144
+ }),
145
+ polling,
146
+ ]);
147
+ return updateStatus ?? status;
148
+ }
149
+ finally {
150
+ stopping.abort();
151
+ await stopped(programs);
152
+ await polling;
153
+ process.off("SIGINT", interrupt);
154
+ process.off("SIGTERM", terminate);
155
+ }
156
+ }
@@ -0,0 +1,15 @@
1
+ import type { WorkflowManifest } from "@workflow/builders";
2
+ import { type DeclaredWorkflow } from "../src/workflow-declaration.ts";
3
+ interface HostManifest {
4
+ readonly schemaVersion: 1;
5
+ readonly name: string;
6
+ readonly workflowId: string;
7
+ readonly steps: readonly string[];
8
+ readonly capabilities: readonly string[];
9
+ readonly resources: readonly string[];
10
+ readonly artifacts: string;
11
+ }
12
+ export declare function workflowFiles(directory: string): Promise<string[]>;
13
+ export declare function workflowDeclarations(directory: string, manifests: Readonly<Record<string, HostManifest>>): Promise<readonly DeclaredWorkflow[]>;
14
+ export declare function workflowManifests(compiled: WorkflowManifest, declarations?: readonly DeclaredWorkflow[]): Readonly<Record<string, HostManifest>>;
15
+ export {};
@@ -0,0 +1,78 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { basename, extname, join } from "node:path";
3
+ import { isWorkflowDeclaration, } from "../src/workflow-declaration.js";
4
+ export async function workflowFiles(directory) {
5
+ const entries = await readdir(directory, { withFileTypes: true });
6
+ return entries
7
+ .filter((entry) => entry.isFile() &&
8
+ /\.(?:ts|js)$/.test(entry.name) &&
9
+ !entry.name.endsWith(".d.ts"))
10
+ .map((entry) => entry.name)
11
+ .sort();
12
+ }
13
+ export async function workflowDeclarations(directory, manifests) {
14
+ const declarations = [];
15
+ for (const file of await workflowFiles(directory)) {
16
+ const name = basename(file, extname(file));
17
+ const declarationFile = `${name}.declaration.json`;
18
+ const text = await readFile(join(directory, declarationFile), "utf8").catch((error) => {
19
+ if (error instanceof Error &&
20
+ "code" in error &&
21
+ error.code === "ENOENT")
22
+ return undefined;
23
+ throw new Error(`invalid-workflow-declaration: ${declarationFile}`, {
24
+ cause: error,
25
+ });
26
+ });
27
+ if (text === undefined)
28
+ continue;
29
+ const entry = Object.entries(manifests).find(([, manifest]) => manifest.name === name);
30
+ try {
31
+ const value = JSON.parse(text);
32
+ if (!isWorkflowDeclaration(value) || entry === undefined)
33
+ throw new Error("Invalid declaration or missing workflow function.");
34
+ declarations.push({
35
+ ...value,
36
+ functionName: entry[0],
37
+ capabilities: [...new Set(value.capabilities)],
38
+ });
39
+ }
40
+ catch (error) {
41
+ throw new Error(`invalid-workflow-declaration: ${declarationFile}`, {
42
+ cause: error,
43
+ });
44
+ }
45
+ }
46
+ return declarations;
47
+ }
48
+ export function workflowManifests(compiled, declarations = []) {
49
+ const names = new Set();
50
+ const steps = Object.values(compiled.steps ?? {})
51
+ .flatMap((entries) => Object.values(entries))
52
+ .map((entry) => entry.stepId)
53
+ .filter((identifier) => identifier.startsWith("step//cloving/"));
54
+ return Object.fromEntries(Object.entries(compiled.workflows ?? {}).flatMap(([file, entries]) => {
55
+ const functions = Object.values(entries);
56
+ if (functions.length > 1)
57
+ throw new Error(`${file} must contain only one workflow function.`);
58
+ return functions.map((entry) => {
59
+ const workflowId = entry.workflowId;
60
+ const functionName = workflowId.slice(workflowId.lastIndexOf("//") + 2);
61
+ if (names.has(functionName))
62
+ throw new Error(`duplicate-workflow-function: ${functionName}`);
63
+ names.add(functionName);
64
+ return [
65
+ functionName,
66
+ {
67
+ schemaVersion: 1,
68
+ name: basename(file, extname(file)),
69
+ workflowId,
70
+ steps,
71
+ capabilities: declarations.find((declaration) => declaration.functionName === functionName)?.capabilities ?? ["claude", "github"],
72
+ resources: [],
73
+ artifacts: "artifacts",
74
+ },
75
+ ];
76
+ });
77
+ }));
78
+ }
@@ -0,0 +1 @@
1
+ export {};