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,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>;