cloving 0.3.20 → 1.0.1

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 (416) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +475 -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 +263 -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 +27 -0
  32. package/dist/src/authority/reconciliation.js +147 -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 +122 -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 +65 -0
  78. package/dist/src/broker/actor/authority-session.js +252 -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/destination.d.ts +4 -0
  138. package/dist/src/chats/destination.js +94 -0
  139. package/dist/src/chats/import.d.ts +13 -0
  140. package/dist/src/chats/import.js +71 -0
  141. package/dist/src/chats/normalize.d.ts +20 -0
  142. package/dist/src/chats/normalize.js +139 -0
  143. package/dist/src/chats/reader.d.ts +15 -0
  144. package/dist/src/chats/reader.js +87 -0
  145. package/dist/src/cli/arguments.d.ts +23 -0
  146. package/dist/src/cli/arguments.js +154 -0
  147. package/dist/src/cli/client.d.ts +15 -0
  148. package/dist/src/cli/client.js +122 -0
  149. package/dist/src/cli/commands.d.ts +14 -0
  150. package/dist/src/cli/commands.js +253 -0
  151. package/dist/src/cli/main.d.ts +1 -0
  152. package/dist/src/cli/main.js +80 -0
  153. package/dist/src/cli/render.d.ts +8 -0
  154. package/dist/src/cli/render.js +186 -0
  155. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  156. package/dist/src/cli/runtime-arguments.js +248 -0
  157. package/dist/src/cli/runtime-directory.d.ts +4 -0
  158. package/dist/src/cli/runtime-directory.js +25 -0
  159. package/dist/src/cli/toolchain.d.ts +3 -0
  160. package/dist/src/cli/toolchain.js +74 -0
  161. package/dist/src/cli/usage.d.ts +4 -0
  162. package/dist/src/cli/usage.js +124 -0
  163. package/dist/src/cli/validate.d.ts +38 -0
  164. package/dist/src/cli/validate.js +116 -0
  165. package/dist/src/cli/watch-board-view.d.ts +22 -0
  166. package/dist/src/cli/watch-board-view.js +128 -0
  167. package/dist/src/cli/watch-board.d.ts +15 -0
  168. package/dist/src/cli/watch-board.js +174 -0
  169. package/dist/src/cli/watch-element.d.ts +11 -0
  170. package/dist/src/cli/watch-element.js +6 -0
  171. package/dist/src/cli/watch-model.d.ts +29 -0
  172. package/dist/src/cli/watch-model.js +261 -0
  173. package/dist/src/cli/watch-navigation.d.ts +9 -0
  174. package/dist/src/cli/watch-navigation.js +40 -0
  175. package/dist/src/cli/watch-page.d.ts +1 -0
  176. package/dist/src/cli/watch-page.js +272 -0
  177. package/dist/src/cli/watch-paths.d.ts +2 -0
  178. package/dist/src/cli/watch-paths.js +52 -0
  179. package/dist/src/cli/watch-phases.d.ts +7 -0
  180. package/dist/src/cli/watch-phases.js +148 -0
  181. package/dist/src/cli/watch-reads.d.ts +28 -0
  182. package/dist/src/cli/watch-reads.js +244 -0
  183. package/dist/src/cli/watch-render.d.ts +139 -0
  184. package/dist/src/cli/watch-render.js +95 -0
  185. package/dist/src/cli/watch-server.d.ts +10 -0
  186. package/dist/src/cli/watch-server.js +176 -0
  187. package/dist/src/cli/watch-stream.d.ts +11 -0
  188. package/dist/src/cli/watch-stream.js +128 -0
  189. package/dist/src/cli/watch-turn.d.ts +29 -0
  190. package/dist/src/cli/watch-turn.js +130 -0
  191. package/dist/src/cli/watch-view.d.ts +39 -0
  192. package/dist/src/cli/watch-view.js +223 -0
  193. package/dist/src/cli.d.ts +2 -0
  194. package/dist/src/cli.js +62 -0
  195. package/dist/src/daemon/claude-turn.d.ts +28 -0
  196. package/dist/src/daemon/claude-turn.js +135 -0
  197. package/dist/src/daemon/claude-worker.d.ts +26 -0
  198. package/dist/src/daemon/claude-worker.js +224 -0
  199. package/dist/src/daemon/codex-stream.d.ts +4 -0
  200. package/dist/src/daemon/codex-stream.js +113 -0
  201. package/dist/src/daemon/daemon.d.ts +46 -0
  202. package/dist/src/daemon/daemon.js +186 -0
  203. package/dist/src/daemon/delivery-router.d.ts +10 -0
  204. package/dist/src/daemon/delivery-router.js +34 -0
  205. package/dist/src/daemon/github-calls.d.ts +29 -0
  206. package/dist/src/daemon/github-calls.js +127 -0
  207. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  208. package/dist/src/daemon/github-issue-methods.js +99 -0
  209. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  210. package/dist/src/daemon/github-issue-privacy.js +131 -0
  211. package/dist/src/daemon/github-merge.d.ts +18 -0
  212. package/dist/src/daemon/github-merge.js +259 -0
  213. package/dist/src/daemon/github-methods.d.ts +5 -0
  214. package/dist/src/daemon/github-methods.js +198 -0
  215. package/dist/src/daemon/github-operation.d.ts +38 -0
  216. package/dist/src/daemon/github-operation.js +57 -0
  217. package/dist/src/daemon/github-worker.d.ts +17 -0
  218. package/dist/src/daemon/github-worker.js +281 -0
  219. package/dist/src/daemon/host-environment.d.ts +8 -0
  220. package/dist/src/daemon/host-environment.js +14 -0
  221. package/dist/src/daemon/issue-queue.d.ts +9 -0
  222. package/dist/src/daemon/issue-queue.js +163 -0
  223. package/dist/src/daemon/notify-message.d.ts +14 -0
  224. package/dist/src/daemon/notify-message.js +48 -0
  225. package/dist/src/daemon/notify.d.ts +12 -0
  226. package/dist/src/daemon/notify.js +161 -0
  227. package/dist/src/daemon/operation-journal.d.ts +42 -0
  228. package/dist/src/daemon/operation-journal.js +53 -0
  229. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  230. package/dist/src/daemon/ticket-registration.js +177 -0
  231. package/dist/src/daemon/ticket-source.d.ts +17 -0
  232. package/dist/src/daemon/ticket-source.js +36 -0
  233. package/dist/src/daemon/work-tree.d.ts +26 -0
  234. package/dist/src/daemon/work-tree.js +206 -0
  235. package/dist/src/effect-authorization.d.ts +21 -0
  236. package/dist/src/effect-authorization.js +14 -0
  237. package/dist/src/execution-pin.d.ts +4 -0
  238. package/dist/src/execution-pin.js +68 -0
  239. package/dist/src/host/start-delivery.d.ts +41 -0
  240. package/dist/src/host/start-delivery.js +68 -0
  241. package/dist/src/host/step-bridge-host.d.ts +79 -0
  242. package/dist/src/host/step-bridge-host.js +205 -0
  243. package/dist/src/host/step-claims.d.ts +31 -0
  244. package/dist/src/host/step-claims.js +85 -0
  245. package/dist/src/host/world-host.d.ts +21 -0
  246. package/dist/src/host/world-host.js +51 -0
  247. package/dist/src/host/world-reconciliation.d.ts +37 -0
  248. package/dist/src/host/world-reconciliation.js +75 -0
  249. package/dist/src/host/world-runs.d.ts +14 -0
  250. package/dist/src/host/world-runs.js +61 -0
  251. package/dist/src/operation-identity.d.ts +7 -0
  252. package/dist/src/operation-identity.js +59 -0
  253. package/dist/src/protocol.d.ts +35 -0
  254. package/dist/src/protocol.js +64 -0
  255. package/dist/src/resource-files.d.ts +1 -0
  256. package/dist/src/resource-files.js +29 -0
  257. package/dist/src/service/changes.d.ts +11 -0
  258. package/dist/src/service/changes.js +32 -0
  259. package/dist/src/service/decision-handler.d.ts +9 -0
  260. package/dist/src/service/decision-handler.js +233 -0
  261. package/dist/src/service/event-handler.d.ts +10 -0
  262. package/dist/src/service/event-handler.js +70 -0
  263. package/dist/src/service/expiry.d.ts +13 -0
  264. package/dist/src/service/expiry.js +53 -0
  265. package/dist/src/service/gateway.d.ts +21 -0
  266. package/dist/src/service/gateway.js +120 -0
  267. package/dist/src/service/registry.d.ts +40 -0
  268. package/dist/src/service/registry.js +13 -0
  269. package/dist/src/service/replies.d.ts +26 -0
  270. package/dist/src/service/replies.js +56 -0
  271. package/dist/src/service/run-handlers.d.ts +4 -0
  272. package/dist/src/service/run-handlers.js +271 -0
  273. package/dist/src/service/service.d.ts +58 -0
  274. package/dist/src/service/service.js +212 -0
  275. package/dist/src/service/submission-handler.d.ts +4 -0
  276. package/dist/src/service/submission-handler.js +206 -0
  277. package/dist/src/service/transport.d.ts +16 -0
  278. package/dist/src/service/transport.js +141 -0
  279. package/dist/src/service/worker-port.d.ts +85 -0
  280. package/dist/src/service/worker-port.js +126 -0
  281. package/dist/src/step-bridge.d.ts +57 -0
  282. package/dist/src/step-bridge.js +4 -0
  283. package/dist/src/steps/decision-gate.d.ts +2 -0
  284. package/dist/src/steps/decision-gate.js +8 -0
  285. package/dist/src/steps/load-cycle.d.ts +10 -0
  286. package/dist/src/steps/load-cycle.js +11 -0
  287. package/dist/src/steps/protected-effect.d.ts +2 -0
  288. package/dist/src/steps/protected-effect.js +8 -0
  289. package/dist/src/storage/decision-rows.d.ts +54 -0
  290. package/dist/src/storage/decision-rows.js +72 -0
  291. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  292. package/dist/src/storage/decision-snapshots.js +25 -0
  293. package/dist/src/storage/domain-changes.d.ts +48 -0
  294. package/dist/src/storage/domain-changes.js +213 -0
  295. package/dist/src/storage/domain-rows.d.ts +85 -0
  296. package/dist/src/storage/domain-rows.js +129 -0
  297. package/dist/src/storage/domain-schema.d.ts +32 -0
  298. package/dist/src/storage/domain-schema.js +193 -0
  299. package/dist/src/storage/effect-changes.d.ts +5 -0
  300. package/dist/src/storage/effect-changes.js +105 -0
  301. package/dist/src/storage/effect-rows.d.ts +67 -0
  302. package/dist/src/storage/effect-rows.js +74 -0
  303. package/dist/src/storage/effect-schema.d.ts +1 -0
  304. package/dist/src/storage/effect-schema.js +59 -0
  305. package/dist/src/storage/statements.d.ts +9 -0
  306. package/dist/src/storage/statements.js +8 -0
  307. package/dist/src/submission.d.ts +42 -0
  308. package/dist/src/submission.js +71 -0
  309. package/dist/src/turn-profile.d.ts +13 -0
  310. package/dist/src/turn-profile.js +100 -0
  311. package/dist/src/workflow-admission.d.ts +45 -0
  312. package/dist/src/workflow-admission.js +151 -0
  313. package/dist/src/workflow-contracts.d.ts +27 -0
  314. package/dist/src/workflow-contracts.js +88 -0
  315. package/dist/src/workflow-declaration.d.ts +11 -0
  316. package/dist/src/workflow-declaration.js +57 -0
  317. package/dist/src/workflow-resources.d.ts +8 -0
  318. package/dist/src/workflow-resources.js +14 -0
  319. package/dist/src/workflows.d.ts +5 -0
  320. package/dist/src/workflows.js +3 -0
  321. package/dist/tools/compile-workflows.d.ts +1 -0
  322. package/dist/tools/compile-workflows.js +33 -0
  323. package/dist/tools/self-host-processes.d.ts +10 -0
  324. package/dist/tools/self-host-processes.js +151 -0
  325. package/dist/tools/self-host-workflows.d.ts +15 -0
  326. package/dist/tools/self-host-workflows.js +78 -0
  327. package/dist/tools/self-host.d.ts +1 -0
  328. package/dist/tools/self-host.js +261 -0
  329. package/dist/tools/self-update-host.d.ts +6 -0
  330. package/dist/tools/self-update-host.js +41 -0
  331. package/dist/tools/self-update.d.ts +10 -0
  332. package/dist/tools/self-update.js +105 -0
  333. package/dist/tools/workflow-manifest.d.ts +3 -0
  334. package/dist/tools/workflow-manifest.js +34 -0
  335. package/dist/workflows/develop-prd.d.ts +7 -0
  336. package/dist/workflows/develop-prd.js +97 -0
  337. package/dist/workflows/develop-ticket.d.ts +15 -0
  338. package/dist/workflows/develop-ticket.js +301 -0
  339. package/dist/workflows/issue-labels.d.ts +14 -0
  340. package/dist/workflows/issue-labels.js +36 -0
  341. package/package.json +82 -75
  342. package/dist/abstract_gpt/index.js +0 -55
  343. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  344. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  345. package/dist/cloving_gpt/adapters/claude.js +0 -128
  346. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  347. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  348. package/dist/cloving_gpt/adapters/index.js +0 -2
  349. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  350. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  351. package/dist/cloving_gpt/adapters/openai.js +0 -100
  352. package/dist/cloving_gpt/index.js +0 -192
  353. package/dist/commands/analyze.js +0 -47
  354. package/dist/commands/chat.js +0 -14
  355. package/dist/commands/check.js +0 -7
  356. package/dist/commands/commit.js +0 -44
  357. package/dist/commands/config.js +0 -167
  358. package/dist/commands/describe.js +0 -235
  359. package/dist/commands/generate/code.js +0 -21
  360. package/dist/commands/generate/commit.js +0 -11
  361. package/dist/commands/generate/context.js +0 -82
  362. package/dist/commands/generate/docs.js +0 -11
  363. package/dist/commands/generate/documentation.js +0 -11
  364. package/dist/commands/generate/fizzbuzz.js +0 -35
  365. package/dist/commands/generate/init.js +0 -15
  366. package/dist/commands/generate/review.js +0 -11
  367. package/dist/commands/generate/sh.js +0 -95
  368. package/dist/commands/generate/shell.js +0 -11
  369. package/dist/commands/generate/unit_tests.js +0 -11
  370. package/dist/commands/init.js +0 -13
  371. package/dist/commands/models.js +0 -22
  372. package/dist/commands/project/build.js +0 -88
  373. package/dist/commands/project/complete.js +0 -12
  374. package/dist/commands/project/init.js +0 -82
  375. package/dist/commands/project/plan.js +0 -108
  376. package/dist/commands/proxy.js +0 -11
  377. package/dist/commands/review.js +0 -50
  378. package/dist/commands/tokens.js +0 -75
  379. package/dist/commands/unit_tests.js +0 -150
  380. package/dist/commands/update.js +0 -7
  381. package/dist/file2.js +0 -4
  382. package/dist/index.js +0 -136
  383. package/dist/managers/BlockManager.js +0 -120
  384. package/dist/managers/ChatManager.js +0 -653
  385. package/dist/managers/ChunkManager.js +0 -32
  386. package/dist/managers/CodeManager.js +0 -185
  387. package/dist/managers/CommitManager.js +0 -78
  388. package/dist/managers/DocsManager.js +0 -88
  389. package/dist/managers/DocumentationManager.js +0 -114
  390. package/dist/managers/InitManager.js +0 -230
  391. package/dist/managers/ProxyManager.js +0 -210
  392. package/dist/managers/ReviewManager.js +0 -131
  393. package/dist/managers/ShellManager.js +0 -163
  394. package/dist/managers/StreamManager.js +0 -308
  395. package/dist/managers/UnitTestManager.js +0 -243
  396. package/dist/managers/src/managers/ProxyManager.js +0 -1
  397. package/dist/newfile.js +0 -2
  398. package/dist/package.json +0 -86
  399. package/dist/utils/command_utils.js +0 -384
  400. package/dist/utils/config_utils.js +0 -249
  401. package/dist/utils/gitUtils.js +0 -42
  402. package/dist/utils/git_utils.js +0 -217
  403. package/dist/utils/modelUtils.js +0 -7
  404. package/dist/utils/model_utils.js +0 -7
  405. package/dist/utils/prompt_utils.js +0 -333
  406. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  407. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  408. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  409. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  410. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  411. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  412. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  413. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  414. package/dist/utils/prompts/index.js +0 -27
  415. package/dist/utils/string_utils.js +0 -505
  416. package/dist/utils/types.js +0 -2
