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,233 @@
1
+ import { continues, gateKey } from "../authority/gates.js";
2
+ import { gateContinuation } from "../authority/reduction.js";
3
+ import { documentDigest } from "../broker/decision-restore.js";
4
+ import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, wholeNumber, } from "./replies.js";
5
+ const decisions = {
6
+ answer: "answered",
7
+ approve: "approved",
8
+ deny: "denied",
9
+ };
10
+ const feedbackBytes = 8_000;
11
+ const commands = {
12
+ question: ["answer"],
13
+ approval: ["approve", "deny"],
14
+ };
15
+ function decisionId(gate) {
16
+ return `${gate.runId}/${gate.gateId}`;
17
+ }
18
+ function label(gate) {
19
+ return gate.label === null ? null : `Q${String(gate.label)}`;
20
+ }
21
+ function typed(state) {
22
+ return Object.values(state.gates)
23
+ .filter((gate) => gate.kind !== "untyped")
24
+ .sort((left, right) => left.openedSequence - right.openedSequence);
25
+ }
26
+ function pending(state) {
27
+ return typed(state).filter((gate) => gate.outcome === null &&
28
+ ["waiting_gate", "paused"].includes(state.runs[gate.runId]?.status ?? ""));
29
+ }
30
+ export async function feedbackOf(context, scope) {
31
+ const denied = Object.values(scope.state.gates)
32
+ .filter((gate) => gate.runId === scope.runId &&
33
+ gate.outcome?.decision === "denied" &&
34
+ gate.outcome.answer !== null)
35
+ .sort((left, right) => left.openedSequence - right.openedSequence);
36
+ const shown = [];
37
+ for (const gate of denied) {
38
+ const text = await context.authority.queries.document(gate.outcome?.answer ?? "");
39
+ shown.push({
40
+ decisionId: `${gate.runId}/${gate.gateId}`,
41
+ text: text ?? "",
42
+ });
43
+ }
44
+ return shown;
45
+ }
46
+ async function described(context, shown) {
47
+ const { state, gate } = shown;
48
+ const { queries } = context.authority;
49
+ const opened = await queries.eventsAfter({
50
+ after: gate.openedSequence - 1,
51
+ limit: 1,
52
+ });
53
+ return {
54
+ decisionId: decisionId(gate),
55
+ label: label(gate),
56
+ type: gate.kind,
57
+ runId: gate.runId,
58
+ gateId: gate.gateId,
59
+ prompt: (await queries.document(gate.prompt ?? "")) ?? "",
60
+ allowed: commands[gate.kind] ?? [],
61
+ revision: gate.revision,
62
+ generation: gate.generation,
63
+ subjectDigest: gate.subject,
64
+ openedAt: opened.events[0]?.recordedAt ?? "",
65
+ expiresAt: gate.expiresAt,
66
+ context: [],
67
+ feedback: await feedbackOf(context, { state, runId: gate.runId }),
68
+ };
69
+ }
70
+ export async function questions(context, parameters) {
71
+ const { runId } = parameters;
72
+ const state = await context.authority.state();
73
+ const listed = pending(state).filter((gate) => runId === undefined || gate.runId === runId);
74
+ const views = [];
75
+ for (const gate of listed)
76
+ views.push(await described(context, { state, gate }));
77
+ return result("decision-list", { decisions: views });
78
+ }
79
+ function referenced(gates, reference) {
80
+ const matches = [
81
+ (gate) => decisionId(gate) === reference,
82
+ (gate) => label(gate) === reference,
83
+ (gate) => gate.runId === reference,
84
+ ].map((matcher) => gates.filter(matcher));
85
+ return matches.find((found) => found.length > 0) ?? [];
86
+ }
87
+ function refusedTarget(code, extra) {
88
+ return { kind: "refused", reply: failed(code, extra) };
89
+ }
90
+ function target(state, request) {
91
+ const { reference, command } = request;
92
+ const open = referenced(pending(state), reference);
93
+ if (open.length === 0)
94
+ return refusedTarget(referenced(typed(state), reference).length > 0
95
+ ? "decision-not-pending"
96
+ : "unknown-decision", { detail: `No pending decision matches ${reference}.` });
97
+ const allowing = open.filter((gate) => commands[gate.kind]?.includes(command));
98
+ const [gate] = allowing;
99
+ if (gate === undefined)
100
+ return refusedTarget("decision-not-allowed", {
101
+ detail: `The decision does not allow the command ${command}.`,
102
+ });
103
+ if (allowing.length > 1)
104
+ return refusedTarget("ambiguous-decision", {
105
+ detail: "The reference matches more than one pending decision.",
106
+ candidates: allowing.map(decisionId),
107
+ });
108
+ return { kind: "gate", gate };
109
+ }
110
+ function validText(command, text) {
111
+ const given = typeof text === "string" && text.trim().length > 0;
112
+ if (command === "answer")
113
+ return given;
114
+ if (command === "deny")
115
+ return given || text === undefined || text === null;
116
+ return text === undefined || text === null;
117
+ }
118
+ function textLimit(context, command) {
119
+ return command === "deny"
120
+ ? { bytes: feedbackBytes, name: "A feedback text" }
121
+ : { bytes: context.textBytes, name: "An answer" };
122
+ }
123
+ function decisionRequest(parameters) {
124
+ const { command, reference, expectedRevision, generation } = parameters;
125
+ const { subjectDigest, commandId } = parameters;
126
+ const text = parameters["text"] ?? null;
127
+ if (typeof command !== "string" ||
128
+ !Object.hasOwn(decisions, command) ||
129
+ typeof reference !== "string" ||
130
+ !wholeNumber(expectedRevision, 1) ||
131
+ !wholeNumber(generation, 1) ||
132
+ !isIdentifier(subjectDigest) ||
133
+ !isIdentifier(commandId) ||
134
+ !validText(command, text))
135
+ return undefined;
136
+ return {
137
+ command,
138
+ reference,
139
+ text,
140
+ expectedRevision,
141
+ generation,
142
+ subjectDigest,
143
+ commandId,
144
+ };
145
+ }
146
+ async function located(context, request) {
147
+ const { commandId, text } = request;
148
+ const limit = textLimit(context, request.command);
149
+ if (text !== null && Buffer.byteLength(text) > limit.bytes)
150
+ return refusedTarget("input-too-large", {
151
+ commandId,
152
+ detail: `${limit.name} has at most ${String(limit.bytes)} bytes.`,
153
+ });
154
+ const existing = await context.authority.queries.receipt(commandId);
155
+ if (existing === undefined)
156
+ return target(await context.authority.state(), request);
157
+ const { gateId } = existing.command;
158
+ if (existing.command.kind !== "decide-gate" || gateId === undefined)
159
+ return refusedTarget("conflicting-command", {
160
+ commandId,
161
+ detail: "The command ID is known with a different request.",
162
+ });
163
+ return { kind: "known", runId: existing.runId, gateId };
164
+ }
165
+ export async function decision(context, parameters) {
166
+ const request = decisionRequest(parameters);
167
+ if (request === undefined)
168
+ return invalidRequest("The decision request is not valid.");
169
+ const found = await located(context, request);
170
+ if (found.kind === "refused")
171
+ return found.reply;
172
+ const { runId, gateId } = found.kind === "gate" ? found.gate : found;
173
+ const { commandId, text } = request;
174
+ const receipt = await context.gateway.execute({
175
+ principal: "operator",
176
+ command: {
177
+ kind: "decide-gate",
178
+ commandId,
179
+ runId,
180
+ gateId,
181
+ decision: decisions[request.command],
182
+ expectedRevision: request.expectedRevision,
183
+ generation: request.generation,
184
+ subject: request.subjectDigest,
185
+ ...(text === null ? {} : { answer: documentDigest(text) }),
186
+ },
187
+ documents: text === null ? [] : [text],
188
+ });
189
+ if (!committed(receipt)) {
190
+ const state = await context.authority.state();
191
+ return rejection(receipt, {
192
+ commandId,
193
+ runId,
194
+ currentRevision: state.gates[gateKey(runId, gateId)]?.revision ?? null,
195
+ });
196
+ }
197
+ return recorded(context, {
198
+ commandId,
199
+ runId,
200
+ gateId,
201
+ replayed: receipt.kind === "duplicate",
202
+ });
203
+ }
204
+ async function continuationState(context, decided) {
205
+ const { gate, run } = decided;
206
+ if (!continues(gate))
207
+ return "held";
208
+ const { operationId } = gateContinuation(gate);
209
+ const operation = (await context.authority.operations()).find((item) => item.operationId === operationId);
210
+ if (operation?.deliveries.some((delivery) => delivery.outcome === "sent"))
211
+ return "admitted";
212
+ const deliverable = operation?.releasedSequence === null && run.status === "running";
213
+ return deliverable ? "admitted" : "held";
214
+ }
215
+ async function recorded(context, outcome) {
216
+ const { commandId, runId, gateId } = outcome;
217
+ const stored = await context.authority.queries.receipt(commandId);
218
+ const state = await context.authority.state();
219
+ const gate = state.gates[gateKey(runId, gateId)];
220
+ const run = state.runs[runId];
221
+ if (stored === undefined || gate === undefined || run === undefined)
222
+ return failed("authority-unavailable", { commandId, runId });
223
+ return result("decision-recorded", {
224
+ decisionId: decisionId(gate),
225
+ runId,
226
+ decision: gate.outcome?.decision ?? null,
227
+ commandId,
228
+ replayed: outcome.replayed,
229
+ receipt: publicReceipt(stored),
230
+ run: { state: run.status, revision: run.revision },
231
+ continuation: await continuationState(context, { gate, run }),
232
+ });
233
+ }
@@ -0,0 +1,10 @@
1
+ import type { Fields, Reply } from "../protocol.ts";
2
+ import { type ServiceContext } from "./replies.ts";
3
+ export interface Connection {
4
+ readonly send: (events: readonly Fields[]) => Promise<boolean>;
5
+ readonly closed: () => boolean;
6
+ }
7
+ export declare function events(context: ServiceContext, request: {
8
+ readonly parameters: Fields;
9
+ readonly connection: Connection;
10
+ }): Promise<Reply | undefined>;
@@ -0,0 +1,70 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { failed, invalidRequest, isIdentifier, result, wholeNumber, } from "./replies.js";
3
+ function cursor(parameters) {
4
+ const { runId } = parameters;
5
+ const after = parameters["after"] ?? 0;
6
+ const limit = parameters["limit"] ?? 100;
7
+ if (!wholeNumber(after, 0) ||
8
+ !wholeNumber(limit, 1) ||
9
+ limit > 1000 ||
10
+ (runId !== undefined && typeof runId !== "string"))
11
+ return undefined;
12
+ return { after, limit, ...(runId === undefined ? {} : { runId }) };
13
+ }
14
+ function published(page) {
15
+ return page.events.map((event) => ({ schemaVersion: 1, ...event }));
16
+ }
17
+ function gap(after, page) {
18
+ return failed("event-gap", {
19
+ detail: `The service has no events after sequence ${String(after)}.`,
20
+ after,
21
+ earliestAvailable: page.earliest,
22
+ latestSequence: page.latest,
23
+ });
24
+ }
25
+ async function followed(context, stream) {
26
+ const { connection } = stream;
27
+ let { after } = stream.start;
28
+ while (!connection.closed()) {
29
+ const page = await context.authority.queries.eventsAfter({
30
+ ...stream.start,
31
+ after,
32
+ });
33
+ if (!(await connection.send(published(page))))
34
+ return undefined;
35
+ after = page.events.at(-1)?.sequence ?? after;
36
+ if (page.events.length === 0)
37
+ await changed(context, page.latest);
38
+ }
39
+ return undefined;
40
+ }
41
+ function changed(context, latest) {
42
+ const milliseconds = context.followMilliseconds;
43
+ return context.changed === undefined
44
+ ? delay(milliseconds)
45
+ : context.changed({ after: latest, milliseconds });
46
+ }
47
+ async function known(context, runId) {
48
+ if (!isIdentifier(runId))
49
+ return false;
50
+ return (await context.authority.state()).runs[runId] !== undefined;
51
+ }
52
+ export async function events(context, request) {
53
+ const start = cursor(request.parameters);
54
+ if (start === undefined)
55
+ return invalidRequest("The events request is not valid.");
56
+ if (start.runId !== undefined && !(await known(context, start.runId)))
57
+ return failed("unknown-run", {
58
+ runId: start.runId,
59
+ detail: `No run has the ID ${start.runId}.`,
60
+ });
61
+ const page = await context.authority.queries.eventsAfter(start);
62
+ if (start.after > page.latest)
63
+ return gap(start.after, page);
64
+ if (request.parameters["follow"] === true)
65
+ return followed(context, { start, connection: request.connection });
66
+ return result("event-page", {
67
+ events: published(page),
68
+ latestSequence: page.latest,
69
+ });
70
+ }
@@ -0,0 +1,13 @@
1
+ import type { Authority } from "../broker/actor/authority.ts";
2
+ import type { Gateway } from "./gateway.ts";
3
+ export interface ExpiryScan {
4
+ readonly stop: () => Promise<void>;
5
+ }
6
+ interface ScanParts {
7
+ readonly authority: Authority;
8
+ readonly gateway: Gateway;
9
+ readonly clock: () => string;
10
+ readonly intervalMilliseconds: number;
11
+ }
12
+ export declare function expiryScan(parts: ScanParts): ExpiryScan;
13
+ export {};
@@ -0,0 +1,53 @@
1
+ import { createHash } from "node:crypto";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { notBefore } from "../authority/instants.js";
4
+ import { operationDigest } from "../broker/operation-digest.js";
5
+ function expiryIdentity(runId, gateId) {
6
+ return `expire:${createHash("sha256").update(`${runId} ${gateId}`).digest("hex").slice(0, 32)}`;
7
+ }
8
+ async function scanned(parts) {
9
+ const { authority, gateway, clock } = parts;
10
+ const state = await authority.state();
11
+ const now = clock();
12
+ const due = Object.values(state.gates).filter((gate) => gate.outcome === null &&
13
+ gate.expiresAt !== null &&
14
+ notBefore(now, gate.expiresAt) &&
15
+ state.runs[gate.runId]?.status === "waiting_gate");
16
+ for (const gate of due)
17
+ await gateway.execute({
18
+ principal: "controller",
19
+ command: {
20
+ kind: "expire-gate",
21
+ commandId: expiryIdentity(gate.runId, gate.gateId),
22
+ runId: gate.runId,
23
+ gateId: gate.gateId,
24
+ },
25
+ });
26
+ for (const lease of await authority.effects.dueLeases(now))
27
+ await gateway.execute({
28
+ principal: "controller",
29
+ command: {
30
+ kind: "expire-lease",
31
+ commandId: `expire-lease:${operationDigest(lease.operationId)}:${String(lease.generation)}`,
32
+ runId: lease.runId,
33
+ operationId: lease.operationId,
34
+ leaseGeneration: lease.generation,
35
+ },
36
+ });
37
+ }
38
+ async function cycle(parts, signal) {
39
+ while (!signal.aborted) {
40
+ await scanned(parts).catch(() => undefined);
41
+ await delay(parts.intervalMilliseconds, undefined, { signal }).catch(() => undefined);
42
+ }
43
+ }
44
+ export function expiryScan(parts) {
45
+ const stopping = new AbortController();
46
+ const running = cycle(parts, stopping.signal);
47
+ return {
48
+ stop: async () => {
49
+ stopping.abort();
50
+ await running;
51
+ },
52
+ };
53
+ }
@@ -0,0 +1,21 @@
1
+ import type { Authority, StoreReceipt } from "../broker/actor/authority.ts";
2
+ import type { Registry } from "./registry.ts";
3
+ export type Principal = "operator" | "worker" | "controller";
4
+ export type Command = Readonly<Record<string, unknown>>;
5
+ export interface Submission {
6
+ readonly principal: Principal;
7
+ readonly command: Command;
8
+ readonly documents?: readonly string[];
9
+ readonly epoch?: number;
10
+ }
11
+ export declare const workerCommandBound = 1000;
12
+ export interface Gateway {
13
+ readonly execute: (submission: Submission) => Promise<StoreReceipt>;
14
+ }
15
+ export declare function commandGateway(parts: {
16
+ readonly authority: Authority;
17
+ readonly registry: Registry;
18
+ readonly clock: () => string;
19
+ readonly textBytes: number;
20
+ readonly pendingWorkerCommands?: number;
21
+ }): Gateway;
@@ -0,0 +1,120 @@
1
+ import { invalidCommand, serializable, textList, unserializable, } from "../broker/actor/authority-receipts.js";
2
+ import { record } from "../protocol.js";
3
+ export const workerCommandBound = 1_000;
4
+ const permitted = {
5
+ operator: [
6
+ "admit-run",
7
+ "decide-gate",
8
+ "pause-run",
9
+ "resume-run",
10
+ "cancel-run",
11
+ ],
12
+ worker: [
13
+ "mark-started",
14
+ "open-gate",
15
+ "register-wait",
16
+ "report-observation",
17
+ "complete-run",
18
+ "fail-run",
19
+ "request-effect",
20
+ "report-effect",
21
+ ],
22
+ controller: ["expire-gate", "expire-lease"],
23
+ };
24
+ const pinned = ["decide-gate", "resume-run"];
25
+ function denied(principal, subject) {
26
+ return {
27
+ kind: "rejected",
28
+ reason: "permission-denied",
29
+ detail: `${principal} cannot send ${subject}`,
30
+ };
31
+ }
32
+ function checked(principal, copy) {
33
+ const command = record(copy["command"]);
34
+ const documents = textList(copy["documents"]);
35
+ const epoch = copy["epoch"];
36
+ if (command === undefined || documents === undefined)
37
+ return undefined;
38
+ if (epoch === undefined)
39
+ return { principal, command, documents };
40
+ if (typeof epoch !== "number")
41
+ return undefined;
42
+ return { principal, command, documents, epoch };
43
+ }
44
+ function busy(bound) {
45
+ return {
46
+ kind: "rejected",
47
+ reason: "service-busy",
48
+ detail: `The service has ${String(bound)} worker commands in work. Send the command again with the same command ID.`,
49
+ };
50
+ }
51
+ function refusal(submission, textBytes) {
52
+ const { principal, command } = submission;
53
+ const kind = String(command["kind"]);
54
+ if (!permitted[principal].includes(kind))
55
+ return denied(principal, kind);
56
+ if (kind === "open-gate" && command["gateKind"] === undefined)
57
+ return denied(principal, "an untyped gate");
58
+ const long = submission.documents.some((document) => Buffer.byteLength(document) > textBytes);
59
+ if (principal === "worker" && long)
60
+ return {
61
+ kind: "rejected",
62
+ reason: "input-too-large",
63
+ detail: `A text of a worker has at most ${String(textBytes)} bytes.`,
64
+ };
65
+ return undefined;
66
+ }
67
+ export function commandGateway(parts) {
68
+ const { authority, registry, clock, textBytes } = parts;
69
+ const bound = parts.pendingWorkerCommands ?? workerCommandBound;
70
+ let pending = 0;
71
+ async function manifest(command) {
72
+ const kind = String(command["kind"]);
73
+ if (kind === "admit-run")
74
+ return registry.byPin(String(command["workflow"]))?.manifest;
75
+ if (!pinned.includes(kind))
76
+ return undefined;
77
+ const run = (await authority.state()).runs[String(command["runId"])];
78
+ return registry.byPin(run?.workflow ?? "")?.manifest;
79
+ }
80
+ async function forwarded(submission) {
81
+ const available = await manifest(submission.command);
82
+ return authority.execute(submission.command, {
83
+ recordedAt: clock(),
84
+ ...(available === undefined ? {} : { manifest: available }),
85
+ ...(submission.epoch === undefined ? {} : { epoch: submission.epoch }),
86
+ documents: submission.documents,
87
+ });
88
+ }
89
+ async function counted(submission) {
90
+ if (pending >= bound)
91
+ return busy(bound);
92
+ pending += 1;
93
+ try {
94
+ return await forwarded(submission);
95
+ }
96
+ finally {
97
+ pending -= 1;
98
+ }
99
+ }
100
+ return {
101
+ execute: async (given) => {
102
+ const copy = serializable({
103
+ command: given.command,
104
+ documents: given.documents ?? [],
105
+ ...(given.epoch === undefined ? {} : { epoch: given.epoch }),
106
+ });
107
+ if (copy === undefined)
108
+ return unserializable;
109
+ const submission = checked(given.principal, copy);
110
+ if (submission === undefined)
111
+ return invalidCommand;
112
+ const refused = refusal(submission, textBytes);
113
+ if (refused !== undefined)
114
+ return refused;
115
+ return submission.principal === "worker"
116
+ ? counted(submission)
117
+ : forwarded(submission);
118
+ },
119
+ };
120
+ }
@@ -0,0 +1,40 @@
1
+ import type { SubmissionContract } from "../submission.ts";
2
+ import type { ExecutionManifest } from "../workflow-admission.ts";
3
+ export type Resolution = {
4
+ readonly kind: "resolved";
5
+ readonly input: unknown;
6
+ } | {
7
+ readonly kind: "rejected";
8
+ readonly code: string;
9
+ readonly detail: string;
10
+ };
11
+ export interface ResolutionRequest {
12
+ readonly workflowId: string;
13
+ readonly submission: Readonly<Record<string, unknown>>;
14
+ readonly commandId: string;
15
+ readonly signal: AbortSignal;
16
+ }
17
+ export interface Resolver {
18
+ readonly id: string;
19
+ readonly version: string;
20
+ readonly resolve: (request: ResolutionRequest) => Promise<Resolution>;
21
+ }
22
+ export interface WorkflowRegistration {
23
+ readonly workflowId: string;
24
+ readonly manifest: ExecutionManifest;
25
+ readonly availability: "available" | "unavailable";
26
+ readonly submission: SubmissionContract;
27
+ readonly resolver: Resolver;
28
+ readonly effectLimit?: number;
29
+ readonly admission?: "when-idle";
30
+ }
31
+ export interface Registered extends WorkflowRegistration {
32
+ readonly pin: string;
33
+ }
34
+ export interface Registry {
35
+ readonly workflowIds: readonly string[];
36
+ readonly byId: (workflowId: string) => Registered | undefined;
37
+ readonly byPin: (pin: string) => Registered | undefined;
38
+ readonly available: (pinned: ExecutionManifest) => ExecutionManifest | undefined;
39
+ }
40
+ export declare function workflowRegistry(workflows: readonly WorkflowRegistration[]): Registry;
@@ -0,0 +1,13 @@
1
+ import { workflowPin } from "../broker/workflow-pin.js";
2
+ export function workflowRegistry(workflows) {
3
+ const registered = workflows.map((workflow) => ({
4
+ ...workflow,
5
+ pin: workflowPin(workflow.manifest),
6
+ }));
7
+ return {
8
+ workflowIds: registered.map((workflow) => workflow.workflowId),
9
+ byId: (workflowId) => registered.find((workflow) => workflow.workflowId === workflowId),
10
+ byPin: (pin) => registered.find((workflow) => workflow.pin === pin),
11
+ available: (pinned) => registered.find((workflow) => workflow.manifest.workflowId === pinned.workflowId)?.manifest,
12
+ };
13
+ }
@@ -0,0 +1,26 @@
1
+ import type { Authority, CommandRecord, StoreReceipt } from "../broker/actor/authority.ts";
2
+ import type { Fields, Reply } from "../protocol.ts";
3
+ import type { ChangeSignal } from "./changes.ts";
4
+ import type { Gateway } from "./gateway.ts";
5
+ import type { Registry } from "./registry.ts";
6
+ export interface ServiceContext {
7
+ readonly authority: Authority;
8
+ readonly registry: Registry;
9
+ readonly gateway: Gateway;
10
+ readonly clock: () => string;
11
+ readonly livenessMilliseconds: number;
12
+ readonly followMilliseconds: number;
13
+ readonly resolverMilliseconds: number;
14
+ readonly textBytes: number;
15
+ readonly documentBytes: number;
16
+ readonly worldReports?: () => readonly unknown[];
17
+ readonly changed?: ChangeSignal["next"];
18
+ }
19
+ export declare function result(kind: string, fields: Fields): Reply;
20
+ export declare function failed(code: string, extra: Fields): Reply;
21
+ export declare function invalidRequest(detail: string): Reply;
22
+ export declare function rejection(receipt: StoreReceipt, identity: Fields): Reply;
23
+ export declare function committed(receipt: StoreReceipt): boolean;
24
+ export declare function isIdentifier(value: unknown): value is string;
25
+ export declare function wholeNumber(value: unknown, minimum: number): value is number;
26
+ export declare function publicReceipt(record: CommandRecord): Fields;
@@ -0,0 +1,56 @@
1
+ import { isRecordKey } from "../authority/commands.js";
2
+ const codes = {
3
+ "invalid-command": "invalid-request",
4
+ "request-too-large": "input-too-large",
5
+ "missing-document": "invalid-request",
6
+ "unknown-gate": "unknown-decision",
7
+ "missing-manifest": "workflow-unavailable",
8
+ };
9
+ export function result(kind, fields) {
10
+ return { kind: "result", result: { schemaVersion: 1, kind, ...fields } };
11
+ }
12
+ export function failed(code, extra) {
13
+ const detail = extra["detail"];
14
+ return {
15
+ kind: "error",
16
+ error: {
17
+ ...extra,
18
+ code,
19
+ detail: typeof detail === "string" ? detail : code,
20
+ },
21
+ };
22
+ }
23
+ export function invalidRequest(detail) {
24
+ return failed("invalid-request", { detail });
25
+ }
26
+ export function rejection(receipt, identity) {
27
+ if (receipt.kind === "failed")
28
+ return failed("authority-unavailable", {
29
+ ...identity,
30
+ detail: `${receipt.reason}: ${receipt.detail}`,
31
+ });
32
+ if (receipt.kind !== "rejected")
33
+ return failed("invalid-request", identity);
34
+ return failed(codes[receipt.reason] ?? receipt.reason, {
35
+ ...identity,
36
+ detail: receipt.detail ?? receipt.reason,
37
+ });
38
+ }
39
+ export function committed(receipt) {
40
+ return receipt.kind === "accepted" || receipt.kind === "duplicate";
41
+ }
42
+ export function isIdentifier(value) {
43
+ return isRecordKey(value);
44
+ }
45
+ export function wholeNumber(value, minimum) {
46
+ return (typeof value === "number" && Number.isSafeInteger(value) && value >= minimum);
47
+ }
48
+ export function publicReceipt(record) {
49
+ return {
50
+ commandId: record.commandId,
51
+ sequence: record.sequence,
52
+ runId: record.runId,
53
+ recordedAt: record.recordedAt,
54
+ commandDigest: record.commandDigest,
55
+ };
56
+ }
@@ -0,0 +1,4 @@
1
+ import { type Fields, type Reply } from "../protocol.ts";
2
+ import { type ServiceContext } from "./replies.ts";
3
+ export declare function status(context: ServiceContext, parameters: Fields): Promise<Reply>;
4
+ export declare function runCommand(context: ServiceContext, parameters: Fields): Promise<Reply>;