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,51 @@
1
+ import { getWorld } from "workflow/runtime";
2
+ import { releaseStepClaims } from "./step-claims.js";
3
+ const workflowQueue = "__wkf_workflow_";
4
+ export const hostBoundLimit = 64;
5
+ function direct(world) {
6
+ return ("registerHandler" in world && typeof world.registerHandler === "function");
7
+ }
8
+ function refused(reason, detail) {
9
+ return { kind: "refused", reason, detail };
10
+ }
11
+ function unsuitable(settings) {
12
+ const { concurrency, dataDirectory } = settings;
13
+ const bounded = Number.isSafeInteger(concurrency) &&
14
+ concurrency >= 1 &&
15
+ concurrency <= hostBoundLimit;
16
+ if (!bounded)
17
+ return refused("invalid-host-bound", String(concurrency));
18
+ if (process.env["WORKFLOW_TARGET_WORLD"] !== "local")
19
+ return refused("host-world", "WORKFLOW_TARGET_WORLD is not local");
20
+ if (process.env["WORKFLOW_LOCAL_DATA_DIR"] !== dataDirectory)
21
+ return refused("host-world", "WORKFLOW_LOCAL_DATA_DIR is not the setting");
22
+ if (process.env["WORKFLOW_LOCAL_QUEUE_CONCURRENCY"] !== String(concurrency))
23
+ return refused("host-bound", "WORKFLOW_LOCAL_QUEUE_CONCURRENCY is not the setting");
24
+ return undefined;
25
+ }
26
+ export async function startHost(settings) {
27
+ const refusal = unsuitable(settings);
28
+ if (refusal)
29
+ return refusal;
30
+ const world = await getWorld();
31
+ if (!direct(world))
32
+ return refused("host-world", "the World takes no handler in its process");
33
+ const released = await releaseStepClaims(settings.dataDirectory, world);
34
+ world.registerHandler(workflowQueue, settings.handler);
35
+ try {
36
+ await world.start?.();
37
+ }
38
+ catch (error) {
39
+ await world.close?.();
40
+ return refused("host-start-failed", String(Reflect.get(Object(error), "message")));
41
+ }
42
+ return {
43
+ kind: "started",
44
+ host: {
45
+ released,
46
+ close: async () => {
47
+ await world.close?.();
48
+ },
49
+ },
50
+ };
51
+ }
@@ -0,0 +1,39 @@
1
+ import { type WorldReport, type WorldRun } from "../authority/reconciliation.ts";
2
+ import type { AuthorityState } from "../authority/transitions.ts";
3
+ export type ReconciledState = Pick<AuthorityState, "runs" | "intents" | "details" | "gates" | "commands">;
4
+ export interface WorkflowOutcome {
5
+ readonly kind: string;
6
+ readonly reason?: string;
7
+ readonly issueUpdate?: "failed";
8
+ readonly ticketStatus?: "complete" | "partial";
9
+ }
10
+ export interface ReconciliationPorts {
11
+ readonly state: () => Promise<ReconciledState>;
12
+ readonly submit: (command: Readonly<Record<string, unknown>>) => Promise<{
13
+ readonly kind: "accepted" | "duplicate" | "rejected" | "failed";
14
+ }>;
15
+ readonly runs: () => Promise<readonly WorldRun[]>;
16
+ readonly outcome: (receipt: string) => Promise<WorkflowOutcome | undefined>;
17
+ }
18
+ export interface Pass {
19
+ readonly sent: readonly string[];
20
+ readonly interrupted: boolean;
21
+ readonly reports: readonly WorldReport[];
22
+ readonly conflicts: readonly string[];
23
+ }
24
+ export declare function reconcileWorld(ports: ReconciliationPorts): Promise<Pass>;
25
+ export type LoopReport = WorldReport | {
26
+ readonly kind: "world-run-conflict";
27
+ readonly runId: string;
28
+ } | {
29
+ readonly kind: "world-reconciliation-failed";
30
+ readonly passes: number;
31
+ };
32
+ export declare const passFailureLimit = 3;
33
+ export interface WorldLoop {
34
+ readonly stop: () => Promise<void>;
35
+ readonly reports: () => readonly LoopReport[];
36
+ }
37
+ export declare function worldLoop(parts: ReconciliationPorts & {
38
+ readonly intervalMilliseconds: number;
39
+ }): WorldLoop;
@@ -0,0 +1,81 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { reconcile, } from "../authority/reconciliation.js";
3
+ async function withOutcome(ports, observed) {
4
+ const { state, world } = observed;
5
+ const ended = world.status === "completed" &&
6
+ state.runs[world.runId]?.status === "running";
7
+ if (!ended)
8
+ return world;
9
+ const read = await ports.outcome(world.receipt).then((outcome) => ({ outcome }), () => undefined);
10
+ if (read === undefined)
11
+ return { ...world, status: "unreadable" };
12
+ return read.outcome === undefined
13
+ ? world
14
+ : {
15
+ ...world,
16
+ outcome: read.outcome.kind,
17
+ ...(read.outcome.issueUpdate === "failed"
18
+ ? { issueUpdate: read.outcome.issueUpdate }
19
+ : {}),
20
+ ...(read.outcome.ticketStatus === undefined
21
+ ? {}
22
+ : { ticketStatus: read.outcome.ticketStatus }),
23
+ ...(read.outcome.reason === undefined
24
+ ? {}
25
+ : { outcomeReason: read.outcome.reason }),
26
+ };
27
+ }
28
+ export async function reconcileWorld(ports) {
29
+ const listed = await ports.runs();
30
+ const state = await ports.state();
31
+ const runs = [];
32
+ for (const world of listed)
33
+ runs.push(await withOutcome(ports, { state, world }));
34
+ const { commands, reports, conflicts } = reconcile(state, runs);
35
+ const sent = [];
36
+ for (const command of commands) {
37
+ const receipt = await ports.submit(command);
38
+ sent.push(`${String(command["commandId"])} ${receipt.kind}`);
39
+ if (receipt.kind === "failed")
40
+ return { sent, interrupted: true, reports, conflicts };
41
+ }
42
+ return { sent, interrupted: false, reports, conflicts };
43
+ }
44
+ export const passFailureLimit = 3;
45
+ function reported(pass) {
46
+ return [
47
+ ...pass.reports,
48
+ ...pass.conflicts.map((runId) => ({
49
+ kind: "world-run-conflict",
50
+ runId,
51
+ })),
52
+ ];
53
+ }
54
+ export function worldLoop(parts) {
55
+ const stopping = new AbortController();
56
+ let reports = [];
57
+ let failures = 0;
58
+ const cycle = async () => {
59
+ while (!stopping.signal.aborted) {
60
+ const pass = await reconcileWorld(parts).catch(() => undefined);
61
+ reports = pass === undefined ? reports : reported(pass);
62
+ failures = pass?.interrupted === false ? 0 : failures + 1;
63
+ await delay(parts.intervalMilliseconds, undefined, {
64
+ signal: stopping.signal,
65
+ }).catch(() => undefined);
66
+ }
67
+ };
68
+ const running = cycle();
69
+ return {
70
+ stop: async () => {
71
+ stopping.abort();
72
+ await running;
73
+ },
74
+ reports: () => failures < passFailureLimit
75
+ ? reports
76
+ : [
77
+ ...reports,
78
+ { kind: "world-reconciliation-failed", passes: failures },
79
+ ],
80
+ };
81
+ }
@@ -0,0 +1,14 @@
1
+ import type { WorldRun } from "../authority/reconciliation.ts";
2
+ import type { WorkflowOutcome } from "./world-reconciliation.ts";
3
+ export declare const runTag = "cloving.run";
4
+ export declare const operationTag = "cloving.operation";
5
+ export interface TaggedRun extends WorldRun {
6
+ readonly operationId: string | null;
7
+ readonly createdAt: string;
8
+ }
9
+ export declare function taggedRuns(pageSize?: number): Promise<TaggedRun[]>;
10
+ export declare function workflowOutcome(receipt: string): Promise<WorkflowOutcome | undefined>;
11
+ export declare function cancelled(receipt: string): Promise<string>;
12
+ export declare function taggedRun(receipt: string): Promise<{
13
+ readonly runId: string;
14
+ } | undefined>;
@@ -0,0 +1,69 @@
1
+ import { isTicketStatus } from "../ticket-status.js";
2
+ import { getRun } from "workflow/api";
3
+ import { getWorld } from "workflow/runtime";
4
+ export const runTag = "cloving.run";
5
+ export const operationTag = "cloving.operation";
6
+ function tag(attributes, name) {
7
+ const value = Reflect.get(Object(attributes), name);
8
+ return typeof value === "string" ? value : null;
9
+ }
10
+ async function collected(world, page) {
11
+ const listed = await world.runs.list({
12
+ resolveData: "none",
13
+ pagination: {
14
+ limit: page.limit,
15
+ ...(page.cursor === null ? {} : { cursor: page.cursor }),
16
+ },
17
+ });
18
+ const found = listed.data.flatMap((item) => {
19
+ const runId = tag(item.attributes, runTag);
20
+ if (runId === null)
21
+ return [];
22
+ return [
23
+ {
24
+ runId,
25
+ operationId: tag(item.attributes, operationTag),
26
+ receipt: item.runId,
27
+ status: item.status,
28
+ createdAt: item.createdAt.toISOString(),
29
+ },
30
+ ];
31
+ });
32
+ if (!listed.hasMore || listed.cursor === null)
33
+ return found;
34
+ return [
35
+ ...found,
36
+ ...(await collected(world, { limit: page.limit, cursor: listed.cursor })),
37
+ ];
38
+ }
39
+ export async function taggedRuns(pageSize = 200) {
40
+ return await collected(await getWorld(), { limit: pageSize, cursor: null });
41
+ }
42
+ export async function workflowOutcome(receipt) {
43
+ const value = await getRun(receipt).returnValue;
44
+ const kind = Reflect.get(Object(value), "kind");
45
+ if (typeof kind !== "string")
46
+ return undefined;
47
+ const reason = Reflect.get(Object(value), "reason");
48
+ const issueUpdate = Reflect.get(Object(value), "issueUpdate");
49
+ const ticketStatus = Reflect.get(Object(value), "ticketStatus");
50
+ return {
51
+ kind,
52
+ ...(typeof reason === "string" ? { reason } : {}),
53
+ ...(issueUpdate === "failed" ? { issueUpdate } : {}),
54
+ ...(isTicketStatus(ticketStatus) ? { ticketStatus } : {}),
55
+ };
56
+ }
57
+ export async function cancelled(receipt) {
58
+ const run = getRun(receipt);
59
+ await run.cancel().catch(() => undefined);
60
+ return await run.status;
61
+ }
62
+ export async function taggedRun(receipt) {
63
+ const world = await getWorld();
64
+ const run = await world.runs
65
+ .get(receipt, { resolveData: "none" })
66
+ .catch(() => undefined);
67
+ const runId = tag(run?.attributes, runTag);
68
+ return runId === null ? undefined : { runId };
69
+ }
@@ -0,0 +1,7 @@
1
+ import type { Validation } from "./workflow-contracts.ts";
2
+ export declare function operationIdentity(value: unknown): Validation<string>;
3
+ export interface OperationScope {
4
+ readonly run: string;
5
+ readonly operation: string;
6
+ }
7
+ export declare function operationScope(operationId: string): OperationScope | null;
@@ -0,0 +1,59 @@
1
+ const component = /^[A-Za-z0-9._:/-]{1,128}$/;
2
+ export function operationIdentity(value) {
3
+ const scope = fields(value);
4
+ const round = scope["round"];
5
+ const stage = optionalStage(scope["stage"]);
6
+ const key = scope["key"];
7
+ const required = [scope["run"], scope["phase"], scope["operation"]];
8
+ if (typeof round !== "number" ||
9
+ !Number.isSafeInteger(round) ||
10
+ round < 0 ||
11
+ stage === undefined ||
12
+ !required.every(isComponent) ||
13
+ (key !== undefined && !isComponent(key)))
14
+ return { kind: "invalid", reason: "invalid-operation-scope" };
15
+ return {
16
+ kind: "valid",
17
+ value: JSON.stringify([
18
+ "cloving-operation",
19
+ round,
20
+ ...required,
21
+ stage,
22
+ key ?? null,
23
+ ]),
24
+ };
25
+ }
26
+ function optionalStage(value) {
27
+ if (value === undefined)
28
+ return null;
29
+ const stage = fields(value);
30
+ const [id, visit, branch] = [stage["id"], stage["visit"], stage["branch"]];
31
+ if (!isComponent(id) || !isComponent(visit) || !isComponent(branch))
32
+ return undefined;
33
+ return [id, visit, branch];
34
+ }
35
+ function isComponent(value) {
36
+ return typeof value === "string" && component.test(value);
37
+ }
38
+ function fields(value) {
39
+ if (!value || typeof value !== "object" || Array.isArray(value))
40
+ return {};
41
+ return Object.fromEntries(Object.entries(value));
42
+ }
43
+ export function operationScope(operationId) {
44
+ const [marker, , run, , operation] = parsedList(operationId);
45
+ if (marker !== "cloving-operation")
46
+ return null;
47
+ if (!isComponent(run) || !isComponent(operation))
48
+ return null;
49
+ return { run, operation };
50
+ }
51
+ function parsedList(text) {
52
+ try {
53
+ const value = JSON.parse(text);
54
+ return Array.isArray(value) ? value : [];
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
@@ -0,0 +1,35 @@
1
+ export declare const protocolVersion = 1;
2
+ export declare const maximumFrameBytes = 1048576;
3
+ export type Fields = Readonly<Record<string, unknown>>;
4
+ export interface ServiceRequest {
5
+ readonly operation: string;
6
+ readonly parameters: Fields;
7
+ }
8
+ export interface ServiceError extends Fields {
9
+ readonly code: string;
10
+ readonly detail: string;
11
+ }
12
+ export type Reply = {
13
+ readonly kind: "result";
14
+ readonly result: Fields;
15
+ } | {
16
+ readonly kind: "error";
17
+ readonly error: ServiceError;
18
+ };
19
+ export type ParsedRequest = {
20
+ readonly kind: "request";
21
+ readonly request: ServiceRequest;
22
+ } | {
23
+ readonly kind: "error";
24
+ readonly error: ServiceError;
25
+ };
26
+ export type ReplyLine = Reply | {
27
+ readonly kind: "event";
28
+ readonly event: Fields;
29
+ };
30
+ export declare function record(value: unknown): Fields | undefined;
31
+ export declare function parseRequest(line: string): ParsedRequest;
32
+ export declare function requestLine(request: ServiceRequest): string;
33
+ export declare function replyLine(reply: Reply): string;
34
+ export declare function eventLine(event: Fields): string;
35
+ export declare function parseReplyLine(line: string): ReplyLine | undefined;
@@ -0,0 +1,64 @@
1
+ export const protocolVersion = 1;
2
+ export const maximumFrameBytes = 1_048_576;
3
+ export function record(value) {
4
+ if (typeof value !== "object" || value === null || Array.isArray(value))
5
+ return undefined;
6
+ return Object.fromEntries(Object.entries(value));
7
+ }
8
+ function decoded(line) {
9
+ try {
10
+ return JSON.parse(line);
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ function invalid(detail) {
17
+ return { kind: "error", error: { code: "invalid-request", detail } };
18
+ }
19
+ export function parseRequest(line) {
20
+ const fields = record(decoded(line));
21
+ if (fields === undefined)
22
+ return invalid("The request is not a JSON object.");
23
+ if (fields["protocol"] !== protocolVersion)
24
+ return {
25
+ kind: "error",
26
+ error: {
27
+ code: "service-incompatible",
28
+ detail: `The service uses protocol ${String(protocolVersion)}.`,
29
+ },
30
+ };
31
+ const { operation } = fields;
32
+ const parameters = record(fields["parameters"]);
33
+ if (typeof operation !== "string" || parameters === undefined)
34
+ return invalid("The request needs an operation and a parameters object.");
35
+ return { kind: "request", request: { operation, parameters } };
36
+ }
37
+ export function requestLine(request) {
38
+ return `${JSON.stringify({ protocol: protocolVersion, ...request })}\n`;
39
+ }
40
+ export function replyLine(reply) {
41
+ return reply.kind === "result"
42
+ ? `${JSON.stringify({ ok: true, result: reply.result })}\n`
43
+ : `${JSON.stringify({ ok: false, error: reply.error })}\n`;
44
+ }
45
+ export function eventLine(event) {
46
+ return `${JSON.stringify({ event })}\n`;
47
+ }
48
+ export function parseReplyLine(line) {
49
+ const fields = record(decoded(line));
50
+ if (fields === undefined)
51
+ return undefined;
52
+ const event = record(fields["event"]);
53
+ if (event !== undefined)
54
+ return { kind: "event", event };
55
+ const result = record(fields["result"]);
56
+ if (fields["ok"] === true && result !== undefined)
57
+ return { kind: "result", result };
58
+ const error = record(fields["error"]);
59
+ const code = error?.["code"];
60
+ const detail = error?.["detail"];
61
+ if (typeof code !== "string" || typeof detail !== "string")
62
+ return undefined;
63
+ return { kind: "error", error: { ...error, code, detail } };
64
+ }
@@ -0,0 +1 @@
1
+ export declare function collectResources(root: string, paths: readonly string[]): Promise<Readonly<Record<string, string>>>;
@@ -0,0 +1,29 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, readFile, realpath } from "node:fs/promises";
3
+ import { isAbsolute, join, relative, sep } from "node:path";
4
+ export async function collectResources(root, paths) {
5
+ const base = await realpath(root);
6
+ const entries = [];
7
+ for (const path of paths) {
8
+ const digest = await resourceDigest(base, path);
9
+ if (digest !== null)
10
+ entries.push([path, digest]);
11
+ }
12
+ return Object.fromEntries(entries);
13
+ }
14
+ async function resourceDigest(base, path) {
15
+ if (isAbsolute(path))
16
+ return null;
17
+ const file = await realpath(join(base, path)).catch(() => null);
18
+ if (file === null)
19
+ return null;
20
+ const inside = relative(base, file);
21
+ if (inside === ".." || inside.startsWith(`..${sep}`) || isAbsolute(inside))
22
+ return null;
23
+ if (!(await lstat(file)).isFile())
24
+ return null;
25
+ const bytes = await readFile(file).catch(() => null);
26
+ if (bytes === null)
27
+ return null;
28
+ return createHash("sha256").update(bytes).digest("hex");
29
+ }
@@ -0,0 +1,11 @@
1
+ export interface ChangeWait {
2
+ readonly after: number;
3
+ readonly milliseconds: number;
4
+ }
5
+ export interface ChangeSignal {
6
+ readonly next: (wait: ChangeWait) => Promise<void>;
7
+ readonly close: () => void;
8
+ }
9
+ type Subscribe = (listener: (sequence: number) => void) => () => void;
10
+ export declare function changeSignal(subscribe: Subscribe): ChangeSignal;
11
+ export {};
@@ -0,0 +1,32 @@
1
+ export function changeSignal(subscribe) {
2
+ const waiting = new Set();
3
+ const seen = { latest: -1, closed: false };
4
+ const wake = () => {
5
+ for (const settle of [...waiting])
6
+ settle();
7
+ };
8
+ const unsubscribe = subscribe((sequence) => {
9
+ seen.latest = Math.max(seen.latest, sequence);
10
+ wake();
11
+ });
12
+ return {
13
+ next: ({ after, milliseconds }) => {
14
+ if (seen.closed || seen.latest > after)
15
+ return Promise.resolve();
16
+ return new Promise((settle) => {
17
+ const done = () => {
18
+ clearTimeout(timer);
19
+ waiting.delete(done);
20
+ settle();
21
+ };
22
+ const timer = setTimeout(done, milliseconds);
23
+ waiting.add(done);
24
+ });
25
+ },
26
+ close: () => {
27
+ seen.closed = true;
28
+ unsubscribe();
29
+ wake();
30
+ },
31
+ };
32
+ }
@@ -0,0 +1,9 @@
1
+ import type { StoredState } from "../broker/actor/authority.ts";
2
+ import type { Fields, Reply } from "../protocol.ts";
3
+ import { type ServiceContext } from "./replies.ts";
4
+ export declare function feedbackOf(context: ServiceContext, scope: {
5
+ readonly state: StoredState;
6
+ readonly runId: string;
7
+ }): Promise<readonly Fields[]>;
8
+ export declare function questions(context: ServiceContext, parameters: Fields): Promise<Reply>;
9
+ export declare function decision(context: ServiceContext, parameters: Fields): Promise<Reply>;