@@ -0,0 +1,126 @@
1
+ import { documentDigest } from "../broker/decision-restore.js";
2
+ import { effectInputDigest } from "../broker/effect-restore.js";
3
+ import { operationIdentity } from "../operation-identity.js";
4
+ function reference(text) {
5
+ return typeof text === "string" ? documentDigest(text) : null;
6
+ }
7
+ function sequenceOf(receipt) {
8
+ const committed = receipt.kind === "accepted" || receipt.kind === "duplicate";
9
+ return committed ? receipt.sequence : undefined;
10
+ }
11
+ async function stored(authority, answer) {
12
+ const { receipt, operationId } = answer;
13
+ if (receipt.kind === "failed")
14
+ return { receipt, disposition: null, operation: null };
15
+ const sequence = sequenceOf(receipt);
16
+ try {
17
+ const disposition = sequence === undefined
18
+ ? undefined
19
+ : await authority.effects.disposition(sequence);
20
+ return {
21
+ receipt,
22
+ disposition: disposition ?? null,
23
+ operation: (await authority.effects.operation(operationId)) ?? null,
24
+ };
25
+ }
26
+ catch {
27
+ return { receipt, disposition: null, operation: null };
28
+ }
29
+ }
30
+ function texts(values) {
31
+ return values.every((value) => typeof value === "string");
32
+ }
33
+ function isObject(value) {
34
+ return typeof value === "object" && value !== null;
35
+ }
36
+ function unanswered(reason) {
37
+ return {
38
+ receipt: { kind: "rejected", reason },
39
+ disposition: null,
40
+ operation: null,
41
+ };
42
+ }
43
+ function effectPort(parts) {
44
+ const { gateway, authority } = parts;
45
+ return {
46
+ requestEffect: async (request) => {
47
+ if (!isObject(request))
48
+ return unanswered("invalid-command");
49
+ const { scope, payload, epoch, ...rest } = request;
50
+ if (!texts([payload, rest.capability, rest.method, rest.target]))
51
+ return unanswered("invalid-command");
52
+ const identity = operationIdentity({ ...scope, run: request.runId });
53
+ if (identity.kind !== "valid")
54
+ return unanswered(identity.reason);
55
+ const operationId = identity.value;
56
+ const digest = documentDigest(payload);
57
+ const receipt = await gateway.execute({
58
+ principal: "worker",
59
+ command: {
60
+ kind: "request-effect",
61
+ ...rest,
62
+ operationId,
63
+ payload: digest,
64
+ inputDigest: effectInputDigest({
65
+ capability: request.capability,
66
+ method: request.method,
67
+ target: request.target,
68
+ payload: digest,
69
+ }),
70
+ recoveryLimit: authority.recoveryLimit,
71
+ },
72
+ documents: [payload],
73
+ epoch: epoch ?? authority.epoch,
74
+ });
75
+ return stored(authority, { receipt, operationId });
76
+ },
77
+ reportEffect: async (report) => {
78
+ if (!isObject(report))
79
+ return unanswered("invalid-command");
80
+ const { result, epoch, ...rest } = report;
81
+ const given = result === undefined ? [] : [result];
82
+ if (!texts([report.operationId, ...given]))
83
+ return unanswered("invalid-command");
84
+ const receipt = await gateway.execute({
85
+ principal: "worker",
86
+ command: {
87
+ kind: "report-effect",
88
+ ...rest,
89
+ ...(result === undefined ? {} : { result: documentDigest(result) }),
90
+ },
91
+ documents: result === undefined ? [] : [result],
92
+ epoch: epoch ?? authority.epoch,
93
+ });
94
+ return stored(authority, {
95
+ receipt,
96
+ operationId: report.operationId,
97
+ });
98
+ },
99
+ };
100
+ }
101
+ export function workerPort(parts) {
102
+ const { gateway } = parts;
103
+ const submit = (command, documents) => gateway.execute({
104
+ principal: "worker",
105
+ command,
106
+ ...(documents === undefined ? {} : { documents }),
107
+ });
108
+ return {
109
+ submit,
110
+ started: (run) => submit({ kind: "mark-started", ...run }),
111
+ openGate: (opening) => {
112
+ const { kind, prompt, ...rest } = opening;
113
+ return submit({
114
+ kind: "open-gate",
115
+ ...rest,
116
+ gateKind: kind,
117
+ prompt: reference(prompt),
118
+ }, [prompt]);
119
+ },
120
+ registerWait: (wait) => submit({ kind: "register-wait", ...wait }),
121
+ observe: (report) => submit({ kind: "report-observation", ...report }),
122
+ completed: (run) => submit({ kind: "complete-run", ...run }),
123
+ failed: (run) => submit({ kind: "fail-run", ...run }),
124
+ ...effectPort(parts),
125
+ };
126
+ }
@@ -0,0 +1,57 @@
1
+ export declare const stepBridgeKey = "cloving.step-bridge/v1";
2
+ export interface ProtectedScope {
3
+ readonly phase: string;
4
+ readonly operation: string;
5
+ readonly round: number;
6
+ readonly key?: string;
7
+ readonly stage?: {
8
+ readonly id: string;
9
+ readonly visit: string;
10
+ readonly branch: string;
11
+ };
12
+ }
13
+ export interface ProtectedRequest {
14
+ readonly scope: ProtectedScope;
15
+ readonly capability: string;
16
+ readonly method: string;
17
+ readonly target: string;
18
+ readonly payload: string;
19
+ readonly units: number;
20
+ readonly resource?: string;
21
+ }
22
+ export type ProtectedResult = {
23
+ readonly kind: "completed";
24
+ readonly operationId: string;
25
+ readonly receipt: string | null;
26
+ readonly result: string | null;
27
+ } | {
28
+ readonly kind: "failed" | "stopped" | "blocked" | "cancelled";
29
+ readonly operationId: string;
30
+ readonly reason: string | null;
31
+ } | {
32
+ readonly kind: "refused";
33
+ readonly reason: string;
34
+ } | {
35
+ readonly kind: "unavailable";
36
+ readonly reason: string;
37
+ };
38
+ export interface GateRequest {
39
+ readonly gateId: string;
40
+ readonly kind: "question" | "approval";
41
+ readonly prompt: string;
42
+ }
43
+ export type GateResult = {
44
+ readonly kind: "opened";
45
+ readonly decisionId: string;
46
+ } | {
47
+ readonly kind: "refused";
48
+ readonly reason: string;
49
+ } | {
50
+ readonly kind: "unavailable";
51
+ readonly reason: string;
52
+ };
53
+ export interface StepBridge {
54
+ readonly effect: (request: ProtectedRequest) => Promise<ProtectedResult>;
55
+ readonly gate: (request: GateRequest) => Promise<GateResult>;
56
+ }
57
+ export declare function isStepBridge(value: unknown): value is StepBridge;
@@ -0,0 +1,4 @@
1
+ export const stepBridgeKey = "cloving.step-bridge/v1";
2
+ export function isStepBridge(value) {
3
+ return ["effect", "gate"].every((member) => typeof Reflect.get(Object(value), member) === "function");
4
+ }
@@ -0,0 +1,2 @@
1
+ import { type GateRequest, type GateResult } from "../step-bridge.ts";
2
+ export declare function decisionGate(request: GateRequest): Promise<GateResult>;
@@ -0,0 +1,8 @@
1
+ import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
2
+ export async function decisionGate(request) {
3
+ "use step";
4
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
5
+ if (!isStepBridge(bridge))
6
+ return { kind: "unavailable", reason: "cloving-host-unavailable" };
7
+ return await bridge.gate(request);
8
+ }
@@ -0,0 +1,10 @@
1
+ import type { DevelopmentInput } from "../workflow-contracts.ts";
2
+ export type CycleLoad = {
3
+ readonly kind: "unavailable";
4
+ readonly reason: "cloving-host-unavailable";
5
+ readonly cycleId: string;
6
+ } | {
7
+ readonly kind: "invalid";
8
+ readonly reason: "invalid-development-input";
9
+ };
10
+ export declare function loadCycle(input: DevelopmentInput): Promise<CycleLoad>;
@@ -0,0 +1,11 @@
1
+ import { validateDevelopmentInput } from "../workflow-contracts.js";
2
+ export async function loadCycle(input) {
3
+ "use step";
4
+ return Promise.resolve(validateDevelopmentInput(input).kind === "invalid"
5
+ ? { kind: "invalid", reason: "invalid-development-input" }
6
+ : {
7
+ kind: "unavailable",
8
+ reason: "cloving-host-unavailable",
9
+ cycleId: input.cycleId,
10
+ });
11
+ }
@@ -0,0 +1,2 @@
1
+ import { type ProtectedRequest, type ProtectedResult } from "../step-bridge.ts";
2
+ export declare function protectedEffect(request: ProtectedRequest): Promise<ProtectedResult>;
@@ -0,0 +1,8 @@
1
+ import { isStepBridge, stepBridgeKey, } from "../step-bridge.js";
2
+ export async function protectedEffect(request) {
3
+ "use step";
4
+ const bridge = Reflect.get(globalThis, Symbol.for(stepBridgeKey));
5
+ if (!isStepBridge(bridge))
6
+ return { kind: "unavailable", reason: "cloving-host-unavailable" };
7
+ return await bridge.effect(request);
8
+ }
@@ -0,0 +1,54 @@
1
+ import { type SqlConnection } from "./domain-rows.ts";
2
+ export interface GateRow {
3
+ readonly runId: string;
4
+ readonly gateId: string;
5
+ readonly kind: string;
6
+ readonly label: number | null;
7
+ readonly subject: string | null;
8
+ readonly prompt: string | null;
9
+ readonly expiresAt: string | null;
10
+ readonly generation: number;
11
+ readonly revision: number;
12
+ readonly wait: string;
13
+ readonly decision: string | null;
14
+ readonly answer: string | null;
15
+ readonly decidedSequence: number | null;
16
+ readonly openedSequence: number;
17
+ readonly continuation: string | null;
18
+ }
19
+ export interface DetailRow {
20
+ readonly runId: string;
21
+ readonly generation: number;
22
+ readonly submission: string | null;
23
+ readonly input: string | null;
24
+ readonly resolver: string | null;
25
+ readonly condition: string | null;
26
+ readonly reason: string | null;
27
+ readonly evidence: string | null;
28
+ readonly retryAt: string | null;
29
+ readonly attempt: number | null;
30
+ readonly attemptLimit: number | null;
31
+ readonly observedSequence: number | null;
32
+ readonly observedAt: string | null;
33
+ readonly observedOperation: string | null;
34
+ }
35
+ export interface DocumentRow {
36
+ readonly digest: string;
37
+ readonly body: string;
38
+ }
39
+ export interface DecisionRows {
40
+ readonly gates: readonly GateRow[];
41
+ readonly details: readonly DetailRow[];
42
+ }
43
+ export declare const gateColumns = "run_id, gate_id, kind, label, subject, prompt, expires_at, generation, revision, wait, decision, answer, decided_sequence, opened_sequence, continuation";
44
+ export declare const detailColumns = "run_id, generation, submission, input, resolver, condition, reason, evidence, retry_at, attempt, attempt_limit, observed_sequence, observed_at, observed_operation";
45
+ export declare function gateRow(row: unknown): GateRow;
46
+ export declare function detailRow(row: unknown): DetailRow;
47
+ export declare function documentRow(row: unknown): DocumentRow;
48
+ export declare function loadDecisions(connection: SqlConnection): Promise<DecisionRows>;
49
+ export declare function loadDocuments(connection: SqlConnection): Promise<readonly DocumentRow[]>;
50
+ export declare function runDecisions(connection: SqlConnection, runId: string): Promise<DecisionRows & {
51
+ readonly questions: number;
52
+ }>;
53
+ export declare function storedDigests(connection: SqlConnection, digests: readonly string[]): Promise<readonly string[]>;
54
+ export declare function documentBody(connection: SqlConnection, digest: string): Promise<string | undefined>;
@@ -0,0 +1,72 @@
1
+ import { integer, optionalInteger, optionalText, text, } from "./domain-rows.js";
2
+ export const gateColumns = "run_id, gate_id, kind, label, subject, prompt, expires_at, generation, revision, wait, decision, answer, decided_sequence, opened_sequence, continuation";
3
+ export const detailColumns = "run_id, generation, submission, input, resolver, condition, reason, evidence, retry_at, attempt, attempt_limit, observed_sequence, observed_at, observed_operation";
4
+ export function gateRow(row) {
5
+ return {
6
+ runId: text(row, "run_id"),
7
+ gateId: text(row, "gate_id"),
8
+ kind: text(row, "kind"),
9
+ label: optionalInteger(row, "label"),
10
+ subject: optionalText(row, "subject"),
11
+ prompt: optionalText(row, "prompt"),
12
+ expiresAt: optionalText(row, "expires_at"),
13
+ generation: integer(row, "generation"),
14
+ revision: integer(row, "revision"),
15
+ wait: text(row, "wait"),
16
+ decision: optionalText(row, "decision"),
17
+ answer: optionalText(row, "answer"),
18
+ decidedSequence: optionalInteger(row, "decided_sequence"),
19
+ openedSequence: integer(row, "opened_sequence"),
20
+ continuation: optionalText(row, "continuation"),
21
+ };
22
+ }
23
+ export function detailRow(row) {
24
+ return {
25
+ runId: text(row, "run_id"),
26
+ generation: integer(row, "generation"),
27
+ submission: optionalText(row, "submission"),
28
+ input: optionalText(row, "input"),
29
+ resolver: optionalText(row, "resolver"),
30
+ condition: optionalText(row, "condition"),
31
+ reason: optionalText(row, "reason"),
32
+ evidence: optionalText(row, "evidence"),
33
+ retryAt: optionalText(row, "retry_at"),
34
+ attempt: optionalInteger(row, "attempt"),
35
+ attemptLimit: optionalInteger(row, "attempt_limit"),
36
+ observedSequence: optionalInteger(row, "observed_sequence"),
37
+ observedAt: optionalText(row, "observed_at"),
38
+ observedOperation: optionalText(row, "observed_operation"),
39
+ };
40
+ }
41
+ export function documentRow(row) {
42
+ return { digest: text(row, "digest"), body: text(row, "body") };
43
+ }
44
+ export async function loadDecisions(connection) {
45
+ return {
46
+ gates: (await connection.all(`SELECT ${gateColumns} FROM gates ORDER BY opened_sequence, gate_id`)).map(gateRow),
47
+ details: (await connection.all(`SELECT ${detailColumns} FROM run_details ORDER BY run_id`)).map(detailRow),
48
+ };
49
+ }
50
+ export async function loadDocuments(connection) {
51
+ return (await connection.all("SELECT digest, body FROM documents ORDER BY digest")).map(documentRow);
52
+ }
53
+ export async function runDecisions(connection, runId) {
54
+ return {
55
+ gates: (await connection.all(`SELECT ${gateColumns} FROM gates WHERE run_id = ? ORDER BY opened_sequence, gate_id`, [runId])).map(gateRow),
56
+ details: (await connection.all(`SELECT ${detailColumns} FROM run_details WHERE run_id = ?`, [runId])).map(detailRow),
57
+ questions: integer(await connection.get("SELECT coalesce(max(label), 0) AS questions FROM gates"), "questions"),
58
+ };
59
+ }
60
+ export async function storedDigests(connection, digests) {
61
+ const found = [];
62
+ for (const digest of digests) {
63
+ const row = await connection.get("SELECT digest FROM documents WHERE digest = ?", [digest]);
64
+ if (row !== undefined)
65
+ found.push(digest);
66
+ }
67
+ return found;
68
+ }
69
+ export async function documentBody(connection, digest) {
70
+ const row = await connection.get("SELECT body FROM documents WHERE digest = ?", [digest]);
71
+ return row === undefined ? undefined : text(row, "body");
72
+ }
@@ -0,0 +1,17 @@
1
+ import { type DecisionRows, type DocumentRow } from "./decision-rows.ts";
2
+ import { type AttemptRow, type DomainSnapshot, type ProjectionRows, type SqlConnection } from "./domain-rows.ts";
3
+ import { type EffectRows } from "./effect-rows.ts";
4
+ export interface ProjectionSnapshot extends ProjectionRows, DecisionRows {
5
+ readonly deliveries: readonly AttemptRow[];
6
+ readonly pending: readonly string[];
7
+ readonly sequence: number;
8
+ }
9
+ export interface DecidedSnapshot extends DomainSnapshot, DecisionRows {
10
+ readonly documents: readonly DocumentRow[];
11
+ }
12
+ export interface CurrentSnapshot extends DecidedSnapshot {
13
+ readonly effects: EffectRows;
14
+ }
15
+ export declare function loadProjections(connection: SqlConnection): Promise<ProjectionSnapshot>;
16
+ export declare function loadDecided(connection: SqlConnection): Promise<DecidedSnapshot>;
17
+ export declare function loadCurrent(connection: SqlConnection): Promise<CurrentSnapshot>;
@@ -0,0 +1,25 @@
1
+ import { loadDecisions, loadDocuments, } from "./decision-rows.js";
2
+ import { latestSequence, loadAttempts, loadSnapshot, projectionRows, text, } from "./domain-rows.js";
3
+ import { loadEffects } from "./effect-rows.js";
4
+ export async function loadProjections(connection) {
5
+ return {
6
+ ...(await projectionRows(connection)),
7
+ ...(await loadDecisions(connection)),
8
+ deliveries: await loadAttempts(connection),
9
+ pending: (await connection.all("SELECT operation_id FROM operations WHERE status = 'dispatch-pending' ORDER BY operation_id")).map((row) => text(row, "operation_id")),
10
+ sequence: await latestSequence(connection),
11
+ };
12
+ }
13
+ export async function loadDecided(connection) {
14
+ return {
15
+ ...(await loadSnapshot(connection)),
16
+ ...(await loadDecisions(connection)),
17
+ documents: await loadDocuments(connection),
18
+ };
19
+ }
20
+ export async function loadCurrent(connection) {
21
+ return {
22
+ ...(await loadDecided(connection)),
23
+ effects: await loadEffects(connection),
24
+ };
25
+ }
@@ -0,0 +1,48 @@
1
+ import { type DetailRow, type DocumentRow, type GateRow } from "./decision-rows.ts";
2
+ import { type CommandRow, type DefinitionRow, type EventRow, type RunRow, type SqlConnection } from "./domain-rows.ts";
3
+ import { type EffectRows } from "./effect-rows.ts";
4
+ import { type Statement } from "./statements.ts";
5
+ export interface StagedDelivery {
6
+ readonly effectId: string;
7
+ readonly operationId: string;
8
+ readonly inputDigest: string;
9
+ readonly purpose: string;
10
+ readonly leaseGeneration: number | null;
11
+ readonly authorityEpoch: number;
12
+ }
13
+ export interface ClosedDelivery {
14
+ readonly effectId: string;
15
+ readonly outcome: string;
16
+ readonly receipt: string | null;
17
+ }
18
+ export interface AddedIntent {
19
+ readonly operationId: string;
20
+ readonly kind: string;
21
+ readonly runId: string;
22
+ readonly createdSequence: number;
23
+ }
24
+ export interface ReleasedIntent {
25
+ readonly operationId: string;
26
+ readonly releasedSequence: number;
27
+ }
28
+ export interface DomainChange extends EffectRows {
29
+ readonly previous: number;
30
+ readonly sequence: number;
31
+ readonly definitions: readonly DefinitionRow[];
32
+ readonly events: readonly EventRow[];
33
+ readonly runs: readonly RunRow[];
34
+ readonly commands: readonly CommandRow[];
35
+ readonly added: readonly AddedIntent[];
36
+ readonly released: readonly ReleasedIntent[];
37
+ readonly staged: readonly StagedDelivery[];
38
+ readonly closed: readonly ClosedDelivery[];
39
+ readonly gates: readonly GateRow[];
40
+ readonly details: readonly DetailRow[];
41
+ readonly documents: readonly DocumentRow[];
42
+ readonly completesAdoption: boolean;
43
+ }
44
+ export declare function persistChange(value: unknown, connection: SqlConnection): Promise<void>;
45
+ export declare function gateParameters(row: GateRow): readonly unknown[];
46
+ export declare function detailParameters(row: DetailRow): readonly unknown[];
47
+ export declare function decisionStatements(change: Pick<DomainChange, "gates" | "details" | "documents">): readonly Statement[];
48
+ export declare function persistDecisions(connection: SqlConnection, rows: Pick<DomainChange, "gates" | "details" | "documents">): Promise<void>;
@@ -0,0 +1,213 @@
1
+ import { detailColumns, detailRow, documentRow, gateColumns, gateRow, } from "./decision-rows.js";
2
+ import { commandRow, definitionRow, eventRow, integer, latestSequence, optionalInteger, optionalText, runRow, text, } from "./domain-rows.js";
3
+ import { effectStatements } from "./effect-changes.js";
4
+ import { budgetRow, evidenceRow, leaseRow, operationRow, stopRow, } from "./effect-rows.js";
5
+ import { upsert } from "./statements.js";
6
+ export async function persistChange(value, connection) {
7
+ const change = parseChange(value);
8
+ if ((await latestSequence(connection)) !== change.previous)
9
+ throw new Error("stale-authority-sequence");
10
+ for (const statement of statements(change))
11
+ await connection.run(statement.sql, statement.parameters);
12
+ }
13
+ function statements(change) {
14
+ return [
15
+ ...change.definitions.map((row) => ({
16
+ sql: "INSERT INTO definitions (pin, manifest) VALUES (?, ?) ON CONFLICT (pin) DO NOTHING",
17
+ parameters: [row.pin, row.manifest],
18
+ })),
19
+ ...change.events.map((row) => ({
20
+ sql: "INSERT INTO events (sequence, type, run_id, command_id, recorded_at, request, payload) VALUES (?, ?, ?, ?, ?, ?, ?)",
21
+ parameters: [
22
+ row.sequence,
23
+ row.type,
24
+ row.runId,
25
+ row.commandId,
26
+ row.recordedAt,
27
+ row.request,
28
+ row.payload,
29
+ ],
30
+ })),
31
+ ...change.runs.map((row) => ({
32
+ sql: "INSERT INTO runs (run_id, status, revision, workflow, paused_from, gates, sequence) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT (run_id) DO UPDATE SET status = excluded.status, revision = excluded.revision, workflow = excluded.workflow, paused_from = excluded.paused_from, gates = excluded.gates, sequence = excluded.sequence",
33
+ parameters: [
34
+ row.runId,
35
+ row.status,
36
+ row.revision,
37
+ row.workflow,
38
+ row.pausedFrom,
39
+ row.gates,
40
+ row.sequence,
41
+ ],
42
+ })),
43
+ ...change.commands.map((row) => ({
44
+ sql: "INSERT INTO commands (command_id, request, sequence) VALUES (?, ?, ?)",
45
+ parameters: [row.commandId, row.request, row.sequence],
46
+ })),
47
+ ...intentStatements(change),
48
+ ...deliveryStatements(change),
49
+ ...decisionStatements(change),
50
+ ...effectStatements(change),
51
+ ...(change.completesAdoption
52
+ ? [
53
+ {
54
+ sql: "UPDATE authority_identity SET adoption_sequence = NULL WHERE singleton = 1 AND adoption_sequence = ?",
55
+ parameters: [change.sequence],
56
+ },
57
+ ]
58
+ : []),
59
+ ];
60
+ }
61
+ function intentStatements(change) {
62
+ return [
63
+ ...change.added.map((row) => ({
64
+ sql: "INSERT INTO outbox (operation_id, kind, run_id, created_sequence) VALUES (?, ?, ?, ?)",
65
+ parameters: [row.operationId, row.kind, row.runId, row.createdSequence],
66
+ })),
67
+ ...change.released.map((row) => ({
68
+ sql: "UPDATE outbox SET released_sequence = ? WHERE operation_id = ? AND released_sequence IS NULL",
69
+ parameters: [row.releasedSequence, row.operationId],
70
+ })),
71
+ ];
72
+ }
73
+ function deliveryStatements(change) {
74
+ return [
75
+ ...change.closed.map((row) => ({
76
+ sql: "UPDATE deliveries SET outcome = ?, receipt = ? WHERE effect_id = ? AND outcome IS NULL",
77
+ parameters: [row.outcome, row.receipt, row.effectId],
78
+ })),
79
+ ...change.staged.flatMap((row) => [
80
+ {
81
+ sql: "INSERT INTO deliveries (effect_id, operation_id, input_digest, staged_sequence) VALUES (?, ?, ?, ?)",
82
+ parameters: [
83
+ row.effectId,
84
+ row.operationId,
85
+ row.inputDigest,
86
+ change.sequence,
87
+ ],
88
+ },
89
+ {
90
+ sql: "INSERT INTO dispatch_attempts (effect_id, purpose, lease_generation, authority_epoch) VALUES (?, ?, ?, ?)",
91
+ parameters: [
92
+ row.effectId,
93
+ row.purpose,
94
+ row.leaseGeneration,
95
+ row.authorityEpoch,
96
+ ],
97
+ },
98
+ ]),
99
+ ];
100
+ }
101
+ const gateNames = gateColumns.split(", ");
102
+ const detailNames = detailColumns.split(", ");
103
+ const gateUpsert = upsert({ table: "gates", names: gateNames, key: 2 });
104
+ const detailUpsert = upsert({
105
+ table: "run_details",
106
+ names: detailNames,
107
+ key: 1,
108
+ });
109
+ export function gateParameters(row) {
110
+ return [
111
+ row.runId,
112
+ row.gateId,
113
+ row.kind,
114
+ row.label,
115
+ row.subject,
116
+ row.prompt,
117
+ row.expiresAt,
118
+ row.generation,
119
+ row.revision,
120
+ row.wait,
121
+ row.decision,
122
+ row.answer,
123
+ row.decidedSequence,
124
+ row.openedSequence,
125
+ row.continuation,
126
+ ];
127
+ }
128
+ export function detailParameters(row) {
129
+ return [
130
+ row.runId,
131
+ row.generation,
132
+ row.submission,
133
+ row.input,
134
+ row.resolver,
135
+ row.condition,
136
+ row.reason,
137
+ row.evidence,
138
+ row.retryAt,
139
+ row.attempt,
140
+ row.attemptLimit,
141
+ row.observedSequence,
142
+ row.observedAt,
143
+ row.observedOperation,
144
+ ];
145
+ }
146
+ export function decisionStatements(change) {
147
+ return [
148
+ ...change.gates.map((row) => ({
149
+ sql: gateUpsert,
150
+ parameters: gateParameters(row),
151
+ })),
152
+ ...change.details.map((row) => ({
153
+ sql: detailUpsert,
154
+ parameters: detailParameters(row),
155
+ })),
156
+ ...change.documents.map((row) => ({
157
+ sql: "INSERT INTO documents (digest, body) VALUES (?, ?) ON CONFLICT (digest) DO NOTHING",
158
+ parameters: [row.digest, row.body],
159
+ })),
160
+ ];
161
+ }
162
+ export async function persistDecisions(connection, rows) {
163
+ for (const statement of decisionStatements(rows))
164
+ await connection.run(statement.sql, statement.parameters);
165
+ }
166
+ function parseChange(value) {
167
+ return {
168
+ previous: integer(value, "previous"),
169
+ sequence: integer(value, "sequence"),
170
+ definitions: list(value, "definitions").map(definitionRow),
171
+ events: list(value, "events").map(eventRow),
172
+ runs: list(value, "runs").map(runRow),
173
+ commands: list(value, "commands").map(commandRow),
174
+ added: list(value, "added").map((row) => ({
175
+ operationId: text(row, "operation_id"),
176
+ kind: text(row, "kind"),
177
+ runId: text(row, "run_id"),
178
+ createdSequence: integer(row, "created_sequence"),
179
+ })),
180
+ released: list(value, "released").map((row) => ({
181
+ operationId: text(row, "operation_id"),
182
+ releasedSequence: integer(row, "released_sequence"),
183
+ })),
184
+ staged: list(value, "staged").map((row) => ({
185
+ effectId: text(row, "effect_id"),
186
+ operationId: text(row, "operation_id"),
187
+ inputDigest: text(row, "input_digest"),
188
+ purpose: text(row, "purpose"),
189
+ leaseGeneration: optionalInteger(row, "lease_generation"),
190
+ authorityEpoch: integer(row, "authority_epoch"),
191
+ })),
192
+ closed: list(value, "closed").map((row) => ({
193
+ effectId: text(row, "effect_id"),
194
+ outcome: text(row, "outcome"),
195
+ receipt: optionalText(row, "receipt"),
196
+ })),
197
+ gates: list(value, "gates").map(gateRow),
198
+ details: list(value, "details").map(detailRow),
199
+ documents: list(value, "documents").map(documentRow),
200
+ budgets: list(value, "budgets").map(budgetRow),
201
+ operations: list(value, "operations").map(operationRow),
202
+ leases: list(value, "leases").map(leaseRow),
203
+ evidence: list(value, "evidence").map(evidenceRow),
204
+ stops: list(value, "stops").map(stopRow),
205
+ completesAdoption: Reflect.get(Object(value), "completes_adoption") === true,
206
+ };
207
+ }
208
+ function list(value, name) {
209
+ const items = Reflect.get(Object(value), name);
210
+ if (!Array.isArray(items))
211
+ throw new Error(`invalid-column: ${name}`);
212
+ return items;
213
+ }