cloving 0.3.20 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +606 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +271 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +29 -0
  32. package/dist/src/authority/reconciliation.js +156 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +124 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +67 -0
  78. package/dist/src/broker/actor/authority-session.js +251 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/analysis-batches.d.ts +24 -0
  138. package/dist/src/chats/analysis-batches.js +83 -0
  139. package/dist/src/chats/analysis-contract.d.ts +80 -0
  140. package/dist/src/chats/analysis-contract.js +16 -0
  141. package/dist/src/chats/analysis-data.d.ts +3 -0
  142. package/dist/src/chats/analysis-data.js +85 -0
  143. package/dist/src/chats/analysis-input.d.ts +12 -0
  144. package/dist/src/chats/analysis-input.js +83 -0
  145. package/dist/src/chats/analysis-links.d.ts +2 -0
  146. package/dist/src/chats/analysis-links.js +25 -0
  147. package/dist/src/chats/analysis-prompt.d.ts +10 -0
  148. package/dist/src/chats/analysis-prompt.js +16 -0
  149. package/dist/src/chats/analysis-proposal.d.ts +2 -0
  150. package/dist/src/chats/analysis-proposal.js +32 -0
  151. package/dist/src/chats/analysis-provenance.d.ts +4 -0
  152. package/dist/src/chats/analysis-provenance.js +99 -0
  153. package/dist/src/chats/analysis-shape.d.ts +3 -0
  154. package/dist/src/chats/analysis-shape.js +228 -0
  155. package/dist/src/chats/analysis.d.ts +3 -0
  156. package/dist/src/chats/analysis.js +42 -0
  157. package/dist/src/chats/corpus-input.d.ts +5 -0
  158. package/dist/src/chats/corpus-input.js +288 -0
  159. package/dist/src/chats/destination.d.ts +4 -0
  160. package/dist/src/chats/destination.js +96 -0
  161. package/dist/src/chats/import.d.ts +15 -0
  162. package/dist/src/chats/import.js +243 -0
  163. package/dist/src/chats/input-file.d.ts +3 -0
  164. package/dist/src/chats/input-file.js +32 -0
  165. package/dist/src/chats/normalize.d.ts +29 -0
  166. package/dist/src/chats/normalize.js +155 -0
  167. package/dist/src/chats/previous-import.d.ts +5 -0
  168. package/dist/src/chats/previous-import.js +34 -0
  169. package/dist/src/chats/reader.d.ts +21 -0
  170. package/dist/src/chats/reader.js +118 -0
  171. package/dist/src/chats/redact-import.d.ts +14 -0
  172. package/dist/src/chats/redact-import.js +141 -0
  173. package/dist/src/chats/redaction.d.ts +41 -0
  174. package/dist/src/chats/redaction.js +161 -0
  175. package/dist/src/chats/revision-input.d.ts +3 -0
  176. package/dist/src/chats/revision-input.js +180 -0
  177. package/dist/src/chats/revision.d.ts +48 -0
  178. package/dist/src/chats/revision.js +94 -0
  179. package/dist/src/chats/selection.d.ts +25 -0
  180. package/dist/src/chats/selection.js +109 -0
  181. package/dist/src/chats/source.d.ts +23 -0
  182. package/dist/src/chats/source.js +135 -0
  183. package/dist/src/chats/structure.d.ts +57 -0
  184. package/dist/src/chats/structure.js +216 -0
  185. package/dist/src/cli/arguments.d.ts +31 -0
  186. package/dist/src/cli/arguments.js +235 -0
  187. package/dist/src/cli/client.d.ts +16 -0
  188. package/dist/src/cli/client.js +159 -0
  189. package/dist/src/cli/commands.d.ts +17 -0
  190. package/dist/src/cli/commands.js +271 -0
  191. package/dist/src/cli/main.d.ts +2 -0
  192. package/dist/src/cli/main.js +127 -0
  193. package/dist/src/cli/render.d.ts +10 -0
  194. package/dist/src/cli/render.js +254 -0
  195. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  196. package/dist/src/cli/runtime-arguments.js +248 -0
  197. package/dist/src/cli/runtime-directory.d.ts +4 -0
  198. package/dist/src/cli/runtime-directory.js +25 -0
  199. package/dist/src/cli/toolchain.d.ts +3 -0
  200. package/dist/src/cli/toolchain.js +74 -0
  201. package/dist/src/cli/usage-render.d.ts +3 -0
  202. package/dist/src/cli/usage-render.js +28 -0
  203. package/dist/src/cli/usage.d.ts +5 -0
  204. package/dist/src/cli/usage.js +156 -0
  205. package/dist/src/cli/validate.d.ts +38 -0
  206. package/dist/src/cli/validate.js +116 -0
  207. package/dist/src/cli/watch-actions.d.ts +10 -0
  208. package/dist/src/cli/watch-actions.js +58 -0
  209. package/dist/src/cli/watch-board-view.d.ts +54 -0
  210. package/dist/src/cli/watch-board-view.js +201 -0
  211. package/dist/src/cli/watch-board.d.ts +15 -0
  212. package/dist/src/cli/watch-board.js +179 -0
  213. package/dist/src/cli/watch-card-client.d.ts +1 -0
  214. package/dist/src/cli/watch-card-client.js +44 -0
  215. package/dist/src/cli/watch-card-forms.d.ts +2 -0
  216. package/dist/src/cli/watch-card-forms.js +33 -0
  217. package/dist/src/cli/watch-card-reply.d.ts +5 -0
  218. package/dist/src/cli/watch-card-reply.js +34 -0
  219. package/dist/src/cli/watch-card-view.d.ts +40 -0
  220. package/dist/src/cli/watch-card-view.js +86 -0
  221. package/dist/src/cli/watch-client.d.ts +1 -0
  222. package/dist/src/cli/watch-client.js +118 -0
  223. package/dist/src/cli/watch-element.d.ts +11 -0
  224. package/dist/src/cli/watch-element.js +6 -0
  225. package/dist/src/cli/watch-model.d.ts +29 -0
  226. package/dist/src/cli/watch-model.js +278 -0
  227. package/dist/src/cli/watch-navigation.d.ts +9 -0
  228. package/dist/src/cli/watch-navigation.js +40 -0
  229. package/dist/src/cli/watch-page.d.ts +1 -0
  230. package/dist/src/cli/watch-page.js +258 -0
  231. package/dist/src/cli/watch-paths.d.ts +2 -0
  232. package/dist/src/cli/watch-paths.js +52 -0
  233. package/dist/src/cli/watch-phases.d.ts +7 -0
  234. package/dist/src/cli/watch-phases.js +148 -0
  235. package/dist/src/cli/watch-pr-board.d.ts +3 -0
  236. package/dist/src/cli/watch-pr-board.js +26 -0
  237. package/dist/src/cli/watch-pr-command.d.ts +15 -0
  238. package/dist/src/cli/watch-pr-command.js +37 -0
  239. package/dist/src/cli/watch-pr-identity.d.ts +20 -0
  240. package/dist/src/cli/watch-pr-identity.js +62 -0
  241. package/dist/src/cli/watch-pr-observer.d.ts +19 -0
  242. package/dist/src/cli/watch-pr-observer.js +108 -0
  243. package/dist/src/cli/watch-pr-settings.d.ts +8 -0
  244. package/dist/src/cli/watch-pr-settings.js +47 -0
  245. package/dist/src/cli/watch-reads.d.ts +28 -0
  246. package/dist/src/cli/watch-reads.js +248 -0
  247. package/dist/src/cli/watch-render.d.ts +153 -0
  248. package/dist/src/cli/watch-render.js +102 -0
  249. package/dist/src/cli/watch-run-input.d.ts +14 -0
  250. package/dist/src/cli/watch-run-input.js +49 -0
  251. package/dist/src/cli/watch-server.d.ts +13 -0
  252. package/dist/src/cli/watch-server.js +214 -0
  253. package/dist/src/cli/watch-start-view.d.ts +18 -0
  254. package/dist/src/cli/watch-start-view.js +77 -0
  255. package/dist/src/cli/watch-stream.d.ts +11 -0
  256. package/dist/src/cli/watch-stream.js +128 -0
  257. package/dist/src/cli/watch-turn.d.ts +30 -0
  258. package/dist/src/cli/watch-turn.js +135 -0
  259. package/dist/src/cli/watch-usage.d.ts +6 -0
  260. package/dist/src/cli/watch-usage.js +65 -0
  261. package/dist/src/cli/watch-view.d.ts +54 -0
  262. package/dist/src/cli/watch-view.js +267 -0
  263. package/dist/src/cli.d.ts +2 -0
  264. package/dist/src/cli.js +104 -0
  265. package/dist/src/daemon/analysis-launch.d.ts +5 -0
  266. package/dist/src/daemon/analysis-launch.js +81 -0
  267. package/dist/src/daemon/analysis-token.d.ts +6 -0
  268. package/dist/src/daemon/analysis-token.js +88 -0
  269. package/dist/src/daemon/analysis-worker.d.ts +22 -0
  270. package/dist/src/daemon/analysis-worker.js +219 -0
  271. package/dist/src/daemon/chats-files.d.ts +15 -0
  272. package/dist/src/daemon/chats-files.js +113 -0
  273. package/dist/src/daemon/chats-worker.d.ts +12 -0
  274. package/dist/src/daemon/chats-worker.js +200 -0
  275. package/dist/src/daemon/claude-turn.d.ts +38 -0
  276. package/dist/src/daemon/claude-turn.js +216 -0
  277. package/dist/src/daemon/claude-worker.d.ts +29 -0
  278. package/dist/src/daemon/claude-worker.js +276 -0
  279. package/dist/src/daemon/codex-stream.d.ts +4 -0
  280. package/dist/src/daemon/codex-stream.js +129 -0
  281. package/dist/src/daemon/daemon.d.ts +49 -0
  282. package/dist/src/daemon/daemon.js +195 -0
  283. package/dist/src/daemon/delivery-router.d.ts +10 -0
  284. package/dist/src/daemon/delivery-router.js +34 -0
  285. package/dist/src/daemon/github-calls.d.ts +29 -0
  286. package/dist/src/daemon/github-calls.js +127 -0
  287. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  288. package/dist/src/daemon/github-issue-methods.js +99 -0
  289. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  290. package/dist/src/daemon/github-issue-privacy.js +131 -0
  291. package/dist/src/daemon/github-merge.d.ts +18 -0
  292. package/dist/src/daemon/github-merge.js +259 -0
  293. package/dist/src/daemon/github-methods.d.ts +5 -0
  294. package/dist/src/daemon/github-methods.js +202 -0
  295. package/dist/src/daemon/github-operation.d.ts +38 -0
  296. package/dist/src/daemon/github-operation.js +57 -0
  297. package/dist/src/daemon/github-ticket-status.d.ts +3 -0
  298. package/dist/src/daemon/github-ticket-status.js +268 -0
  299. package/dist/src/daemon/github-worker.d.ts +17 -0
  300. package/dist/src/daemon/github-worker.js +281 -0
  301. package/dist/src/daemon/host-environment.d.ts +8 -0
  302. package/dist/src/daemon/host-environment.js +14 -0
  303. package/dist/src/daemon/issue-queue.d.ts +10 -0
  304. package/dist/src/daemon/issue-queue.js +254 -0
  305. package/dist/src/daemon/notify-message.d.ts +14 -0
  306. package/dist/src/daemon/notify-message.js +48 -0
  307. package/dist/src/daemon/notify.d.ts +12 -0
  308. package/dist/src/daemon/notify.js +161 -0
  309. package/dist/src/daemon/operation-journal.d.ts +43 -0
  310. package/dist/src/daemon/operation-journal.js +55 -0
  311. package/dist/src/daemon/retrying-turn.d.ts +9 -0
  312. package/dist/src/daemon/retrying-turn.js +185 -0
  313. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  314. package/dist/src/daemon/ticket-registration.js +177 -0
  315. package/dist/src/daemon/ticket-source.d.ts +17 -0
  316. package/dist/src/daemon/ticket-source.js +36 -0
  317. package/dist/src/daemon/work-tree.d.ts +26 -0
  318. package/dist/src/daemon/work-tree.js +206 -0
  319. package/dist/src/effect-authorization.d.ts +21 -0
  320. package/dist/src/effect-authorization.js +14 -0
  321. package/dist/src/execution-pin.d.ts +4 -0
  322. package/dist/src/execution-pin.js +68 -0
  323. package/dist/src/host/start-delivery.d.ts +41 -0
  324. package/dist/src/host/start-delivery.js +68 -0
  325. package/dist/src/host/step-bridge-host.d.ts +79 -0
  326. package/dist/src/host/step-bridge-host.js +205 -0
  327. package/dist/src/host/step-claims.d.ts +31 -0
  328. package/dist/src/host/step-claims.js +85 -0
  329. package/dist/src/host/world-host.d.ts +21 -0
  330. package/dist/src/host/world-host.js +51 -0
  331. package/dist/src/host/world-reconciliation.d.ts +39 -0
  332. package/dist/src/host/world-reconciliation.js +81 -0
  333. package/dist/src/host/world-runs.d.ts +14 -0
  334. package/dist/src/host/world-runs.js +69 -0
  335. package/dist/src/operation-identity.d.ts +7 -0
  336. package/dist/src/operation-identity.js +59 -0
  337. package/dist/src/protocol.d.ts +35 -0
  338. package/dist/src/protocol.js +64 -0
  339. package/dist/src/resource-files.d.ts +1 -0
  340. package/dist/src/resource-files.js +29 -0
  341. package/dist/src/service/changes.d.ts +11 -0
  342. package/dist/src/service/changes.js +32 -0
  343. package/dist/src/service/decision-handler.d.ts +9 -0
  344. package/dist/src/service/decision-handler.js +233 -0
  345. package/dist/src/service/event-handler.d.ts +10 -0
  346. package/dist/src/service/event-handler.js +70 -0
  347. package/dist/src/service/expiry.d.ts +13 -0
  348. package/dist/src/service/expiry.js +53 -0
  349. package/dist/src/service/gateway.d.ts +21 -0
  350. package/dist/src/service/gateway.js +120 -0
  351. package/dist/src/service/registry.d.ts +40 -0
  352. package/dist/src/service/registry.js +13 -0
  353. package/dist/src/service/replies.d.ts +26 -0
  354. package/dist/src/service/replies.js +56 -0
  355. package/dist/src/service/run-handlers.d.ts +4 -0
  356. package/dist/src/service/run-handlers.js +263 -0
  357. package/dist/src/service/service.d.ts +58 -0
  358. package/dist/src/service/service.js +212 -0
  359. package/dist/src/service/submission-handler.d.ts +4 -0
  360. package/dist/src/service/submission-handler.js +206 -0
  361. package/dist/src/service/transport.d.ts +16 -0
  362. package/dist/src/service/transport.js +141 -0
  363. package/dist/src/service/worker-port.d.ts +85 -0
  364. package/dist/src/service/worker-port.js +126 -0
  365. package/dist/src/service/worker-totals.d.ts +3 -0
  366. package/dist/src/service/worker-totals.js +28 -0
  367. package/dist/src/step-bridge.d.ts +57 -0
  368. package/dist/src/step-bridge.js +4 -0
  369. package/dist/src/steps/decision-gate.d.ts +2 -0
  370. package/dist/src/steps/decision-gate.js +8 -0
  371. package/dist/src/steps/load-cycle.d.ts +10 -0
  372. package/dist/src/steps/load-cycle.js +11 -0
  373. package/dist/src/steps/protected-effect.d.ts +2 -0
  374. package/dist/src/steps/protected-effect.js +8 -0
  375. package/dist/src/storage/decision-rows.d.ts +54 -0
  376. package/dist/src/storage/decision-rows.js +72 -0
  377. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  378. package/dist/src/storage/decision-snapshots.js +25 -0
  379. package/dist/src/storage/domain-changes.d.ts +48 -0
  380. package/dist/src/storage/domain-changes.js +213 -0
  381. package/dist/src/storage/domain-rows.d.ts +85 -0
  382. package/dist/src/storage/domain-rows.js +129 -0
  383. package/dist/src/storage/domain-schema.d.ts +32 -0
  384. package/dist/src/storage/domain-schema.js +193 -0
  385. package/dist/src/storage/effect-changes.d.ts +5 -0
  386. package/dist/src/storage/effect-changes.js +105 -0
  387. package/dist/src/storage/effect-rows.d.ts +67 -0
  388. package/dist/src/storage/effect-rows.js +74 -0
  389. package/dist/src/storage/effect-schema.d.ts +1 -0
  390. package/dist/src/storage/effect-schema.js +59 -0
  391. package/dist/src/storage/statements.d.ts +9 -0
  392. package/dist/src/storage/statements.js +8 -0
  393. package/dist/src/submission.d.ts +42 -0
  394. package/dist/src/submission.js +71 -0
  395. package/dist/src/ticket-status.d.ts +8 -0
  396. package/dist/src/ticket-status.js +45 -0
  397. package/dist/src/token-prices.d.ts +19 -0
  398. package/dist/src/token-prices.js +76 -0
  399. package/dist/src/turn-profile.d.ts +13 -0
  400. package/dist/src/turn-profile.js +100 -0
  401. package/dist/src/worker-usage.d.ts +22 -0
  402. package/dist/src/worker-usage.js +44 -0
  403. package/dist/src/workflow-admission.d.ts +45 -0
  404. package/dist/src/workflow-admission.js +151 -0
  405. package/dist/src/workflow-candidate.d.ts +29 -0
  406. package/dist/src/workflow-candidate.js +59 -0
  407. package/dist/src/workflow-contracts.d.ts +29 -0
  408. package/dist/src/workflow-contracts.js +110 -0
  409. package/dist/src/workflow-declaration.d.ts +11 -0
  410. package/dist/src/workflow-declaration.js +59 -0
  411. package/dist/src/workflow-resources.d.ts +8 -0
  412. package/dist/src/workflow-resources.js +14 -0
  413. package/dist/src/workflows.d.ts +6 -0
  414. package/dist/src/workflows.js +4 -0
  415. package/dist/tools/compile-workflows.d.ts +1 -0
  416. package/dist/tools/compile-workflows.js +33 -0
  417. package/dist/tools/self-host-processes.d.ts +10 -0
  418. package/dist/tools/self-host-processes.js +156 -0
  419. package/dist/tools/self-host-workflows.d.ts +15 -0
  420. package/dist/tools/self-host-workflows.js +78 -0
  421. package/dist/tools/self-host.d.ts +1 -0
  422. package/dist/tools/self-host.js +261 -0
  423. package/dist/tools/self-update-host.d.ts +13 -0
  424. package/dist/tools/self-update-host.js +88 -0
  425. package/dist/tools/self-update.d.ts +11 -0
  426. package/dist/tools/self-update.js +177 -0
  427. package/dist/tools/workflow-manifest.d.ts +3 -0
  428. package/dist/tools/workflow-manifest.js +34 -0
  429. package/dist/workflows/analyze-chats.d.ts +10 -0
  430. package/dist/workflows/analyze-chats.declaration.json +9 -0
  431. package/dist/workflows/analyze-chats.js +73 -0
  432. package/dist/workflows/develop-prd.d.ts +7 -0
  433. package/dist/workflows/develop-prd.js +97 -0
  434. package/dist/workflows/develop-ticket.d.ts +9 -0
  435. package/dist/workflows/develop-ticket.js +202 -0
  436. package/dist/workflows/issue-labels.d.ts +16 -0
  437. package/dist/workflows/issue-labels.js +70 -0
  438. package/dist/workflows/ticket-prompts.d.ts +35 -0
  439. package/dist/workflows/ticket-prompts.js +133 -0
  440. package/package.json +84 -75
  441. package/dist/abstract_gpt/index.js +0 -55
  442. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  443. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  444. package/dist/cloving_gpt/adapters/claude.js +0 -128
  445. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  446. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  447. package/dist/cloving_gpt/adapters/index.js +0 -2
  448. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  449. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  450. package/dist/cloving_gpt/adapters/openai.js +0 -100
  451. package/dist/cloving_gpt/index.js +0 -192
  452. package/dist/commands/analyze.js +0 -47
  453. package/dist/commands/chat.js +0 -14
  454. package/dist/commands/check.js +0 -7
  455. package/dist/commands/commit.js +0 -44
  456. package/dist/commands/config.js +0 -167
  457. package/dist/commands/describe.js +0 -235
  458. package/dist/commands/generate/code.js +0 -21
  459. package/dist/commands/generate/commit.js +0 -11
  460. package/dist/commands/generate/context.js +0 -82
  461. package/dist/commands/generate/docs.js +0 -11
  462. package/dist/commands/generate/documentation.js +0 -11
  463. package/dist/commands/generate/fizzbuzz.js +0 -35
  464. package/dist/commands/generate/init.js +0 -15
  465. package/dist/commands/generate/review.js +0 -11
  466. package/dist/commands/generate/sh.js +0 -95
  467. package/dist/commands/generate/shell.js +0 -11
  468. package/dist/commands/generate/unit_tests.js +0 -11
  469. package/dist/commands/init.js +0 -13
  470. package/dist/commands/models.js +0 -22
  471. package/dist/commands/project/build.js +0 -88
  472. package/dist/commands/project/complete.js +0 -12
  473. package/dist/commands/project/init.js +0 -82
  474. package/dist/commands/project/plan.js +0 -108
  475. package/dist/commands/proxy.js +0 -11
  476. package/dist/commands/review.js +0 -50
  477. package/dist/commands/tokens.js +0 -75
  478. package/dist/commands/unit_tests.js +0 -150
  479. package/dist/commands/update.js +0 -7
  480. package/dist/file2.js +0 -4
  481. package/dist/index.js +0 -136
  482. package/dist/managers/BlockManager.js +0 -120
  483. package/dist/managers/ChatManager.js +0 -653
  484. package/dist/managers/ChunkManager.js +0 -32
  485. package/dist/managers/CodeManager.js +0 -185
  486. package/dist/managers/CommitManager.js +0 -78
  487. package/dist/managers/DocsManager.js +0 -88
  488. package/dist/managers/DocumentationManager.js +0 -114
  489. package/dist/managers/InitManager.js +0 -230
  490. package/dist/managers/ProxyManager.js +0 -210
  491. package/dist/managers/ReviewManager.js +0 -131
  492. package/dist/managers/ShellManager.js +0 -163
  493. package/dist/managers/StreamManager.js +0 -308
  494. package/dist/managers/UnitTestManager.js +0 -243
  495. package/dist/managers/src/managers/ProxyManager.js +0 -1
  496. package/dist/newfile.js +0 -2
  497. package/dist/package.json +0 -86
  498. package/dist/utils/command_utils.js +0 -384
  499. package/dist/utils/config_utils.js +0 -249
  500. package/dist/utils/gitUtils.js +0 -42
  501. package/dist/utils/git_utils.js +0 -217
  502. package/dist/utils/modelUtils.js +0 -7
  503. package/dist/utils/model_utils.js +0 -7
  504. package/dist/utils/prompt_utils.js +0 -333
  505. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  506. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  507. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  508. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  509. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  510. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  511. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  512. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  513. package/dist/utils/prompts/index.js +0 -27
  514. package/dist/utils/string_utils.js +0 -505
  515. package/dist/utils/types.js +0 -2
