cloving 0.3.20 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +606 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +271 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +29 -0
  32. package/dist/src/authority/reconciliation.js +156 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +124 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +67 -0
  78. package/dist/src/broker/actor/authority-session.js +251 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/analysis-batches.d.ts +24 -0
  138. package/dist/src/chats/analysis-batches.js +83 -0
  139. package/dist/src/chats/analysis-contract.d.ts +80 -0
  140. package/dist/src/chats/analysis-contract.js +16 -0
  141. package/dist/src/chats/analysis-data.d.ts +3 -0
  142. package/dist/src/chats/analysis-data.js +85 -0
  143. package/dist/src/chats/analysis-input.d.ts +12 -0
  144. package/dist/src/chats/analysis-input.js +83 -0
  145. package/dist/src/chats/analysis-links.d.ts +2 -0
  146. package/dist/src/chats/analysis-links.js +25 -0
  147. package/dist/src/chats/analysis-prompt.d.ts +10 -0
  148. package/dist/src/chats/analysis-prompt.js +16 -0
  149. package/dist/src/chats/analysis-proposal.d.ts +2 -0
  150. package/dist/src/chats/analysis-proposal.js +32 -0
  151. package/dist/src/chats/analysis-provenance.d.ts +4 -0
  152. package/dist/src/chats/analysis-provenance.js +99 -0
  153. package/dist/src/chats/analysis-shape.d.ts +3 -0
  154. package/dist/src/chats/analysis-shape.js +228 -0
  155. package/dist/src/chats/analysis.d.ts +3 -0
  156. package/dist/src/chats/analysis.js +42 -0
  157. package/dist/src/chats/corpus-input.d.ts +5 -0
  158. package/dist/src/chats/corpus-input.js +288 -0
  159. package/dist/src/chats/destination.d.ts +4 -0
  160. package/dist/src/chats/destination.js +96 -0
  161. package/dist/src/chats/import.d.ts +15 -0
  162. package/dist/src/chats/import.js +243 -0
  163. package/dist/src/chats/input-file.d.ts +3 -0
  164. package/dist/src/chats/input-file.js +32 -0
  165. package/dist/src/chats/normalize.d.ts +29 -0
  166. package/dist/src/chats/normalize.js +155 -0
  167. package/dist/src/chats/previous-import.d.ts +5 -0
  168. package/dist/src/chats/previous-import.js +34 -0
  169. package/dist/src/chats/reader.d.ts +21 -0
  170. package/dist/src/chats/reader.js +118 -0
  171. package/dist/src/chats/redact-import.d.ts +14 -0
  172. package/dist/src/chats/redact-import.js +141 -0
  173. package/dist/src/chats/redaction.d.ts +41 -0
  174. package/dist/src/chats/redaction.js +161 -0
  175. package/dist/src/chats/revision-input.d.ts +3 -0
  176. package/dist/src/chats/revision-input.js +180 -0
  177. package/dist/src/chats/revision.d.ts +48 -0
  178. package/dist/src/chats/revision.js +94 -0
  179. package/dist/src/chats/selection.d.ts +25 -0
  180. package/dist/src/chats/selection.js +109 -0
  181. package/dist/src/chats/source.d.ts +23 -0
  182. package/dist/src/chats/source.js +135 -0
  183. package/dist/src/chats/structure.d.ts +57 -0
  184. package/dist/src/chats/structure.js +216 -0
  185. package/dist/src/cli/arguments.d.ts +31 -0
  186. package/dist/src/cli/arguments.js +235 -0
  187. package/dist/src/cli/client.d.ts +16 -0
  188. package/dist/src/cli/client.js +159 -0
  189. package/dist/src/cli/commands.d.ts +17 -0
  190. package/dist/src/cli/commands.js +271 -0
  191. package/dist/src/cli/main.d.ts +2 -0
  192. package/dist/src/cli/main.js +127 -0
  193. package/dist/src/cli/render.d.ts +10 -0
  194. package/dist/src/cli/render.js +254 -0
  195. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  196. package/dist/src/cli/runtime-arguments.js +248 -0
  197. package/dist/src/cli/runtime-directory.d.ts +4 -0
  198. package/dist/src/cli/runtime-directory.js +25 -0
  199. package/dist/src/cli/toolchain.d.ts +3 -0
  200. package/dist/src/cli/toolchain.js +74 -0
  201. package/dist/src/cli/usage-render.d.ts +3 -0
  202. package/dist/src/cli/usage-render.js +28 -0
  203. package/dist/src/cli/usage.d.ts +5 -0
  204. package/dist/src/cli/usage.js +156 -0
  205. package/dist/src/cli/validate.d.ts +38 -0
  206. package/dist/src/cli/validate.js +116 -0
  207. package/dist/src/cli/watch-actions.d.ts +10 -0
  208. package/dist/src/cli/watch-actions.js +58 -0
  209. package/dist/src/cli/watch-board-view.d.ts +54 -0
  210. package/dist/src/cli/watch-board-view.js +201 -0
  211. package/dist/src/cli/watch-board.d.ts +15 -0
  212. package/dist/src/cli/watch-board.js +179 -0
  213. package/dist/src/cli/watch-card-client.d.ts +1 -0
  214. package/dist/src/cli/watch-card-client.js +44 -0
  215. package/dist/src/cli/watch-card-forms.d.ts +2 -0
  216. package/dist/src/cli/watch-card-forms.js +33 -0
  217. package/dist/src/cli/watch-card-reply.d.ts +5 -0
  218. package/dist/src/cli/watch-card-reply.js +34 -0
  219. package/dist/src/cli/watch-card-view.d.ts +40 -0
  220. package/dist/src/cli/watch-card-view.js +86 -0
  221. package/dist/src/cli/watch-client.d.ts +1 -0
  222. package/dist/src/cli/watch-client.js +118 -0
  223. package/dist/src/cli/watch-element.d.ts +11 -0
  224. package/dist/src/cli/watch-element.js +6 -0
  225. package/dist/src/cli/watch-model.d.ts +29 -0
  226. package/dist/src/cli/watch-model.js +278 -0
  227. package/dist/src/cli/watch-navigation.d.ts +9 -0
  228. package/dist/src/cli/watch-navigation.js +40 -0
  229. package/dist/src/cli/watch-page.d.ts +1 -0
  230. package/dist/src/cli/watch-page.js +258 -0
  231. package/dist/src/cli/watch-paths.d.ts +2 -0
  232. package/dist/src/cli/watch-paths.js +52 -0
  233. package/dist/src/cli/watch-phases.d.ts +7 -0
  234. package/dist/src/cli/watch-phases.js +148 -0
  235. package/dist/src/cli/watch-pr-board.d.ts +3 -0
  236. package/dist/src/cli/watch-pr-board.js +26 -0
  237. package/dist/src/cli/watch-pr-command.d.ts +15 -0
  238. package/dist/src/cli/watch-pr-command.js +37 -0
  239. package/dist/src/cli/watch-pr-identity.d.ts +20 -0
  240. package/dist/src/cli/watch-pr-identity.js +62 -0
  241. package/dist/src/cli/watch-pr-observer.d.ts +19 -0
  242. package/dist/src/cli/watch-pr-observer.js +108 -0
  243. package/dist/src/cli/watch-pr-settings.d.ts +8 -0
  244. package/dist/src/cli/watch-pr-settings.js +47 -0
  245. package/dist/src/cli/watch-reads.d.ts +28 -0
  246. package/dist/src/cli/watch-reads.js +248 -0
  247. package/dist/src/cli/watch-render.d.ts +153 -0
  248. package/dist/src/cli/watch-render.js +102 -0
  249. package/dist/src/cli/watch-run-input.d.ts +14 -0
  250. package/dist/src/cli/watch-run-input.js +49 -0
  251. package/dist/src/cli/watch-server.d.ts +13 -0
  252. package/dist/src/cli/watch-server.js +214 -0
  253. package/dist/src/cli/watch-start-view.d.ts +18 -0
  254. package/dist/src/cli/watch-start-view.js +77 -0
  255. package/dist/src/cli/watch-stream.d.ts +11 -0
  256. package/dist/src/cli/watch-stream.js +128 -0
  257. package/dist/src/cli/watch-turn.d.ts +30 -0
  258. package/dist/src/cli/watch-turn.js +135 -0
  259. package/dist/src/cli/watch-usage.d.ts +6 -0
  260. package/dist/src/cli/watch-usage.js +65 -0
  261. package/dist/src/cli/watch-view.d.ts +54 -0
  262. package/dist/src/cli/watch-view.js +267 -0
  263. package/dist/src/cli.d.ts +2 -0
  264. package/dist/src/cli.js +104 -0
  265. package/dist/src/daemon/analysis-launch.d.ts +5 -0
  266. package/dist/src/daemon/analysis-launch.js +81 -0
  267. package/dist/src/daemon/analysis-token.d.ts +6 -0
  268. package/dist/src/daemon/analysis-token.js +88 -0
  269. package/dist/src/daemon/analysis-worker.d.ts +22 -0
  270. package/dist/src/daemon/analysis-worker.js +219 -0
  271. package/dist/src/daemon/chats-files.d.ts +15 -0
  272. package/dist/src/daemon/chats-files.js +113 -0
  273. package/dist/src/daemon/chats-worker.d.ts +12 -0
  274. package/dist/src/daemon/chats-worker.js +200 -0
  275. package/dist/src/daemon/claude-turn.d.ts +38 -0
  276. package/dist/src/daemon/claude-turn.js +216 -0
  277. package/dist/src/daemon/claude-worker.d.ts +29 -0
  278. package/dist/src/daemon/claude-worker.js +276 -0
  279. package/dist/src/daemon/codex-stream.d.ts +4 -0
  280. package/dist/src/daemon/codex-stream.js +129 -0
  281. package/dist/src/daemon/daemon.d.ts +49 -0
  282. package/dist/src/daemon/daemon.js +195 -0
  283. package/dist/src/daemon/delivery-router.d.ts +10 -0
  284. package/dist/src/daemon/delivery-router.js +34 -0
  285. package/dist/src/daemon/github-calls.d.ts +29 -0
  286. package/dist/src/daemon/github-calls.js +127 -0
  287. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  288. package/dist/src/daemon/github-issue-methods.js +99 -0
  289. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  290. package/dist/src/daemon/github-issue-privacy.js +131 -0
  291. package/dist/src/daemon/github-merge.d.ts +18 -0
  292. package/dist/src/daemon/github-merge.js +259 -0
  293. package/dist/src/daemon/github-methods.d.ts +5 -0
  294. package/dist/src/daemon/github-methods.js +202 -0
  295. package/dist/src/daemon/github-operation.d.ts +38 -0
  296. package/dist/src/daemon/github-operation.js +57 -0
  297. package/dist/src/daemon/github-ticket-status.d.ts +3 -0
  298. package/dist/src/daemon/github-ticket-status.js +268 -0
  299. package/dist/src/daemon/github-worker.d.ts +17 -0
  300. package/dist/src/daemon/github-worker.js +281 -0
  301. package/dist/src/daemon/host-environment.d.ts +8 -0
  302. package/dist/src/daemon/host-environment.js +14 -0
  303. package/dist/src/daemon/issue-queue.d.ts +10 -0
  304. package/dist/src/daemon/issue-queue.js +254 -0
  305. package/dist/src/daemon/notify-message.d.ts +14 -0
  306. package/dist/src/daemon/notify-message.js +48 -0
  307. package/dist/src/daemon/notify.d.ts +12 -0
  308. package/dist/src/daemon/notify.js +161 -0
  309. package/dist/src/daemon/operation-journal.d.ts +43 -0
  310. package/dist/src/daemon/operation-journal.js +55 -0
  311. package/dist/src/daemon/retrying-turn.d.ts +9 -0
  312. package/dist/src/daemon/retrying-turn.js +185 -0
  313. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  314. package/dist/src/daemon/ticket-registration.js +177 -0
  315. package/dist/src/daemon/ticket-source.d.ts +17 -0
  316. package/dist/src/daemon/ticket-source.js +36 -0
  317. package/dist/src/daemon/work-tree.d.ts +26 -0
  318. package/dist/src/daemon/work-tree.js +206 -0
  319. package/dist/src/effect-authorization.d.ts +21 -0
  320. package/dist/src/effect-authorization.js +14 -0
  321. package/dist/src/execution-pin.d.ts +4 -0
  322. package/dist/src/execution-pin.js +68 -0
  323. package/dist/src/host/start-delivery.d.ts +41 -0
  324. package/dist/src/host/start-delivery.js +68 -0
  325. package/dist/src/host/step-bridge-host.d.ts +79 -0
  326. package/dist/src/host/step-bridge-host.js +205 -0
  327. package/dist/src/host/step-claims.d.ts +31 -0
  328. package/dist/src/host/step-claims.js +85 -0
  329. package/dist/src/host/world-host.d.ts +21 -0
  330. package/dist/src/host/world-host.js +51 -0
  331. package/dist/src/host/world-reconciliation.d.ts +39 -0
  332. package/dist/src/host/world-reconciliation.js +81 -0
  333. package/dist/src/host/world-runs.d.ts +14 -0
  334. package/dist/src/host/world-runs.js +69 -0
  335. package/dist/src/operation-identity.d.ts +7 -0
  336. package/dist/src/operation-identity.js +59 -0
  337. package/dist/src/protocol.d.ts +35 -0
  338. package/dist/src/protocol.js +64 -0
  339. package/dist/src/resource-files.d.ts +1 -0
  340. package/dist/src/resource-files.js +29 -0
  341. package/dist/src/service/changes.d.ts +11 -0
  342. package/dist/src/service/changes.js +32 -0
  343. package/dist/src/service/decision-handler.d.ts +9 -0
  344. package/dist/src/service/decision-handler.js +233 -0
  345. package/dist/src/service/event-handler.d.ts +10 -0
  346. package/dist/src/service/event-handler.js +70 -0
  347. package/dist/src/service/expiry.d.ts +13 -0
  348. package/dist/src/service/expiry.js +53 -0
  349. package/dist/src/service/gateway.d.ts +21 -0
  350. package/dist/src/service/gateway.js +120 -0
  351. package/dist/src/service/registry.d.ts +40 -0
  352. package/dist/src/service/registry.js +13 -0
  353. package/dist/src/service/replies.d.ts +26 -0
  354. package/dist/src/service/replies.js +56 -0
  355. package/dist/src/service/run-handlers.d.ts +4 -0
  356. package/dist/src/service/run-handlers.js +263 -0
  357. package/dist/src/service/service.d.ts +58 -0
  358. package/dist/src/service/service.js +212 -0
  359. package/dist/src/service/submission-handler.d.ts +4 -0
  360. package/dist/src/service/submission-handler.js +206 -0
  361. package/dist/src/service/transport.d.ts +16 -0
  362. package/dist/src/service/transport.js +141 -0
  363. package/dist/src/service/worker-port.d.ts +85 -0
  364. package/dist/src/service/worker-port.js +126 -0
  365. package/dist/src/service/worker-totals.d.ts +3 -0
  366. package/dist/src/service/worker-totals.js +28 -0
  367. package/dist/src/step-bridge.d.ts +57 -0
  368. package/dist/src/step-bridge.js +4 -0
  369. package/dist/src/steps/decision-gate.d.ts +2 -0
  370. package/dist/src/steps/decision-gate.js +8 -0
  371. package/dist/src/steps/load-cycle.d.ts +10 -0
  372. package/dist/src/steps/load-cycle.js +11 -0
  373. package/dist/src/steps/protected-effect.d.ts +2 -0
  374. package/dist/src/steps/protected-effect.js +8 -0
  375. package/dist/src/storage/decision-rows.d.ts +54 -0
  376. package/dist/src/storage/decision-rows.js +72 -0
  377. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  378. package/dist/src/storage/decision-snapshots.js +25 -0
  379. package/dist/src/storage/domain-changes.d.ts +48 -0
  380. package/dist/src/storage/domain-changes.js +213 -0
  381. package/dist/src/storage/domain-rows.d.ts +85 -0
  382. package/dist/src/storage/domain-rows.js +129 -0
  383. package/dist/src/storage/domain-schema.d.ts +32 -0
  384. package/dist/src/storage/domain-schema.js +193 -0
  385. package/dist/src/storage/effect-changes.d.ts +5 -0
  386. package/dist/src/storage/effect-changes.js +105 -0
  387. package/dist/src/storage/effect-rows.d.ts +67 -0
  388. package/dist/src/storage/effect-rows.js +74 -0
  389. package/dist/src/storage/effect-schema.d.ts +1 -0
  390. package/dist/src/storage/effect-schema.js +59 -0
  391. package/dist/src/storage/statements.d.ts +9 -0
  392. package/dist/src/storage/statements.js +8 -0
  393. package/dist/src/submission.d.ts +42 -0
  394. package/dist/src/submission.js +71 -0
  395. package/dist/src/ticket-status.d.ts +8 -0
  396. package/dist/src/ticket-status.js +45 -0
  397. package/dist/src/token-prices.d.ts +19 -0
  398. package/dist/src/token-prices.js +76 -0
  399. package/dist/src/turn-profile.d.ts +13 -0
  400. package/dist/src/turn-profile.js +100 -0
  401. package/dist/src/worker-usage.d.ts +22 -0
  402. package/dist/src/worker-usage.js +44 -0
  403. package/dist/src/workflow-admission.d.ts +45 -0
  404. package/dist/src/workflow-admission.js +151 -0
  405. package/dist/src/workflow-candidate.d.ts +29 -0
  406. package/dist/src/workflow-candidate.js +59 -0
  407. package/dist/src/workflow-contracts.d.ts +29 -0
  408. package/dist/src/workflow-contracts.js +110 -0
  409. package/dist/src/workflow-declaration.d.ts +11 -0
  410. package/dist/src/workflow-declaration.js +59 -0
  411. package/dist/src/workflow-resources.d.ts +8 -0
  412. package/dist/src/workflow-resources.js +14 -0
  413. package/dist/src/workflows.d.ts +6 -0
  414. package/dist/src/workflows.js +4 -0
  415. package/dist/tools/compile-workflows.d.ts +1 -0
  416. package/dist/tools/compile-workflows.js +33 -0
  417. package/dist/tools/self-host-processes.d.ts +10 -0
  418. package/dist/tools/self-host-processes.js +156 -0
  419. package/dist/tools/self-host-workflows.d.ts +15 -0
  420. package/dist/tools/self-host-workflows.js +78 -0
  421. package/dist/tools/self-host.d.ts +1 -0
  422. package/dist/tools/self-host.js +261 -0
  423. package/dist/tools/self-update-host.d.ts +13 -0
  424. package/dist/tools/self-update-host.js +88 -0
  425. package/dist/tools/self-update.d.ts +11 -0
  426. package/dist/tools/self-update.js +177 -0
  427. package/dist/tools/workflow-manifest.d.ts +3 -0
  428. package/dist/tools/workflow-manifest.js +34 -0
  429. package/dist/workflows/analyze-chats.d.ts +10 -0
  430. package/dist/workflows/analyze-chats.declaration.json +9 -0
  431. package/dist/workflows/analyze-chats.js +73 -0
  432. package/dist/workflows/develop-prd.d.ts +7 -0
  433. package/dist/workflows/develop-prd.js +97 -0
  434. package/dist/workflows/develop-ticket.d.ts +9 -0
  435. package/dist/workflows/develop-ticket.js +202 -0
  436. package/dist/workflows/issue-labels.d.ts +16 -0
  437. package/dist/workflows/issue-labels.js +70 -0
  438. package/dist/workflows/ticket-prompts.d.ts +35 -0
  439. package/dist/workflows/ticket-prompts.js +133 -0
  440. package/package.json +84 -75
  441. package/dist/abstract_gpt/index.js +0 -55
  442. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  443. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  444. package/dist/cloving_gpt/adapters/claude.js +0 -128
  445. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  446. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  447. package/dist/cloving_gpt/adapters/index.js +0 -2
  448. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  449. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  450. package/dist/cloving_gpt/adapters/openai.js +0 -100
  451. package/dist/cloving_gpt/index.js +0 -192
  452. package/dist/commands/analyze.js +0 -47
  453. package/dist/commands/chat.js +0 -14
  454. package/dist/commands/check.js +0 -7
  455. package/dist/commands/commit.js +0 -44
  456. package/dist/commands/config.js +0 -167
  457. package/dist/commands/describe.js +0 -235
  458. package/dist/commands/generate/code.js +0 -21
  459. package/dist/commands/generate/commit.js +0 -11
  460. package/dist/commands/generate/context.js +0 -82
  461. package/dist/commands/generate/docs.js +0 -11
  462. package/dist/commands/generate/documentation.js +0 -11
  463. package/dist/commands/generate/fizzbuzz.js +0 -35
  464. package/dist/commands/generate/init.js +0 -15
  465. package/dist/commands/generate/review.js +0 -11
  466. package/dist/commands/generate/sh.js +0 -95
  467. package/dist/commands/generate/shell.js +0 -11
  468. package/dist/commands/generate/unit_tests.js +0 -11
  469. package/dist/commands/init.js +0 -13
  470. package/dist/commands/models.js +0 -22
  471. package/dist/commands/project/build.js +0 -88
  472. package/dist/commands/project/complete.js +0 -12
  473. package/dist/commands/project/init.js +0 -82
  474. package/dist/commands/project/plan.js +0 -108
  475. package/dist/commands/proxy.js +0 -11
  476. package/dist/commands/review.js +0 -50
  477. package/dist/commands/tokens.js +0 -75
  478. package/dist/commands/unit_tests.js +0 -150
  479. package/dist/commands/update.js +0 -7
  480. package/dist/file2.js +0 -4
  481. package/dist/index.js +0 -136
  482. package/dist/managers/BlockManager.js +0 -120
  483. package/dist/managers/ChatManager.js +0 -653
  484. package/dist/managers/ChunkManager.js +0 -32
  485. package/dist/managers/CodeManager.js +0 -185
  486. package/dist/managers/CommitManager.js +0 -78
  487. package/dist/managers/DocsManager.js +0 -88
  488. package/dist/managers/DocumentationManager.js +0 -114
  489. package/dist/managers/InitManager.js +0 -230
  490. package/dist/managers/ProxyManager.js +0 -210
  491. package/dist/managers/ReviewManager.js +0 -131
  492. package/dist/managers/ShellManager.js +0 -163
  493. package/dist/managers/StreamManager.js +0 -308
  494. package/dist/managers/UnitTestManager.js +0 -243
  495. package/dist/managers/src/managers/ProxyManager.js +0 -1
  496. package/dist/newfile.js +0 -2
  497. package/dist/package.json +0 -86
  498. package/dist/utils/command_utils.js +0 -384
  499. package/dist/utils/config_utils.js +0 -249
  500. package/dist/utils/gitUtils.js +0 -42
  501. package/dist/utils/git_utils.js +0 -217
  502. package/dist/utils/modelUtils.js +0 -7
  503. package/dist/utils/model_utils.js +0 -7
  504. package/dist/utils/prompt_utils.js +0 -333
  505. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  506. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  507. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  508. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  509. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  510. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  511. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  512. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  513. package/dist/utils/prompts/index.js +0 -27
  514. package/dist/utils/string_utils.js +0 -505
  515. package/dist/utils/types.js +0 -2
