cloving 0.3.19 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +475 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +263 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +27 -0
  32. package/dist/src/authority/reconciliation.js +147 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +122 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +65 -0
  78. package/dist/src/broker/actor/authority-session.js +252 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/destination.d.ts +4 -0
  138. package/dist/src/chats/destination.js +94 -0
  139. package/dist/src/chats/import.d.ts +13 -0
  140. package/dist/src/chats/import.js +71 -0
  141. package/dist/src/chats/normalize.d.ts +20 -0
  142. package/dist/src/chats/normalize.js +139 -0
  143. package/dist/src/chats/reader.d.ts +15 -0
  144. package/dist/src/chats/reader.js +87 -0
  145. package/dist/src/cli/arguments.d.ts +23 -0
  146. package/dist/src/cli/arguments.js +154 -0
  147. package/dist/src/cli/client.d.ts +15 -0
  148. package/dist/src/cli/client.js +122 -0
  149. package/dist/src/cli/commands.d.ts +14 -0
  150. package/dist/src/cli/commands.js +253 -0
  151. package/dist/src/cli/main.d.ts +1 -0
  152. package/dist/src/cli/main.js +80 -0
  153. package/dist/src/cli/render.d.ts +8 -0
  154. package/dist/src/cli/render.js +186 -0
  155. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  156. package/dist/src/cli/runtime-arguments.js +248 -0
  157. package/dist/src/cli/runtime-directory.d.ts +4 -0
  158. package/dist/src/cli/runtime-directory.js +25 -0
  159. package/dist/src/cli/toolchain.d.ts +3 -0
  160. package/dist/src/cli/toolchain.js +74 -0
  161. package/dist/src/cli/usage.d.ts +4 -0
  162. package/dist/src/cli/usage.js +124 -0
  163. package/dist/src/cli/validate.d.ts +38 -0
  164. package/dist/src/cli/validate.js +116 -0
  165. package/dist/src/cli/watch-board-view.d.ts +22 -0
  166. package/dist/src/cli/watch-board-view.js +128 -0
  167. package/dist/src/cli/watch-board.d.ts +15 -0
  168. package/dist/src/cli/watch-board.js +174 -0
  169. package/dist/src/cli/watch-element.d.ts +11 -0
  170. package/dist/src/cli/watch-element.js +6 -0
  171. package/dist/src/cli/watch-model.d.ts +29 -0
  172. package/dist/src/cli/watch-model.js +261 -0
  173. package/dist/src/cli/watch-navigation.d.ts +9 -0
  174. package/dist/src/cli/watch-navigation.js +40 -0
  175. package/dist/src/cli/watch-page.d.ts +1 -0
  176. package/dist/src/cli/watch-page.js +272 -0
  177. package/dist/src/cli/watch-paths.d.ts +2 -0
  178. package/dist/src/cli/watch-paths.js +52 -0
  179. package/dist/src/cli/watch-phases.d.ts +7 -0
  180. package/dist/src/cli/watch-phases.js +148 -0
  181. package/dist/src/cli/watch-reads.d.ts +28 -0
  182. package/dist/src/cli/watch-reads.js +244 -0
  183. package/dist/src/cli/watch-render.d.ts +139 -0
  184. package/dist/src/cli/watch-render.js +95 -0
  185. package/dist/src/cli/watch-server.d.ts +10 -0
  186. package/dist/src/cli/watch-server.js +176 -0
  187. package/dist/src/cli/watch-stream.d.ts +11 -0
  188. package/dist/src/cli/watch-stream.js +128 -0
  189. package/dist/src/cli/watch-turn.d.ts +29 -0
  190. package/dist/src/cli/watch-turn.js +130 -0
  191. package/dist/src/cli/watch-view.d.ts +39 -0
  192. package/dist/src/cli/watch-view.js +223 -0
  193. package/dist/src/cli.d.ts +2 -0
  194. package/dist/src/cli.js +62 -0
  195. package/dist/src/daemon/claude-turn.d.ts +28 -0
  196. package/dist/src/daemon/claude-turn.js +135 -0
  197. package/dist/src/daemon/claude-worker.d.ts +26 -0
  198. package/dist/src/daemon/claude-worker.js +224 -0
  199. package/dist/src/daemon/codex-stream.d.ts +4 -0
  200. package/dist/src/daemon/codex-stream.js +113 -0
  201. package/dist/src/daemon/daemon.d.ts +46 -0
  202. package/dist/src/daemon/daemon.js +186 -0
  203. package/dist/src/daemon/delivery-router.d.ts +10 -0
  204. package/dist/src/daemon/delivery-router.js +34 -0
  205. package/dist/src/daemon/github-calls.d.ts +29 -0
  206. package/dist/src/daemon/github-calls.js +127 -0
  207. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  208. package/dist/src/daemon/github-issue-methods.js +99 -0
  209. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  210. package/dist/src/daemon/github-issue-privacy.js +131 -0
  211. package/dist/src/daemon/github-merge.d.ts +18 -0
  212. package/dist/src/daemon/github-merge.js +259 -0
  213. package/dist/src/daemon/github-methods.d.ts +5 -0
  214. package/dist/src/daemon/github-methods.js +198 -0
  215. package/dist/src/daemon/github-operation.d.ts +38 -0
  216. package/dist/src/daemon/github-operation.js +57 -0
  217. package/dist/src/daemon/github-worker.d.ts +17 -0
  218. package/dist/src/daemon/github-worker.js +281 -0
  219. package/dist/src/daemon/host-environment.d.ts +8 -0
  220. package/dist/src/daemon/host-environment.js +14 -0
  221. package/dist/src/daemon/issue-queue.d.ts +9 -0
  222. package/dist/src/daemon/issue-queue.js +163 -0
  223. package/dist/src/daemon/notify-message.d.ts +14 -0
  224. package/dist/src/daemon/notify-message.js +48 -0
  225. package/dist/src/daemon/notify.d.ts +12 -0
  226. package/dist/src/daemon/notify.js +161 -0
  227. package/dist/src/daemon/operation-journal.d.ts +42 -0
  228. package/dist/src/daemon/operation-journal.js +53 -0
  229. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  230. package/dist/src/daemon/ticket-registration.js +177 -0
  231. package/dist/src/daemon/ticket-source.d.ts +17 -0
  232. package/dist/src/daemon/ticket-source.js +36 -0
  233. package/dist/src/daemon/work-tree.d.ts +26 -0
  234. package/dist/src/daemon/work-tree.js +206 -0
  235. package/dist/src/effect-authorization.d.ts +21 -0
  236. package/dist/src/effect-authorization.js +14 -0
  237. package/dist/src/execution-pin.d.ts +4 -0
  238. package/dist/src/execution-pin.js +68 -0
  239. package/dist/src/host/start-delivery.d.ts +41 -0
  240. package/dist/src/host/start-delivery.js +68 -0
  241. package/dist/src/host/step-bridge-host.d.ts +79 -0
  242. package/dist/src/host/step-bridge-host.js +205 -0
  243. package/dist/src/host/step-claims.d.ts +31 -0
  244. package/dist/src/host/step-claims.js +85 -0
  245. package/dist/src/host/world-host.d.ts +21 -0
  246. package/dist/src/host/world-host.js +51 -0
  247. package/dist/src/host/world-reconciliation.d.ts +37 -0
  248. package/dist/src/host/world-reconciliation.js +75 -0
  249. package/dist/src/host/world-runs.d.ts +14 -0
  250. package/dist/src/host/world-runs.js +61 -0
  251. package/dist/src/operation-identity.d.ts +7 -0
  252. package/dist/src/operation-identity.js +59 -0
  253. package/dist/src/protocol.d.ts +35 -0
  254. package/dist/src/protocol.js +64 -0
  255. package/dist/src/resource-files.d.ts +1 -0
  256. package/dist/src/resource-files.js +29 -0
  257. package/dist/src/service/changes.d.ts +11 -0
  258. package/dist/src/service/changes.js +32 -0
  259. package/dist/src/service/decision-handler.d.ts +9 -0
  260. package/dist/src/service/decision-handler.js +233 -0
  261. package/dist/src/service/event-handler.d.ts +10 -0
  262. package/dist/src/service/event-handler.js +70 -0
  263. package/dist/src/service/expiry.d.ts +13 -0
  264. package/dist/src/service/expiry.js +53 -0
  265. package/dist/src/service/gateway.d.ts +21 -0
  266. package/dist/src/service/gateway.js +120 -0
  267. package/dist/src/service/registry.d.ts +40 -0
  268. package/dist/src/service/registry.js +13 -0
  269. package/dist/src/service/replies.d.ts +26 -0
  270. package/dist/src/service/replies.js +56 -0
  271. package/dist/src/service/run-handlers.d.ts +4 -0
  272. package/dist/src/service/run-handlers.js +271 -0
  273. package/dist/src/service/service.d.ts +58 -0
  274. package/dist/src/service/service.js +212 -0
  275. package/dist/src/service/submission-handler.d.ts +4 -0
  276. package/dist/src/service/submission-handler.js +206 -0
  277. package/dist/src/service/transport.d.ts +16 -0
  278. package/dist/src/service/transport.js +141 -0
  279. package/dist/src/service/worker-port.d.ts +85 -0
  280. package/dist/src/service/worker-port.js +126 -0
  281. package/dist/src/step-bridge.d.ts +57 -0
  282. package/dist/src/step-bridge.js +4 -0
  283. package/dist/src/steps/decision-gate.d.ts +2 -0
  284. package/dist/src/steps/decision-gate.js +8 -0
  285. package/dist/src/steps/load-cycle.d.ts +10 -0
  286. package/dist/src/steps/load-cycle.js +11 -0
  287. package/dist/src/steps/protected-effect.d.ts +2 -0
  288. package/dist/src/steps/protected-effect.js +8 -0
  289. package/dist/src/storage/decision-rows.d.ts +54 -0
  290. package/dist/src/storage/decision-rows.js +72 -0
  291. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  292. package/dist/src/storage/decision-snapshots.js +25 -0
  293. package/dist/src/storage/domain-changes.d.ts +48 -0
  294. package/dist/src/storage/domain-changes.js +213 -0
  295. package/dist/src/storage/domain-rows.d.ts +85 -0
  296. package/dist/src/storage/domain-rows.js +129 -0
  297. package/dist/src/storage/domain-schema.d.ts +32 -0
  298. package/dist/src/storage/domain-schema.js +193 -0
  299. package/dist/src/storage/effect-changes.d.ts +5 -0
  300. package/dist/src/storage/effect-changes.js +105 -0
  301. package/dist/src/storage/effect-rows.d.ts +67 -0
  302. package/dist/src/storage/effect-rows.js +74 -0
  303. package/dist/src/storage/effect-schema.d.ts +1 -0
  304. package/dist/src/storage/effect-schema.js +59 -0
  305. package/dist/src/storage/statements.d.ts +9 -0
  306. package/dist/src/storage/statements.js +8 -0
  307. package/dist/src/submission.d.ts +42 -0
  308. package/dist/src/submission.js +71 -0
  309. package/dist/src/turn-profile.d.ts +13 -0
  310. package/dist/src/turn-profile.js +100 -0
  311. package/dist/src/workflow-admission.d.ts +45 -0
  312. package/dist/src/workflow-admission.js +151 -0
  313. package/dist/src/workflow-contracts.d.ts +27 -0
  314. package/dist/src/workflow-contracts.js +88 -0
  315. package/dist/src/workflow-declaration.d.ts +11 -0
  316. package/dist/src/workflow-declaration.js +57 -0
  317. package/dist/src/workflow-resources.d.ts +8 -0
  318. package/dist/src/workflow-resources.js +14 -0
  319. package/dist/src/workflows.d.ts +5 -0
  320. package/dist/src/workflows.js +3 -0
  321. package/dist/tools/compile-workflows.d.ts +1 -0
  322. package/dist/tools/compile-workflows.js +33 -0
  323. package/dist/tools/self-host-processes.d.ts +10 -0
  324. package/dist/tools/self-host-processes.js +151 -0
  325. package/dist/tools/self-host-workflows.d.ts +15 -0
  326. package/dist/tools/self-host-workflows.js +78 -0
  327. package/dist/tools/self-host.d.ts +1 -0
  328. package/dist/tools/self-host.js +261 -0
  329. package/dist/tools/self-update-host.d.ts +6 -0
  330. package/dist/tools/self-update-host.js +41 -0
  331. package/dist/tools/self-update.d.ts +10 -0
  332. package/dist/tools/self-update.js +105 -0
  333. package/dist/tools/workflow-manifest.d.ts +3 -0
  334. package/dist/tools/workflow-manifest.js +34 -0
  335. package/dist/workflows/develop-prd.d.ts +7 -0
  336. package/dist/workflows/develop-prd.js +97 -0
  337. package/dist/workflows/develop-ticket.d.ts +15 -0
  338. package/dist/workflows/develop-ticket.js +301 -0
  339. package/dist/workflows/issue-labels.d.ts +14 -0
  340. package/dist/workflows/issue-labels.js +36 -0
  341. package/package.json +82 -75
  342. package/.DS_Store +0 -0
  343. package/.aider.chat.history.md +0 -16978
  344. package/.aider.input.history +0 -15
  345. package/.aider.tags.cache.v3/cache.db +0 -0
  346. package/.aider.tags.cache.v3/cache.db-shm +0 -0
  347. package/.aider.tags.cache.v3/cache.db-wal +0 -0
  348. package/.cursorrules +0 -77
  349. package/.github/workflows/auto-release.yml +0 -83
  350. package/.github/workflows/ci.yml +0 -32
  351. package/.github/workflows/npm-publish.yml +0 -34
  352. package/.gitignore +0 -67
  353. package/.husky/_/.gitignore +0 -1
  354. package/.husky/_/applypatch-msg +0 -2
  355. package/.husky/_/commit-msg +0 -2
  356. package/.husky/_/h +0 -22
  357. package/.husky/_/husky.sh +0 -9
  358. package/.husky/_/post-applypatch +0 -2
  359. package/.husky/_/post-checkout +0 -2
  360. package/.husky/_/post-commit +0 -2
  361. package/.husky/_/post-merge +0 -2
  362. package/.husky/_/post-rewrite +0 -2
  363. package/.husky/_/pre-applypatch +0 -2
  364. package/.husky/_/pre-auto-gc +0 -2
  365. package/.husky/_/pre-commit +0 -2
  366. package/.husky/_/pre-merge-commit +0 -2
  367. package/.husky/_/pre-push +0 -2
  368. package/.husky/_/pre-rebase +0 -2
  369. package/.husky/_/prepare-commit-msg +0 -2
  370. package/.husky/pre-commit +0 -1
  371. package/.husky/pre-push +0 -1
  372. package/.prettierrc.json +0 -7
  373. package/.tool-versions +0 -2
  374. package/SECURITY.md +0 -15
  375. package/cloving.json +0 -67
  376. package/dist/abstract_gpt/index.js +0 -55
  377. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  378. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  379. package/dist/cloving_gpt/adapters/claude.js +0 -128
  380. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  381. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  382. package/dist/cloving_gpt/adapters/index.js +0 -2
  383. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  384. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  385. package/dist/cloving_gpt/adapters/openai.js +0 -100
  386. package/dist/cloving_gpt/index.js +0 -192
  387. package/dist/commands/analyze.js +0 -47
  388. package/dist/commands/chat.js +0 -14
  389. package/dist/commands/check.js +0 -7
  390. package/dist/commands/commit.js +0 -44
  391. package/dist/commands/config.js +0 -167
  392. package/dist/commands/describe.js +0 -235
  393. package/dist/commands/generate/code.js +0 -21
  394. package/dist/commands/generate/commit.js +0 -11
  395. package/dist/commands/generate/context.js +0 -82
  396. package/dist/commands/generate/docs.js +0 -11
  397. package/dist/commands/generate/documentation.js +0 -11
  398. package/dist/commands/generate/fizzbuzz.js +0 -35
  399. package/dist/commands/generate/init.js +0 -15
  400. package/dist/commands/generate/review.js +0 -11
  401. package/dist/commands/generate/sh.js +0 -95
  402. package/dist/commands/generate/shell.js +0 -11
  403. package/dist/commands/generate/unit_tests.js +0 -11
  404. package/dist/commands/init.js +0 -13
  405. package/dist/commands/models.js +0 -22
  406. package/dist/commands/project/build.js +0 -88
  407. package/dist/commands/project/complete.js +0 -12
  408. package/dist/commands/project/init.js +0 -82
  409. package/dist/commands/project/plan.js +0 -108
  410. package/dist/commands/proxy.js +0 -11
  411. package/dist/commands/review.js +0 -50
  412. package/dist/commands/tokens.js +0 -75
  413. package/dist/commands/unit_tests.js +0 -150
  414. package/dist/commands/update.js +0 -7
  415. package/dist/file2.js +0 -4
  416. package/dist/index.js +0 -134
  417. package/dist/managers/BlockManager.js +0 -120
  418. package/dist/managers/ChatManager.js +0 -653
  419. package/dist/managers/ChunkManager.js +0 -32
  420. package/dist/managers/CodeManager.js +0 -185
  421. package/dist/managers/CommitManager.js +0 -64
  422. package/dist/managers/DocsManager.js +0 -88
  423. package/dist/managers/DocumentationManager.js +0 -114
  424. package/dist/managers/InitManager.js +0 -230
  425. package/dist/managers/ProxyManager.js +0 -210
  426. package/dist/managers/ReviewManager.js +0 -131
  427. package/dist/managers/ShellManager.js +0 -163
  428. package/dist/managers/StreamManager.js +0 -308
  429. package/dist/managers/UnitTestManager.js +0 -243
  430. package/dist/managers/src/managers/ProxyManager.js +0 -1
  431. package/dist/newfile.js +0 -2
  432. package/dist/package.json +0 -86
  433. package/dist/utils/command_utils.js +0 -384
  434. package/dist/utils/config_utils.js +0 -249
  435. package/dist/utils/gitUtils.js +0 -42
  436. package/dist/utils/git_utils.js +0 -217
  437. package/dist/utils/modelUtils.js +0 -7
  438. package/dist/utils/model_utils.js +0 -7
  439. package/dist/utils/prompt_utils.js +0 -333
  440. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  441. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  442. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  443. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  444. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  445. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  446. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  447. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  448. package/dist/utils/prompts/index.js +0 -27
  449. package/dist/utils/string_utils.js +0 -505
  450. package/dist/utils/types.js +0 -2
  451. package/jest.config.js +0 -11
  452. package/src/cloving_gpt/adapters/azureopenai.ts +0 -83
  453. package/src/cloving_gpt/adapters/claude.ts +0 -140
  454. package/src/cloving_gpt/adapters/gemini.ts +0 -146
  455. package/src/cloving_gpt/adapters/index.ts +0 -43
  456. package/src/cloving_gpt/adapters/mistral.ts +0 -142
  457. package/src/cloving_gpt/adapters/ollama.ts +0 -136
  458. package/src/cloving_gpt/adapters/openai.ts +0 -113
  459. package/src/cloving_gpt/index.ts +0 -229
  460. package/src/commands/chat.ts +0 -12
  461. package/src/commands/config.ts +0 -192
  462. package/src/commands/generate/code.ts +0 -18
  463. package/src/commands/generate/commit.ts +0 -9
  464. package/src/commands/generate/context.ts +0 -93
  465. package/src/commands/generate/docs.ts +0 -9
  466. package/src/commands/generate/review.ts +0 -9
  467. package/src/commands/generate/shell.ts +0 -9
  468. package/src/commands/generate/unit_tests.ts +0 -9
  469. package/src/commands/init.ts +0 -9
  470. package/src/commands/models.ts +0 -21
  471. package/src/commands/proxy.ts +0 -9
  472. package/src/commands/tokens.ts +0 -82
  473. package/src/index.ts +0 -197
  474. package/src/managers/BlockManager.ts +0 -126
  475. package/src/managers/ChatManager.ts +0 -755
  476. package/src/managers/ChunkManager.ts +0 -31
  477. package/src/managers/CodeManager.ts +0 -226
  478. package/src/managers/CommitManager.ts +0 -71
  479. package/src/managers/DocsManager.ts +0 -101
  480. package/src/managers/InitManager.ts +0 -263
  481. package/src/managers/ProxyManager.ts +0 -240
  482. package/src/managers/ReviewManager.ts +0 -154
  483. package/src/managers/ShellManager.ts +0 -172
  484. package/src/managers/StreamManager.ts +0 -353
  485. package/src/managers/UnitTestManager.ts +0 -293
  486. package/src/utils/config_utils.ts +0 -271
  487. package/src/utils/git_utils.ts +0 -230
  488. package/src/utils/model_utils.ts +0 -3
  489. package/src/utils/prompt_utils.ts +0 -375
  490. package/src/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  491. package/src/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  492. package/src/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  493. package/src/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  494. package/src/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  495. package/src/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  496. package/src/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  497. package/src/utils/prompts/SPECIAL_FILES.md +0 -66
  498. package/src/utils/prompts/index.ts +0 -37
  499. package/src/utils/string_utils.ts +0 -552
  500. package/src/utils/types.ts +0 -127
  501. package/tests/commands/generate/unit_tests.test.ts +0 -27
  502. package/tests/utils/git_utils.test.ts +0 -116
  503. package/tests/utils/model_utils.test.ts +0 -27
  504. package/tests/utils/prompt_utils.test.ts +0 -33
  505. package/tests/utils/string_utils.test.ts +0 -560
  506. package/tsconfig.json +0 -14
  507. package/yarn.lock +0 -5823
