cloving 0.3.20 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +475 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +263 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +27 -0
  32. package/dist/src/authority/reconciliation.js +147 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +122 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +65 -0
  78. package/dist/src/broker/actor/authority-session.js +252 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/destination.d.ts +4 -0
  138. package/dist/src/chats/destination.js +94 -0
  139. package/dist/src/chats/import.d.ts +13 -0
  140. package/dist/src/chats/import.js +71 -0
  141. package/dist/src/chats/normalize.d.ts +20 -0
  142. package/dist/src/chats/normalize.js +139 -0
  143. package/dist/src/chats/reader.d.ts +15 -0
  144. package/dist/src/chats/reader.js +87 -0
  145. package/dist/src/cli/arguments.d.ts +23 -0
  146. package/dist/src/cli/arguments.js +154 -0
  147. package/dist/src/cli/client.d.ts +15 -0
  148. package/dist/src/cli/client.js +122 -0
  149. package/dist/src/cli/commands.d.ts +14 -0
  150. package/dist/src/cli/commands.js +253 -0
  151. package/dist/src/cli/main.d.ts +1 -0
  152. package/dist/src/cli/main.js +80 -0
  153. package/dist/src/cli/render.d.ts +8 -0
  154. package/dist/src/cli/render.js +186 -0
  155. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  156. package/dist/src/cli/runtime-arguments.js +248 -0
  157. package/dist/src/cli/runtime-directory.d.ts +4 -0
  158. package/dist/src/cli/runtime-directory.js +25 -0
  159. package/dist/src/cli/toolchain.d.ts +3 -0
  160. package/dist/src/cli/toolchain.js +74 -0
  161. package/dist/src/cli/usage.d.ts +4 -0
  162. package/dist/src/cli/usage.js +124 -0
  163. package/dist/src/cli/validate.d.ts +38 -0
  164. package/dist/src/cli/validate.js +116 -0
  165. package/dist/src/cli/watch-board-view.d.ts +22 -0
  166. package/dist/src/cli/watch-board-view.js +128 -0
  167. package/dist/src/cli/watch-board.d.ts +15 -0
  168. package/dist/src/cli/watch-board.js +174 -0
  169. package/dist/src/cli/watch-element.d.ts +11 -0
  170. package/dist/src/cli/watch-element.js +6 -0
  171. package/dist/src/cli/watch-model.d.ts +29 -0
  172. package/dist/src/cli/watch-model.js +261 -0
  173. package/dist/src/cli/watch-navigation.d.ts +9 -0
  174. package/dist/src/cli/watch-navigation.js +40 -0
  175. package/dist/src/cli/watch-page.d.ts +1 -0
  176. package/dist/src/cli/watch-page.js +272 -0
  177. package/dist/src/cli/watch-paths.d.ts +2 -0
  178. package/dist/src/cli/watch-paths.js +52 -0
  179. package/dist/src/cli/watch-phases.d.ts +7 -0
  180. package/dist/src/cli/watch-phases.js +148 -0
  181. package/dist/src/cli/watch-reads.d.ts +28 -0
  182. package/dist/src/cli/watch-reads.js +244 -0
  183. package/dist/src/cli/watch-render.d.ts +139 -0
  184. package/dist/src/cli/watch-render.js +95 -0
  185. package/dist/src/cli/watch-server.d.ts +10 -0
  186. package/dist/src/cli/watch-server.js +176 -0
  187. package/dist/src/cli/watch-stream.d.ts +11 -0
  188. package/dist/src/cli/watch-stream.js +128 -0
  189. package/dist/src/cli/watch-turn.d.ts +29 -0
  190. package/dist/src/cli/watch-turn.js +130 -0
  191. package/dist/src/cli/watch-view.d.ts +39 -0
  192. package/dist/src/cli/watch-view.js +223 -0
  193. package/dist/src/cli.d.ts +2 -0
  194. package/dist/src/cli.js +62 -0
  195. package/dist/src/daemon/claude-turn.d.ts +28 -0
  196. package/dist/src/daemon/claude-turn.js +135 -0
  197. package/dist/src/daemon/claude-worker.d.ts +26 -0
  198. package/dist/src/daemon/claude-worker.js +224 -0
  199. package/dist/src/daemon/codex-stream.d.ts +4 -0
  200. package/dist/src/daemon/codex-stream.js +113 -0
  201. package/dist/src/daemon/daemon.d.ts +46 -0
  202. package/dist/src/daemon/daemon.js +186 -0
  203. package/dist/src/daemon/delivery-router.d.ts +10 -0
  204. package/dist/src/daemon/delivery-router.js +34 -0
  205. package/dist/src/daemon/github-calls.d.ts +29 -0
  206. package/dist/src/daemon/github-calls.js +127 -0
  207. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  208. package/dist/src/daemon/github-issue-methods.js +99 -0
  209. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  210. package/dist/src/daemon/github-issue-privacy.js +131 -0
  211. package/dist/src/daemon/github-merge.d.ts +18 -0
  212. package/dist/src/daemon/github-merge.js +259 -0
  213. package/dist/src/daemon/github-methods.d.ts +5 -0
  214. package/dist/src/daemon/github-methods.js +198 -0
  215. package/dist/src/daemon/github-operation.d.ts +38 -0
  216. package/dist/src/daemon/github-operation.js +57 -0
  217. package/dist/src/daemon/github-worker.d.ts +17 -0
  218. package/dist/src/daemon/github-worker.js +281 -0
  219. package/dist/src/daemon/host-environment.d.ts +8 -0
  220. package/dist/src/daemon/host-environment.js +14 -0
  221. package/dist/src/daemon/issue-queue.d.ts +9 -0
  222. package/dist/src/daemon/issue-queue.js +163 -0
  223. package/dist/src/daemon/notify-message.d.ts +14 -0
  224. package/dist/src/daemon/notify-message.js +48 -0
  225. package/dist/src/daemon/notify.d.ts +12 -0
  226. package/dist/src/daemon/notify.js +161 -0
  227. package/dist/src/daemon/operation-journal.d.ts +42 -0
  228. package/dist/src/daemon/operation-journal.js +53 -0
  229. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  230. package/dist/src/daemon/ticket-registration.js +177 -0
  231. package/dist/src/daemon/ticket-source.d.ts +17 -0
  232. package/dist/src/daemon/ticket-source.js +36 -0
  233. package/dist/src/daemon/work-tree.d.ts +26 -0
  234. package/dist/src/daemon/work-tree.js +206 -0
  235. package/dist/src/effect-authorization.d.ts +21 -0
  236. package/dist/src/effect-authorization.js +14 -0
  237. package/dist/src/execution-pin.d.ts +4 -0
  238. package/dist/src/execution-pin.js +68 -0
  239. package/dist/src/host/start-delivery.d.ts +41 -0
  240. package/dist/src/host/start-delivery.js +68 -0
  241. package/dist/src/host/step-bridge-host.d.ts +79 -0
  242. package/dist/src/host/step-bridge-host.js +205 -0
  243. package/dist/src/host/step-claims.d.ts +31 -0
  244. package/dist/src/host/step-claims.js +85 -0
  245. package/dist/src/host/world-host.d.ts +21 -0
  246. package/dist/src/host/world-host.js +51 -0
  247. package/dist/src/host/world-reconciliation.d.ts +37 -0
  248. package/dist/src/host/world-reconciliation.js +75 -0
  249. package/dist/src/host/world-runs.d.ts +14 -0
  250. package/dist/src/host/world-runs.js +61 -0
  251. package/dist/src/operation-identity.d.ts +7 -0
  252. package/dist/src/operation-identity.js +59 -0
  253. package/dist/src/protocol.d.ts +35 -0
  254. package/dist/src/protocol.js +64 -0
  255. package/dist/src/resource-files.d.ts +1 -0
  256. package/dist/src/resource-files.js +29 -0
  257. package/dist/src/service/changes.d.ts +11 -0
  258. package/dist/src/service/changes.js +32 -0
  259. package/dist/src/service/decision-handler.d.ts +9 -0
  260. package/dist/src/service/decision-handler.js +233 -0
  261. package/dist/src/service/event-handler.d.ts +10 -0
  262. package/dist/src/service/event-handler.js +70 -0
  263. package/dist/src/service/expiry.d.ts +13 -0
  264. package/dist/src/service/expiry.js +53 -0
  265. package/dist/src/service/gateway.d.ts +21 -0
  266. package/dist/src/service/gateway.js +120 -0
  267. package/dist/src/service/registry.d.ts +40 -0
  268. package/dist/src/service/registry.js +13 -0
  269. package/dist/src/service/replies.d.ts +26 -0
  270. package/dist/src/service/replies.js +56 -0
  271. package/dist/src/service/run-handlers.d.ts +4 -0
  272. package/dist/src/service/run-handlers.js +271 -0
  273. package/dist/src/service/service.d.ts +58 -0
  274. package/dist/src/service/service.js +212 -0
  275. package/dist/src/service/submission-handler.d.ts +4 -0
  276. package/dist/src/service/submission-handler.js +206 -0
  277. package/dist/src/service/transport.d.ts +16 -0
  278. package/dist/src/service/transport.js +141 -0
  279. package/dist/src/service/worker-port.d.ts +85 -0
  280. package/dist/src/service/worker-port.js +126 -0
  281. package/dist/src/step-bridge.d.ts +57 -0
  282. package/dist/src/step-bridge.js +4 -0
  283. package/dist/src/steps/decision-gate.d.ts +2 -0
  284. package/dist/src/steps/decision-gate.js +8 -0
  285. package/dist/src/steps/load-cycle.d.ts +10 -0
  286. package/dist/src/steps/load-cycle.js +11 -0
  287. package/dist/src/steps/protected-effect.d.ts +2 -0
  288. package/dist/src/steps/protected-effect.js +8 -0
  289. package/dist/src/storage/decision-rows.d.ts +54 -0
  290. package/dist/src/storage/decision-rows.js +72 -0
  291. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  292. package/dist/src/storage/decision-snapshots.js +25 -0
  293. package/dist/src/storage/domain-changes.d.ts +48 -0
  294. package/dist/src/storage/domain-changes.js +213 -0
  295. package/dist/src/storage/domain-rows.d.ts +85 -0
  296. package/dist/src/storage/domain-rows.js +129 -0
  297. package/dist/src/storage/domain-schema.d.ts +32 -0
  298. package/dist/src/storage/domain-schema.js +193 -0
  299. package/dist/src/storage/effect-changes.d.ts +5 -0
  300. package/dist/src/storage/effect-changes.js +105 -0
  301. package/dist/src/storage/effect-rows.d.ts +67 -0
  302. package/dist/src/storage/effect-rows.js +74 -0
  303. package/dist/src/storage/effect-schema.d.ts +1 -0
  304. package/dist/src/storage/effect-schema.js +59 -0
  305. package/dist/src/storage/statements.d.ts +9 -0
  306. package/dist/src/storage/statements.js +8 -0
  307. package/dist/src/submission.d.ts +42 -0
  308. package/dist/src/submission.js +71 -0
  309. package/dist/src/turn-profile.d.ts +13 -0
  310. package/dist/src/turn-profile.js +100 -0
  311. package/dist/src/workflow-admission.d.ts +45 -0
  312. package/dist/src/workflow-admission.js +151 -0
  313. package/dist/src/workflow-contracts.d.ts +27 -0
  314. package/dist/src/workflow-contracts.js +88 -0
  315. package/dist/src/workflow-declaration.d.ts +11 -0
  316. package/dist/src/workflow-declaration.js +57 -0
  317. package/dist/src/workflow-resources.d.ts +8 -0
  318. package/dist/src/workflow-resources.js +14 -0
  319. package/dist/src/workflows.d.ts +5 -0
  320. package/dist/src/workflows.js +3 -0
  321. package/dist/tools/compile-workflows.d.ts +1 -0
  322. package/dist/tools/compile-workflows.js +33 -0
  323. package/dist/tools/self-host-processes.d.ts +10 -0
  324. package/dist/tools/self-host-processes.js +151 -0
  325. package/dist/tools/self-host-workflows.d.ts +15 -0
  326. package/dist/tools/self-host-workflows.js +78 -0
  327. package/dist/tools/self-host.d.ts +1 -0
  328. package/dist/tools/self-host.js +261 -0
  329. package/dist/tools/self-update-host.d.ts +6 -0
  330. package/dist/tools/self-update-host.js +41 -0
  331. package/dist/tools/self-update.d.ts +10 -0
  332. package/dist/tools/self-update.js +105 -0
  333. package/dist/tools/workflow-manifest.d.ts +3 -0
  334. package/dist/tools/workflow-manifest.js +34 -0
  335. package/dist/workflows/develop-prd.d.ts +7 -0
  336. package/dist/workflows/develop-prd.js +97 -0
  337. package/dist/workflows/develop-ticket.d.ts +15 -0
  338. package/dist/workflows/develop-ticket.js +301 -0
  339. package/dist/workflows/issue-labels.d.ts +14 -0
  340. package/dist/workflows/issue-labels.js +36 -0
  341. package/package.json +82 -75
  342. package/dist/abstract_gpt/index.js +0 -55
  343. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  344. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  345. package/dist/cloving_gpt/adapters/claude.js +0 -128
  346. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  347. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  348. package/dist/cloving_gpt/adapters/index.js +0 -2
  349. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  350. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  351. package/dist/cloving_gpt/adapters/openai.js +0 -100
  352. package/dist/cloving_gpt/index.js +0 -192
  353. package/dist/commands/analyze.js +0 -47
  354. package/dist/commands/chat.js +0 -14
  355. package/dist/commands/check.js +0 -7
  356. package/dist/commands/commit.js +0 -44
  357. package/dist/commands/config.js +0 -167
  358. package/dist/commands/describe.js +0 -235
  359. package/dist/commands/generate/code.js +0 -21
  360. package/dist/commands/generate/commit.js +0 -11
  361. package/dist/commands/generate/context.js +0 -82
  362. package/dist/commands/generate/docs.js +0 -11
  363. package/dist/commands/generate/documentation.js +0 -11
  364. package/dist/commands/generate/fizzbuzz.js +0 -35
  365. package/dist/commands/generate/init.js +0 -15
  366. package/dist/commands/generate/review.js +0 -11
  367. package/dist/commands/generate/sh.js +0 -95
  368. package/dist/commands/generate/shell.js +0 -11
  369. package/dist/commands/generate/unit_tests.js +0 -11
  370. package/dist/commands/init.js +0 -13
  371. package/dist/commands/models.js +0 -22
  372. package/dist/commands/project/build.js +0 -88
  373. package/dist/commands/project/complete.js +0 -12
  374. package/dist/commands/project/init.js +0 -82
  375. package/dist/commands/project/plan.js +0 -108
  376. package/dist/commands/proxy.js +0 -11
  377. package/dist/commands/review.js +0 -50
  378. package/dist/commands/tokens.js +0 -75
  379. package/dist/commands/unit_tests.js +0 -150
  380. package/dist/commands/update.js +0 -7
  381. package/dist/file2.js +0 -4
  382. package/dist/index.js +0 -136
  383. package/dist/managers/BlockManager.js +0 -120
  384. package/dist/managers/ChatManager.js +0 -653
  385. package/dist/managers/ChunkManager.js +0 -32
  386. package/dist/managers/CodeManager.js +0 -185
  387. package/dist/managers/CommitManager.js +0 -78
  388. package/dist/managers/DocsManager.js +0 -88
  389. package/dist/managers/DocumentationManager.js +0 -114
  390. package/dist/managers/InitManager.js +0 -230
  391. package/dist/managers/ProxyManager.js +0 -210
  392. package/dist/managers/ReviewManager.js +0 -131
  393. package/dist/managers/ShellManager.js +0 -163
  394. package/dist/managers/StreamManager.js +0 -308
  395. package/dist/managers/UnitTestManager.js +0 -243
  396. package/dist/managers/src/managers/ProxyManager.js +0 -1
  397. package/dist/newfile.js +0 -2
  398. package/dist/package.json +0 -86
  399. package/dist/utils/command_utils.js +0 -384
  400. package/dist/utils/config_utils.js +0 -249
  401. package/dist/utils/gitUtils.js +0 -42
  402. package/dist/utils/git_utils.js +0 -217
  403. package/dist/utils/modelUtils.js +0 -7
  404. package/dist/utils/model_utils.js +0 -7
  405. package/dist/utils/prompt_utils.js +0 -333
  406. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  407. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  408. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  409. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  410. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  411. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  412. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  413. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  414. package/dist/utils/prompts/index.js +0 -27
  415. package/dist/utils/string_utils.js +0 -505
  416. package/dist/utils/types.js +0 -2
