cloving 0.3.19 → 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 (507) 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/.DS_Store +0 -0
  343. package/.aider.chat.history.md +0 -16978
  344. package/.aider.input.history +0 -15
  345. package/.aider.tags.cache.v3/cache.db +0 -0
  346. package/.aider.tags.cache.v3/cache.db-shm +0 -0
  347. package/.aider.tags.cache.v3/cache.db-wal +0 -0
  348. package/.cursorrules +0 -77
  349. package/.github/workflows/auto-release.yml +0 -83
  350. package/.github/workflows/ci.yml +0 -32
  351. package/.github/workflows/npm-publish.yml +0 -34
  352. package/.gitignore +0 -67
  353. package/.husky/_/.gitignore +0 -1
  354. package/.husky/_/applypatch-msg +0 -2
  355. package/.husky/_/commit-msg +0 -2
  356. package/.husky/_/h +0 -22
  357. package/.husky/_/husky.sh +0 -9
  358. package/.husky/_/post-applypatch +0 -2
  359. package/.husky/_/post-checkout +0 -2
  360. package/.husky/_/post-commit +0 -2
  361. package/.husky/_/post-merge +0 -2
  362. package/.husky/_/post-rewrite +0 -2
  363. package/.husky/_/pre-applypatch +0 -2
  364. package/.husky/_/pre-auto-gc +0 -2
  365. package/.husky/_/pre-commit +0 -2
  366. package/.husky/_/pre-merge-commit +0 -2
  367. package/.husky/_/pre-push +0 -2
  368. package/.husky/_/pre-rebase +0 -2
  369. package/.husky/_/prepare-commit-msg +0 -2
  370. package/.husky/pre-commit +0 -1
  371. package/.husky/pre-push +0 -1
  372. package/.prettierrc.json +0 -7
  373. package/.tool-versions +0 -2
  374. package/SECURITY.md +0 -15
  375. package/cloving.json +0 -67
  376. package/dist/abstract_gpt/index.js +0 -55
  377. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  378. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  379. package/dist/cloving_gpt/adapters/claude.js +0 -128
  380. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  381. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  382. package/dist/cloving_gpt/adapters/index.js +0 -2
  383. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  384. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  385. package/dist/cloving_gpt/adapters/openai.js +0 -100
  386. package/dist/cloving_gpt/index.js +0 -192
  387. package/dist/commands/analyze.js +0 -47
  388. package/dist/commands/chat.js +0 -14
  389. package/dist/commands/check.js +0 -7
  390. package/dist/commands/commit.js +0 -44
  391. package/dist/commands/config.js +0 -167
  392. package/dist/commands/describe.js +0 -235
  393. package/dist/commands/generate/code.js +0 -21
  394. package/dist/commands/generate/commit.js +0 -11
  395. package/dist/commands/generate/context.js +0 -82
  396. package/dist/commands/generate/docs.js +0 -11
  397. package/dist/commands/generate/documentation.js +0 -11
  398. package/dist/commands/generate/fizzbuzz.js +0 -35
  399. package/dist/commands/generate/init.js +0 -15
  400. package/dist/commands/generate/review.js +0 -11
  401. package/dist/commands/generate/sh.js +0 -95
  402. package/dist/commands/generate/shell.js +0 -11
  403. package/dist/commands/generate/unit_tests.js +0 -11
  404. package/dist/commands/init.js +0 -13
  405. package/dist/commands/models.js +0 -22
  406. package/dist/commands/project/build.js +0 -88
  407. package/dist/commands/project/complete.js +0 -12
  408. package/dist/commands/project/init.js +0 -82
  409. package/dist/commands/project/plan.js +0 -108
  410. package/dist/commands/proxy.js +0 -11
  411. package/dist/commands/review.js +0 -50
  412. package/dist/commands/tokens.js +0 -75
  413. package/dist/commands/unit_tests.js +0 -150
  414. package/dist/commands/update.js +0 -7
  415. package/dist/file2.js +0 -4
  416. package/dist/index.js +0 -134
  417. package/dist/managers/BlockManager.js +0 -120
  418. package/dist/managers/ChatManager.js +0 -653
  419. package/dist/managers/ChunkManager.js +0 -32
  420. package/dist/managers/CodeManager.js +0 -185
  421. package/dist/managers/CommitManager.js +0 -64
  422. package/dist/managers/DocsManager.js +0 -88
  423. package/dist/managers/DocumentationManager.js +0 -114
  424. package/dist/managers/InitManager.js +0 -230
  425. package/dist/managers/ProxyManager.js +0 -210
  426. package/dist/managers/ReviewManager.js +0 -131
  427. package/dist/managers/ShellManager.js +0 -163
  428. package/dist/managers/StreamManager.js +0 -308
  429. package/dist/managers/UnitTestManager.js +0 -243
  430. package/dist/managers/src/managers/ProxyManager.js +0 -1
  431. package/dist/newfile.js +0 -2
  432. package/dist/package.json +0 -86
  433. package/dist/utils/command_utils.js +0 -384
  434. package/dist/utils/config_utils.js +0 -249
  435. package/dist/utils/gitUtils.js +0 -42
  436. package/dist/utils/git_utils.js +0 -217
  437. package/dist/utils/modelUtils.js +0 -7
  438. package/dist/utils/model_utils.js +0 -7
  439. package/dist/utils/prompt_utils.js +0 -333
  440. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  441. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  442. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  443. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  444. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  445. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  446. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  447. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  448. package/dist/utils/prompts/index.js +0 -27
  449. package/dist/utils/string_utils.js +0 -505
  450. package/dist/utils/types.js +0 -2
  451. package/jest.config.js +0 -11
  452. package/src/cloving_gpt/adapters/azureopenai.ts +0 -83
  453. package/src/cloving_gpt/adapters/claude.ts +0 -140
  454. package/src/cloving_gpt/adapters/gemini.ts +0 -146
  455. package/src/cloving_gpt/adapters/index.ts +0 -43
  456. package/src/cloving_gpt/adapters/mistral.ts +0 -142
  457. package/src/cloving_gpt/adapters/ollama.ts +0 -136
  458. package/src/cloving_gpt/adapters/openai.ts +0 -113
  459. package/src/cloving_gpt/index.ts +0 -229
  460. package/src/commands/chat.ts +0 -12
  461. package/src/commands/config.ts +0 -192
  462. package/src/commands/generate/code.ts +0 -18
  463. package/src/commands/generate/commit.ts +0 -9
  464. package/src/commands/generate/context.ts +0 -93
  465. package/src/commands/generate/docs.ts +0 -9
  466. package/src/commands/generate/review.ts +0 -9
  467. package/src/commands/generate/shell.ts +0 -9
  468. package/src/commands/generate/unit_tests.ts +0 -9
  469. package/src/commands/init.ts +0 -9
  470. package/src/commands/models.ts +0 -21
  471. package/src/commands/proxy.ts +0 -9
  472. package/src/commands/tokens.ts +0 -82
  473. package/src/index.ts +0 -197
  474. package/src/managers/BlockManager.ts +0 -126
  475. package/src/managers/ChatManager.ts +0 -755
  476. package/src/managers/ChunkManager.ts +0 -31
  477. package/src/managers/CodeManager.ts +0 -226
  478. package/src/managers/CommitManager.ts +0 -71
  479. package/src/managers/DocsManager.ts +0 -101
  480. package/src/managers/InitManager.ts +0 -263
  481. package/src/managers/ProxyManager.ts +0 -240
  482. package/src/managers/ReviewManager.ts +0 -154
  483. package/src/managers/ShellManager.ts +0 -172
  484. package/src/managers/StreamManager.ts +0 -353
  485. package/src/managers/UnitTestManager.ts +0 -293
  486. package/src/utils/config_utils.ts +0 -271
  487. package/src/utils/git_utils.ts +0 -230
  488. package/src/utils/model_utils.ts +0 -3
  489. package/src/utils/prompt_utils.ts +0 -375
  490. package/src/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  491. package/src/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  492. package/src/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  493. package/src/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  494. package/src/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  495. package/src/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  496. package/src/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  497. package/src/utils/prompts/SPECIAL_FILES.md +0 -66
  498. package/src/utils/prompts/index.ts +0 -37
  499. package/src/utils/string_utils.ts +0 -552
  500. package/src/utils/types.ts +0 -127
  501. package/tests/commands/generate/unit_tests.test.ts +0 -27
  502. package/tests/utils/git_utils.test.ts +0 -116
  503. package/tests/utils/model_utils.test.ts +0 -27
  504. package/tests/utils/prompt_utils.test.ts +0 -33
  505. package/tests/utils/string_utils.test.ts +0 -560
  506. package/tsconfig.json +0 -14
  507. package/yarn.lock +0 -5823