@@ -0,0 +1,19 @@
1
+ function line(level, entry) {
2
+ try {
3
+ return `${JSON.stringify({ level, ...entry })}\n`;
4
+ }
5
+ catch {
6
+ return `${JSON.stringify({ level, event: "unserializable-log-entry" })}\n`;
7
+ }
8
+ }
9
+ export function lineLogger(write) {
10
+ const level = (name) => (entry) => {
11
+ write(line(name, entry));
12
+ };
13
+ return {
14
+ debug: level("debug"),
15
+ info: level("info"),
16
+ warn: level("warn"),
17
+ error: level("error"),
18
+ };
19
+ }
@@ -0,0 +1,9 @@
1
+ import type { AdministrationAuthorizationInput, AuthorizationInput, SubscriptionAuthorizationInput } from "solid-objects";
2
+ export interface BrokerAuthorization {
3
+ readonly authorizeMessage: (input: AuthorizationInput) => boolean;
4
+ readonly authorizeQuery: (input: AuthorizationInput) => boolean;
5
+ readonly authorizeAdministration: (input: AdministrationAuthorizationInput) => boolean;
6
+ readonly authorizeDestroy: (input: object) => boolean;
7
+ readonly authorizeSubscription: (input: SubscriptionAuthorizationInput) => boolean;
8
+ }
9
+ export declare function brokerAuthorization(broker: object): BrokerAuthorization;
@@ -0,0 +1,11 @@
1
+ const brokerOperations = ["adopt", "beginEpoch", "execute", "recover"];
2
+ export function brokerAuthorization(broker) {
3
+ return {
4
+ authorizeMessage: (input) => input.authorizationContext === broker &&
5
+ brokerOperations.includes(input.operation),
6
+ authorizeQuery: () => false,
7
+ authorizeAdministration: (input) => input.authorizationContext === broker,
8
+ authorizeDestroy: () => false,
9
+ authorizeSubscription: (input) => input.authorizationContext === broker,
10
+ };
11
+ }
@@ -0,0 +1,45 @@
1
+ import type { Database } from "solid-objects";
2
+ import type { AuthorityCommand, AuthorityEvent } from "../../authority/transitions.ts";
3
+ import { type SqlConnection } from "../../storage/domain-rows.ts";
4
+ export interface CommandRecord {
5
+ readonly commandId: string;
6
+ readonly sequence: number;
7
+ readonly runId: string;
8
+ readonly recordedAt: string;
9
+ readonly commandDigest: string;
10
+ readonly command: AuthorityCommand;
11
+ }
12
+ export type PublishedEvent = Omit<AuthorityEvent, "request">;
13
+ export interface EventPage {
14
+ readonly events: readonly PublishedEvent[];
15
+ readonly earliest: number;
16
+ readonly latest: number;
17
+ }
18
+ export interface EventCursor {
19
+ readonly after: number;
20
+ readonly limit: number;
21
+ readonly runId?: string;
22
+ }
23
+ export interface Sequences {
24
+ readonly latest: number;
25
+ readonly runs: Readonly<Record<string, number>>;
26
+ readonly times: Readonly<Record<string, string>>;
27
+ }
28
+ export interface CompletionCursor {
29
+ readonly runId: string;
30
+ readonly atOrBefore: number;
31
+ }
32
+ export interface AuthorityQueries {
33
+ readonly document: (digest: string) => Promise<string | undefined>;
34
+ readonly receipt: (commandId: string) => Promise<CommandRecord | undefined>;
35
+ readonly eventsAfter: (cursor: EventCursor) => Promise<EventPage>;
36
+ readonly latestCompletion: (cursor: CompletionCursor) => Promise<PublishedEvent | undefined>;
37
+ readonly sequences: () => Promise<Sequences>;
38
+ readonly workflowIds: () => Promise<Readonly<Record<string, string>>>;
39
+ }
40
+ export type Read = <Value>(query: (connection: SqlConnection) => Promise<Value>) => Promise<Value>;
41
+ export declare function guardedRead(access: {
42
+ readonly reader: Database;
43
+ readonly ready: () => Promise<void>;
44
+ }): Read;
45
+ export declare function authorityQueries(read: Read): AuthorityQueries;
@@ -0,0 +1,85 @@
1
+ import { parseCommand } from "../../authority/commands.js";
2
+ import { documentBody } from "../../storage/decision-rows.js";
3
+ import { integer, latestSequence, text, } from "../../storage/domain-rows.js";
4
+ import { storedEvents } from "../authority-restore.js";
5
+ import { documentDigest } from "../decision-restore.js";
6
+ async function receipt(connection, commandId) {
7
+ const row = await connection.get("SELECT c.request, c.sequence, e.run_id, e.recorded_at FROM commands c JOIN events e ON e.sequence = c.sequence WHERE c.command_id = ?", [commandId]);
8
+ if (row === undefined)
9
+ return undefined;
10
+ const request = text(row, "request");
11
+ const command = parseCommand(JSON.parse(request));
12
+ if (command === null)
13
+ throw new Error(`invalid-command-row: ${commandId}`);
14
+ return {
15
+ commandId,
16
+ sequence: integer(row, "sequence"),
17
+ runId: text(row, "run_id"),
18
+ recordedAt: text(row, "recorded_at"),
19
+ commandDigest: documentDigest(request),
20
+ command,
21
+ };
22
+ }
23
+ async function eventsAfter(connection, cursor) {
24
+ const scoped = cursor.runId === undefined ? "" : " AND run_id = ?";
25
+ const parameters = cursor.runId === undefined
26
+ ? [cursor.after, cursor.limit]
27
+ : [cursor.after, cursor.runId, cursor.limit];
28
+ const rows = await connection.all(`SELECT sequence, type, run_id, command_id, recorded_at, payload FROM events WHERE sequence > ?${scoped} ORDER BY sequence LIMIT ?`, parameters);
29
+ return {
30
+ events: publishedEvents(rows),
31
+ earliest: integer(await connection.get("SELECT coalesce(min(sequence), 0) AS sequence FROM events"), "sequence"),
32
+ latest: await latestSequence(connection),
33
+ };
34
+ }
35
+ function publishedEvents(rows) {
36
+ return storedEvents(rows.map((row) => ({
37
+ sequence: integer(row, "sequence"),
38
+ type: text(row, "type"),
39
+ runId: text(row, "run_id"),
40
+ commandId: text(row, "command_id"),
41
+ recordedAt: text(row, "recorded_at"),
42
+ request: "",
43
+ payload: text(row, "payload"),
44
+ }))).map((event) => ({
45
+ sequence: event.sequence,
46
+ type: event.type,
47
+ runId: event.runId,
48
+ commandId: event.commandId,
49
+ recordedAt: event.recordedAt,
50
+ payload: event.payload,
51
+ }));
52
+ }
53
+ async function latestCompletion(connection, cursor) {
54
+ const row = await connection.get("SELECT sequence, type, run_id, command_id, recorded_at, payload FROM events WHERE run_id = ? AND type = 'run.completed' AND sequence <= ? ORDER BY sequence DESC LIMIT 1", [cursor.runId, cursor.atOrBefore]);
55
+ return row === undefined ? undefined : publishedEvents([row])[0];
56
+ }
57
+ async function sequences(connection) {
58
+ const rows = await connection.all("SELECT r.run_id, r.sequence, e.recorded_at FROM runs r JOIN events e ON e.sequence = r.sequence ORDER BY r.run_id");
59
+ return {
60
+ latest: await latestSequence(connection),
61
+ runs: Object.fromEntries(rows.map((row) => [text(row, "run_id"), integer(row, "sequence")])),
62
+ times: Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "recorded_at")])),
63
+ };
64
+ }
65
+ async function workflowIds(connection) {
66
+ const rows = await connection.all("SELECT d.run_id, json_extract(s.body, '$.workflowId') AS workflow_id FROM run_details d JOIN documents s ON s.digest = d.submission WHERE json_valid(s.body) AND json_type(s.body, '$.workflowId') = 'text'");
67
+ return Object.fromEntries(rows.map((row) => [text(row, "run_id"), text(row, "workflow_id")]));
68
+ }
69
+ export function guardedRead(access) {
70
+ const { reader, ready } = access;
71
+ return async (query) => {
72
+ await ready();
73
+ return reader.connection(query);
74
+ };
75
+ }
76
+ export function authorityQueries(read) {
77
+ return {
78
+ document: (digest) => read((connection) => documentBody(connection, digest)),
79
+ receipt: (commandId) => read((connection) => receipt(connection, commandId)),
80
+ eventsAfter: (cursor) => read((connection) => eventsAfter(connection, cursor)),
81
+ latestCompletion: (cursor) => read((connection) => latestCompletion(connection, cursor)),
82
+ sequences: () => read(sequences),
83
+ workflowIds: () => read(workflowIds),
84
+ };
85
+ }
@@ -0,0 +1,28 @@
1
+ import type { JsonObject } from "solid-objects";
2
+ import type { EffectIntent } from "../../authority/reducer.ts";
3
+ export type StoreReceipt = {
4
+ readonly kind: "accepted" | "duplicate";
5
+ readonly sequence: number;
6
+ readonly intents: readonly EffectIntent[];
7
+ readonly disposition?: string;
8
+ } | {
9
+ readonly kind: "rejected";
10
+ readonly reason: string;
11
+ readonly detail?: string;
12
+ } | {
13
+ readonly kind: "failed";
14
+ readonly reason: "storage-failure" | "storage-unavailable" | "authority-unavailable";
15
+ readonly detail: string;
16
+ };
17
+ export declare const unserializable: StoreReceipt;
18
+ export declare const invalidCommand: StoreReceipt;
19
+ export declare const maximumRequestBytes = 900000;
20
+ export declare const tooLarge: StoreReceipt;
21
+ export declare function oversized(request: JsonObject): boolean;
22
+ export declare function failed(error: unknown): Extract<StoreReceipt, {
23
+ kind: "failed";
24
+ }>;
25
+ export declare function storeReceipt(value: unknown): StoreReceipt;
26
+ export declare function json(value: unknown): JsonObject;
27
+ export declare function textList(value: unknown): readonly string[] | undefined;
28
+ export declare function serializable(value: unknown): JsonObject | undefined;
@@ -0,0 +1,84 @@
1
+ import { integer, text } from "../../storage/domain-rows.js";
2
+ import { intentKind } from "../authority-restore.js";
3
+ export const unserializable = {
4
+ kind: "rejected",
5
+ reason: "invalid-command",
6
+ detail: "unserializable-command",
7
+ };
8
+ export const invalidCommand = {
9
+ kind: "rejected",
10
+ reason: "invalid-command",
11
+ };
12
+ export const maximumRequestBytes = 900_000;
13
+ export const tooLarge = {
14
+ kind: "rejected",
15
+ reason: "request-too-large",
16
+ detail: `A request has at most ${String(maximumRequestBytes)} bytes.`,
17
+ };
18
+ export function oversized(request) {
19
+ return Buffer.byteLength(JSON.stringify(request)) > maximumRequestBytes;
20
+ }
21
+ export function failed(error) {
22
+ const name = String(Reflect.get(Object(error), "name"));
23
+ if (name === "MessageFailed")
24
+ return {
25
+ kind: "failed",
26
+ reason: "storage-failure",
27
+ detail: String(Reflect.get(Object(Reflect.get(Object(error), "details")), "message")),
28
+ };
29
+ return {
30
+ kind: "failed",
31
+ reason: "authority-unavailable",
32
+ detail: `${name}: ${String(Reflect.get(Object(error), "message"))}`,
33
+ };
34
+ }
35
+ export function storeReceipt(value) {
36
+ const kind = text(value, "kind");
37
+ if (kind === "rejected") {
38
+ const detail = Reflect.get(Object(value), "detail");
39
+ return {
40
+ kind,
41
+ reason: text(value, "reason"),
42
+ ...(typeof detail === "string" ? { detail } : {}),
43
+ };
44
+ }
45
+ if (kind !== "accepted" && kind !== "duplicate")
46
+ throw new Error(`invalid-receipt: ${kind}`);
47
+ const intents = Reflect.get(Object(value), "intents");
48
+ if (!Array.isArray(intents))
49
+ throw new Error("invalid-receipt: intents");
50
+ const disposition = Reflect.get(Object(value), "disposition");
51
+ return {
52
+ kind,
53
+ sequence: integer(value, "sequence"),
54
+ intents: intents.map((intent) => ({
55
+ kind: intentKind(text(intent, "kind")),
56
+ runId: text(intent, "runId"),
57
+ operationId: text(intent, "operationId"),
58
+ })),
59
+ ...(typeof disposition === "string" ? { disposition } : {}),
60
+ };
61
+ }
62
+ export function json(value) {
63
+ const copy = JSON.parse(JSON.stringify(value));
64
+ if (!isJsonObject(copy))
65
+ throw new Error("invalid-json-object");
66
+ return copy;
67
+ }
68
+ function isJsonObject(value) {
69
+ return typeof value === "object" && value !== null && !Array.isArray(value);
70
+ }
71
+ export function textList(value) {
72
+ if (!Array.isArray(value))
73
+ return undefined;
74
+ const items = value;
75
+ return items.every((item) => typeof item === "string") ? items : undefined;
76
+ }
77
+ export function serializable(value) {
78
+ try {
79
+ return json(value);
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ }
@@ -0,0 +1,13 @@
1
+ import type { Database, SolidObjectsRuntime } from "solid-objects";
2
+ import type { deliveryHandler } from "./authority-delivery.ts";
3
+ export interface DeliveryRegistration {
4
+ readonly runtime: Pick<SolidObjectsRuntime, "registerEffect" | "close">;
5
+ readonly database: Pick<Database, "close">;
6
+ readonly handle: ReturnType<typeof deliveryHandler>;
7
+ readonly shutdownMilliseconds: number;
8
+ }
9
+ export interface TrackedDelivery {
10
+ readonly stop: () => Promise<void>;
11
+ readonly handlersSettled: () => Promise<boolean>;
12
+ }
13
+ export declare function trackedDelivery(registration: DeliveryRegistration): TrackedDelivery;
@@ -0,0 +1,69 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { deliverEffect } from "./authority-actor.js";
3
+ export function trackedDelivery(registration) {
4
+ const { runtime, database, handle, shutdownMilliseconds } = registration;
5
+ const handlers = new Set();
6
+ runtime.registerEffect(deliverEffect, (argumentsValue, context) => tracked(handlers, handle(argumentsValue, context)));
7
+ let released;
8
+ return {
9
+ handlersSettled: async () => {
10
+ await settledWithin([...handlers], shutdownMilliseconds);
11
+ return handlers.size === 0;
12
+ },
13
+ stop: () => {
14
+ const libraryWaited = released === undefined && handlers.size > 0;
15
+ released ??= Promise.allSettled([...handlers]).then(() => closedInOrder([() => runtime.close(), () => database.close()]));
16
+ return releasedWithin({
17
+ released,
18
+ handlers,
19
+ milliseconds: libraryWaited ? 0 : shutdownMilliseconds,
20
+ });
21
+ },
22
+ };
23
+ }
24
+ async function closedInOrder(closers) {
25
+ const attempts = [];
26
+ for (const close of closers) {
27
+ const attempt = close();
28
+ attempts.push(attempt);
29
+ await attempt.catch(() => undefined);
30
+ }
31
+ await Promise.all(attempts);
32
+ }
33
+ async function settledWithin(handlers, milliseconds) {
34
+ if (handlers.length === 0)
35
+ return;
36
+ const limit = new AbortController();
37
+ try {
38
+ await Promise.race([
39
+ Promise.allSettled(handlers),
40
+ delay(milliseconds, undefined, { signal: limit.signal }).catch(() => undefined),
41
+ ]);
42
+ }
43
+ finally {
44
+ limit.abort();
45
+ }
46
+ }
47
+ function tracked(handlers, handling) {
48
+ handlers.add(handling);
49
+ const remove = () => {
50
+ handlers.delete(handling);
51
+ };
52
+ void handling.then(remove, remove);
53
+ return handling;
54
+ }
55
+ async function releasedWithin(waiting) {
56
+ const { released, handlers, milliseconds } = waiting;
57
+ let timer;
58
+ const timedOut = new Promise((_resolve, reject) => {
59
+ timer = setTimeout(() => {
60
+ reject(new Error(`authority-close-timeout: in-flight delivery handlers: ${String(handlers.size)}`));
61
+ }, milliseconds);
62
+ });
63
+ try {
64
+ await Promise.race([released, timedOut]);
65
+ }
66
+ finally {
67
+ clearTimeout(timer);
68
+ }
69
+ }
@@ -0,0 +1,60 @@
1
+ import { type Database, type InstrumentationEvent, type JsonObject, type SolidObjectsRuntime } from "solid-objects";
2
+ import { type SequenceListener } from "./authority-changes.ts";
3
+ import { type SchemaState } from "../../storage/domain-schema.ts";
4
+ import { type AvailableManifest, type Delivery } from "./authority-delivery.ts";
5
+ import { type AuthorityTiming, type EffectSettings } from "./authority-settings.ts";
6
+ export interface AuthorityOptions {
7
+ readonly delivery?: Delivery;
8
+ readonly timing?: AuthorityTiming;
9
+ readonly effects?: Partial<EffectSettings>;
10
+ readonly clock?: () => string;
11
+ readonly instrumentation?: (event: InstrumentationEvent) => void;
12
+ readonly log?: (line: string) => void;
13
+ readonly available?: AvailableManifest;
14
+ }
15
+ export interface Refusal {
16
+ readonly kind: "refused";
17
+ readonly reason: string;
18
+ readonly detail: string;
19
+ }
20
+ export { authorityTiming } from "./authority-settings.ts";
21
+ export type { AuthorityTiming } from "./authority-settings.ts";
22
+ export declare function refused(reason: string, error: unknown): Refusal;
23
+ export interface Owned {
24
+ readonly kind: "owned";
25
+ readonly database: Database;
26
+ readonly schema: Exclude<SchemaState, Refusal>;
27
+ }
28
+ export declare function ownedDatabase(directory: string): Promise<Owned | Refusal>;
29
+ export interface OwnedRuntime extends Owned {
30
+ readonly parts: AuthorityRuntime;
31
+ }
32
+ export declare function ownedRuntime(directory: string, options: AuthorityOptions): Promise<OwnedRuntime | Refusal>;
33
+ export interface AuthorityInvoker {
34
+ readonly beginEpoch: () => Promise<unknown>;
35
+ readonly execute: (request: JsonObject) => Promise<unknown>;
36
+ readonly adopt: () => Promise<unknown>;
37
+ readonly recover: () => Promise<unknown>;
38
+ }
39
+ export declare function recoverDeliveries(invoker: AuthorityInvoker): Promise<number>;
40
+ export interface SessionLimits {
41
+ readonly stopLimit: number;
42
+ readonly recoveryLimit: number;
43
+ }
44
+ export interface AuthorityRuntime {
45
+ readonly runtime: SolidObjectsRuntime;
46
+ readonly reader: Database;
47
+ readonly invoker: (actorId: string, idempotencyKey?: string) => AuthorityInvoker;
48
+ readonly stop: () => Promise<void>;
49
+ readonly handlersSettled: () => Promise<boolean>;
50
+ readonly setEpoch: (epoch: number) => void;
51
+ readonly unhealthy: () => string | undefined;
52
+ readonly watchMilliseconds: number;
53
+ readonly limits: SessionLimits;
54
+ readonly releaseEarlierOwners: () => Promise<void>;
55
+ readonly retryDeliveryCallbacks: () => Promise<void>;
56
+ readonly storedActorRefusal: (actorId: string) => Promise<Refusal | undefined>;
57
+ readonly condition: () => Promise<string | undefined>;
58
+ readonly subscribe: (actorId: string, listener: SequenceListener) => () => void;
59
+ }
60
+ export declare function authorityRuntime(database: Database, options: AuthorityOptions): AuthorityRuntime;
@@ -0,0 +1,204 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { setTimeout as delay } from "node:timers/promises";
4
+ import { guardApplicationDatabase, } from "solid-objects";
5
+ import { sqlite } from "solid-objects/database/sqlite";
6
+ import { recoveryBatch } from "./turn-state.js";
7
+ import { integer, latestSequence, text } from "../../storage/domain-rows.js";
8
+ import { trackedDelivery } from "./authority-release.js";
9
+ import { authorityActor } from "./authority-actor.js";
10
+ import { sequenceSubscriber, } from "./authority-changes.js";
11
+ import { contentionMilliseconds, lockContention, lockExclusively, observeSettings, requiredSettingsViolation, takeOwnership, } from "./authority-connection.js";
12
+ import { inspectSchema, } from "../../storage/domain-schema.js";
13
+ import { deliveryHandler, } from "./authority-delivery.js";
14
+ import { authorityTiming, effectConfiguration, } from "./authority-settings.js";
15
+ import { failureCounter, registeredRuntime, runtimeSettings, wallClock, } from "./runtime-parts.js";
16
+ import { strandingWatchdog, } from "./authority-watchdog.js";
17
+ export { authorityTiming } from "./authority-settings.js";
18
+ export function refused(reason, error) {
19
+ return {
20
+ kind: "refused",
21
+ reason,
22
+ detail: String(Reflect.get(Object(error), "message")),
23
+ };
24
+ }
25
+ export async function ownedDatabase(directory) {
26
+ let database;
27
+ try {
28
+ database = sqlite({
29
+ path: join(await realpath(directory), "authority.sqlite"),
30
+ timeoutMilliseconds: contentionMilliseconds,
31
+ lockRetryAttempts: 1,
32
+ });
33
+ }
34
+ catch (error) {
35
+ return refused("storage-failure", error);
36
+ }
37
+ const owned = await ownership(database);
38
+ if (owned.kind === "owned")
39
+ return owned;
40
+ await database.close();
41
+ return owned;
42
+ }
43
+ async function ownership(database) {
44
+ let schema;
45
+ try {
46
+ await lockExclusively(database);
47
+ schema = await database.connection(inspectSchema);
48
+ if (schema.kind === "refused")
49
+ return schema;
50
+ await takeOwnership(database);
51
+ }
52
+ catch (error) {
53
+ return refused(lockContention(error) ? "authority-held" : "storage-failure", error);
54
+ }
55
+ const violation = requiredSettingsViolation(await observeSettings(database));
56
+ return violation === null
57
+ ? { kind: "owned", database, schema }
58
+ : { kind: "refused", reason: "storage-failure", detail: violation };
59
+ }
60
+ export async function ownedRuntime(directory, options) {
61
+ const owned = await ownedDatabase(directory);
62
+ if (owned.kind === "refused")
63
+ return owned;
64
+ try {
65
+ return { ...owned, parts: authorityRuntime(owned.database, options) };
66
+ }
67
+ catch (error) {
68
+ await owned.database.close();
69
+ return refused("invalid-configuration", error);
70
+ }
71
+ }
72
+ export async function recoverDeliveries(invoker) {
73
+ let staged = 0;
74
+ for (;;) {
75
+ const batch = integer(await invoker.recover(), "staged");
76
+ staged += batch;
77
+ if (batch < recoveryBatch)
78
+ return staged;
79
+ }
80
+ }
81
+ function unhealthy(watchdog) {
82
+ const dead = watchdog.deadLettered();
83
+ if (dead !== undefined)
84
+ return `dead-lettered message ${dead}`;
85
+ const stranded = watchdog.stranded();
86
+ return stranded === undefined ? undefined : `stranded message ${stranded}`;
87
+ }
88
+ const deliveryCallbacks = ["deliveryCompleted", "deliveryFailed"];
89
+ async function retryDeliveryCallbacks(retry) {
90
+ const administration = { authorizationContext: retry.broker };
91
+ const letters = await retry.runtime.deadLetters.all(administration);
92
+ for (const letter of letters.filter((item) => item.actorType === "ClovingAuthority" &&
93
+ deliveryCallbacks.includes(item.operation) &&
94
+ item.retriedMessageId === null))
95
+ await retry.runtime.deadLetters.retry(letter.id, administration);
96
+ }
97
+ async function releaseEarlierOwners(release) {
98
+ const { runtime, broker, timing } = release;
99
+ const administration = { authorizationContext: broker };
100
+ const bound = timing.aliveThresholdMilliseconds + 2 * timing.heartbeatMilliseconds;
101
+ for (let waited = 0;; waited += timing.heartbeatMilliseconds) {
102
+ await runtime.processes.cleanup(administration);
103
+ const earlier = (await runtime.processes.all(administration)).filter((record) => record.shutdownState !== "stopped");
104
+ if (earlier.length === 0)
105
+ return;
106
+ if (waited > bound)
107
+ throw new Error(`earlier-owner-not-released: ${earlier.map((record) => record.id).join(",")}`);
108
+ await delay(timing.heartbeatMilliseconds);
109
+ }
110
+ }
111
+ const actorSequenceMismatch = {
112
+ kind: "refused",
113
+ reason: "projection-mismatch",
114
+ detail: "actor-sequence",
115
+ };
116
+ async function storedActorRefusal(check) {
117
+ const { database, actor, actorId } = check;
118
+ const supported = actor.stateVersion ?? 1;
119
+ const { row, latest } = await database.connection(async (connection) => ({
120
+ row: await connection.get("SELECT state_version, state FROM solid_instances WHERE actor_type = ? AND actor_id = ?", [actor.actorType, actorId]),
121
+ latest: await latestSequence(connection),
122
+ }));
123
+ const version = row === undefined ? supported : integer(row, "state_version");
124
+ if (version > supported)
125
+ return {
126
+ kind: "refused",
127
+ reason: "incompatible-state-version",
128
+ detail: `stored state version ${String(version)} is newer than code version ${String(supported)}`,
129
+ };
130
+ const sequence = row === undefined ? 0 : integer(JSON.parse(text(row, "state")), "sequence");
131
+ return sequence === latest ? undefined : actorSequenceMismatch;
132
+ }
133
+ async function condition(watch) {
134
+ const { runtime, broker, watchdog } = watch;
135
+ const dead = watchdog.deadLettered();
136
+ if (dead === undefined)
137
+ return unhealthy(watchdog);
138
+ return `dead-lettered message ${dead}: ${await deadLetterCause({ runtime, broker, messageId: dead })}`;
139
+ }
140
+ async function deadLetterCause(lookup) {
141
+ const { runtime, broker, messageId } = lookup;
142
+ try {
143
+ const letters = await runtime.deadLetters.all({
144
+ authorizationContext: broker,
145
+ });
146
+ const letter = letters.find((item) => item.messageId === messageId);
147
+ return String(Reflect.get(Object(letter?.error), "message"));
148
+ }
149
+ catch {
150
+ return "unreadable cause";
151
+ }
152
+ }
153
+ export function authorityRuntime(database, options) {
154
+ const timing = options.timing ?? authorityTiming;
155
+ const reader = guardApplicationDatabase(database);
156
+ const broker = {};
157
+ let epoch = 0;
158
+ const watchdog = strandingWatchdog({
159
+ boundMilliseconds: timing.callTimeoutMilliseconds,
160
+ });
161
+ const effects = effectConfiguration(options);
162
+ const shared = { reader, effects, clock: options.clock ?? wallClock };
163
+ const ClovingAuthority = authorityActor({
164
+ ...shared,
165
+ failed: failureCounter(),
166
+ });
167
+ const runtime = registeredRuntime({
168
+ database,
169
+ actor: ClovingAuthority,
170
+ settings: runtimeSettings({ timing, options, broker, watchdog }),
171
+ });
172
+ const delivery = trackedDelivery({
173
+ runtime,
174
+ database,
175
+ shutdownMilliseconds: timing.shutdownMilliseconds,
176
+ handle: deliveryHandler({
177
+ ...shared,
178
+ delivery: options.delivery,
179
+ epoch: () => epoch,
180
+ available: options.available,
181
+ }),
182
+ });
183
+ return {
184
+ runtime,
185
+ reader,
186
+ invoker: (actorId, idempotencyKey) => runtime.ref(ClovingAuthority, actorId).with({
187
+ authorizationContext: broker,
188
+ timeoutMilliseconds: timing.callTimeoutMilliseconds,
189
+ ...(idempotencyKey === undefined ? {} : { idempotencyKey }),
190
+ }),
191
+ ...delivery,
192
+ setEpoch: (value) => {
193
+ epoch = value;
194
+ },
195
+ unhealthy: () => unhealthy(watchdog),
196
+ watchMilliseconds: timing.leaseMilliseconds,
197
+ limits: effects,
198
+ releaseEarlierOwners: () => releaseEarlierOwners({ runtime, broker, timing }),
199
+ retryDeliveryCallbacks: () => retryDeliveryCallbacks({ runtime, broker }),
200
+ storedActorRefusal: (actorId) => storedActorRefusal({ database, actor: ClovingAuthority, actorId }),
201
+ condition: () => condition({ runtime, broker, watchdog }),
202
+ subscribe: sequenceSubscriber({ realtime: runtime.realtime, broker }),
203
+ };
204
+ }