@@ -0,0 +1,173 @@
1
+ import { isInstant } from "../../authority/instants.js";
2
+ import { promotions } from "../../authority/leases.js";
3
+ import { execute } from "../../authority/reducer.js";
4
+ import { documentDigest } from "../decision-restore.js";
5
+ import { operationDigest } from "../operation-digest.js";
6
+ import { protectedIntent } from "./delivery-intents.js";
7
+ function leaseGrant(state, grant) {
8
+ const { operation, recordedAt, effects } = grant;
9
+ const generation = (state.effects.leases[operation.leaseKey]?.generation ?? 0) + 1;
10
+ return {
11
+ kind: "grant-lease",
12
+ commandId: `lease:${operationDigest(operation.operationId)}:${String(generation)}`,
13
+ runId: operation.runId,
14
+ operationId: operation.operationId,
15
+ leaseGeneration: generation,
16
+ expiresAt: new Date(Date.parse(recordedAt) + effects.leaseMilliseconds).toISOString(),
17
+ capacity: effects.capacity,
18
+ };
19
+ }
20
+ function recordedStep(before, proposed) {
21
+ return [execute(before, proposed)]
22
+ .filter((result) => result.kind === "accepted")
23
+ .map((result) => ({ result, before }));
24
+ }
25
+ function granted(before, grant) {
26
+ return recordedStep(before, {
27
+ command: leaseGrant(before, grant),
28
+ recordedAt: grant.recordedAt,
29
+ });
30
+ }
31
+ export function promoted(state, promotion) {
32
+ if (!isInstant(promotion.recordedAt))
33
+ return [];
34
+ const steps = [];
35
+ for (const operation of promotions(state, promotion.effects.capacity))
36
+ steps.push(...granted(steps.at(-1)?.result.state ?? state, {
37
+ ...promotion,
38
+ operation,
39
+ }));
40
+ return steps;
41
+ }
42
+ const terminal = ["completed", "failed", "cancelled"];
43
+ function closure(state, operation) {
44
+ if (terminal.includes(state.runs[operation.runId]?.status ?? ""))
45
+ return ["run-ended"];
46
+ const exhausted = (state.effects.budgets[operation.runId]?.exhaustedSequence ?? null) !==
47
+ null;
48
+ return exhausted ? ["budget-exhausted"] : [];
49
+ }
50
+ function unblocked(state, followUp) {
51
+ const steps = [];
52
+ for (const [operationId, effectId] of followUp.blocked) {
53
+ const before = steps.at(-1)?.result.state ?? state;
54
+ const pending = Object.values(before.effects.operations).filter((operation) => operation.operationId === operationId &&
55
+ operation.status === "dispatch-pending" &&
56
+ operation.receipt === null);
57
+ for (const operation of pending)
58
+ for (const reason of closure(before, operation))
59
+ steps.push(...recordedStep(before, {
60
+ command: {
61
+ kind: "record-outcome",
62
+ commandId: `outcome:${effectId}`,
63
+ runId: operation.runId,
64
+ operationId,
65
+ leaseGeneration: before.effects.leases[operation.leaseKey]?.generation ?? 0,
66
+ outcome: "not-started",
67
+ reason,
68
+ },
69
+ recordedAt: followUp.recordedAt,
70
+ }));
71
+ }
72
+ return steps;
73
+ }
74
+ export function followUps(state, followUp) {
75
+ const settled = unblocked(state, followUp);
76
+ return [
77
+ ...settled,
78
+ ...promoted(settled.at(-1)?.result.state ?? state, followUp),
79
+ ];
80
+ }
81
+ function stated(fields) {
82
+ return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== null));
83
+ }
84
+ function identified(attempt) {
85
+ return { receipt: attempt.receipt, worker: attempt.worker };
86
+ }
87
+ function unknown(reason) {
88
+ return { outcome: "unknown", reason };
89
+ }
90
+ const outcomes = {
91
+ accepted: (attempt) => ({
92
+ outcome: "accepted",
93
+ receipt: attempt.receipt,
94
+ worker: attempt.worker,
95
+ }),
96
+ completed: (attempt) => stated({
97
+ outcome: "completed",
98
+ result: attempt.result === null ? null : documentDigest(attempt.result),
99
+ reason: attempt.reason,
100
+ ...identified(attempt),
101
+ }),
102
+ failed: (attempt) => stated({
103
+ outcome: "failed",
104
+ reason: attempt.reason,
105
+ result: attempt.result === null ? null : documentDigest(attempt.result),
106
+ ...identified(attempt),
107
+ }),
108
+ stopped: (attempt) => stated({ outcome: "stopped", ...identified(attempt) }),
109
+ unknown: (attempt) => unknown(attempt.reason ?? "adapter-unknown"),
110
+ thrown: () => unknown("handler-failure"),
111
+ "stale-epoch": () => unknown("stale-epoch"),
112
+ absent: (attempt) => attempt.storedReceipt === null
113
+ ? { outcome: "not-started", reason: "absent" }
114
+ : unknown("absent-with-receipt"),
115
+ withheld: (attempt) => attempt.purpose === "dispatch"
116
+ ? { outcome: "not-started", reason: "withheld" }
117
+ : undefined,
118
+ refused: () => ({ outcome: "not-started", reason: "budget-exhausted" }),
119
+ };
120
+ export function outcomeCommand(attempt) {
121
+ const fields = outcomes[attempt.outcome]?.(attempt);
122
+ if (fields === undefined)
123
+ return undefined;
124
+ return {
125
+ kind: "record-outcome",
126
+ commandId: `outcome:${attempt.effectId}`,
127
+ runId: attempt.runId,
128
+ operationId: attempt.operationId,
129
+ leaseGeneration: attempt.leaseGeneration,
130
+ ...fields,
131
+ };
132
+ }
133
+ export function resultDocuments(attempt) {
134
+ const kept = ["completed", "failed"].includes(attempt.outcome);
135
+ if (!kept || attempt.result === null)
136
+ return [];
137
+ return [{ digest: documentDigest(attempt.result), body: attempt.result }];
138
+ }
139
+ function named(reconciling) {
140
+ const operations = reconciling.results.flatMap((result) => result.events.flatMap((event) => event.payload["operationId"] ?? []));
141
+ return [...new Set([...operations, ...reconciling.closed])];
142
+ }
143
+ export function rejectedReports(results) {
144
+ return new Set(results
145
+ .filter((result) => result.events.some((event) => event.type === "effect.reported") &&
146
+ result.disposition?.disposition === "rejected")
147
+ .flatMap((result) => result.disposition?.operationId ?? []));
148
+ }
149
+ function acceptedNow(reconciling) {
150
+ return new Set(reconciling.results.flatMap((result) => result.events
151
+ .filter((event) => event.type === "operation.reconciled" &&
152
+ event.payload["outcome"] === "accepted")
153
+ .flatMap((event) => event.payload["operationId"] ?? [])));
154
+ }
155
+ export function reconciliations(state, reconciling) {
156
+ const accepted = acceptedNow(reconciling);
157
+ const rejected = rejectedReports(reconciling.results);
158
+ const due = (operation) => state.runs[operation.runId]?.status !== "cancelled" && live(operation);
159
+ const live = (operation) => (operation.status === "recovering" &&
160
+ !accepted.has(operation.operationId)) ||
161
+ (operation.status === "blocked" && rejected.has(operation.operationId));
162
+ return named(reconciling)
163
+ .filter((operationId) => !reconciling.open.has(operationId))
164
+ .flatMap((operationId) => Object.values(state.effects.operations).filter((operation) => operation.operationId === operationId && due(operation)))
165
+ .flatMap((operation) => protectedIntent(state, {
166
+ intent: {
167
+ kind: "protected-effect",
168
+ runId: operation.runId,
169
+ operationId: operation.operationId,
170
+ },
171
+ purpose: "reconcile",
172
+ }));
173
+ }
@@ -0,0 +1,27 @@
1
+ import type { Evidence, RunBudget } from "../../authority/operations.ts";
2
+ import { type RunClosure } from "../../authority/stop-sequence.ts";
3
+ import { type OperationRow } from "../../storage/effect-rows.ts";
4
+ import type { Read } from "./authority-queries.ts";
5
+ export interface OperationView extends OperationRow {
6
+ readonly leaseGeneration: number | null;
7
+ readonly waitCause: string | null;
8
+ }
9
+ export type StoredDisposition = Omit<Evidence, "sequence">;
10
+ export interface EffectQueries {
11
+ readonly operation: (operationId: string) => Promise<OperationView | undefined>;
12
+ readonly operations: (runId: string) => Promise<readonly OperationView[]>;
13
+ readonly evidence: (runId: string) => Promise<readonly number[]>;
14
+ readonly disposition: (sequence: number) => Promise<StoredDisposition | undefined>;
15
+ readonly budget: (runId: string) => Promise<RunBudget | undefined>;
16
+ readonly dueLeases: (instant: string) => Promise<readonly DueLease[]>;
17
+ readonly stops: (runId: string) => Promise<readonly string[]>;
18
+ readonly closure: (runId: string) => Promise<RunClosure>;
19
+ }
20
+ export interface DueLease {
21
+ readonly runId: string;
22
+ readonly operationId: string;
23
+ readonly generation: number;
24
+ }
25
+ export declare function effectQueries(read: Read, settings: {
26
+ readonly stopLimit: number;
27
+ }): EffectQueries;
@@ -0,0 +1,80 @@
1
+ import { runClosure } from "../../authority/stop-sequence.js";
2
+ import { integer, optionalInteger, optionalText, text, } from "../../storage/domain-rows.js";
3
+ import { budgetColumns, budgetRow, evidenceColumns, evidenceRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
4
+ import { storedBudget } from "../effect-restore.js";
5
+ import { stopping } from "./stop-turn.js";
6
+ async function storedClosure(connection, scope) {
7
+ const { subjects, cancelledSequence } = await stopping(connection, scope.runId);
8
+ return runClosure(subjects, {
9
+ cancelledSequence: cancelledSequence ?? 0,
10
+ stopLimit: scope.stopLimit,
11
+ });
12
+ }
13
+ async function stops(connection, runId) {
14
+ const rows = await connection.all("SELECT operation_id FROM stopped_operations WHERE run_id = ? ORDER BY operation_id", [runId]);
15
+ return rows.map((row) => text(row, "operation_id"));
16
+ }
17
+ const dueBatch = 100;
18
+ async function dueLeases(connection, instant) {
19
+ const rows = await connection.all("SELECT o.run_id, l.operation_id, l.generation FROM leases l JOIN operations o ON o.operation_id = l.operation_id WHERE l.state = 'held' AND l.expires_at <= ? ORDER BY l.expires_at, l.resource_key LIMIT ?", [new Date(instant).toISOString(), dueBatch]);
20
+ return rows.map((row) => ({
21
+ runId: text(row, "run_id"),
22
+ operationId: text(row, "operation_id"),
23
+ generation: integer(row, "generation"),
24
+ }));
25
+ }
26
+ const viewColumns = operationColumns
27
+ .split(", ")
28
+ .map((name) => `o.${name}`)
29
+ .join(", ");
30
+ const waitCause = "CASE WHEN o.status != 'waiting' THEN NULL WHEN r.status != 'running' THEN 'run-not-running' WHEN EXISTS (SELECT 1 FROM leases h WHERE h.resource_key = o.lease_key AND h.state != 'released') THEN 'resource' ELSE 'ready' END";
31
+ const viewed = `SELECT ${viewColumns}, l.generation AS lease_generation, ${waitCause} AS wait_cause FROM operations o JOIN runs r ON r.run_id = o.run_id LEFT JOIN leases l ON l.resource_key = o.lease_key AND l.operation_id = o.operation_id AND l.state != 'released'`;
32
+ function operationView(row) {
33
+ return {
34
+ ...operationRow(row),
35
+ leaseGeneration: optionalInteger(row, "lease_generation"),
36
+ waitCause: optionalText(row, "wait_cause"),
37
+ };
38
+ }
39
+ async function operation(connection, operationId) {
40
+ const row = await connection.get(`${viewed} WHERE o.operation_id = ?`, [
41
+ operationId,
42
+ ]);
43
+ return row === undefined ? undefined : operationView(row);
44
+ }
45
+ async function operations(connection, runId) {
46
+ const rows = await connection.all(`${viewed} WHERE o.run_id = ? ORDER BY o.requested_sequence`, [runId]);
47
+ return rows.map(operationView);
48
+ }
49
+ async function evidence(connection, runId) {
50
+ const rows = await connection.all("SELECT e.sequence FROM effect_evidence e JOIN events v ON v.sequence = e.sequence WHERE e.run_id = ? AND (e.disposition IN ('rejected', 'denied', 'refused') OR (v.type = 'operation.reconciled' AND json_extract(v.payload, '$.outcome') = 'unknown')) ORDER BY e.sequence", [runId]);
51
+ return rows.map((row) => integer(row, "sequence"));
52
+ }
53
+ async function disposition(connection, sequence) {
54
+ const row = await connection.get(`SELECT ${evidenceColumns} FROM effect_evidence WHERE sequence = ?`, [sequence]);
55
+ if (row === undefined)
56
+ return undefined;
57
+ const stored = evidenceRow(row);
58
+ return {
59
+ runId: stored.runId,
60
+ operationId: stored.operationId,
61
+ disposition: stored.disposition,
62
+ reason: stored.reason,
63
+ };
64
+ }
65
+ async function budget(connection, runId) {
66
+ const row = await connection.get(`SELECT ${budgetColumns} FROM run_budgets WHERE run_id = ?`, [runId]);
67
+ return row === undefined ? undefined : storedBudget(budgetRow(row));
68
+ }
69
+ export function effectQueries(read, settings) {
70
+ return {
71
+ stops: (runId) => read((connection) => stops(connection, runId)),
72
+ closure: (runId) => read((connection) => storedClosure(connection, { runId, stopLimit: settings.stopLimit })),
73
+ budget: (runId) => read((connection) => budget(connection, runId)),
74
+ dueLeases: (instant) => read((connection) => dueLeases(connection, instant)),
75
+ operation: (operationId) => read((connection) => operation(connection, operationId)),
76
+ operations: (runId) => read((connection) => operations(connection, runId)),
77
+ evidence: (runId) => read((connection) => evidence(connection, runId)),
78
+ disposition: (sequence) => read((connection) => disposition(connection, sequence)),
79
+ };
80
+ }
@@ -0,0 +1,25 @@
1
+ import type { RunDetails } from "../../authority/details.ts";
2
+ import type { EffectState } from "../../authority/operations.ts";
3
+ import type { EffectIntent, RunState } from "../../authority/reducer.ts";
4
+ import { type SqlConnection } from "../../storage/domain-rows.ts";
5
+ import type { DeliveryIntent, Purpose, Undigested } from "./delivery-intents.ts";
6
+ export interface EffectScope {
7
+ readonly runId: string;
8
+ readonly operations: readonly string[];
9
+ readonly keys: readonly string[];
10
+ readonly capacity: number;
11
+ }
12
+ export declare function effectTurn(connection: SqlConnection, scope: EffectScope): Promise<EffectState>;
13
+ export declare function pendingEffect(connection: SqlConnection, attempt: {
14
+ readonly intent: Undigested;
15
+ readonly purpose: Purpose;
16
+ }): Promise<DeliveryIntent>;
17
+ export interface Neighbours {
18
+ readonly runs: Readonly<Record<string, RunState>>;
19
+ readonly details: Readonly<Record<string, RunDetails>>;
20
+ readonly intents: readonly EffectIntent[];
21
+ }
22
+ export declare function neighbours(connection: SqlConnection, scope: {
23
+ readonly runId: string;
24
+ readonly effects: EffectState;
25
+ }): Promise<Neighbours>;
@@ -0,0 +1,84 @@
1
+ import { detailColumns, detailRow } from "../../storage/decision-rows.js";
2
+ import { integer, runRow, text, } from "../../storage/domain-rows.js";
3
+ import { storedRun } from "../authority-restore.js";
4
+ import { storedDetails } from "../decision-restore.js";
5
+ import { budgetColumns, budgetRow, leaseColumns, leaseRow, operationColumns, operationRow, } from "../../storage/effect-rows.js";
6
+ import { storedEffects } from "../effect-restore.js";
7
+ const candidateColumns = operationColumns
8
+ .split(", ")
9
+ .map((name) => `p.${name}`)
10
+ .join(", ");
11
+ const oldestElsewhere = "p.status = 'waiting' AND r.status = 'running' AND p.run_id != ? AND NOT EXISTS (SELECT 1 FROM operations q JOIN runs s ON s.run_id = q.run_id WHERE q.lease_key = p.lease_key AND q.status = 'waiting' AND s.status = 'running' AND q.run_id != ? AND q.wait_sequence < p.wait_sequence)";
12
+ async function candidates(connection, scope) {
13
+ const { runId, capacity } = scope;
14
+ const source = `SELECT ${candidateColumns} FROM operations p JOIN runs r ON r.run_id = p.run_id WHERE ${oldestElsewhere}`;
15
+ return [
16
+ ...(await connection.all(`${source} AND NOT EXISTS (SELECT 1 FROM leases l WHERE l.resource_key = p.lease_key AND l.state != 'released') ORDER BY p.wait_sequence LIMIT ?`, [runId, runId, capacity])),
17
+ ...(await connection.all(`${source} AND p.lease_key IN (SELECT l.resource_key FROM leases l JOIN operations o ON o.operation_id = l.operation_id WHERE o.run_id = ? AND l.state != 'released') ORDER BY p.wait_sequence`, [runId, runId, runId])),
18
+ ];
19
+ }
20
+ const open = "status NOT IN ('refused', 'completed', 'failed', 'stopped', 'cancelled')";
21
+ async function operations(connection, scope) {
22
+ const rows = [
23
+ ...(await connection.all(`SELECT ${operationColumns} FROM operations WHERE run_id = ? AND ${open} ORDER BY requested_sequence`, [scope.runId])),
24
+ ];
25
+ for (const operationId of scope.operations)
26
+ rows.push(...(await connection.all(`SELECT ${operationColumns} FROM operations WHERE operation_id = ?`, [operationId])));
27
+ rows.push(...(await candidates(connection, scope)));
28
+ return [
29
+ ...new Map(rows.map(operationRow).map((row) => [row.operationId, row])).values(),
30
+ ];
31
+ }
32
+ async function leases(connection, keys) {
33
+ const rows = [];
34
+ for (const key of new Set(keys))
35
+ rows.push(...(await connection.all(`SELECT ${leaseColumns} FROM leases WHERE resource_key = ?`, [key])));
36
+ return rows.map(leaseRow);
37
+ }
38
+ export async function effectTurn(connection, scope) {
39
+ const loaded = await operations(connection, scope);
40
+ const budgets = [];
41
+ for (const runId of new Set([scope.runId, ...loaded.map((row) => row.runId)]))
42
+ budgets.push(...(await connection.all(`SELECT ${budgetColumns} FROM run_budgets WHERE run_id = ?`, [runId])));
43
+ return storedEffects({
44
+ budgets: budgets.map(budgetRow),
45
+ operations: loaded,
46
+ leases: await leases(connection, [
47
+ ...loaded.map((row) => row.leaseKey),
48
+ ...scope.keys,
49
+ ]),
50
+ stops: [],
51
+ holding: integer(await connection.get("SELECT count(*) AS holding FROM operations WHERE status IN ('dispatch-pending', 'running', 'recovering', 'blocked')"), "holding"),
52
+ });
53
+ }
54
+ export async function pendingEffect(connection, attempt) {
55
+ const { intent, purpose } = attempt;
56
+ const row = await connection.get("SELECT p.input_digest, p.capability, p.method, p.target, p.payload, l.generation FROM operations p JOIN leases l ON l.resource_key = p.lease_key WHERE p.operation_id = ?", [intent.operationId]);
57
+ return {
58
+ ...intent,
59
+ purpose,
60
+ inputDigest: text(row, "input_digest"),
61
+ leaseGeneration: integer(row, "generation"),
62
+ capability: text(row, "capability"),
63
+ method: text(row, "method"),
64
+ target: text(row, "target"),
65
+ payload: text(row, "payload"),
66
+ };
67
+ }
68
+ export async function neighbours(connection, scope) {
69
+ const others = Object.values(scope.effects.operations).filter((operation) => operation.runId !== scope.runId);
70
+ const runs = {};
71
+ const details = {};
72
+ for (const runId of new Set(others.map((operation) => operation.runId))) {
73
+ runs[runId] = storedRun(runRow(await connection.get("SELECT run_id, status, revision, workflow, paused_from, gates, sequence FROM runs WHERE run_id = ?", [runId])));
74
+ details[runId] = storedDetails(detailRow(await connection.get(`SELECT ${detailColumns} FROM run_details WHERE run_id = ?`, [runId])));
75
+ }
76
+ const intents = [];
77
+ for (const operation of others)
78
+ intents.push(...(await connection.all("SELECT operation_id FROM outbox WHERE operation_id = ? AND released_sequence IS NULL", [operation.operationId])).map(() => ({
79
+ kind: "protected-effect",
80
+ runId: operation.runId,
81
+ operationId: operation.operationId,
82
+ })));
83
+ return { runs, details, intents };
84
+ }
@@ -0,0 +1,6 @@
1
+ import { type SqlConnection } from "../../storage/domain-rows.ts";
2
+ import type { AvailableManifest } from "./delivery-intents.ts";
3
+ export declare function pinned(connection: SqlConnection, check: {
4
+ readonly workflow: string;
5
+ readonly available: AvailableManifest | undefined;
6
+ }): Promise<boolean>;
@@ -0,0 +1,12 @@
1
+ import { readExecutionManifest, resumePinned } from "../../execution-pin.js";
2
+ import { text } from "../../storage/domain-rows.js";
3
+ export async function pinned(connection, check) {
4
+ const { workflow, available } = check;
5
+ if (available === undefined)
6
+ return true;
7
+ const stored = readExecutionManifest(JSON.parse(text(await connection.get("SELECT manifest FROM definitions WHERE pin = ?", [
8
+ workflow,
9
+ ]), "manifest")));
10
+ const current = available(stored);
11
+ return (current !== undefined && resumePinned(stored, current).kind === "admitted");
12
+ }
@@ -0,0 +1,23 @@
1
+ import { type ActorClass, type Database, type InstrumentationEvent, type SolidObjectsConfiguration, type SolidObjectsRuntime } from "solid-objects";
2
+ import { type AuthorityTiming } from "./authority-settings.ts";
3
+ import type { StrandingWatchdog } from "./authority-watchdog.ts";
4
+ export interface FailedDelivery {
5
+ readonly operationId: string;
6
+ readonly effectId: string;
7
+ }
8
+ export declare function failureCounter(): (delivery: FailedDelivery) => number;
9
+ export declare function wallClock(): string;
10
+ export declare function runtimeSettings(parts: {
11
+ readonly timing: AuthorityTiming;
12
+ readonly options: {
13
+ readonly log?: (line: string) => void;
14
+ readonly instrumentation?: (event: InstrumentationEvent) => void;
15
+ };
16
+ readonly broker: object;
17
+ readonly watchdog: StrandingWatchdog;
18
+ }): Partial<SolidObjectsConfiguration>;
19
+ export declare function registeredRuntime(registration: {
20
+ readonly database: Database;
21
+ readonly actor: ActorClass;
22
+ readonly settings: Partial<SolidObjectsConfiguration>;
23
+ }): SolidObjectsRuntime;
@@ -0,0 +1,34 @@
1
+ import { createRuntime, } from "solid-objects";
2
+ import { persistChange } from "../../storage/domain-changes.js";
3
+ import { persistAction } from "./authority-actor.js";
4
+ import { brokerAuthorization } from "./authority-policy.js";
5
+ import { librarySettings } from "./authority-settings.js";
6
+ export function failureCounter() {
7
+ const failed = new Map();
8
+ return ({ operationId, effectId }) => {
9
+ const effects = failed.get(operationId) ?? new Set();
10
+ failed.set(operationId, effects.add(effectId));
11
+ return effects.size;
12
+ };
13
+ }
14
+ export function wallClock() {
15
+ return new Date().toISOString();
16
+ }
17
+ export function runtimeSettings(parts) {
18
+ const { timing, options, broker, watchdog } = parts;
19
+ return {
20
+ ...librarySettings(timing, options.log),
21
+ ...brokerAuthorization(broker),
22
+ instrumentation: (event) => {
23
+ watchdog.observe(event);
24
+ options.instrumentation?.(event);
25
+ },
26
+ };
27
+ }
28
+ export function registeredRuntime(registration) {
29
+ const { database, actor, settings } = registration;
30
+ const runtime = createRuntime({ database, ...settings });
31
+ runtime.register(actor);
32
+ runtime.registerCommitAction(persistAction, (change, context) => persistChange(change, context.connection));
33
+ return runtime;
34
+ }
@@ -0,0 +1,20 @@
1
+ import type { AuthorityState } from "../../authority/reducer.ts";
2
+ import { type StopSubject } from "../../authority/stop-sequence.ts";
3
+ import { type DeliveryIntent } from "./delivery-intents.ts";
4
+ import type { Stopping } from "./stop-turn.ts";
5
+ export interface ClosedRow {
6
+ readonly effectId: string;
7
+ readonly outcome: string;
8
+ }
9
+ export interface StopPlanning {
10
+ readonly stopping: Stopping;
11
+ readonly runId: string;
12
+ readonly closed: readonly ClosedRow[];
13
+ readonly cancelledNow: readonly number[];
14
+ readonly stopLimit: number;
15
+ readonly stopSupported: boolean;
16
+ readonly opening: boolean;
17
+ readonly rejected: ReadonlySet<string>;
18
+ }
19
+ export declare function presentSubjects(state: AuthorityState, planning: Pick<StopPlanning, "stopping" | "closed">): readonly StopSubject[];
20
+ export declare function stopIntents(state: AuthorityState, planning: StopPlanning): readonly DeliveryIntent[];
@@ -0,0 +1,46 @@
1
+ import { stopAttempts, } from "../../authority/stop-sequence.js";
2
+ import { observingIntent, protectedIntent, } from "./delivery-intents.js";
3
+ function present(state, planning) {
4
+ const { subject, closed } = planning;
5
+ const operation = state.effects.operations[subject.operationId];
6
+ return {
7
+ ...subject,
8
+ attempts: subject.attempts.map((attempt) => ({
9
+ ...attempt,
10
+ outcome: closed.find((row) => row.effectId === attempt.effectId)?.outcome ??
11
+ attempt.outcome,
12
+ })),
13
+ status: operation?.status ?? subject.status,
14
+ receipt: operation?.receipt ?? subject.receipt,
15
+ stopped: subject.stopped || state.effects.stops[subject.operationId] !== undefined,
16
+ };
17
+ }
18
+ const kinds = ["start-run", "continue-run"];
19
+ function intentOf(state, attempt) {
20
+ const { runId, operationId, purpose } = attempt;
21
+ const kind = kinds.find((candidate) => candidate === attempt.kind);
22
+ if (kind === undefined)
23
+ return protectedIntent(state, {
24
+ intent: { kind: "protected-effect", runId, operationId },
25
+ purpose,
26
+ });
27
+ return [
28
+ observingIntent(state, { intent: { kind, runId, operationId }, purpose }),
29
+ ];
30
+ }
31
+ export function presentSubjects(state, planning) {
32
+ return planning.stopping.subjects.map((subject) => present(state, { subject, closed: planning.closed }));
33
+ }
34
+ export function stopIntents(state, planning) {
35
+ const { runId, stopping } = planning;
36
+ if (state.runs[runId]?.status !== "cancelled")
37
+ return [];
38
+ const subjects = presentSubjects(state, planning);
39
+ return stopAttempts(subjects, {
40
+ cancelledSequence: planning.cancelledNow[0] ?? stopping.cancelledSequence ?? 0,
41
+ stopLimit: planning.stopLimit,
42
+ stopSupported: planning.stopSupported,
43
+ opening: planning.opening,
44
+ rejected: planning.rejected,
45
+ }).flatMap((attempt) => intentOf(state, { ...attempt, runId }));
46
+ }
@@ -0,0 +1,17 @@
1
+ import type { StopSubject } from "../../authority/stop-sequence.ts";
2
+ import { type SqlConnection } from "../../storage/domain-rows.ts";
3
+ export interface Stopping {
4
+ readonly subjects: readonly StopSubject[];
5
+ readonly cancelledSequence: number | null;
6
+ }
7
+ export declare const noStopping: Stopping;
8
+ export declare function stopping(connection: SqlConnection, runId: string): Promise<Stopping>;
9
+ export declare function turnStopping(connection: SqlConnection, scope: {
10
+ readonly runId: string;
11
+ readonly status: string | undefined;
12
+ readonly kind: string;
13
+ }): Promise<Stopping>;
14
+ export declare function droppedRuns(connection: SqlConnection, rule: {
15
+ readonly limit: number;
16
+ readonly stopSupported: boolean;
17
+ }): Promise<readonly string[]>;
@@ -0,0 +1,42 @@
1
+ import { integer, optionalInteger, optionalText, text, } from "../../storage/domain-rows.js";
2
+ export const noStopping = { subjects: [], cancelledSequence: null };
3
+ function attemptOf(row) {
4
+ return {
5
+ effectId: text(row, "effect_id"),
6
+ purpose: text(row, "purpose"),
7
+ outcome: optionalText(row, "outcome"),
8
+ stagedSequence: integer(row, "staged_sequence"),
9
+ };
10
+ }
11
+ const closed = "NOT EXISTS (SELECT 1 FROM deliveries x WHERE x.operation_id = o.operation_id AND x.outcome IS NULL)";
12
+ const reported = "EXISTS (SELECT 1 FROM stopped_operations s WHERE s.operation_id = o.operation_id)";
13
+ const finalStatuses = "'refused', 'completed', 'failed', 'stopped', 'cancelled'";
14
+ export async function stopping(connection, runId) {
15
+ const rows = await connection.all(`SELECT o.operation_id, o.kind, d.effect_id, coalesce(a.purpose, 'dispatch') AS purpose, d.outcome, d.staged_sequence, p.status, p.receipt, ${reported} AS stopped FROM outbox o JOIN deliveries d ON d.operation_id = o.operation_id LEFT JOIN dispatch_attempts a ON a.effect_id = d.effect_id LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = ? AND ((coalesce(p.status, '') NOT IN (${finalStatuses}) AND NOT ${reported}) OR NOT ${closed}) ORDER BY d.staged_sequence, d.rowid`, [runId]);
16
+ const grouped = Map.groupBy(rows, (row) => text(row, "operation_id"));
17
+ return {
18
+ subjects: [...grouped].map(([operationId, attempts]) => ({
19
+ operationId,
20
+ kind: text(attempts[0], "kind"),
21
+ attempts: attempts.map(attemptOf),
22
+ status: optionalText(attempts[0], "status"),
23
+ receipt: optionalText(attempts[0], "receipt"),
24
+ stopped: integer(attempts[0], "stopped") === 1,
25
+ })),
26
+ cancelledSequence: optionalInteger(await connection.get("SELECT max(sequence) AS sequence FROM events WHERE run_id = ? AND type = 'run.cancelled'", [runId]), "sequence"),
27
+ };
28
+ }
29
+ export function turnStopping(connection, scope) {
30
+ const dropping = scope.status === "cancelled" || scope.kind === "cancel-run";
31
+ return dropping
32
+ ? stopping(connection, scope.runId)
33
+ : Promise.resolve(noStopping);
34
+ }
35
+ const sent = "EXISTS (SELECT 1 FROM deliveries d WHERE d.operation_id = o.operation_id AND d.outcome = 'sent')";
36
+ const last = "(SELECT d.outcome FROM deliveries d WHERE d.operation_id = o.operation_id ORDER BY d.staged_sequence DESC, d.rowid DESC LIMIT 1)";
37
+ const effectDue = `o.kind = 'protected-effect' AND p.status NOT IN (${finalStatuses}) AND (p.receipt IS NULL OR ?1 = 1 OR p.status IN ('recovering', 'blocked'))`;
38
+ const runDue = `o.kind != 'protected-effect' AND NOT ${reported} AND ((${sent} AND ?1 = 1) OR (NOT ${sent} AND ${last} NOT IN ('withheld', 'blocked', 'absent')))`;
39
+ export async function droppedRuns(connection, rule) {
40
+ const rows = await connection.all(`SELECT r.run_id FROM runs r WHERE r.status = 'cancelled' AND EXISTS (SELECT 1 FROM outbox o LEFT JOIN operations p ON p.operation_id = o.operation_id WHERE o.run_id = r.run_id AND ${closed} AND ((${effectDue}) OR (${runDue}))) ORDER BY r.run_id LIMIT ?2`, [rule.stopSupported ? 1 : 0, rule.limit]);
41
+ return rows.map((row) => text(row, "run_id"));
42
+ }
@@ -0,0 +1,31 @@
1
+ import type { AuthorityState, CommandResult } from "../../authority/reducer.ts";
2
+ export type Row = Readonly<Record<string, unknown>>;
3
+ export interface ChangeDraft {
4
+ readonly previous: number;
5
+ readonly sequence: number;
6
+ readonly definitions: readonly Row[];
7
+ readonly events: readonly Row[];
8
+ readonly runs: readonly Row[];
9
+ readonly commands: readonly Row[];
10
+ readonly added: readonly Row[];
11
+ readonly released: readonly Row[];
12
+ readonly closed: readonly Row[];
13
+ readonly gates: readonly Row[];
14
+ readonly details: readonly Row[];
15
+ readonly documents: readonly Row[];
16
+ readonly budgets: readonly Row[];
17
+ readonly operations: readonly Row[];
18
+ readonly leases: readonly Row[];
19
+ readonly evidence: readonly Row[];
20
+ readonly stops: readonly Row[];
21
+ readonly completes_adoption?: true;
22
+ }
23
+ export type Accepted = Extract<CommandResult, {
24
+ kind: "accepted";
25
+ }>;
26
+ export declare function unchanged(state: AuthorityState, closed: readonly Row[]): ChangeDraft;
27
+ export declare function unchangedAt(sequence: number, closed: readonly Row[]): ChangeDraft;
28
+ export declare function draft(result: Accepted, extra: Pick<ChangeDraft, "definitions" | "closed" | "documents"> & {
29
+ readonly before: AuthorityState;
30
+ }): ChangeDraft;
31
+ export declare function merged(first: ChangeDraft, later: readonly ChangeDraft[]): ChangeDraft;