@@ -0,0 +1,208 @@
1
+ import { parseCommand } from "../../authority/commands.js";
2
+ import { readExecutionManifest } from "../../execution-pin.js";
3
+ import { operationScope } from "../../operation-identity.js";
4
+ import { gateColumns, gateRow, runDecisions, storedDigests, } from "../../storage/decision-rows.js";
5
+ import { deliveryRow, integer, latestSequence, optionalInteger, outboxRow, runRow, text, } from "../../storage/domain-rows.js";
6
+ import { authorityIdentity } from "../../storage/domain-schema.js";
7
+ import { intentKind, storedRun } from "../authority-restore.js";
8
+ import { decisionState, storedGate } from "../decision-restore.js";
9
+ import { deliveryIntent, gateDecision, } from "./delivery-intents.js";
10
+ import { effectTurn, neighbours, pendingEffect } from "./effect-turn.js";
11
+ import { stopIntents } from "./stop-plan.js";
12
+ import { droppedRuns, turnStopping } from "./stop-turn.js";
13
+ import { documentReferences } from "./turn-plan.js";
14
+ export async function commandTurn(connection, scope) {
15
+ const { command, sequence, capacity } = scope;
16
+ const parsed = parseCommand(command);
17
+ return turnState(connection, {
18
+ runId: parsed?.runId ?? "",
19
+ commandId: parsed?.commandId ?? "",
20
+ kind: parsed?.kind ?? "",
21
+ sequence,
22
+ references: documentReferences(parsed),
23
+ operations: [parsed?.operationId]
24
+ .filter((operationId) => operationId !== undefined)
25
+ .filter((operationId) => operationScope(operationId)?.run === parsed?.runId),
26
+ keys: parsed?.resource === undefined ? [] : [parsed.resource],
27
+ capacity,
28
+ });
29
+ }
30
+ export async function stopRecoveries(connection, rule) {
31
+ const intents = [];
32
+ const listed = await droppedRuns(connection, {
33
+ limit: recoveryBatch,
34
+ stopSupported: rule.stopSupported,
35
+ });
36
+ for (const runId of listed) {
37
+ const turn = await turnState(connection, {
38
+ runId,
39
+ commandId: "",
40
+ kind: "",
41
+ sequence: 0,
42
+ references: [],
43
+ operations: [],
44
+ keys: [],
45
+ capacity: rule.capacity,
46
+ });
47
+ intents.push(...stopIntents(turn.state, {
48
+ ...rule,
49
+ stopping: turn.stopping,
50
+ runId,
51
+ closed: [],
52
+ cancelledNow: [],
53
+ opening: true,
54
+ rejected: new Set(),
55
+ }));
56
+ }
57
+ return intents;
58
+ }
59
+ export function recoveryTurn(connection, scope) {
60
+ return turnState(connection, {
61
+ ...scope,
62
+ runId: "",
63
+ commandId: "",
64
+ kind: "",
65
+ references: [],
66
+ operations: [],
67
+ keys: [],
68
+ });
69
+ }
70
+ export const recoveryBatch = 100;
71
+ export async function adoptionTurn(connection) {
72
+ const identity = await authorityIdentity(connection);
73
+ const latest = await latestSequence(connection);
74
+ if (identity.pendingAdoption !== latest)
75
+ throw new Error("adoption-not-pending");
76
+ return latest;
77
+ }
78
+ export async function recoverableIntents(connection) {
79
+ const rows = await connection.all("SELECT o.operation_id, o.kind, o.run_id, r.workflow FROM outbox o JOIN runs r ON r.run_id = o.run_id WHERE o.released_sequence IS NULL AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome IS NULL) AND ((o.kind = 'start-run' AND r.status = 'queued') OR (o.kind = 'continue-run' AND r.status = 'running') OR (o.kind = 'protected-effect' AND r.status = 'running' AND EXISTS (SELECT 1 FROM operations p WHERE p.operation_id = o.operation_id AND p.status = 'dispatch-pending'))) ORDER BY o.created_sequence, o.rowid LIMIT ?", [recoveryBatch]);
80
+ const intents = [];
81
+ for (const row of rows) {
82
+ const intent = {
83
+ kind: intentKind(text(row, "kind")),
84
+ runId: text(row, "run_id"),
85
+ operationId: text(row, "operation_id"),
86
+ workflow: text(row, "workflow"),
87
+ };
88
+ intents.push(intent.kind === "protected-effect"
89
+ ? await pendingEffect(connection, { intent, purpose: "dispatch" })
90
+ : await runIntent(connection, intent));
91
+ }
92
+ return [...intents, ...(await uncertainEffects(connection))];
93
+ }
94
+ async function uncertainEffects(connection) {
95
+ const rows = await connection.all("SELECT p.operation_id, p.run_id, r.workflow FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE p.status IN ('recovering', 'blocked') AND r.status != 'cancelled' AND NOT EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = p.operation_id AND d.outcome IS NULL) ORDER BY p.requested_sequence LIMIT ?", [recoveryBatch]);
96
+ const intents = [];
97
+ for (const row of rows)
98
+ intents.push(await pendingEffect(connection, {
99
+ intent: {
100
+ kind: "protected-effect",
101
+ runId: text(row, "run_id"),
102
+ operationId: text(row, "operation_id"),
103
+ workflow: text(row, "workflow"),
104
+ },
105
+ purpose: "reconcile",
106
+ }));
107
+ return intents;
108
+ }
109
+ async function runIntent(connection, intent) {
110
+ const gate = await connection.get(`SELECT ${gateColumns} FROM gates WHERE continuation = ?`, [intent.operationId]);
111
+ return deliveryIntent({
112
+ ...intent,
113
+ ...gateDecision(gate === undefined ? undefined : storedGate(gateRow(gate))),
114
+ });
115
+ }
116
+ export async function deliveryTurn(connection, scope) {
117
+ const { effectId, sequence, capacity } = scope;
118
+ const found = await connection.get("SELECT d.effect_id, d.operation_id, d.input_digest, d.staged_sequence, d.outcome, d.receipt, o.run_id, o.kind, a.lease_generation, coalesce(a.purpose, 'dispatch') AS purpose FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id WHERE d.effect_id = ?", [effectId]);
119
+ if (found === undefined)
120
+ return undefined;
121
+ const runId = text(found, "run_id");
122
+ return {
123
+ delivery: deliveryRow(found),
124
+ runId,
125
+ intent: intentKind(text(found, "kind")),
126
+ leaseGeneration: optionalInteger(found, "lease_generation"),
127
+ purpose: text(found, "purpose"),
128
+ turn: await turnState(connection, {
129
+ runId,
130
+ commandId: "",
131
+ kind: "",
132
+ sequence,
133
+ references: [],
134
+ operations: [text(found, "operation_id")],
135
+ keys: [],
136
+ capacity,
137
+ }),
138
+ };
139
+ }
140
+ async function attemptSets(connection, runId) {
141
+ return {
142
+ held: new Set((await connection.all("SELECT d.operation_id FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id WHERE o.run_id = ? AND (d.outcome IS NULL OR (d.outcome = 'blocked' AND d.rowid = (SELECT max(rowid) FROM deliveries WHERE operation_id = d.operation_id)))", [runId])).map((row) => text(row, "operation_id"))),
143
+ blocked: new Map((await connection.all("SELECT d.operation_id, d.effect_id FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id WHERE o.run_id = ? AND d.outcome = 'blocked' AND d.rowid = (SELECT max(rowid) FROM deliveries WHERE operation_id = d.operation_id)", [runId])).map((row) => [text(row, "operation_id"), text(row, "effect_id")])),
144
+ };
145
+ }
146
+ async function turnState(connection, scope) {
147
+ const { runId, commandId, sequence } = scope;
148
+ const run = await connection.get("SELECT run_id, status, revision, workflow, paused_from, gates, sequence FROM runs WHERE run_id = ?", [runId]);
149
+ const stored = run === undefined ? undefined : storedRun(runRow(run));
150
+ const existing = await connection.get("SELECT request, sequence FROM commands WHERE command_id = ?", [commandId]);
151
+ const recorded = existing === undefined
152
+ ? undefined
153
+ : {
154
+ request: text(existing, "request"),
155
+ sequence: integer(existing, "sequence"),
156
+ };
157
+ const effects = await effectTurn(connection, scope);
158
+ const near = await neighbours(connection, { runId, effects });
159
+ const decisions = decisionState(await runDecisions(connection, runId));
160
+ const own = await intents(connection, {
161
+ sql: "SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox WHERE run_id = ? AND released_sequence IS NULL ORDER BY created_sequence, rowid",
162
+ parameters: [runId],
163
+ });
164
+ return {
165
+ state: {
166
+ sequence,
167
+ runs: { ...near.runs, ...(stored ? { [runId]: stored } : {}) },
168
+ commands: recorded ? { [commandId]: recorded } : {},
169
+ intents: [...own, ...near.intents],
170
+ ...decisions,
171
+ details: { ...near.details, ...decisions.details },
172
+ effects,
173
+ },
174
+ documents: new Set(await storedDigests(connection, scope.references)),
175
+ definitions: await definitions(connection, stored?.workflow),
176
+ ...(await attemptSets(connection, runId)),
177
+ stopping: await turnStopping(connection, {
178
+ runId,
179
+ status: stored?.status,
180
+ kind: scope.kind,
181
+ }),
182
+ runId,
183
+ created: recorded
184
+ ? await intents(connection, {
185
+ sql: "SELECT operation_id, kind, run_id, created_sequence, released_sequence FROM outbox WHERE created_sequence = ? ORDER BY rowid",
186
+ parameters: [recorded.sequence],
187
+ })
188
+ : [],
189
+ };
190
+ }
191
+ async function intents(connection, query) {
192
+ return (await connection.all(query.sql, query.parameters)).map((row) => {
193
+ const intent = outboxRow(row);
194
+ return {
195
+ kind: intentKind(intent.kind),
196
+ runId: intent.runId,
197
+ operationId: intent.operationId,
198
+ };
199
+ });
200
+ }
201
+ async function definitions(connection, pin) {
202
+ if (pin === undefined)
203
+ return new Map();
204
+ const row = await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [pin]);
205
+ return new Map([
206
+ [pin, readExecutionManifest(JSON.parse(text(row, "manifest")))],
207
+ ]);
208
+ }
@@ -0,0 +1,21 @@
1
+ import type { AuthorityState } from "../authority/reducer.ts";
2
+ import type { AdmissionResult, ExecutionManifest } from "../workflow-admission.ts";
3
+ export type Definitions = ReadonlyMap<string, ExecutionManifest>;
4
+ export type Admission = {
5
+ readonly kind: "admissible";
6
+ readonly definitions: Definitions;
7
+ } | {
8
+ readonly kind: "rejected";
9
+ readonly reason: string;
10
+ readonly detail?: string;
11
+ };
12
+ export declare function admitted(state: AuthorityState, request: {
13
+ readonly definitions: Definitions;
14
+ readonly command: unknown;
15
+ readonly manifest: ExecutionManifest | undefined;
16
+ }): Admission;
17
+ export declare function pinnedResumption(state: Pick<AuthorityState, "runs">, request: {
18
+ readonly definitions: Definitions;
19
+ readonly runId: string;
20
+ readonly available: ExecutionManifest;
21
+ }): AdmissionResult;
@@ -0,0 +1,70 @@
1
+ import { parseCommand } from "../authority/commands.js";
2
+ import { readExecutionManifest, resumePinned } from "../execution-pin.js";
3
+ import { effectInputDigest } from "./effect-restore.js";
4
+ import { workflowPin } from "./workflow-pin.js";
5
+ const admissible = { kind: "admissible", definitions: new Map() };
6
+ const terminal = ["completed", "failed", "cancelled"];
7
+ const unpinned = (_command, context) => context.manifest === undefined
8
+ ? admissible
9
+ : { kind: "rejected", reason: "unexpected-manifest" };
10
+ const admission = (command, context) => {
11
+ const { manifest } = context;
12
+ if (manifest === undefined)
13
+ return { kind: "rejected", reason: "missing-manifest" };
14
+ const stored = readExecutionManifest(manifest);
15
+ const pin = workflowPin(stored);
16
+ if (command.workflow !== pin)
17
+ return { kind: "rejected", reason: "workflow-pin-mismatch" };
18
+ const capabilities = JSON.stringify([...stored.capabilities].sort());
19
+ if ((command.capabilities ?? capabilities) !== capabilities)
20
+ return { kind: "rejected", reason: "capability-pin-mismatch" };
21
+ return { kind: "admissible", definitions: new Map([[pin, stored]]) };
22
+ };
23
+ const resumption = (command, context) => {
24
+ const { manifest, state, definitions } = context;
25
+ if (manifest === undefined)
26
+ return { kind: "rejected", reason: "missing-manifest" };
27
+ const resumed = pinnedResumption(state, {
28
+ definitions,
29
+ runId: command.runId,
30
+ available: manifest,
31
+ });
32
+ return resumed.kind === "rejected" && resumed.reason !== "unknown-run"
33
+ ? resumed
34
+ : admissible;
35
+ };
36
+ const effectRequest = (command, context) => {
37
+ const computed = effectInputDigest({
38
+ capability: String(command.capability),
39
+ method: String(command.method),
40
+ target: String(command.target),
41
+ payload: String(command.payload),
42
+ });
43
+ return computed === command.inputDigest
44
+ ? unpinned(command, context)
45
+ : { kind: "rejected", reason: "input-digest-mismatch" };
46
+ };
47
+ const rules = {
48
+ "request-effect": effectRequest,
49
+ "admit-run": admission,
50
+ "decide-gate": resumption,
51
+ "resume-run": resumption,
52
+ };
53
+ export function admitted(state, request) {
54
+ const { definitions, command, manifest } = request;
55
+ const parsed = parseCommand(command);
56
+ if (!parsed || state.commands[parsed.commandId])
57
+ return admissible;
58
+ const rule = rules[parsed.kind] ?? unpinned;
59
+ return rule(parsed, { manifest, state, definitions });
60
+ }
61
+ export function pinnedResumption(state, request) {
62
+ const { definitions, runId, available } = request;
63
+ const status = state.runs[runId]?.status ?? "";
64
+ const pinned = definitions.get(state.runs[runId]?.workflow ?? "");
65
+ if (!pinned)
66
+ return { kind: "rejected", reason: "unknown-run", detail: runId };
67
+ if (terminal.includes(status))
68
+ return { kind: "rejected", reason: "terminal-run", detail: runId };
69
+ return resumePinned(pinned, available);
70
+ }
@@ -0,0 +1,30 @@
1
+ import type { AuthorityEvent, AuthorityState, EffectIntent, RunState } from "../authority/reducer.ts";
2
+ import type { DecisionRows, DocumentRow } from "../storage/decision-rows.ts";
3
+ import type { EffectRows } from "../storage/effect-rows.ts";
4
+ import type { ProjectionSnapshot } from "../storage/decision-snapshots.ts";
5
+ import type { AuthoritySnapshot, EventRow } from "../storage/domain-rows.ts";
6
+ import type { ExecutionManifest } from "../workflow-admission.ts";
7
+ export type RestoredSnapshot = AuthoritySnapshot & Partial<DecisionRows> & {
8
+ readonly documents?: readonly DocumentRow[];
9
+ readonly effects?: EffectRows;
10
+ };
11
+ export type Restoration = {
12
+ readonly kind: "restored";
13
+ readonly state: AuthorityState;
14
+ readonly events: readonly AuthorityEvent[];
15
+ readonly definitions: ReadonlyMap<string, ExecutionManifest>;
16
+ } | {
17
+ readonly kind: "refused";
18
+ readonly reason: "invalid-history" | "projection-mismatch";
19
+ readonly detail: string;
20
+ };
21
+ export declare function restore(snapshot: RestoredSnapshot): Restoration;
22
+ export declare function storedDefinitions(snapshot: Pick<ProjectionSnapshot, "definitions">): ReadonlyMap<string, ExecutionManifest>;
23
+ type BaseState = Pick<AuthorityState, "sequence" | "runs" | "commands" | "intents">;
24
+ export type StoredState = Omit<AuthorityState, "effects">;
25
+ export declare function currentState(snapshot: ProjectionSnapshot): StoredState;
26
+ export declare function projectedState(snapshot: Pick<ProjectionSnapshot, "runs" | "commands" | "outbox" | "sequence">): BaseState;
27
+ export declare function intentKind(value: string): EffectIntent["kind"];
28
+ export declare function storedRun(row: AuthoritySnapshot["runs"][number]): RunState;
29
+ export declare function storedEvents(rows: readonly EventRow[]): readonly AuthorityEvent[];
30
+ export {};
@@ -0,0 +1,165 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { parseEvent } from "../authority/events.js";
3
+ import { rebuildHistory } from "../authority/history.js";
4
+ import { readExecutionManifest } from "../execution-pin.js";
5
+ import { decisionRows, decisionState, documentsIntact, referencedDigests, } from "./decision-restore.js";
6
+ import { effectChecks, effectDigests } from "./effect-restore.js";
7
+ import { workflowPin } from "./workflow-pin.js";
8
+ const statuses = [
9
+ "queued",
10
+ "running",
11
+ "waiting_gate",
12
+ "paused",
13
+ "completed",
14
+ "failed",
15
+ "cancelled",
16
+ ];
17
+ export function restore(snapshot) {
18
+ let events;
19
+ let history;
20
+ try {
21
+ events = storedEvents(snapshot.events);
22
+ history = rebuildHistory(events);
23
+ }
24
+ catch (error) {
25
+ return { kind: "refused", reason: "invalid-history", detail: text(error) };
26
+ }
27
+ let stored;
28
+ try {
29
+ stored = {
30
+ ...history.state,
31
+ ...projectedState({
32
+ ...snapshot,
33
+ sequence: snapshot.events.at(-1)?.sequence ?? 0,
34
+ }),
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ kind: "refused",
40
+ reason: "projection-mismatch",
41
+ detail: text(error),
42
+ };
43
+ }
44
+ const { state } = history;
45
+ const definitions = storedDefinitions(snapshot);
46
+ const checks = [
47
+ ...projectionParts.map((part) => [part, isDeepStrictEqual(stored[part], state[part])]),
48
+ ["outbox", isDeepStrictEqual(snapshot.outbox, history.outbox)],
49
+ [
50
+ "run-sequences",
51
+ isDeepStrictEqual(Object.fromEntries(snapshot.runs.map((row) => [row.runId, row.sequence])), history.runSequences),
52
+ ],
53
+ ["definitions", definitionsIntact(definitions, state)],
54
+ ...decisionChecks(snapshot, state),
55
+ ...(snapshot.effects === undefined
56
+ ? []
57
+ : effectChecks(snapshot.effects, {
58
+ effects: state.effects,
59
+ evidence: history.evidence,
60
+ })),
61
+ ];
62
+ const failed = checks.find(([, holds]) => !holds);
63
+ if (failed)
64
+ return {
65
+ kind: "refused",
66
+ reason: "projection-mismatch",
67
+ detail: failed[0],
68
+ };
69
+ return { kind: "restored", state, events, definitions };
70
+ }
71
+ function decisionChecks(snapshot, state) {
72
+ const { gates, details, documents } = snapshot;
73
+ if (gates === undefined || details === undefined || documents === undefined)
74
+ return [];
75
+ const expected = decisionRows(state);
76
+ return [
77
+ ["gates", isDeepStrictEqual(gates, expected.gates)],
78
+ ["details", isDeepStrictEqual(details, expected.details)],
79
+ [
80
+ "documents",
81
+ documentsIntact(documents, [
82
+ ...referencedDigests(state),
83
+ ...effectDigests(state.effects),
84
+ ]),
85
+ ],
86
+ ];
87
+ }
88
+ export function storedDefinitions(snapshot) {
89
+ return new Map(snapshot.definitions.map((row) => [
90
+ row.pin,
91
+ readExecutionManifest(parsed(row.manifest)),
92
+ ]));
93
+ }
94
+ function definitionsIntact(definitions, state) {
95
+ const used = new Set(Object.values(state.runs).map((run) => run.workflow));
96
+ return ([...definitions].every(([pin, manifest]) => workflowPin(manifest) === pin && used.has(pin)) && [...used].every((pin) => definitions.has(pin)));
97
+ }
98
+ const projectionParts = ["sequence", "runs", "commands", "intents"];
99
+ function text(error) {
100
+ return String(Reflect.get(Object(error), "message"));
101
+ }
102
+ export function currentState(snapshot) {
103
+ return { ...projectedState(snapshot), ...decisionState(snapshot) };
104
+ }
105
+ export function projectedState(snapshot) {
106
+ return {
107
+ sequence: snapshot.sequence,
108
+ runs: Object.fromEntries(snapshot.runs.map((row) => [row.runId, storedRun(row)])),
109
+ commands: Object.fromEntries(snapshot.commands.map((row) => [
110
+ row.commandId,
111
+ { request: row.request, sequence: row.sequence },
112
+ ])),
113
+ intents: snapshot.outbox
114
+ .filter((row) => row.releasedSequence === null)
115
+ .map((row) => ({
116
+ kind: intentKind(row.kind),
117
+ runId: row.runId,
118
+ operationId: row.operationId,
119
+ })),
120
+ };
121
+ }
122
+ const intentKinds = [
123
+ "start-run",
124
+ "continue-run",
125
+ "protected-effect",
126
+ ];
127
+ export function intentKind(value) {
128
+ const kind = intentKinds.find((candidate) => candidate === value);
129
+ if (!kind)
130
+ throw new Error("invalid-outbox-row");
131
+ return kind;
132
+ }
133
+ export function storedRun(row) {
134
+ const status = statuses.find((candidate) => candidate === row.status);
135
+ const pausedFrom = statuses.find((candidate) => candidate === row.pausedFrom);
136
+ const gates = JSON.parse(row.gates);
137
+ const unknownPause = row.pausedFrom !== null && pausedFrom === undefined;
138
+ if (!status || unknownPause || !Array.isArray(gates))
139
+ throw new Error("invalid-run-row");
140
+ return {
141
+ runId: row.runId,
142
+ status,
143
+ revision: row.revision,
144
+ workflow: row.workflow,
145
+ pausedFrom: pausedFrom ?? null,
146
+ gates: gates.map(String),
147
+ };
148
+ }
149
+ export function storedEvents(rows) {
150
+ return rows.map(storedEvent);
151
+ }
152
+ function storedEvent(row) {
153
+ const event = parseEvent({ ...row, payload: parsed(row.payload) });
154
+ if (!event)
155
+ throw new Error(`invalid-event-row: ${String(row.sequence)}`);
156
+ return event;
157
+ }
158
+ function parsed(value) {
159
+ try {
160
+ return JSON.parse(value);
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ }
@@ -0,0 +1,16 @@
1
+ import type { RunDetails } from "../authority/details.ts";
2
+ import { type GateState } from "../authority/gates.ts";
3
+ import type { AuthorityState } from "../authority/reducer.ts";
4
+ import type { DecisionRows, DetailRow, DocumentRow, GateRow } from "../storage/decision-rows.ts";
5
+ export type DecisionState = Pick<AuthorityState, "gates" | "details" | "questions">;
6
+ export declare function documentDigest(body: string): string;
7
+ export declare function gateRecord(gate: GateState): GateRow;
8
+ export declare function detailRecord(details: RunDetails): DetailRow;
9
+ export declare function storedGate(row: GateRow): GateState;
10
+ export declare function storedDetails(row: DetailRow): RunDetails;
11
+ export declare function decisionState(rows: DecisionRows & {
12
+ readonly questions?: number;
13
+ }): DecisionState;
14
+ export declare function decisionRows(state: DecisionState): DecisionRows;
15
+ export declare function referencedDigests(state: DecisionState): readonly string[];
16
+ export declare function documentsIntact(documents: readonly DocumentRow[], referenced: readonly string[]): boolean;
@@ -0,0 +1,158 @@
1
+ import { createHash } from "node:crypto";
2
+ import { continues, gateKey } from "../authority/gates.js";
3
+ import { gateContinuation } from "../authority/reduction.js";
4
+ const kinds = ["question", "approval", "untyped"];
5
+ const waits = ["registered", "pending"];
6
+ export function documentDigest(body) {
7
+ return `sha256:${createHash("sha256").update(body).digest("hex")}`;
8
+ }
9
+ export function gateRecord(gate) {
10
+ return {
11
+ runId: gate.runId,
12
+ gateId: gate.gateId,
13
+ kind: gate.kind,
14
+ label: gate.label,
15
+ subject: gate.subject,
16
+ prompt: gate.prompt,
17
+ expiresAt: gate.expiresAt,
18
+ generation: gate.generation,
19
+ revision: gate.revision,
20
+ wait: gate.wait,
21
+ decision: gate.outcome?.decision ?? null,
22
+ answer: gate.outcome?.answer ?? null,
23
+ decidedSequence: gate.outcome?.sequence ?? null,
24
+ openedSequence: gate.openedSequence,
25
+ continuation: continues(gate) ? gateContinuation(gate).operationId : null,
26
+ };
27
+ }
28
+ const unobserved = {
29
+ condition: null,
30
+ reason: null,
31
+ evidence: null,
32
+ retryAt: null,
33
+ attempt: null,
34
+ attemptLimit: null,
35
+ observedSequence: null,
36
+ observedAt: null,
37
+ observedOperation: null,
38
+ };
39
+ function observationColumns(observation) {
40
+ if (observation === null)
41
+ return unobserved;
42
+ return {
43
+ condition: observation.condition,
44
+ reason: observation.reason,
45
+ evidence: observation.evidence,
46
+ retryAt: observation.retryAt,
47
+ attempt: observation.attempt,
48
+ attemptLimit: observation.limit,
49
+ observedSequence: observation.sequence,
50
+ observedAt: observation.recordedAt,
51
+ observedOperation: observation.operationId,
52
+ };
53
+ }
54
+ export function detailRecord(details) {
55
+ return {
56
+ runId: details.runId,
57
+ generation: details.generation,
58
+ submission: details.submission,
59
+ input: details.input,
60
+ resolver: details.resolver,
61
+ ...observationColumns(details.observation),
62
+ };
63
+ }
64
+ export function storedGate(row) {
65
+ const kind = kinds.find((candidate) => candidate === row.kind);
66
+ const wait = waits.find((candidate) => candidate === row.wait);
67
+ if (!kind || !wait)
68
+ throw new Error("invalid-gate-row");
69
+ const { decidedSequence } = row;
70
+ return {
71
+ runId: row.runId,
72
+ gateId: row.gateId,
73
+ kind,
74
+ label: row.label,
75
+ subject: row.subject,
76
+ prompt: row.prompt,
77
+ expiresAt: row.expiresAt,
78
+ generation: row.generation,
79
+ revision: row.revision,
80
+ wait,
81
+ outcome: decidedSequence === null
82
+ ? null
83
+ : {
84
+ decision: row.decision,
85
+ answer: row.answer,
86
+ sequence: decidedSequence,
87
+ },
88
+ openedSequence: row.openedSequence,
89
+ };
90
+ }
91
+ function storedObservation(row) {
92
+ const { condition, reason, observedSequence, observedAt } = row;
93
+ if (condition === null ||
94
+ reason === null ||
95
+ observedSequence === null ||
96
+ observedAt === null)
97
+ return null;
98
+ return {
99
+ condition,
100
+ reason,
101
+ evidence: row.evidence,
102
+ retryAt: row.retryAt,
103
+ operationId: row.observedOperation,
104
+ attempt: row.attempt,
105
+ limit: row.attemptLimit,
106
+ sequence: observedSequence,
107
+ recordedAt: observedAt,
108
+ };
109
+ }
110
+ export function storedDetails(row) {
111
+ return {
112
+ runId: row.runId,
113
+ generation: row.generation,
114
+ submission: row.submission,
115
+ input: row.input,
116
+ resolver: row.resolver,
117
+ observation: storedObservation(row),
118
+ };
119
+ }
120
+ export function decisionState(rows) {
121
+ const highest = rows.gates.reduce((label, row) => Math.max(label, row.label ?? 0), 0);
122
+ return {
123
+ gates: Object.fromEntries(rows.gates.map((row) => [
124
+ gateKey(row.runId, row.gateId),
125
+ storedGate(row),
126
+ ])),
127
+ details: Object.fromEntries(rows.details.map((row) => [row.runId, storedDetails(row)])),
128
+ questions: rows.questions ?? highest,
129
+ };
130
+ }
131
+ export function decisionRows(state) {
132
+ return {
133
+ gates: Object.values(state.gates)
134
+ .map(gateRecord)
135
+ .sort((left, right) => left.openedSequence - right.openedSequence ||
136
+ (left.gateId < right.gateId ? -1 : 1)),
137
+ details: Object.values(state.details)
138
+ .map(detailRecord)
139
+ .sort((left, right) => (left.runId < right.runId ? -1 : 1)),
140
+ };
141
+ }
142
+ export function referencedDigests(state) {
143
+ return [
144
+ ...Object.values(state.gates).flatMap((gate) => [
145
+ gate.prompt,
146
+ gate.outcome?.answer ?? null,
147
+ ]),
148
+ ...Object.values(state.details).flatMap((details) => [
149
+ details.submission,
150
+ details.input,
151
+ ]),
152
+ ].filter((digest) => digest !== null);
153
+ }
154
+ export function documentsIntact(documents, referenced) {
155
+ const stored = new Set(documents.map((row) => row.digest));
156
+ return (documents.every((row) => documentDigest(row.body) === row.digest) &&
157
+ referenced.every((digest) => stored.has(digest)));
158
+ }
@@ -0,0 +1,3 @@
1
+ import type { Database } from "solid-objects";
2
+ import type { AuthorityState } from "../authority/reducer.ts";
3
+ export declare function upgradeDecisions(database: Database, state: AuthorityState): Promise<void>;