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,21 @@
1
+ export interface EffectBudget {
2
+ readonly limit: number;
3
+ readonly spent: number;
4
+ }
5
+ export interface EffectRequest {
6
+ readonly capability: string;
7
+ readonly units: number;
8
+ }
9
+ export type EffectAuthorization = {
10
+ readonly kind: "authorized";
11
+ readonly spent: number;
12
+ } | {
13
+ readonly kind: "rejected";
14
+ readonly reason: string;
15
+ };
16
+ export declare function authorizeEffect(manifest: {
17
+ readonly capabilities: readonly string[];
18
+ }, effect: {
19
+ readonly budget: EffectBudget;
20
+ readonly request: EffectRequest;
21
+ }): EffectAuthorization;
@@ -0,0 +1,14 @@
1
+ export function authorizeEffect(manifest, effect) {
2
+ const { budget, request } = effect;
3
+ if (![budget.limit, budget.spent].every((value) => Number.isSafeInteger(value) && value >= 0) ||
4
+ !Number.isSafeInteger(request.units) ||
5
+ request.units < 1 ||
6
+ budget.spent > budget.limit)
7
+ return { kind: "rejected", reason: "invalid-effect-request" };
8
+ if (!manifest.capabilities.includes(request.capability))
9
+ return { kind: "rejected", reason: "unadmitted-capability" };
10
+ const spent = budget.spent + request.units;
11
+ if (spent > budget.limit)
12
+ return { kind: "rejected", reason: "budget-exhausted" };
13
+ return { kind: "authorized", spent };
14
+ }
@@ -0,0 +1,4 @@
1
+ import type { AdmissionResult, ExecutionManifest } from "./workflow-admission.ts";
2
+ export declare function pinnedIdentity(manifest: ExecutionManifest): string;
3
+ export declare function resumePinned(pinned: ExecutionManifest, available: ExecutionManifest): AdmissionResult;
4
+ export declare function readExecutionManifest(value: unknown): ExecutionManifest;
@@ -0,0 +1,68 @@
1
+ const canonical = {
2
+ name: (manifest) => JSON.stringify(manifest.name),
3
+ workflowId: (manifest) => JSON.stringify(manifest.workflowId),
4
+ steps: (manifest) => JSON.stringify([...manifest.steps].sort()),
5
+ capabilities: (manifest) => JSON.stringify([...manifest.capabilities].sort()),
6
+ artifacts: (manifest) => JSON.stringify(Object.keys(manifest.artifacts)
7
+ .sort()
8
+ .map((name) => [name, manifest.artifacts[name]])),
9
+ resources: (manifest) => JSON.stringify(Object.keys(manifest.resources)
10
+ .sort()
11
+ .map((name) => [name, manifest.resources[name]])),
12
+ toolchain: (manifest) => JSON.stringify(["sdk", "world", "builder", "node", "dependencies"].map((key) => manifest.toolchain[key])),
13
+ };
14
+ const fields = [
15
+ "name",
16
+ "workflowId",
17
+ "steps",
18
+ "capabilities",
19
+ "artifacts",
20
+ "resources",
21
+ "toolchain",
22
+ ];
23
+ export function pinnedIdentity(manifest) {
24
+ return JSON.stringify(fields.map((field) => canonical[field](manifest)));
25
+ }
26
+ export function resumePinned(pinned, available) {
27
+ const changed = fields.find((field) => canonical[field](pinned) !== canonical[field](available));
28
+ if (changed !== undefined)
29
+ return {
30
+ kind: "rejected",
31
+ reason: "pinned-manifest-mismatch",
32
+ detail: changed,
33
+ };
34
+ return { kind: "admitted", manifest: pinned };
35
+ }
36
+ export function readExecutionManifest(value) {
37
+ const fields = record(value);
38
+ const toolchain = record(fields["toolchain"]);
39
+ return {
40
+ name: text(fields["name"]),
41
+ workflowId: text(fields["workflowId"]),
42
+ steps: texts(fields["steps"]),
43
+ capabilities: texts(fields["capabilities"]),
44
+ artifacts: textRecord(fields["artifacts"]),
45
+ resources: textRecord(fields["resources"]),
46
+ toolchain: {
47
+ sdk: text(toolchain["sdk"]),
48
+ world: text(toolchain["world"]),
49
+ builder: text(toolchain["builder"]),
50
+ node: text(toolchain["node"]),
51
+ dependencies: text(toolchain["dependencies"]),
52
+ },
53
+ };
54
+ }
55
+ function record(value) {
56
+ if (!value || typeof value !== "object" || Array.isArray(value))
57
+ return {};
58
+ return Object.fromEntries(Object.entries(value));
59
+ }
60
+ function text(value) {
61
+ return typeof value === "string" ? value : "";
62
+ }
63
+ function texts(value) {
64
+ return Array.isArray(value) ? value.map(text) : [];
65
+ }
66
+ function textRecord(value) {
67
+ return Object.fromEntries(Object.entries(record(value)).map(([key, item]) => [key, text(item)]));
68
+ }
@@ -0,0 +1,41 @@
1
+ import { type TaggedRun } from "./world-runs.ts";
2
+ export type WorkflowFunction = (input: unknown, continuation?: Continuation) => Promise<unknown>;
3
+ export interface Continuation {
4
+ readonly gateId: string;
5
+ readonly decision: string;
6
+ readonly answer: string | null;
7
+ }
8
+ export interface RunIntent extends Partial<Continuation> {
9
+ readonly kind: string;
10
+ readonly runId: string;
11
+ readonly operationId: string;
12
+ }
13
+ export type RunOutcome = {
14
+ readonly kind: "accepted";
15
+ readonly receipt: string;
16
+ } | {
17
+ readonly kind: "stopped";
18
+ readonly receipt: string;
19
+ } | {
20
+ readonly kind: "absent";
21
+ } | {
22
+ readonly kind: "unknown";
23
+ readonly evidence: string;
24
+ };
25
+ type OperationRun = Pick<TaggedRun, "receipt" | "operationId" | "status">;
26
+ export interface StartParts {
27
+ readonly runs: () => Promise<readonly OperationRun[]>;
28
+ readonly input: (runId: string) => Promise<string | undefined>;
29
+ readonly document: (digest: string) => Promise<string | undefined>;
30
+ readonly workflow: (runId: string) => Promise<WorkflowFunction | undefined>;
31
+ readonly cancel: (receipt: string) => Promise<string>;
32
+ }
33
+ export interface StartDelivery {
34
+ readonly reconcile: (intent: RunIntent) => Promise<RunOutcome>;
35
+ readonly deliver: (intent: RunIntent) => Promise<{
36
+ readonly receipt: string;
37
+ }>;
38
+ readonly stop: (intent: RunIntent) => Promise<RunOutcome>;
39
+ }
40
+ export declare function startDelivery(parts: StartParts): StartDelivery;
41
+ export {};
@@ -0,0 +1,68 @@
1
+ import { start } from "workflow/api";
2
+ import { operationTag, runTag } from "./world-runs.js";
3
+ const ends = ["cancelled", "completed", "failed"];
4
+ async function segments(parts, intent) {
5
+ return (await parts.runs()).filter((run) => run.operationId === intent.operationId);
6
+ }
7
+ async function reconciled(parts, intent) {
8
+ const found = await segments(parts, intent);
9
+ const [first, ...others] = found;
10
+ if (first === undefined)
11
+ return { kind: "absent" };
12
+ if (others.length === 0)
13
+ return { kind: "accepted", receipt: first.receipt };
14
+ return {
15
+ kind: "unknown",
16
+ evidence: found.map((run) => `world-run:${run.receipt}`).join(" "),
17
+ };
18
+ }
19
+ async function continuation(parts, intent) {
20
+ const { kind, gateId, decision, answer } = intent;
21
+ if (kind === "start-run")
22
+ return undefined;
23
+ if (kind !== "continue-run" || gateId === undefined || decision === undefined)
24
+ throw new Error(`unsupported-intent: ${kind}`);
25
+ if (answer === undefined || answer === null)
26
+ return { gateId, decision, answer: null };
27
+ const text = await parts.document(answer);
28
+ if (text === undefined)
29
+ throw new Error(`answer-not-available: ${gateId}`);
30
+ return { gateId, decision, answer: text };
31
+ }
32
+ async function delivered(parts, intent) {
33
+ const continued = await continuation(parts, intent);
34
+ const workflow = await parts.workflow(intent.runId);
35
+ const input = await parts.input(intent.runId);
36
+ if (workflow === undefined || input === undefined)
37
+ throw new Error(`start-not-available: ${intent.runId}`);
38
+ const argument = JSON.parse(input);
39
+ const started = await start(workflow, [argument, continued], {
40
+ attributes: {
41
+ [runTag]: intent.runId,
42
+ [operationTag]: intent.operationId,
43
+ },
44
+ });
45
+ return { receipt: started.runId };
46
+ }
47
+ async function stopped(parts, intent) {
48
+ const found = await segments(parts, intent);
49
+ const [first] = found;
50
+ if (first === undefined)
51
+ return { kind: "absent" };
52
+ const alive = [];
53
+ for (const run of found.filter((run) => !ends.includes(run.status))) {
54
+ const status = await parts.cancel(run.receipt);
55
+ if (!ends.includes(status))
56
+ alive.push(`world-run:${run.receipt} ${status}`);
57
+ }
58
+ if (alive.length > 0)
59
+ return { kind: "unknown", evidence: alive.join(" ") };
60
+ return { kind: "stopped", receipt: first.receipt };
61
+ }
62
+ export function startDelivery(parts) {
63
+ return {
64
+ reconcile: (intent) => reconciled(parts, intent),
65
+ deliver: (intent) => delivered(parts, intent),
66
+ stop: (intent) => stopped(parts, intent),
67
+ };
68
+ }
@@ -0,0 +1,79 @@
1
+ import { type ProtectedRequest, type StepBridge } from "../step-bridge.ts";
2
+ export interface StepCall {
3
+ readonly worldRunId: string;
4
+ readonly stepId: string;
5
+ readonly attempt: number;
6
+ }
7
+ export declare function sdkStepCall(): StepCall;
8
+ export interface OperationRead {
9
+ readonly operationId: string;
10
+ readonly status: string;
11
+ readonly reason: string | null;
12
+ readonly receipt: string | null;
13
+ readonly result: string | null;
14
+ }
15
+ export interface BridgeReply {
16
+ readonly receipt: {
17
+ readonly kind: string;
18
+ readonly reason?: string;
19
+ };
20
+ readonly disposition: {
21
+ readonly disposition: string;
22
+ readonly reason: string | null;
23
+ } | null;
24
+ readonly operation: OperationRead | null;
25
+ }
26
+ interface BridgeIdentity {
27
+ readonly commandId: string;
28
+ readonly transport: string;
29
+ }
30
+ export interface BridgeRequest extends ProtectedRequest, BridgeIdentity {
31
+ readonly runId: string;
32
+ }
33
+ export interface GateReceipt {
34
+ readonly kind: string;
35
+ readonly reason?: string;
36
+ }
37
+ export interface GateOpening {
38
+ readonly runId: string;
39
+ readonly commandId: string;
40
+ readonly expectedRevision: number;
41
+ readonly gateId: string;
42
+ readonly kind: "question" | "approval";
43
+ readonly prompt: string;
44
+ readonly subject: string;
45
+ }
46
+ export interface WaitRegistration {
47
+ readonly runId: string;
48
+ readonly commandId: string;
49
+ readonly gateId: string;
50
+ }
51
+ export interface BridgeTiming {
52
+ readonly lookupTries: number;
53
+ readonly pollMilliseconds: number;
54
+ readonly retryMilliseconds: number;
55
+ }
56
+ export declare const bridgeTiming: BridgeTiming;
57
+ export interface BridgePorts {
58
+ readonly call: () => StepCall;
59
+ readonly run: (worldRunId: string) => Promise<{
60
+ readonly runId: string;
61
+ } | undefined>;
62
+ readonly timing?: BridgeTiming;
63
+ readonly stopped: AbortSignal;
64
+ readonly state: () => Promise<{
65
+ readonly runs: Readonly<Record<string, {
66
+ readonly status: string;
67
+ readonly revision: number;
68
+ } | undefined>>;
69
+ readonly gates: Readonly<Record<string, unknown>>;
70
+ }>;
71
+ readonly openGate: (opening: GateOpening) => Promise<GateReceipt>;
72
+ readonly registerWait: (wait: WaitRegistration) => Promise<GateReceipt>;
73
+ readonly requestEffect: (request: BridgeRequest) => Promise<BridgeReply>;
74
+ readonly operation: (operationId: string) => Promise<OperationRead | undefined>;
75
+ readonly document: (digest: string) => Promise<string | undefined>;
76
+ }
77
+ export declare function stepBridge(ports: BridgePorts): StepBridge;
78
+ export declare function registerStepBridge(bridge: StepBridge): () => void;
79
+ export {};
@@ -0,0 +1,205 @@
1
+ import { createHash } from "node:crypto";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { getStepMetadata, getWorkflowMetadata } from "workflow";
4
+ import { gateKey } from "../authority/gates.js";
5
+ import { stepBridgeKey, } from "../step-bridge.js";
6
+ export function sdkStepCall() {
7
+ const { stepId, attempt } = getStepMetadata();
8
+ return { worldRunId: getWorkflowMetadata().workflowRunId, stepId, attempt };
9
+ }
10
+ export const bridgeTiming = {
11
+ lookupTries: 250,
12
+ pollMilliseconds: 20,
13
+ retryMilliseconds: 1000,
14
+ };
15
+ const committed = ["accepted", "duplicate"];
16
+ const ended = ["failed", "stopped", "blocked", "cancelled"];
17
+ async function paused(hold, milliseconds) {
18
+ const { stopped } = hold.ports;
19
+ await delay(milliseconds, undefined, { signal: stopped }).catch(() => undefined);
20
+ if (stopped.aborted)
21
+ await new Promise(() => undefined);
22
+ }
23
+ function answered(reply) {
24
+ const { receipt, disposition, operation } = reply;
25
+ const busy = receipt.kind === "rejected" && receipt.reason === "service-busy";
26
+ if (receipt.kind === "failed" || busy)
27
+ return undefined;
28
+ if (!committed.includes(receipt.kind))
29
+ return { kind: "refused", reason: receipt.reason ?? receipt.kind };
30
+ if (disposition?.disposition === "refused")
31
+ return { kind: "refused", reason: disposition.reason ?? "refused" };
32
+ if (operation === null)
33
+ return undefined;
34
+ return { kind: "admitted", operationId: operation.operationId };
35
+ }
36
+ async function requested(hold, request) {
37
+ for (;;) {
38
+ await paused(hold, 0);
39
+ const answer = await hold.ports
40
+ .requestEffect(request)
41
+ .then(answered, () => undefined);
42
+ if (answer !== undefined)
43
+ return answer;
44
+ await paused(hold, hold.timing.retryMilliseconds);
45
+ }
46
+ }
47
+ async function text(hold, digest) {
48
+ if (digest === null)
49
+ return null;
50
+ for (;;) {
51
+ const read = await hold.ports.document(digest).then((value) => ({ value: value ?? null }), () => undefined);
52
+ if (read !== undefined)
53
+ return read.value;
54
+ await paused(hold, hold.timing.retryMilliseconds);
55
+ }
56
+ }
57
+ async function outcome(hold, operation) {
58
+ const { operationId, status, reason, receipt, result } = operation;
59
+ if (status === "refused")
60
+ return { kind: "refused", reason: reason ?? "refused" };
61
+ const end = ended.find((kind) => kind === status);
62
+ if (end !== undefined)
63
+ return { kind: end, operationId, reason };
64
+ if (status !== "completed")
65
+ return undefined;
66
+ return {
67
+ kind: "completed",
68
+ operationId,
69
+ receipt,
70
+ result: await text(hold, result),
71
+ };
72
+ }
73
+ async function settled(hold, operationId) {
74
+ for (;;) {
75
+ const operation = await hold.ports
76
+ .operation(operationId)
77
+ .catch(() => undefined);
78
+ const result = operation === undefined ? undefined : await outcome(hold, operation);
79
+ if (result !== undefined)
80
+ return result;
81
+ await paused(hold, operation === undefined
82
+ ? hold.timing.retryMilliseconds
83
+ : hold.timing.pollMilliseconds);
84
+ }
85
+ }
86
+ async function located(hold, worldRunId) {
87
+ const tries = hold.timing.lookupTries;
88
+ for (let attempt = 1; attempt <= tries; attempt += 1) {
89
+ const world = await hold.ports.run(worldRunId);
90
+ if (world !== undefined || attempt === tries)
91
+ return world;
92
+ await paused(hold, hold.timing.pollMilliseconds);
93
+ }
94
+ return undefined;
95
+ }
96
+ async function inWork(hold, runId) {
97
+ for (;;) {
98
+ const state = await hold.ports.state().catch(() => undefined);
99
+ if (state !== undefined && state.runs[runId]?.status !== "queued")
100
+ return;
101
+ await paused(hold, state === undefined
102
+ ? hold.timing.retryMilliseconds
103
+ : hold.timing.pollMilliseconds);
104
+ }
105
+ }
106
+ function transportOf(call) {
107
+ return `sdk:${call.stepId}`.replace(/[^A-Za-z0-9._:/-]/g, "-");
108
+ }
109
+ function identity(call, request) {
110
+ const transport = transportOf(call);
111
+ const scope = createHash("sha256")
112
+ .update(JSON.stringify(request.scope))
113
+ .digest("hex")
114
+ .slice(0, 16);
115
+ return { transport, commandId: `${transport}:${scope}` };
116
+ }
117
+ async function effect(hold, request) {
118
+ const call = hold.ports.call();
119
+ const world = await located(hold, call.worldRunId);
120
+ if (world === undefined)
121
+ return { kind: "unavailable", reason: "unknown-world-run" };
122
+ await inWork(hold, world.runId);
123
+ const answer = await requested(hold, {
124
+ ...request,
125
+ ...identity(call, request),
126
+ runId: world.runId,
127
+ });
128
+ if (answer.kind !== "admitted")
129
+ return answer;
130
+ return await settled(hold, answer.operationId);
131
+ }
132
+ function verdict(hold, receipt) {
133
+ if (receipt === undefined || receipt.kind === "failed")
134
+ return hold.timing.retryMilliseconds;
135
+ if (committed.includes(receipt.kind))
136
+ return "committed";
137
+ if (receipt.reason === "service-busy")
138
+ return hold.timing.retryMilliseconds;
139
+ if (receipt.reason === "stale-revision")
140
+ return hold.timing.pollMilliseconds;
141
+ return { kind: "refused", reason: receipt.reason ?? receipt.kind };
142
+ }
143
+ async function gateCommand(hold, send) {
144
+ for (;;) {
145
+ await paused(hold, 0);
146
+ const result = verdict(hold, await send().catch(() => undefined));
147
+ if (result === "committed")
148
+ return undefined;
149
+ if (typeof result !== "number")
150
+ return result;
151
+ await paused(hold, result);
152
+ }
153
+ }
154
+ async function opening(hold, subject) {
155
+ const { runId, transport, request } = subject;
156
+ const { gateId, kind, prompt } = request;
157
+ const state = await hold.ports.state();
158
+ const run = state.runs[runId];
159
+ if (run === undefined)
160
+ return { kind: "rejected", reason: "unknown-run" };
161
+ if (Object.hasOwn(state.gates, gateKey(runId, gateId)))
162
+ return { kind: "duplicate" };
163
+ return await hold.ports.openGate({
164
+ runId,
165
+ commandId: `${transport}:open:${gateId}`,
166
+ expectedRevision: run.revision,
167
+ gateId,
168
+ kind,
169
+ prompt,
170
+ subject: `sha256:${createHash("sha256").update(prompt).digest("hex")}`,
171
+ });
172
+ }
173
+ async function gate(hold, request) {
174
+ const call = hold.ports.call();
175
+ const world = await located(hold, call.worldRunId);
176
+ if (world === undefined)
177
+ return { kind: "unavailable", reason: "unknown-world-run" };
178
+ await inWork(hold, world.runId);
179
+ const subject = {
180
+ runId: world.runId,
181
+ transport: transportOf(call),
182
+ request,
183
+ };
184
+ const refusal = (await gateCommand(hold, () => opening(hold, subject))) ??
185
+ (await gateCommand(hold, () => hold.ports.registerWait({
186
+ runId: subject.runId,
187
+ commandId: `${subject.transport}:wait:${request.gateId}`,
188
+ gateId: request.gateId,
189
+ })));
190
+ return refusal ?? { kind: "opened", decisionId: request.gateId };
191
+ }
192
+ export function stepBridge(ports) {
193
+ const hold = { ports, timing: ports.timing ?? bridgeTiming };
194
+ return {
195
+ effect: (request) => effect(hold, request),
196
+ gate: (request) => gate(hold, request),
197
+ };
198
+ }
199
+ export function registerStepBridge(bridge) {
200
+ const key = Symbol.for(stepBridgeKey);
201
+ Reflect.set(globalThis, key, bridge);
202
+ return () => {
203
+ Reflect.deleteProperty(globalThis, key);
204
+ };
205
+ }
@@ -0,0 +1,31 @@
1
+ interface ClaimEvent {
2
+ readonly eventType: string;
3
+ readonly correlationId?: string | undefined;
4
+ }
5
+ interface EventPage {
6
+ readonly data: readonly ClaimEvent[];
7
+ readonly cursor: string | null;
8
+ readonly hasMore: boolean;
9
+ }
10
+ export interface ClaimWorld {
11
+ readonly runs: {
12
+ readonly get: (runId: string, parameters: {
13
+ readonly resolveData: "none";
14
+ }) => Promise<{
15
+ readonly status: string;
16
+ }>;
17
+ };
18
+ readonly events: {
19
+ readonly list: (parameters: {
20
+ readonly runId: string;
21
+ readonly resolveData: "none";
22
+ readonly pagination: {
23
+ readonly limit: number;
24
+ readonly sortOrder: "asc";
25
+ readonly cursor?: string;
26
+ };
27
+ }) => Promise<EventPage>;
28
+ };
29
+ }
30
+ export declare function releaseStepClaims(dataDirectory: string, world: ClaimWorld): Promise<readonly string[]>;
31
+ export {};
@@ -0,0 +1,85 @@
1
+ import { readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const claimName = /^(wrun_[0-9A-Z]+)-(step_[0-9A-Z]+)\.(created|terminal)$/;
4
+ const runEnds = ["completed", "failed", "cancelled"];
5
+ const stepEnds = ["step_completed", "step_failed"];
6
+ const endFields = ["output", "error", "completedAt"];
7
+ function claimOf(name) {
8
+ const [, runId, stepId, kind] = claimName.exec(name) ?? [];
9
+ if (runId === undefined || stepId === undefined)
10
+ return [];
11
+ return [
12
+ { name, runId, stepId, kind: kind === "terminal" ? kind : "created" },
13
+ ];
14
+ }
15
+ async function recorded(world, page) {
16
+ const { runId, cursor } = page;
17
+ const listed = await world.events.list({
18
+ runId,
19
+ resolveData: "none",
20
+ pagination: {
21
+ limit: 1000,
22
+ sortOrder: "asc",
23
+ ...(cursor === null ? {} : { cursor }),
24
+ },
25
+ });
26
+ if (!listed.hasMore || listed.cursor === null)
27
+ return listed.data;
28
+ return [
29
+ ...listed.data,
30
+ ...(await recorded(world, { runId, cursor: listed.cursor })),
31
+ ];
32
+ }
33
+ function proven(claim, events) {
34
+ const own = events
35
+ .filter((event) => event.correlationId === claim.stepId)
36
+ .map((event) => event.eventType);
37
+ if (claim.kind === "created")
38
+ return own.length > 0;
39
+ return own.some((type) => stepEnds.includes(type));
40
+ }
41
+ async function orphans(world, held) {
42
+ const run = await world.runs
43
+ .get(held.runId, { resolveData: "none" })
44
+ .catch(() => undefined);
45
+ if (run === undefined || runEnds.includes(run.status))
46
+ return [];
47
+ const events = await recorded(world, { runId: held.runId, cursor: null });
48
+ return held.claims.filter((claim) => !proven(claim, events));
49
+ }
50
+ function records(value) {
51
+ return typeof value === "object" && value !== null ? { ...value } : {};
52
+ }
53
+ async function reopened(path) {
54
+ const text = await readFile(path, "utf8").catch(() => undefined);
55
+ if (text === undefined)
56
+ return;
57
+ const parsed = JSON.parse(text);
58
+ const step = records(parsed);
59
+ if (step["status"] !== "completed" && step["status"] !== "failed")
60
+ return;
61
+ const kept = Object.entries(step).filter(([field]) => !endFields.includes(field));
62
+ const staged = `${path}.reopened`;
63
+ await writeFile(staged, JSON.stringify({ ...Object.fromEntries(kept), status: "running" }, null, 2));
64
+ await rename(staged, path);
65
+ }
66
+ async function reverted(dataDirectory, claim) {
67
+ const path = join(dataDirectory, "steps", `${claim.runId}-${claim.stepId}.json`);
68
+ if (claim.kind === "created")
69
+ await rm(path, { force: true });
70
+ if (claim.kind === "terminal")
71
+ await reopened(path);
72
+ }
73
+ export async function releaseStepClaims(dataDirectory, world) {
74
+ const folder = join(dataDirectory, ".locks", "steps");
75
+ const names = await readdir(folder).catch(() => []);
76
+ const held = Map.groupBy(names.flatMap(claimOf), (claim) => claim.runId);
77
+ const released = [];
78
+ for (const [runId, claims] of held)
79
+ for (const claim of await orphans(world, { runId, claims })) {
80
+ await reverted(dataDirectory, claim);
81
+ await rm(join(folder, claim.name), { force: true });
82
+ released.push(claim.name);
83
+ }
84
+ return released;
85
+ }
@@ -0,0 +1,21 @@
1
+ export type WorkflowHandler = (request: Request) => Promise<Response>;
2
+ export interface HostSettings {
3
+ readonly dataDirectory: string;
4
+ readonly concurrency: number;
5
+ readonly handler: WorkflowHandler;
6
+ }
7
+ export interface WorkflowHost {
8
+ readonly released: readonly string[];
9
+ readonly close: () => Promise<void>;
10
+ }
11
+ export interface HostRefusal {
12
+ readonly kind: "refused";
13
+ readonly reason: string;
14
+ readonly detail: string;
15
+ }
16
+ export type HostOpening = {
17
+ readonly kind: "started";
18
+ readonly host: WorkflowHost;
19
+ } | HostRefusal;
20
+ export declare const hostBoundLimit = 64;
21
+ export declare function startHost(settings: HostSettings): Promise<HostOpening>;