@@ -0,0 +1,80 @@
1
+ import { isIdentifier } from "../../authority/commands.js";
2
+ function unknown(reason) {
3
+ return { kind: "unknown", reason };
4
+ }
5
+ const malformed = unknown("invalid-adapter-reply");
6
+ function field(value, name) {
7
+ return Reflect.get(Object(value), name);
8
+ }
9
+ function accepted(reply) {
10
+ const receipt = field(reply, "receipt");
11
+ const worker = field(reply, "worker");
12
+ if (!isIdentifier(receipt) || !isIdentifier(worker))
13
+ return malformed;
14
+ return { kind: "accepted", receipt, worker };
15
+ }
16
+ function optionalIdentifier(value) {
17
+ if (value === undefined || value === null)
18
+ return null;
19
+ return isIdentifier(value) ? value : undefined;
20
+ }
21
+ function identity(reply) {
22
+ const receipt = optionalIdentifier(field(reply, "receipt"));
23
+ const worker = optionalIdentifier(field(reply, "worker"));
24
+ if (receipt === undefined || worker === undefined)
25
+ return undefined;
26
+ return { receipt, worker };
27
+ }
28
+ function completed(reply, resultBytes) {
29
+ const result = field(reply, "result");
30
+ const given = identity(reply);
31
+ if (typeof result !== "string" || given?.receipt == null)
32
+ return malformed;
33
+ const { receipt, worker } = given;
34
+ const large = Buffer.byteLength(result) > resultBytes;
35
+ return {
36
+ kind: "completed",
37
+ receipt,
38
+ worker,
39
+ result: large ? null : result,
40
+ reason: large ? "result-too-large" : null,
41
+ };
42
+ }
43
+ function failed(reply, resultBytes) {
44
+ const reason = field(reply, "reason");
45
+ const result = field(reply, "result");
46
+ const given = identity(reply);
47
+ if (!isIdentifier(reason) || given === undefined)
48
+ return malformed;
49
+ const kept = typeof result === "string" && Buffer.byteLength(result) <= resultBytes;
50
+ return { kind: "failed", ...given, reason, ...(kept ? { result } : {}) };
51
+ }
52
+ function stopped(reply) {
53
+ const given = identity(reply);
54
+ return given === undefined ? malformed : { kind: "stopped", ...given };
55
+ }
56
+ const mappings = {
57
+ absent: () => ({ kind: "absent" }),
58
+ accepted,
59
+ completed,
60
+ failed,
61
+ stopped,
62
+ unknown: () => unknown("adapter-unknown"),
63
+ };
64
+ const failures = {
65
+ thrown: unknown("adapter-failure"),
66
+ overdue: unknown("time-limit"),
67
+ };
68
+ function mappingOf(reply) {
69
+ const kind = field(reply, "kind");
70
+ if (kind === undefined)
71
+ return accepted;
72
+ const known = typeof kind === "string" && Object.hasOwn(mappings, kind);
73
+ return known ? mappings[kind] : undefined;
74
+ }
75
+ export function settlement(result, resultBytes) {
76
+ if (result.kind !== "replied")
77
+ return failures[result.kind];
78
+ const mapping = mappingOf(result.reply);
79
+ return mapping === undefined ? malformed : mapping(result.reply, resultBytes);
80
+ }
@@ -0,0 +1,25 @@
1
+ import { Actor, type ActorClass, type Database, type JsonObject } from "solid-objects";
2
+ import type { PlanSettings } from "./authority-settings.ts";
3
+ export declare const deliverEffect = "cloving.deliver";
4
+ export declare const persistAction = "cloving.persist";
5
+ export interface ActorParts {
6
+ readonly reader: Database;
7
+ readonly effects: PlanSettings;
8
+ readonly clock: () => string;
9
+ readonly failed: (delivery: {
10
+ readonly operationId: string;
11
+ readonly effectId: string;
12
+ }) => number;
13
+ }
14
+ export declare function authorityActor(parts: ActorParts): AuthorityActorClass;
15
+ export type AuthorityActorClass = ActorClass<Actor & {
16
+ sequence: number;
17
+ epoch: number;
18
+ beginEpoch: () => JsonObject;
19
+ execute: (request: JsonObject) => Promise<JsonObject>;
20
+ adopt: () => Promise<JsonObject>;
21
+ recover: () => Promise<JsonObject>;
22
+ deliveryCompleted: (payload: JsonObject) => Promise<JsonObject>;
23
+ deliveryFailed: (payload: JsonObject) => Promise<JsonObject>;
24
+ }>;
25
+ export declare function checkedRequest(given: JsonObject): JsonObject | undefined;
@@ -0,0 +1,169 @@
1
+ import { Actor, broadcastValue, } from "solid-objects";
2
+ import { optionalInteger, text } from "../../storage/domain-rows.js";
3
+ import { parseCommand } from "../../authority/commands.js";
4
+ import { readExecutionManifest } from "../../execution-pin.js";
5
+ import { documentDigest } from "../decision-restore.js";
6
+ import { planAdoption, planCommand, planDelivery, planRecovery, } from "./turn-plan.js";
7
+ import { json, textList } from "./authority-receipts.js";
8
+ import { completedOutcome, thrownOutcome, } from "./delivery-results.js";
9
+ import { adoptionTurn, commandTurn, deliveryTurn, recoverableIntents, recoveryTurn, stopRecoveries, } from "./turn-state.js";
10
+ export const deliverEffect = "cloving.deliver";
11
+ export const persistAction = "cloving.persist";
12
+ export function authorityActor(parts) {
13
+ const { reader } = parts;
14
+ return class ClovingAuthority extends Actor {
15
+ static actorType = "ClovingAuthority";
16
+ static stateVersion = 1;
17
+ sequence = 0;
18
+ epoch = 0;
19
+ observables() {
20
+ return { sequence: broadcastValue(this.sequence) };
21
+ }
22
+ beginEpoch() {
23
+ this.epoch += 1;
24
+ return { epoch: this.epoch, sequence: this.sequence };
25
+ }
26
+ execute(request) {
27
+ return executeCommand(this, { parts, request });
28
+ }
29
+ async adopt() {
30
+ return applyPlan(this, planAdoption(await reader.connection(adoptionTurn)));
31
+ }
32
+ recover() {
33
+ return recoverTurn(this, parts);
34
+ }
35
+ deliveryCompleted(payload) {
36
+ return settleDelivery(this, {
37
+ parts,
38
+ outcome: completedOutcome(payload, present(this, parts)),
39
+ });
40
+ }
41
+ deliveryFailed(payload) {
42
+ return settleDelivery(this, {
43
+ parts,
44
+ outcome: thrownOutcome(payload, present(this, parts)),
45
+ });
46
+ }
47
+ };
48
+ }
49
+ async function recoverTurn(actor, parts) {
50
+ const scope = { sequence: actor.sequence, capacity: parts.effects.capacity };
51
+ return applyPlan(actor, planRecovery({
52
+ ...(await parts.reader.connection(async (connection) => ({
53
+ intents: [
54
+ ...(await recoverableIntents(connection)),
55
+ ...(await stopRecoveries(connection, {
56
+ capacity: parts.effects.capacity,
57
+ stopLimit: parts.effects.stopLimit,
58
+ stopSupported: parts.effects.stopSupported,
59
+ })),
60
+ ],
61
+ turn: await recoveryTurn(connection, scope),
62
+ }))),
63
+ effects: parts.effects,
64
+ recordedAt: parts.clock(),
65
+ }));
66
+ }
67
+ async function executeCommand(actor, input) {
68
+ const { parts, request } = input;
69
+ const turn = await parts.reader.connection((connection) => commandTurn(connection, {
70
+ command: request["command"],
71
+ sequence: actor.sequence,
72
+ capacity: parts.effects.capacity,
73
+ }));
74
+ return applyPlan(actor, planCommand({
75
+ turn,
76
+ request: turnRequest(request),
77
+ epoch: actor.epoch,
78
+ effects: parts.effects,
79
+ }));
80
+ }
81
+ async function settleDelivery(actor, input) {
82
+ const { parts, outcome } = input;
83
+ const found = await parts.reader.connection((connection) => deliveryTurn(connection, {
84
+ effectId: outcome.effectId,
85
+ sequence: actor.sequence,
86
+ capacity: parts.effects.capacity,
87
+ }));
88
+ if (found?.delivery.outcome !== null ||
89
+ found.delivery.operationId !== outcome.operationId ||
90
+ found.delivery.inputDigest !== outcome.inputDigest)
91
+ actor.reject("stale_callback", {
92
+ message: "the callback does not match an open delivery",
93
+ });
94
+ return applyPlan(actor, planDelivery({
95
+ turn: found.turn,
96
+ delivery: {
97
+ ...outcome,
98
+ runId: found.runId,
99
+ intent: found.intent,
100
+ leaseGeneration: found.leaseGeneration,
101
+ purpose: found.purpose,
102
+ attempts: failures(parts, outcome),
103
+ },
104
+ epoch: actor.epoch,
105
+ effects: parts.effects,
106
+ }));
107
+ }
108
+ function failures(parts, outcome) {
109
+ return outcome.outcome === "thrown" ? parts.failed(outcome) : 0;
110
+ }
111
+ function applyPlan(actor, plan) {
112
+ if (plan.kind === "answer")
113
+ return json(plan.receipt);
114
+ const staged = plan.stage.map((intent) => ({
115
+ effect_id: actor.emit(deliverEffect, {
116
+ arguments: { ...intent },
117
+ onSuccess: "deliveryCompleted",
118
+ onFailure: "deliveryFailed",
119
+ }).id,
120
+ operation_id: intent.operationId,
121
+ input_digest: intent.inputDigest,
122
+ purpose: intent.purpose,
123
+ lease_generation: intent.leaseGeneration ?? null,
124
+ authority_epoch: actor.epoch,
125
+ }));
126
+ actor.commitAction(persistAction, { ...plan.change, staged });
127
+ actor.sequence = plan.change.sequence;
128
+ return json(plan.receipt);
129
+ }
130
+ function present(actor, parts) {
131
+ return { epoch: actor.epoch, recordedAt: parts.clock() };
132
+ }
133
+ export function checkedRequest(given) {
134
+ const bodies = textList(given["documents"]);
135
+ if (bodies === undefined || parseCommand(given["command"]) === null)
136
+ return undefined;
137
+ const documents = bodies.map((body) => ({
138
+ digest: documentDigest(body),
139
+ body,
140
+ }));
141
+ try {
142
+ const request = turnRequest({ ...given, documents });
143
+ return json({
144
+ ...request,
145
+ manifest: request.manifest ?? null,
146
+ epoch: request.epoch ?? null,
147
+ });
148
+ }
149
+ catch {
150
+ return undefined;
151
+ }
152
+ }
153
+ function turnRequest(request) {
154
+ const manifest = request["manifest"];
155
+ const epoch = optionalInteger(request, "epoch");
156
+ const documents = request["documents"];
157
+ return {
158
+ command: request["command"],
159
+ recordedAt: text(request, "recordedAt"),
160
+ documents: (Array.isArray(documents) ? documents : []).map((document) => ({
161
+ digest: text(document, "digest"),
162
+ body: text(document, "body"),
163
+ })),
164
+ ...(manifest === undefined || manifest === null
165
+ ? {}
166
+ : { manifest: readExecutionManifest(manifest) }),
167
+ ...(epoch === null ? {} : { epoch }),
168
+ };
169
+ }
@@ -0,0 +1,31 @@
1
+ export type SequenceListener = (sequence: number) => void;
2
+ interface Envelope {
3
+ readonly kind: string;
4
+ readonly observables?: Readonly<Record<string, unknown>>;
5
+ }
6
+ export interface Realtime {
7
+ connect(options: {
8
+ readonly authorizationContext: unknown;
9
+ readonly send: (envelope: Envelope) => void;
10
+ }): {
11
+ receive(request: unknown): Promise<void>;
12
+ close(): void;
13
+ };
14
+ }
15
+ export interface SequenceSource {
16
+ readonly realtime: Realtime;
17
+ readonly broker: object;
18
+ readonly actorType: string;
19
+ readonly actorId: string;
20
+ }
21
+ export declare function sequenceChanges(source: SequenceSource, listener: SequenceListener): () => void;
22
+ export declare function sequenceSubscriber(source: Pick<SequenceSource, "realtime" | "broker">): (actorId: string, listener: SequenceListener) => () => void;
23
+ export interface SequenceChanges {
24
+ readonly subscribe: (listener: SequenceListener) => () => void;
25
+ }
26
+ export interface Subscriptions {
27
+ readonly add: (listener: SequenceListener) => () => void;
28
+ readonly close: () => void;
29
+ }
30
+ export declare function subscriptions(subscribe: (listener: SequenceListener) => () => void): Subscriptions;
31
+ export {};
@@ -0,0 +1,46 @@
1
+ export function sequenceChanges(source, listener) {
2
+ let last = -1;
3
+ const session = source.realtime.connect({
4
+ authorizationContext: source.broker,
5
+ send: (envelope) => {
6
+ const sequence = envelope.observables?.["sequence"];
7
+ if (typeof sequence !== "number" || sequence <= last)
8
+ return;
9
+ last = sequence;
10
+ listener(sequence);
11
+ },
12
+ });
13
+ const request = {
14
+ version: 1,
15
+ action: "subscribe",
16
+ actorType: source.actorType,
17
+ actorId: source.actorId,
18
+ };
19
+ session.receive(request).then(undefined, () => {
20
+ session.close();
21
+ });
22
+ return () => {
23
+ session.close();
24
+ };
25
+ }
26
+ export function sequenceSubscriber(source) {
27
+ return (actorId, listener) => sequenceChanges({ ...source, actorType: "ClovingAuthority", actorId }, listener);
28
+ }
29
+ export function subscriptions(subscribe) {
30
+ const open = new Set();
31
+ return {
32
+ add: (listener) => {
33
+ const close = subscribe(listener);
34
+ open.add(close);
35
+ return () => {
36
+ open.delete(close);
37
+ close();
38
+ };
39
+ },
40
+ close: () => {
41
+ for (const close of open)
42
+ close();
43
+ open.clear();
44
+ },
45
+ };
46
+ }
@@ -0,0 +1,15 @@
1
+ import type { Database } from "solid-objects";
2
+ export declare const contentionMilliseconds = 250;
3
+ export interface ConnectionSettings {
4
+ readonly schemaVersion: number;
5
+ readonly journalMode: string;
6
+ readonly synchronous: number;
7
+ readonly foreignKeys: number;
8
+ readonly lockingMode: string;
9
+ readonly busyTimeoutMilliseconds: number;
10
+ }
11
+ export declare function lockExclusively(database: Database): Promise<void>;
12
+ export declare function takeOwnership(database: Database): Promise<void>;
13
+ export declare function observeSettings(database: Database): Promise<ConnectionSettings>;
14
+ export declare function requiredSettingsViolation(settings: ConnectionSettings): string | null;
15
+ export declare function lockContention(error: unknown): boolean;
@@ -0,0 +1,44 @@
1
+ import { integer, text } from "../../storage/domain-rows.js";
2
+ export const contentionMilliseconds = 250;
3
+ const required = {
4
+ journalMode: "wal",
5
+ synchronous: 2,
6
+ foreignKeys: 1,
7
+ lockingMode: "exclusive",
8
+ busyTimeoutMilliseconds: contentionMilliseconds,
9
+ };
10
+ export async function lockExclusively(database) {
11
+ await database.connection(async (connection) => {
12
+ await connection.run("PRAGMA locking_mode = EXCLUSIVE");
13
+ });
14
+ }
15
+ export async function takeOwnership(database) {
16
+ await database.connection(async (connection) => {
17
+ await connection.run("PRAGMA journal_mode = WAL");
18
+ await connection.run("PRAGMA synchronous = FULL");
19
+ await connection.run("PRAGMA foreign_keys = ON");
20
+ });
21
+ await database.transaction(() => Promise.resolve());
22
+ }
23
+ export function observeSettings(database) {
24
+ return database.connection(async (connection) => {
25
+ const pragma = async (name) => connection.get(`PRAGMA ${name}`);
26
+ return {
27
+ schemaVersion: integer(await pragma("user_version"), "user_version"),
28
+ journalMode: text(await pragma("journal_mode"), "journal_mode"),
29
+ synchronous: integer(await pragma("synchronous"), "synchronous"),
30
+ foreignKeys: integer(await pragma("foreign_keys"), "foreign_keys"),
31
+ lockingMode: text(await pragma("locking_mode"), "locking_mode"),
32
+ busyTimeoutMilliseconds: integer(await pragma("busy_timeout"), "timeout"),
33
+ };
34
+ });
35
+ }
36
+ export function requiredSettingsViolation(settings) {
37
+ const key = Object.keys(required).find((name) => Reflect.get(settings, name) !== Reflect.get(required, name));
38
+ return key === undefined
39
+ ? null
40
+ : `${key}=${String(Reflect.get(settings, key))}`;
41
+ }
42
+ export function lockContention(error) {
43
+ return (Number(Reflect.get(Object(error), "errcode")) & 0xff) === 5;
44
+ }
@@ -0,0 +1,10 @@
1
+ import { type AuthorityOptions, type Refusal } from "./authority-runtime.ts";
2
+ export interface ConversionOptions extends Pick<AuthorityOptions, "instrumentation" | "timing"> {
3
+ readonly progress?: (step: string) => void;
4
+ }
5
+ export type Conversion = {
6
+ readonly kind: "converted";
7
+ readonly sequence: number;
8
+ readonly staged: number;
9
+ } | Refusal;
10
+ export declare function convertAuthority(directory: string, options?: ConversionOptions): Promise<Conversion>;
@@ -0,0 +1,72 @@
1
+ import { integer, latestSequence, loadBaseline, } from "../../storage/domain-rows.js";
2
+ import { adoptSchema, authorityIdentity } from "../../storage/domain-schema.js";
3
+ import { restore } from "../authority-restore.js";
4
+ import { upgradeSteps } from "./authority-upgrades.js";
5
+ import { ownedRuntime, recoverDeliveries, refused, } from "./authority-runtime.js";
6
+ const adoptionKey = "cloving-adoption";
7
+ export async function convertAuthority(directory, options = {}) {
8
+ const owned = await ownedRuntime(directory, {
9
+ ...(options.instrumentation === undefined
10
+ ? {}
11
+ : { instrumentation: options.instrumentation }),
12
+ ...(options.timing === undefined ? {} : { timing: options.timing }),
13
+ });
14
+ if (owned.kind === "refused")
15
+ return owned;
16
+ let conversion;
17
+ try {
18
+ conversion = await converted(owned, options);
19
+ }
20
+ catch (error) {
21
+ conversion = refused("storage-failure", error);
22
+ }
23
+ await owned.parts.stop();
24
+ return conversion;
25
+ }
26
+ async function converted(owned, options) {
27
+ const { database, schema } = owned;
28
+ const progress = options.progress ?? (() => undefined);
29
+ if (schema.kind === "new")
30
+ return { kind: "refused", reason: "nothing-to-convert", detail: "0" };
31
+ const restored = restore(await database.connection(loadBaseline));
32
+ if (restored.kind === "refused")
33
+ return restored;
34
+ progress("baseline-validated");
35
+ if (schema.kind === "baseline") {
36
+ await database.transaction((connection) => adoptSchema(connection, restored.state.sequence));
37
+ progress("schema-adopted");
38
+ }
39
+ const from = schema.kind === "baseline" ? "adopted" : schema.kind;
40
+ for (const step of upgradeSteps(from)) {
41
+ const stored = restore(await database.connection(step.load));
42
+ if (stored.kind === "refused")
43
+ return stored;
44
+ await step.apply(database, stored.state);
45
+ }
46
+ if (schema.kind !== "current")
47
+ progress("schema-upgraded");
48
+ const identity = await database.connection(authorityIdentity);
49
+ if (identity.pendingAdoption === null)
50
+ return {
51
+ kind: "converted",
52
+ sequence: await database.connection(latestSequence),
53
+ staged: 0,
54
+ };
55
+ return adopted({
56
+ parts: owned.parts,
57
+ actorId: identity.actorId,
58
+ progress: options.progress,
59
+ });
60
+ }
61
+ async function adopted(adoption) {
62
+ const { parts, actorId, progress } = adoption;
63
+ await parts.runtime.install();
64
+ await parts.releaseEarlierOwners();
65
+ progress?.("library-installed");
66
+ const result = await parts.invoker(actorId, adoptionKey).adopt();
67
+ return {
68
+ kind: "converted",
69
+ sequence: integer(result, "sequence"),
70
+ staged: await recoverDeliveries(parts.invoker(actorId)),
71
+ };
72
+ }
@@ -0,0 +1,13 @@
1
+ import type { Database, EffectContext, JsonObject } from "solid-objects";
2
+ import { type AvailableManifest, type Delivery } from "./delivery-intents.ts";
3
+ import type { EffectSettings } from "./authority-settings.ts";
4
+ export type { AdapterOutcome, AvailableManifest, Delivery, DeliveryIntent, Reconciliation, } from "./delivery-intents.ts";
5
+ export interface DeliveryParts {
6
+ readonly reader: Database;
7
+ readonly delivery: Delivery | undefined;
8
+ readonly epoch: () => number;
9
+ readonly clock: () => string;
10
+ readonly available: AvailableManifest | undefined;
11
+ readonly effects: EffectSettings;
12
+ }
13
+ export declare function deliveryHandler(parts: DeliveryParts): (argumentsValue: JsonObject, context: EffectContext) => Promise<JsonObject>;
@@ -0,0 +1,162 @@
1
+ import { isIdentifier } from "../../authority/commands.js";
2
+ import { optionalInteger, optionalText, text, } from "../../storage/domain-rows.js";
3
+ import { intentKind } from "../authority-restore.js";
4
+ import { intentDigest, } from "./delivery-intents.js";
5
+ import { adapterCalls, } from "./adapter-calls.js";
6
+ import { deliverEffect, protectedArguments } from "./effect-delivery.js";
7
+ import { pinned } from "./pin-check.js";
8
+ const eligibleStatus = {
9
+ "start-run": "queued",
10
+ "continue-run": "running",
11
+ };
12
+ function admission(parts, attempt) {
13
+ const { intent, effectId } = attempt;
14
+ return parts.reader.connection(async (connection) => {
15
+ const row = await connection.get("SELECT d.outcome, d.input_digest, o.released_sequence, r.status, r.workflow FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [effectId, intent.operationId]);
16
+ if (!current(row, intent))
17
+ return "stale";
18
+ if (!eligible(row, intent))
19
+ return "withheld";
20
+ const admitted = await pinned(connection, {
21
+ workflow: intent.workflow,
22
+ available: parts.available,
23
+ });
24
+ return admitted ? "sent" : "blocked";
25
+ });
26
+ }
27
+ async function called(attempt, name) {
28
+ const { intent, delivery, calls } = attempt;
29
+ const result = await calls.call(intent.operationId, (signal) => delivery[name](intent, signal));
30
+ if (result.kind === "replied")
31
+ return result.reply;
32
+ throw new Error(result.kind === "thrown" ? result.message : "adapter-time-limit");
33
+ }
34
+ const confirmations = ["stopped", "completed", "failed"];
35
+ function observation(result) {
36
+ if (result.kind !== "replied")
37
+ return { kind: "unknown" };
38
+ const kind = Reflect.get(Object(result.reply), "kind");
39
+ const receipt = Reflect.get(Object(result.reply), "receipt");
40
+ if (typeof kind === "string" && confirmations.includes(kind))
41
+ return { kind: "stopped" };
42
+ if (kind === "absent")
43
+ return { kind: "absent" };
44
+ return kind === "accepted" && isIdentifier(receipt)
45
+ ? { kind: "sent", receipt }
46
+ : { kind: "unknown" };
47
+ }
48
+ async function observed(attempt, name) {
49
+ const { intent, delivery, calls } = attempt;
50
+ const call = delivery[name]?.bind(delivery);
51
+ if (call === undefined)
52
+ return { kind: "unknown" };
53
+ return observation(await calls.call(intent.operationId, (signal) => call(intent, signal)));
54
+ }
55
+ async function observeRun(parts, attempt) {
56
+ const { intent, effectId } = attempt;
57
+ const open = await parts.reader.connection(async (connection) => current(await connection.get("SELECT d.outcome, d.input_digest, r.workflow FROM deliveries d JOIN outbox o ON o.operation_id = d.operation_id JOIN runs r ON r.run_id = o.run_id WHERE d.effect_id = ? AND d.operation_id = ?", [effectId, intent.operationId]), intent));
58
+ const result = open ? await requested(attempt) : { kind: "withheld" };
59
+ return {
60
+ receipt: null,
61
+ ...result,
62
+ epoch: parts.epoch(),
63
+ recordedAt: parts.clock(),
64
+ };
65
+ }
66
+ async function requested(attempt) {
67
+ if (attempt.intent.purpose !== "stop")
68
+ return observed(attempt, "reconcile");
69
+ const stopped = await observed(attempt, "stop");
70
+ return stopped.kind === "stopped" ? stopped : observed(attempt, "reconcile");
71
+ }
72
+ async function deliverRun(parts, attempt) {
73
+ if (attempt.intent.purpose !== "dispatch")
74
+ return observeRun(parts, attempt);
75
+ const first = await admission(parts, attempt);
76
+ const settled = { epoch: parts.epoch(), recordedAt: parts.clock() };
77
+ const unsent = (kind) => ({
78
+ kind: kind === "stale" ? "withheld" : kind,
79
+ receipt: null,
80
+ ...settled,
81
+ });
82
+ if (first === "stale")
83
+ return unsent(first);
84
+ const known = acceptedReceipt(await called(attempt, "reconcile"));
85
+ if (known !== undefined)
86
+ return { kind: "sent", receipt: known, ...settled };
87
+ if (first !== "sent")
88
+ return unsent(first);
89
+ const second = await admission(parts, attempt);
90
+ if (second !== "sent")
91
+ return unsent(second);
92
+ const receipt = sentReceipt(await called(attempt, "deliver"));
93
+ return { kind: "sent", receipt, ...settled };
94
+ }
95
+ export function deliveryHandler(parts) {
96
+ const calls = adapterCalls(parts.effects.adapterMilliseconds);
97
+ return async (argumentsValue, context) => {
98
+ const { delivery } = parts;
99
+ if (delivery === undefined)
100
+ throw new Error("delivery-unconfigured");
101
+ const intent = argumentsIntent(argumentsValue);
102
+ if (intent.kind !== "protected-effect")
103
+ return deliverRun(parts, {
104
+ intent,
105
+ effectId: context.id,
106
+ delivery,
107
+ calls,
108
+ });
109
+ return deliverEffect({ ...parts, delivery, calls }, {
110
+ intent: { ...intent, ...protectedArguments(argumentsValue) },
111
+ effectId: context.id,
112
+ });
113
+ };
114
+ }
115
+ function acceptedReceipt(value) {
116
+ const kind = Reflect.get(Object(value), "kind");
117
+ if (kind === "absent")
118
+ return undefined;
119
+ const receipt = Reflect.get(Object(value), "receipt");
120
+ if (kind !== "accepted" || !isIdentifier(receipt))
121
+ throw new Error("invalid-reconciliation");
122
+ return receipt;
123
+ }
124
+ function sentReceipt(value) {
125
+ const receipt = Reflect.get(Object(value), "receipt");
126
+ if (!isIdentifier(receipt))
127
+ throw new Error("invalid-delivery-receipt");
128
+ return receipt;
129
+ }
130
+ function current(row, intent) {
131
+ return (row !== undefined &&
132
+ Reflect.get(Object(row), "outcome") === null &&
133
+ text(row, "input_digest") === intent.inputDigest &&
134
+ intentDigest(intent) === intent.inputDigest &&
135
+ text(row, "workflow") === intent.workflow);
136
+ }
137
+ function eligible(row, intent) {
138
+ return (optionalInteger(row, "released_sequence") === null &&
139
+ text(row, "status") === eligibleStatus[intent.kind]);
140
+ }
141
+ const purposes = ["reconcile", "stop"];
142
+ function purposeOf(value) {
143
+ return purposes.find((purpose) => purpose === value) ?? "dispatch";
144
+ }
145
+ function argumentsIntent(value) {
146
+ const base = {
147
+ kind: intentKind(text(value, "kind")),
148
+ runId: text(value, "runId"),
149
+ operationId: text(value, "operationId"),
150
+ workflow: text(value, "workflow"),
151
+ inputDigest: text(value, "inputDigest"),
152
+ purpose: purposeOf(value["purpose"]),
153
+ };
154
+ if (value["gateId"] === undefined)
155
+ return base;
156
+ return {
157
+ ...base,
158
+ gateId: text(value, "gateId"),
159
+ decision: text(value, "decision"),
160
+ answer: optionalText(value, "answer"),
161
+ };
162
+ }
@@ -0,0 +1,2 @@
1
+ import type { Logger } from "solid-objects";
2
+ export declare function lineLogger(write: (text: string) => void): Logger;