@@ -0,0 +1,38 @@
1
+ const instant = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{3})?Z$/;
2
+ function leap(year) {
3
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
4
+ }
5
+ function daysIn(year, month) {
6
+ if (month === 2)
7
+ return leap(year) ? 29 : 28;
8
+ return [4, 6, 9, 11].includes(month) ? 30 : 31;
9
+ }
10
+ function calendar(match) {
11
+ const year = Number(match[1]);
12
+ const month = Number(match[2]);
13
+ const bounds = [
14
+ [month, 1, 12],
15
+ [Number(match[3]), 1, daysIn(year, month)],
16
+ [Number(match[4]), 0, 23],
17
+ [Number(match[5]), 0, 59],
18
+ [Number(match[6]), 0, 59],
19
+ ];
20
+ return bounds.every(([value, minimum, maximum]) => value >= minimum && value <= maximum);
21
+ }
22
+ export function isInstant(value) {
23
+ if (typeof value !== "string")
24
+ return false;
25
+ const match = instant.exec(value);
26
+ return match !== null && calendar(match);
27
+ }
28
+ function milliseconds(value) {
29
+ return value.length === 20 ? `${value.slice(0, 19)}.000Z` : value;
30
+ }
31
+ export function notBefore(value, bound) {
32
+ return (isInstant(value) &&
33
+ isInstant(bound) &&
34
+ milliseconds(value) >= milliseconds(bound));
35
+ }
36
+ export function isAfter(value, bound) {
37
+ return notBefore(value, bound) && !notBefore(bound, value);
38
+ }
@@ -0,0 +1,15 @@
1
+ import { type EffectContext, type EffectResult, type EffectState, type Lease, type Operation } from "./operations.ts";
2
+ export declare function ownedLease(effects: EffectState, operation: Operation): Lease | undefined;
3
+ export declare function current(lease: Lease, event: {
4
+ readonly recordedAt: string;
5
+ }): boolean;
6
+ export declare function granted(effects: EffectState, context: EffectContext): EffectResult;
7
+ export declare function expired(effects: EffectState, context: EffectContext): EffectResult;
8
+ interface Promotable {
9
+ readonly effects: EffectState;
10
+ readonly runs: Readonly<Record<string, {
11
+ readonly status: string;
12
+ }>>;
13
+ }
14
+ export declare function promotions(state: Promotable, bound: number): readonly Operation[];
15
+ export {};
@@ -0,0 +1,113 @@
1
+ import { isAfter, notBefore } from "./instants.js";
2
+ import { count, field, rejected, withOperation, } from "./operations.js";
3
+ export function ownedLease(effects, operation) {
4
+ const lease = effects.leases[operation.leaseKey];
5
+ const owned = lease?.operationId === operation.operationId && lease.state !== "released";
6
+ return owned ? lease : undefined;
7
+ }
8
+ export function current(lease, event) {
9
+ return (lease.state === "held" && !notBefore(event.recordedAt, lease.expiresAt));
10
+ }
11
+ function grantRefusal(effects, grant) {
12
+ const { operation, event, runStatus } = grant;
13
+ if (operation.status !== "waiting")
14
+ return "operation-not-waiting";
15
+ if (runStatus !== "running")
16
+ return "run-not-running";
17
+ const lease = effects.leases[operation.leaseKey];
18
+ if (lease !== undefined && lease.state !== "released")
19
+ return "resource-held";
20
+ if (count(event, "leaseGeneration") !== (lease?.generation ?? 0) + 1)
21
+ return "stale-lease-generation";
22
+ if (effects.holding >= count(event, "capacity"))
23
+ return "capacity-exceeded";
24
+ if (!isAfter(field(event, "expiresAt"), event.recordedAt))
25
+ return "invalid-lease-expiry";
26
+ return undefined;
27
+ }
28
+ export function granted(effects, context) {
29
+ const { event } = context;
30
+ const operation = effects.operations[field(event, "operationId")];
31
+ if (operation?.runId !== event.runId)
32
+ return rejected("unknown-operation");
33
+ const refusal = grantRefusal(effects, { ...context, operation });
34
+ if (refusal !== undefined)
35
+ return rejected(refusal);
36
+ const lease = {
37
+ resourceKey: operation.leaseKey,
38
+ operationId: operation.operationId,
39
+ generation: count(event, "leaseGeneration"),
40
+ expiresAt: field(event, "expiresAt"),
41
+ state: "held",
42
+ grantedSequence: event.sequence,
43
+ };
44
+ return {
45
+ kind: "changed",
46
+ effects: {
47
+ ...withOperation(effects, {
48
+ ...operation,
49
+ status: "dispatch-pending",
50
+ reason: null,
51
+ waitSequence: null,
52
+ }),
53
+ leases: { ...effects.leases, [lease.resourceKey]: lease },
54
+ holding: effects.holding + 1,
55
+ },
56
+ added: [operation.operationId],
57
+ };
58
+ }
59
+ function expiryRefusal(lease, expiry) {
60
+ const { operation, event } = expiry;
61
+ const held = lease?.operationId === operation.operationId && lease.state === "held";
62
+ if (!held)
63
+ return "lease-not-held";
64
+ if (lease.generation !== count(event, "leaseGeneration"))
65
+ return "stale-lease-generation";
66
+ if (!notBefore(event.recordedAt, lease.expiresAt))
67
+ return "lease-not-expired";
68
+ return undefined;
69
+ }
70
+ const expiring = ["dispatch-pending", "running"];
71
+ export function expired(effects, context) {
72
+ const { event } = context;
73
+ const operation = effects.operations[field(event, "operationId")];
74
+ if (operation?.runId !== event.runId)
75
+ return rejected("unknown-operation");
76
+ const lease = effects.leases[operation.leaseKey];
77
+ const refusal = expiryRefusal(lease, { ...context, operation });
78
+ if (refusal !== undefined || lease === undefined)
79
+ return rejected(refusal ?? "lease-not-held");
80
+ const recovering = expiring.includes(operation.status)
81
+ ? { ...operation, status: "recovering", reason: "lease-expired" }
82
+ : operation;
83
+ return {
84
+ kind: "changed",
85
+ effects: {
86
+ ...withOperation(effects, recovering),
87
+ leases: {
88
+ ...effects.leases,
89
+ [lease.resourceKey]: { ...lease, state: "expired" },
90
+ },
91
+ },
92
+ };
93
+ }
94
+ function free(effects, leaseKey) {
95
+ const lease = effects.leases[leaseKey];
96
+ return lease === undefined || lease.state === "released";
97
+ }
98
+ export function promotions(state, bound) {
99
+ const { effects, runs } = state;
100
+ const waiting = Object.values(effects.operations)
101
+ .filter((operation) => operation.status === "waiting" &&
102
+ runs[operation.runId]?.status === "running" &&
103
+ free(effects, operation.leaseKey))
104
+ .sort((left, right) => (left.waitSequence ?? 0) - (right.waitSequence ?? 0) ||
105
+ (left.operationId < right.operationId ? -1 : 1));
106
+ const keys = new Set();
107
+ const oldest = waiting.filter((operation) => {
108
+ const first = !keys.has(operation.leaseKey);
109
+ keys.add(operation.leaseKey);
110
+ return first;
111
+ });
112
+ return oldest.slice(0, Math.max(0, bound - effects.holding));
113
+ }
@@ -0,0 +1,101 @@
1
+ export type OperationStatus = "refused" | "waiting" | "dispatch-pending" | "running" | "recovering" | "blocked" | "completed" | "failed" | "stopped" | "cancelled";
2
+ export interface Operation {
3
+ readonly runId: string;
4
+ readonly operationId: string;
5
+ readonly capability: string;
6
+ readonly method: string;
7
+ readonly target: string;
8
+ readonly payload: string;
9
+ readonly inputDigest: string;
10
+ readonly units: number;
11
+ readonly leaseKey: string;
12
+ readonly recoveryLimit: number;
13
+ readonly status: OperationStatus;
14
+ readonly reason: string | null;
15
+ readonly attempts: number;
16
+ readonly receipt: string | null;
17
+ readonly worker: string | null;
18
+ readonly result: string | null;
19
+ readonly requestedSequence: number;
20
+ readonly waitSequence: number | null;
21
+ readonly settledSequence: number | null;
22
+ }
23
+ export interface Lease {
24
+ readonly resourceKey: string;
25
+ readonly operationId: string;
26
+ readonly generation: number;
27
+ readonly expiresAt: string;
28
+ readonly state: "held" | "expired" | "released";
29
+ readonly grantedSequence: number;
30
+ }
31
+ export interface RunBudget {
32
+ readonly runId: string;
33
+ readonly limit: number;
34
+ readonly spent: number;
35
+ readonly capabilities: readonly string[];
36
+ readonly exhaustedSequence: number | null;
37
+ }
38
+ export interface StoppedOperation {
39
+ readonly runId: string;
40
+ readonly sequence: number;
41
+ }
42
+ export interface EffectState {
43
+ readonly budgets: Readonly<Record<string, RunBudget>>;
44
+ readonly operations: Readonly<Record<string, Operation>>;
45
+ readonly leases: Readonly<Record<string, Lease>>;
46
+ readonly holding: number;
47
+ readonly stops: Readonly<Record<string, StoppedOperation>>;
48
+ }
49
+ export declare const emptyEffects: EffectState;
50
+ export interface Disposition {
51
+ readonly operationId: string;
52
+ readonly disposition: string;
53
+ readonly reason: string | null;
54
+ }
55
+ export interface Evidence extends Disposition {
56
+ readonly sequence: number;
57
+ readonly runId: string;
58
+ }
59
+ export declare function evidenceOf(event: {
60
+ readonly sequence: number;
61
+ readonly runId: string;
62
+ }, disposition: Disposition | undefined): readonly Evidence[];
63
+ export interface EffectChange {
64
+ readonly kind: "changed";
65
+ readonly effects: EffectState;
66
+ readonly added?: readonly string[];
67
+ readonly released?: readonly string[];
68
+ readonly disposition?: Disposition;
69
+ }
70
+ export type EffectResult = EffectChange | {
71
+ readonly kind: "invalid";
72
+ readonly reason: string;
73
+ };
74
+ export interface EffectEvent {
75
+ readonly sequence: number;
76
+ readonly runId: string;
77
+ readonly recordedAt: string;
78
+ readonly payload: Readonly<Record<string, string>>;
79
+ }
80
+ export interface EffectContext {
81
+ readonly event: EffectEvent;
82
+ readonly runStatus: string;
83
+ }
84
+ export declare const runOperations: string[];
85
+ export declare function namesRunIntent(operationId: string, runId: string): boolean;
86
+ export declare function isHolding(operation: {
87
+ readonly status: string;
88
+ }): boolean;
89
+ export declare function isFinal(operation: Operation): boolean;
90
+ export declare function rejected(reason: string): EffectResult;
91
+ export declare function field(event: EffectEvent, name: string): string;
92
+ export declare function count(event: EffectEvent, name: string): number;
93
+ export declare function withOperation(effects: EffectState, operation: Operation): EffectState;
94
+ export declare function cancelledOperation(operation: Operation, cancellation: {
95
+ readonly reason: string;
96
+ readonly sequence: number;
97
+ }): Operation;
98
+ export declare function endedRun(effects: EffectState, event: {
99
+ readonly runId: string;
100
+ readonly sequence: number;
101
+ }): EffectState;
@@ -0,0 +1,75 @@
1
+ import { operationScope } from "../operation-identity.js";
2
+ export const emptyEffects = {
3
+ budgets: {},
4
+ operations: {},
5
+ leases: {},
6
+ holding: 0,
7
+ stops: {},
8
+ };
9
+ export function evidenceOf(event, disposition) {
10
+ if (disposition === undefined)
11
+ return [];
12
+ return [{ sequence: event.sequence, runId: event.runId, ...disposition }];
13
+ }
14
+ const holdingStatuses = [
15
+ "dispatch-pending",
16
+ "running",
17
+ "recovering",
18
+ "blocked",
19
+ ];
20
+ const finalStatuses = [
21
+ "refused",
22
+ "completed",
23
+ "failed",
24
+ "stopped",
25
+ "cancelled",
26
+ ];
27
+ export const runOperations = ["start-run", "continue-run"];
28
+ export function namesRunIntent(operationId, runId) {
29
+ const scope = operationScope(operationId);
30
+ return scope?.run === runId && runOperations.includes(scope.operation);
31
+ }
32
+ export function isHolding(operation) {
33
+ return holdingStatuses.includes(operation.status);
34
+ }
35
+ export function isFinal(operation) {
36
+ return finalStatuses.includes(operation.status);
37
+ }
38
+ export function rejected(reason) {
39
+ return { kind: "invalid", reason };
40
+ }
41
+ export function field(event, name) {
42
+ return event.payload[name] ?? "";
43
+ }
44
+ export function count(event, name) {
45
+ return Number(event.payload[name]);
46
+ }
47
+ export function withOperation(effects, operation) {
48
+ return {
49
+ ...effects,
50
+ operations: { ...effects.operations, [operation.operationId]: operation },
51
+ };
52
+ }
53
+ export function cancelledOperation(operation, cancellation) {
54
+ return {
55
+ ...operation,
56
+ status: "cancelled",
57
+ reason: cancellation.reason,
58
+ waitSequence: null,
59
+ settledSequence: cancellation.sequence,
60
+ };
61
+ }
62
+ export function endedRun(effects, event) {
63
+ return {
64
+ ...effects,
65
+ operations: Object.fromEntries(Object.entries(effects.operations).map(([operationId, operation]) => [
66
+ operationId,
67
+ operation.runId === event.runId && operation.status === "waiting"
68
+ ? cancelledOperation(operation, {
69
+ reason: "run-ended",
70
+ sequence: event.sequence,
71
+ })
72
+ : operation,
73
+ ])),
74
+ };
75
+ }
@@ -0,0 +1,29 @@
1
+ import { type AuthorityState } from "./transitions.ts";
2
+ export interface WorldRun {
3
+ readonly runId: string;
4
+ readonly receipt: string;
5
+ readonly status: string;
6
+ readonly outcome?: string;
7
+ readonly outcomeReason?: string;
8
+ readonly issueUpdate?: "failed";
9
+ readonly ticketStatus?: "complete" | "partial";
10
+ readonly operationId?: string | null;
11
+ readonly createdAt?: string;
12
+ }
13
+ export type WorldReport = {
14
+ readonly kind: "unknown-world-run" | "world-run-unreadable";
15
+ readonly runId: string;
16
+ readonly receipt: string;
17
+ } | {
18
+ readonly kind: "world-run-absent";
19
+ readonly runId: string;
20
+ readonly operationId: string;
21
+ };
22
+ export interface Reconciliation {
23
+ readonly commands: readonly Readonly<Record<string, unknown>>[];
24
+ readonly conflicts: readonly string[];
25
+ readonly reports: readonly WorldReport[];
26
+ }
27
+ type Reconciled = Pick<AuthorityState, "runs" | "intents" | "details" | "gates" | "commands">;
28
+ export declare function reconcile(state: Reconciled, worldRuns: readonly WorldRun[]): Reconciliation;
29
+ export {};
@@ -0,0 +1,156 @@
1
+ import { isTicketStatus } from "../ticket-status.js";
2
+ import { gateContinuation } from "./gate-reduction.js";
3
+ import { isBlockedReason } from "../workflow-contracts.js";
4
+ import { continues } from "./gates.js";
5
+ import { startOperation } from "./reduction.js";
6
+ import { terminal, } from "./transitions.js";
7
+ const progress = {
8
+ queued: { running: "mark-started", completed: "mark-started" },
9
+ running: { completed: "complete-run" },
10
+ };
11
+ const endings = {
12
+ failed: "world-run-failed",
13
+ cancelled: "world-run-cancelled",
14
+ };
15
+ export function reconcile(state, worldRuns) {
16
+ const observed = Map.groupBy(worldRuns, (world) => world.runId);
17
+ const known = Object.values(state.runs).map((run) => ({
18
+ run,
19
+ segments: (observed.get(run.runId) ?? []).toSorted((first, second) => created(first) < created(second) ? -1 : 1),
20
+ }));
21
+ return {
22
+ commands: known.flatMap((found) => planned(state, found)),
23
+ conflicts: known
24
+ .filter((found) => conflicting(found.segments))
25
+ .map((found) => found.run.runId),
26
+ reports: [
27
+ ...worldRuns.flatMap((world) => unusable(state, world)),
28
+ ...known.flatMap((found) => absent(state, found)),
29
+ ],
30
+ };
31
+ }
32
+ function unusable(state, world) {
33
+ const { runId, receipt } = world;
34
+ if (!Object.hasOwn(state.runs, runId))
35
+ return [{ kind: "unknown-world-run", runId, receipt }];
36
+ if (world.status !== "unreadable")
37
+ return [];
38
+ return [{ kind: "world-run-unreadable", runId, receipt }];
39
+ }
40
+ function dispatched(state, run) {
41
+ const pending = state.intents.map((intent) => intent.operationId);
42
+ const continued = Object.values(state.gates)
43
+ .filter((gate) => gate.runId === run.runId)
44
+ .filter(continues)
45
+ .map((gate) => gateContinuation(gate).operationId);
46
+ return [startOperation(run.runId), ...continued].filter((operationId) => !pending.includes(operationId));
47
+ }
48
+ function missing(state, found) {
49
+ const { run, segments } = found;
50
+ const tags = segments.map((world) => world.operationId ?? null);
51
+ if (terminal.includes(run.status) || tags.includes(null))
52
+ return [];
53
+ return dispatched(state, run).filter((operationId) => !tags.includes(operationId));
54
+ }
55
+ function absent(state, found) {
56
+ return missing(state, found).map((operationId) => ({
57
+ kind: "world-run-absent",
58
+ runId: found.run.runId,
59
+ operationId,
60
+ }));
61
+ }
62
+ function created(world) {
63
+ return `${world.createdAt ?? ""} ${world.receipt}`;
64
+ }
65
+ function conflicting(runs) {
66
+ const operations = runs.map((world) => world.operationId ?? null);
67
+ return (runs.length > 1 &&
68
+ (operations.includes(null) || new Set(operations).size < runs.length));
69
+ }
70
+ function planned(state, found) {
71
+ const { run, segments } = found;
72
+ const world = segments.at(-1);
73
+ if (!world || terminal.includes(run.status))
74
+ return [];
75
+ if (conflicting(segments))
76
+ return unsent(state, conflict(found));
77
+ const pending = state.intents.some((intent) => intent.runId === run.runId && intent.kind !== "protected-effect");
78
+ if (pending)
79
+ return [];
80
+ const failed = segments.find((segment) => Object.hasOwn(endings, segment.status));
81
+ if (failed)
82
+ return ended(state, {
83
+ run,
84
+ world: failed,
85
+ reason: String(endings[failed.status]),
86
+ });
87
+ return next(state, { ...found, world });
88
+ }
89
+ function next(state, observed) {
90
+ const { run, world } = observed;
91
+ const kind = progress[run.status]?.[world.status];
92
+ if (kind === undefined)
93
+ return [];
94
+ const waits = kind === "complete-run" && world.outcome === "waiting_for_decision";
95
+ if (!waits)
96
+ return [moved(kind, observed)];
97
+ const held = run.gates.length > 0 || missing(state, observed).length > 0;
98
+ if (held)
99
+ return [];
100
+ return ended(state, { run, world, reason: "world-run-waits-without-gate" });
101
+ }
102
+ function moved(kind, observed) {
103
+ const { run, world } = observed;
104
+ return {
105
+ kind,
106
+ commandId: `${kind}:${world.receipt}`,
107
+ runId: run.runId,
108
+ expectedRevision: run.revision,
109
+ ...(kind === "complete-run" ? completionOutcome(world) : {}),
110
+ };
111
+ }
112
+ function completionOutcome(world) {
113
+ const { outcome, outcomeReason } = world;
114
+ if (outcome !== "handoff_requested" && outcome !== "blocked")
115
+ return {};
116
+ if (outcome !== "blocked" || !isBlockedReason(outcomeReason))
117
+ return {
118
+ outcome,
119
+ ...(outcome === "handoff_requested" && world.issueUpdate === "failed"
120
+ ? { issueUpdate: world.issueUpdate }
121
+ : {}),
122
+ ...(outcome === "handoff_requested" && isTicketStatus(world.ticketStatus)
123
+ ? { ticketStatus: world.ticketStatus }
124
+ : {}),
125
+ };
126
+ return { outcome, outcomeReason };
127
+ }
128
+ function noted(observed, evidence) {
129
+ const { run, world, reason } = observed;
130
+ return {
131
+ kind: "report-observation",
132
+ commandId: `observe:${reason}:${world.receipt}`,
133
+ runId: run.runId,
134
+ condition: "infrastructure-failure",
135
+ reason,
136
+ evidence,
137
+ };
138
+ }
139
+ function unsent(state, command) {
140
+ const recorded = Object.hasOwn(state.commands, String(command["commandId"]));
141
+ return recorded ? [] : [command];
142
+ }
143
+ function conflict(found) {
144
+ const [world = { runId: "", receipt: "", status: "" }] = found.segments;
145
+ return noted({ run: found.run, world, reason: "world-run-conflict" }, found.segments
146
+ .slice(0, 2)
147
+ .map((segment) => `world-run:${segment.receipt}`)
148
+ .join("/"));
149
+ }
150
+ function ended(state, observed) {
151
+ const { run, world } = observed;
152
+ return [
153
+ ...unsent(state, noted(observed, `world-run:${world.receipt}`)),
154
+ ...(run.status === "paused" ? [] : [moved("fail-run", observed)]),
155
+ ];
156
+ }
@@ -0,0 +1,41 @@
1
+ import { type AuthorityEvent, type AuthorityState, type EffectIntent } from "./transitions.ts";
2
+ import { type Disposition, type Evidence } from "./operations.ts";
3
+ export type { AuthorityEvent, AuthorityState, EffectIntent, RunState, RunStatus, } from "./transitions.ts";
4
+ export type CommandResult = {
5
+ readonly kind: "accepted";
6
+ readonly events: readonly AuthorityEvent[];
7
+ readonly state: AuthorityState;
8
+ readonly intents: readonly EffectIntent[];
9
+ readonly disposition?: Disposition;
10
+ } | {
11
+ readonly kind: "duplicate";
12
+ readonly sequence: number;
13
+ } | {
14
+ readonly kind: "rejected";
15
+ readonly reason: string;
16
+ };
17
+ export declare const emptyAuthority: AuthorityState;
18
+ export declare function execute(state: AuthorityState, proposed: {
19
+ readonly command: unknown;
20
+ readonly recordedAt: string;
21
+ }): CommandResult;
22
+ export declare function rebuild(events: readonly unknown[]): AuthorityState;
23
+ export declare function applyEvent(state: AuthorityState, entry: {
24
+ readonly value: unknown;
25
+ readonly index: number;
26
+ }): {
27
+ readonly state: AuthorityState;
28
+ readonly event: AuthorityEvent;
29
+ readonly evidence: readonly Evidence[];
30
+ };
31
+ type Statuses = Readonly<Record<string, {
32
+ readonly status: string;
33
+ }>>;
34
+ export interface Eligibility {
35
+ readonly intents: readonly EffectIntent[];
36
+ readonly runs: Statuses;
37
+ readonly effects: {
38
+ readonly operations: Statuses;
39
+ };
40
+ }
41
+ export declare function eligibleIntents(state: Eligibility): readonly EffectIntent[];