cloving 0.3.19 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +475 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +263 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +27 -0
  32. package/dist/src/authority/reconciliation.js +147 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +122 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +65 -0
  78. package/dist/src/broker/actor/authority-session.js +252 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/destination.d.ts +4 -0
  138. package/dist/src/chats/destination.js +94 -0
  139. package/dist/src/chats/import.d.ts +13 -0
  140. package/dist/src/chats/import.js +71 -0
  141. package/dist/src/chats/normalize.d.ts +20 -0
  142. package/dist/src/chats/normalize.js +139 -0
  143. package/dist/src/chats/reader.d.ts +15 -0
  144. package/dist/src/chats/reader.js +87 -0
  145. package/dist/src/cli/arguments.d.ts +23 -0
  146. package/dist/src/cli/arguments.js +154 -0
  147. package/dist/src/cli/client.d.ts +15 -0
  148. package/dist/src/cli/client.js +122 -0
  149. package/dist/src/cli/commands.d.ts +14 -0
  150. package/dist/src/cli/commands.js +253 -0
  151. package/dist/src/cli/main.d.ts +1 -0
  152. package/dist/src/cli/main.js +80 -0
  153. package/dist/src/cli/render.d.ts +8 -0
  154. package/dist/src/cli/render.js +186 -0
  155. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  156. package/dist/src/cli/runtime-arguments.js +248 -0
  157. package/dist/src/cli/runtime-directory.d.ts +4 -0
  158. package/dist/src/cli/runtime-directory.js +25 -0
  159. package/dist/src/cli/toolchain.d.ts +3 -0
  160. package/dist/src/cli/toolchain.js +74 -0
  161. package/dist/src/cli/usage.d.ts +4 -0
  162. package/dist/src/cli/usage.js +124 -0
  163. package/dist/src/cli/validate.d.ts +38 -0
  164. package/dist/src/cli/validate.js +116 -0
  165. package/dist/src/cli/watch-board-view.d.ts +22 -0
  166. package/dist/src/cli/watch-board-view.js +128 -0
  167. package/dist/src/cli/watch-board.d.ts +15 -0
  168. package/dist/src/cli/watch-board.js +174 -0
  169. package/dist/src/cli/watch-element.d.ts +11 -0
  170. package/dist/src/cli/watch-element.js +6 -0
  171. package/dist/src/cli/watch-model.d.ts +29 -0
  172. package/dist/src/cli/watch-model.js +261 -0
  173. package/dist/src/cli/watch-navigation.d.ts +9 -0
  174. package/dist/src/cli/watch-navigation.js +40 -0
  175. package/dist/src/cli/watch-page.d.ts +1 -0
  176. package/dist/src/cli/watch-page.js +272 -0
  177. package/dist/src/cli/watch-paths.d.ts +2 -0
  178. package/dist/src/cli/watch-paths.js +52 -0
  179. package/dist/src/cli/watch-phases.d.ts +7 -0
  180. package/dist/src/cli/watch-phases.js +148 -0
  181. package/dist/src/cli/watch-reads.d.ts +28 -0
  182. package/dist/src/cli/watch-reads.js +244 -0
  183. package/dist/src/cli/watch-render.d.ts +139 -0
  184. package/dist/src/cli/watch-render.js +95 -0
  185. package/dist/src/cli/watch-server.d.ts +10 -0
  186. package/dist/src/cli/watch-server.js +176 -0
  187. package/dist/src/cli/watch-stream.d.ts +11 -0
  188. package/dist/src/cli/watch-stream.js +128 -0
  189. package/dist/src/cli/watch-turn.d.ts +29 -0
  190. package/dist/src/cli/watch-turn.js +130 -0
  191. package/dist/src/cli/watch-view.d.ts +39 -0
  192. package/dist/src/cli/watch-view.js +223 -0
  193. package/dist/src/cli.d.ts +2 -0
  194. package/dist/src/cli.js +62 -0
  195. package/dist/src/daemon/claude-turn.d.ts +28 -0
  196. package/dist/src/daemon/claude-turn.js +135 -0
  197. package/dist/src/daemon/claude-worker.d.ts +26 -0
  198. package/dist/src/daemon/claude-worker.js +224 -0
  199. package/dist/src/daemon/codex-stream.d.ts +4 -0
  200. package/dist/src/daemon/codex-stream.js +113 -0
  201. package/dist/src/daemon/daemon.d.ts +46 -0
  202. package/dist/src/daemon/daemon.js +186 -0
  203. package/dist/src/daemon/delivery-router.d.ts +10 -0
  204. package/dist/src/daemon/delivery-router.js +34 -0
  205. package/dist/src/daemon/github-calls.d.ts +29 -0
  206. package/dist/src/daemon/github-calls.js +127 -0
  207. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  208. package/dist/src/daemon/github-issue-methods.js +99 -0
  209. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  210. package/dist/src/daemon/github-issue-privacy.js +131 -0
  211. package/dist/src/daemon/github-merge.d.ts +18 -0
  212. package/dist/src/daemon/github-merge.js +259 -0
  213. package/dist/src/daemon/github-methods.d.ts +5 -0
  214. package/dist/src/daemon/github-methods.js +198 -0
  215. package/dist/src/daemon/github-operation.d.ts +38 -0
  216. package/dist/src/daemon/github-operation.js +57 -0
  217. package/dist/src/daemon/github-worker.d.ts +17 -0
  218. package/dist/src/daemon/github-worker.js +281 -0
  219. package/dist/src/daemon/host-environment.d.ts +8 -0
  220. package/dist/src/daemon/host-environment.js +14 -0
  221. package/dist/src/daemon/issue-queue.d.ts +9 -0
  222. package/dist/src/daemon/issue-queue.js +163 -0
  223. package/dist/src/daemon/notify-message.d.ts +14 -0
  224. package/dist/src/daemon/notify-message.js +48 -0
  225. package/dist/src/daemon/notify.d.ts +12 -0
  226. package/dist/src/daemon/notify.js +161 -0
  227. package/dist/src/daemon/operation-journal.d.ts +42 -0
  228. package/dist/src/daemon/operation-journal.js +53 -0
  229. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  230. package/dist/src/daemon/ticket-registration.js +177 -0
  231. package/dist/src/daemon/ticket-source.d.ts +17 -0
  232. package/dist/src/daemon/ticket-source.js +36 -0
  233. package/dist/src/daemon/work-tree.d.ts +26 -0
  234. package/dist/src/daemon/work-tree.js +206 -0
  235. package/dist/src/effect-authorization.d.ts +21 -0
  236. package/dist/src/effect-authorization.js +14 -0
  237. package/dist/src/execution-pin.d.ts +4 -0
  238. package/dist/src/execution-pin.js +68 -0
  239. package/dist/src/host/start-delivery.d.ts +41 -0
  240. package/dist/src/host/start-delivery.js +68 -0
  241. package/dist/src/host/step-bridge-host.d.ts +79 -0
  242. package/dist/src/host/step-bridge-host.js +205 -0
  243. package/dist/src/host/step-claims.d.ts +31 -0
  244. package/dist/src/host/step-claims.js +85 -0
  245. package/dist/src/host/world-host.d.ts +21 -0
  246. package/dist/src/host/world-host.js +51 -0
  247. package/dist/src/host/world-reconciliation.d.ts +37 -0
  248. package/dist/src/host/world-reconciliation.js +75 -0
  249. package/dist/src/host/world-runs.d.ts +14 -0
  250. package/dist/src/host/world-runs.js +61 -0
  251. package/dist/src/operation-identity.d.ts +7 -0
  252. package/dist/src/operation-identity.js +59 -0
  253. package/dist/src/protocol.d.ts +35 -0
  254. package/dist/src/protocol.js +64 -0
  255. package/dist/src/resource-files.d.ts +1 -0
  256. package/dist/src/resource-files.js +29 -0
  257. package/dist/src/service/changes.d.ts +11 -0
  258. package/dist/src/service/changes.js +32 -0
  259. package/dist/src/service/decision-handler.d.ts +9 -0
  260. package/dist/src/service/decision-handler.js +233 -0
  261. package/dist/src/service/event-handler.d.ts +10 -0
  262. package/dist/src/service/event-handler.js +70 -0
  263. package/dist/src/service/expiry.d.ts +13 -0
  264. package/dist/src/service/expiry.js +53 -0
  265. package/dist/src/service/gateway.d.ts +21 -0
  266. package/dist/src/service/gateway.js +120 -0
  267. package/dist/src/service/registry.d.ts +40 -0
  268. package/dist/src/service/registry.js +13 -0
  269. package/dist/src/service/replies.d.ts +26 -0
  270. package/dist/src/service/replies.js +56 -0
  271. package/dist/src/service/run-handlers.d.ts +4 -0
  272. package/dist/src/service/run-handlers.js +271 -0
  273. package/dist/src/service/service.d.ts +58 -0
  274. package/dist/src/service/service.js +212 -0
  275. package/dist/src/service/submission-handler.d.ts +4 -0
  276. package/dist/src/service/submission-handler.js +206 -0
  277. package/dist/src/service/transport.d.ts +16 -0
  278. package/dist/src/service/transport.js +141 -0
  279. package/dist/src/service/worker-port.d.ts +85 -0
  280. package/dist/src/service/worker-port.js +126 -0
  281. package/dist/src/step-bridge.d.ts +57 -0
  282. package/dist/src/step-bridge.js +4 -0
  283. package/dist/src/steps/decision-gate.d.ts +2 -0
  284. package/dist/src/steps/decision-gate.js +8 -0
  285. package/dist/src/steps/load-cycle.d.ts +10 -0
  286. package/dist/src/steps/load-cycle.js +11 -0
  287. package/dist/src/steps/protected-effect.d.ts +2 -0
  288. package/dist/src/steps/protected-effect.js +8 -0
  289. package/dist/src/storage/decision-rows.d.ts +54 -0
  290. package/dist/src/storage/decision-rows.js +72 -0
  291. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  292. package/dist/src/storage/decision-snapshots.js +25 -0
  293. package/dist/src/storage/domain-changes.d.ts +48 -0
  294. package/dist/src/storage/domain-changes.js +213 -0
  295. package/dist/src/storage/domain-rows.d.ts +85 -0
  296. package/dist/src/storage/domain-rows.js +129 -0
  297. package/dist/src/storage/domain-schema.d.ts +32 -0
  298. package/dist/src/storage/domain-schema.js +193 -0
  299. package/dist/src/storage/effect-changes.d.ts +5 -0
  300. package/dist/src/storage/effect-changes.js +105 -0
  301. package/dist/src/storage/effect-rows.d.ts +67 -0
  302. package/dist/src/storage/effect-rows.js +74 -0
  303. package/dist/src/storage/effect-schema.d.ts +1 -0
  304. package/dist/src/storage/effect-schema.js +59 -0
  305. package/dist/src/storage/statements.d.ts +9 -0
  306. package/dist/src/storage/statements.js +8 -0
  307. package/dist/src/submission.d.ts +42 -0
  308. package/dist/src/submission.js +71 -0
  309. package/dist/src/turn-profile.d.ts +13 -0
  310. package/dist/src/turn-profile.js +100 -0
  311. package/dist/src/workflow-admission.d.ts +45 -0
  312. package/dist/src/workflow-admission.js +151 -0
  313. package/dist/src/workflow-contracts.d.ts +27 -0
  314. package/dist/src/workflow-contracts.js +88 -0
  315. package/dist/src/workflow-declaration.d.ts +11 -0
  316. package/dist/src/workflow-declaration.js +57 -0
  317. package/dist/src/workflow-resources.d.ts +8 -0
  318. package/dist/src/workflow-resources.js +14 -0
  319. package/dist/src/workflows.d.ts +5 -0
  320. package/dist/src/workflows.js +3 -0
  321. package/dist/tools/compile-workflows.d.ts +1 -0
  322. package/dist/tools/compile-workflows.js +33 -0
  323. package/dist/tools/self-host-processes.d.ts +10 -0
  324. package/dist/tools/self-host-processes.js +151 -0
  325. package/dist/tools/self-host-workflows.d.ts +15 -0
  326. package/dist/tools/self-host-workflows.js +78 -0
  327. package/dist/tools/self-host.d.ts +1 -0
  328. package/dist/tools/self-host.js +261 -0
  329. package/dist/tools/self-update-host.d.ts +6 -0
  330. package/dist/tools/self-update-host.js +41 -0
  331. package/dist/tools/self-update.d.ts +10 -0
  332. package/dist/tools/self-update.js +105 -0
  333. package/dist/tools/workflow-manifest.d.ts +3 -0
  334. package/dist/tools/workflow-manifest.js +34 -0
  335. package/dist/workflows/develop-prd.d.ts +7 -0
  336. package/dist/workflows/develop-prd.js +97 -0
  337. package/dist/workflows/develop-ticket.d.ts +15 -0
  338. package/dist/workflows/develop-ticket.js +301 -0
  339. package/dist/workflows/issue-labels.d.ts +14 -0
  340. package/dist/workflows/issue-labels.js +36 -0
  341. package/package.json +82 -75
  342. package/.DS_Store +0 -0
  343. package/.aider.chat.history.md +0 -16978
  344. package/.aider.input.history +0 -15
  345. package/.aider.tags.cache.v3/cache.db +0 -0
  346. package/.aider.tags.cache.v3/cache.db-shm +0 -0
  347. package/.aider.tags.cache.v3/cache.db-wal +0 -0
  348. package/.cursorrules +0 -77
  349. package/.github/workflows/auto-release.yml +0 -83
  350. package/.github/workflows/ci.yml +0 -32
  351. package/.github/workflows/npm-publish.yml +0 -34
  352. package/.gitignore +0 -67
  353. package/.husky/_/.gitignore +0 -1
  354. package/.husky/_/applypatch-msg +0 -2
  355. package/.husky/_/commit-msg +0 -2
  356. package/.husky/_/h +0 -22
  357. package/.husky/_/husky.sh +0 -9
  358. package/.husky/_/post-applypatch +0 -2
  359. package/.husky/_/post-checkout +0 -2
  360. package/.husky/_/post-commit +0 -2
  361. package/.husky/_/post-merge +0 -2
  362. package/.husky/_/post-rewrite +0 -2
  363. package/.husky/_/pre-applypatch +0 -2
  364. package/.husky/_/pre-auto-gc +0 -2
  365. package/.husky/_/pre-commit +0 -2
  366. package/.husky/_/pre-merge-commit +0 -2
  367. package/.husky/_/pre-push +0 -2
  368. package/.husky/_/pre-rebase +0 -2
  369. package/.husky/_/prepare-commit-msg +0 -2
  370. package/.husky/pre-commit +0 -1
  371. package/.husky/pre-push +0 -1
  372. package/.prettierrc.json +0 -7
  373. package/.tool-versions +0 -2
  374. package/SECURITY.md +0 -15
  375. package/cloving.json +0 -67
  376. package/dist/abstract_gpt/index.js +0 -55
  377. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  378. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  379. package/dist/cloving_gpt/adapters/claude.js +0 -128
  380. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  381. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  382. package/dist/cloving_gpt/adapters/index.js +0 -2
  383. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  384. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  385. package/dist/cloving_gpt/adapters/openai.js +0 -100
  386. package/dist/cloving_gpt/index.js +0 -192
  387. package/dist/commands/analyze.js +0 -47
  388. package/dist/commands/chat.js +0 -14
  389. package/dist/commands/check.js +0 -7
  390. package/dist/commands/commit.js +0 -44
  391. package/dist/commands/config.js +0 -167
  392. package/dist/commands/describe.js +0 -235
  393. package/dist/commands/generate/code.js +0 -21
  394. package/dist/commands/generate/commit.js +0 -11
  395. package/dist/commands/generate/context.js +0 -82
  396. package/dist/commands/generate/docs.js +0 -11
  397. package/dist/commands/generate/documentation.js +0 -11
  398. package/dist/commands/generate/fizzbuzz.js +0 -35
  399. package/dist/commands/generate/init.js +0 -15
  400. package/dist/commands/generate/review.js +0 -11
  401. package/dist/commands/generate/sh.js +0 -95
  402. package/dist/commands/generate/shell.js +0 -11
  403. package/dist/commands/generate/unit_tests.js +0 -11
  404. package/dist/commands/init.js +0 -13
  405. package/dist/commands/models.js +0 -22
  406. package/dist/commands/project/build.js +0 -88
  407. package/dist/commands/project/complete.js +0 -12
  408. package/dist/commands/project/init.js +0 -82
  409. package/dist/commands/project/plan.js +0 -108
  410. package/dist/commands/proxy.js +0 -11
  411. package/dist/commands/review.js +0 -50
  412. package/dist/commands/tokens.js +0 -75
  413. package/dist/commands/unit_tests.js +0 -150
  414. package/dist/commands/update.js +0 -7
  415. package/dist/file2.js +0 -4
  416. package/dist/index.js +0 -134
  417. package/dist/managers/BlockManager.js +0 -120
  418. package/dist/managers/ChatManager.js +0 -653
  419. package/dist/managers/ChunkManager.js +0 -32
  420. package/dist/managers/CodeManager.js +0 -185
  421. package/dist/managers/CommitManager.js +0 -64
  422. package/dist/managers/DocsManager.js +0 -88
  423. package/dist/managers/DocumentationManager.js +0 -114
  424. package/dist/managers/InitManager.js +0 -230
  425. package/dist/managers/ProxyManager.js +0 -210
  426. package/dist/managers/ReviewManager.js +0 -131
  427. package/dist/managers/ShellManager.js +0 -163
  428. package/dist/managers/StreamManager.js +0 -308
  429. package/dist/managers/UnitTestManager.js +0 -243
  430. package/dist/managers/src/managers/ProxyManager.js +0 -1
  431. package/dist/newfile.js +0 -2
  432. package/dist/package.json +0 -86
  433. package/dist/utils/command_utils.js +0 -384
  434. package/dist/utils/config_utils.js +0 -249
  435. package/dist/utils/gitUtils.js +0 -42
  436. package/dist/utils/git_utils.js +0 -217
  437. package/dist/utils/modelUtils.js +0 -7
  438. package/dist/utils/model_utils.js +0 -7
  439. package/dist/utils/prompt_utils.js +0 -333
  440. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  441. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  442. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  443. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  444. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  445. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  446. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  447. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  448. package/dist/utils/prompts/index.js +0 -27
  449. package/dist/utils/string_utils.js +0 -505
  450. package/dist/utils/types.js +0 -2
  451. package/jest.config.js +0 -11
  452. package/src/cloving_gpt/adapters/azureopenai.ts +0 -83
  453. package/src/cloving_gpt/adapters/claude.ts +0 -140
  454. package/src/cloving_gpt/adapters/gemini.ts +0 -146
  455. package/src/cloving_gpt/adapters/index.ts +0 -43
  456. package/src/cloving_gpt/adapters/mistral.ts +0 -142
  457. package/src/cloving_gpt/adapters/ollama.ts +0 -136
  458. package/src/cloving_gpt/adapters/openai.ts +0 -113
  459. package/src/cloving_gpt/index.ts +0 -229
  460. package/src/commands/chat.ts +0 -12
  461. package/src/commands/config.ts +0 -192
  462. package/src/commands/generate/code.ts +0 -18
  463. package/src/commands/generate/commit.ts +0 -9
  464. package/src/commands/generate/context.ts +0 -93
  465. package/src/commands/generate/docs.ts +0 -9
  466. package/src/commands/generate/review.ts +0 -9
  467. package/src/commands/generate/shell.ts +0 -9
  468. package/src/commands/generate/unit_tests.ts +0 -9
  469. package/src/commands/init.ts +0 -9
  470. package/src/commands/models.ts +0 -21
  471. package/src/commands/proxy.ts +0 -9
  472. package/src/commands/tokens.ts +0 -82
  473. package/src/index.ts +0 -197
  474. package/src/managers/BlockManager.ts +0 -126
  475. package/src/managers/ChatManager.ts +0 -755
  476. package/src/managers/ChunkManager.ts +0 -31
  477. package/src/managers/CodeManager.ts +0 -226
  478. package/src/managers/CommitManager.ts +0 -71
  479. package/src/managers/DocsManager.ts +0 -101
  480. package/src/managers/InitManager.ts +0 -263
  481. package/src/managers/ProxyManager.ts +0 -240
  482. package/src/managers/ReviewManager.ts +0 -154
  483. package/src/managers/ShellManager.ts +0 -172
  484. package/src/managers/StreamManager.ts +0 -353
  485. package/src/managers/UnitTestManager.ts +0 -293
  486. package/src/utils/config_utils.ts +0 -271
  487. package/src/utils/git_utils.ts +0 -230
  488. package/src/utils/model_utils.ts +0 -3
  489. package/src/utils/prompt_utils.ts +0 -375
  490. package/src/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  491. package/src/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  492. package/src/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  493. package/src/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  494. package/src/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  495. package/src/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  496. package/src/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  497. package/src/utils/prompts/SPECIAL_FILES.md +0 -66
  498. package/src/utils/prompts/index.ts +0 -37
  499. package/src/utils/string_utils.ts +0 -552
  500. package/src/utils/types.ts +0 -127
  501. package/tests/commands/generate/unit_tests.test.ts +0 -27
  502. package/tests/utils/git_utils.test.ts +0 -116
  503. package/tests/utils/model_utils.test.ts +0 -27
  504. package/tests/utils/prompt_utils.test.ts +0 -33
  505. package/tests/utils/string_utils.test.ts +0 -560
  506. package/tsconfig.json +0 -14
  507. package/yarn.lock +0 -5823
@@ -0,0 +1,212 @@
1
+ import { lstat, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { authorityTiming, openAuthority, } from "../broker/actor/authority.js";
4
+ import { socketAddress } from "../broker/socket-address.js";
5
+ import { changeSignal } from "./changes.js";
6
+ import { decision, questions } from "./decision-handler.js";
7
+ import { events } from "./event-handler.js";
8
+ import { expiryScan } from "./expiry.js";
9
+ import { commandGateway, workerCommandBound } from "./gateway.js";
10
+ import { workflowRegistry, } from "./registry.js";
11
+ import { failed } from "./replies.js";
12
+ import { runCommand, status } from "./run-handlers.js";
13
+ import { submissionHandler } from "./submission-handler.js";
14
+ import { connectionLimits, listen, reachable } from "./transport.js";
15
+ import { workerPort } from "./worker-port.js";
16
+ export const serviceTiming = {
17
+ authority: authorityTiming,
18
+ expiryScanMilliseconds: 1_000,
19
+ livenessMilliseconds: 600_000,
20
+ followMilliseconds: 250,
21
+ resolverMilliseconds: 30_000,
22
+ idleMilliseconds: connectionLimits.idleMilliseconds,
23
+ };
24
+ export const serviceLimits = {
25
+ textBytes: 65_536,
26
+ documentBytes: 262_144,
27
+ pendingWorkerCommands: workerCommandBound,
28
+ };
29
+ function refused(reason, detail) {
30
+ return { kind: "refused", reason, detail };
31
+ }
32
+ async function privateDirectory(directory) {
33
+ const entry = await lstat(directory).catch(() => undefined);
34
+ if (entry === undefined || !entry.isDirectory())
35
+ return refused("insecure-runtime-directory", "not a directory");
36
+ const owned = entry.uid === process.getuid?.();
37
+ const mode = entry.mode & 0o777;
38
+ if (owned && (mode & 0o077) === 0)
39
+ return undefined;
40
+ return refused("insecure-runtime-directory", owned ? `mode ${mode.toString(8)}` : "owned by a different user");
41
+ }
42
+ async function endpoint(directory) {
43
+ const insecure = await privateDirectory(directory);
44
+ if (insecure !== undefined)
45
+ return insecure;
46
+ const address = socketAddress(join(directory, "control.sock"));
47
+ if (address.kind === "refused")
48
+ return address;
49
+ if (await reachable(address.path))
50
+ return refused("service-already-running", directory);
51
+ return address.path;
52
+ }
53
+ function wallClock() {
54
+ return new Date().toISOString();
55
+ }
56
+ function dispatcher(context) {
57
+ const run = submissionHandler(context);
58
+ const operations = new Map([
59
+ ["run", (request) => run(request.parameters)],
60
+ ["status", (request) => status(context, request.parameters)],
61
+ ["questions", (request) => questions(context, request.parameters)],
62
+ ["decision", (request) => decision(context, request.parameters)],
63
+ ["run-command", (request) => runCommand(context, request.parameters)],
64
+ [
65
+ "events",
66
+ (request, connection) => events(context, { parameters: request.parameters, connection }),
67
+ ],
68
+ ]);
69
+ return (request, connection) => {
70
+ const operation = operations.get(request.operation);
71
+ if (operation === undefined)
72
+ return Promise.resolve(failed("unknown-operation", {
73
+ detail: `The service has no operation ${request.operation}.`,
74
+ }));
75
+ return operation(request, connection);
76
+ };
77
+ }
78
+ async function started(authority, setup) {
79
+ const { options, path, timing, registry, gateway, host } = setup;
80
+ const clock = options.clock ?? wallClock;
81
+ const { textBytes, documentBytes } = options.limits ?? serviceLimits;
82
+ await rm(path, { force: true });
83
+ const changes = changeSignal(authority.changes.subscribe);
84
+ const listener = await listen({
85
+ path,
86
+ limits: { idleMilliseconds: timing.idleMilliseconds },
87
+ handle: dispatcher({
88
+ authority,
89
+ registry,
90
+ gateway,
91
+ clock,
92
+ changed: changes.next,
93
+ livenessMilliseconds: timing.livenessMilliseconds,
94
+ followMilliseconds: timing.followMilliseconds,
95
+ resolverMilliseconds: timing.resolverMilliseconds,
96
+ textBytes,
97
+ documentBytes,
98
+ worldReports: () => host?.reports?.() ?? [],
99
+ }),
100
+ });
101
+ const stopping = new AbortController();
102
+ const delivering = Promise.allSettled([authority.deliver(stopping.signal)]);
103
+ const expiry = expiryScan({
104
+ authority,
105
+ gateway,
106
+ clock,
107
+ intervalMilliseconds: timing.expiryScanMilliseconds,
108
+ });
109
+ return {
110
+ socket: path,
111
+ epoch: authority.epoch,
112
+ worker: setup.worker,
113
+ close: async () => {
114
+ changes.close();
115
+ await expiry.stop();
116
+ await listener.close();
117
+ stopping.abort();
118
+ await delivering;
119
+ await released(authority, host);
120
+ },
121
+ };
122
+ }
123
+ async function released(authority, host) {
124
+ try {
125
+ await host?.close();
126
+ }
127
+ finally {
128
+ await authority.close();
129
+ }
130
+ }
131
+ export async function startService(options) {
132
+ const path = await endpoint(options.runtimeDirectory);
133
+ if (typeof path !== "string")
134
+ return path;
135
+ const timing = options.timing ?? serviceTiming;
136
+ const registry = workflowRegistry(options.workflows);
137
+ const opening = await openAuthority(options.stateDirectory, {
138
+ delivery: options.delivery,
139
+ timing: timing.authority,
140
+ available: registry.available,
141
+ ...(options.effects === undefined ? {} : { effects: options.effects }),
142
+ ...(options.clock === undefined ? {} : { clock: options.clock }),
143
+ });
144
+ if (opening.kind === "refused")
145
+ return opening;
146
+ const { authority } = opening;
147
+ const gateway = serviceGateway(authority, { options, registry });
148
+ const worker = workerPort({ gateway, authority });
149
+ const host = await hosted(options, hostPorts(authority, worker));
150
+ if (host.kind === "refused") {
151
+ await authority.close();
152
+ return host;
153
+ }
154
+ try {
155
+ return {
156
+ kind: "started",
157
+ service: await started(authority, {
158
+ options,
159
+ path,
160
+ timing,
161
+ registry,
162
+ gateway,
163
+ worker,
164
+ host: host.host,
165
+ }),
166
+ };
167
+ }
168
+ catch (error) {
169
+ const unclosed = await released(authority, host.host).then(() => "", (failure) => `; the close failed: ${message(failure)}`);
170
+ return refused("transport-failure", `${message(error)}${unclosed}`);
171
+ }
172
+ }
173
+ function serviceGateway(authority, parts) {
174
+ const limits = parts.options.limits ?? serviceLimits;
175
+ return commandGateway({
176
+ authority,
177
+ registry: parts.registry,
178
+ clock: parts.options.clock ?? wallClock,
179
+ textBytes: limits.textBytes,
180
+ pendingWorkerCommands: limits.pendingWorkerCommands,
181
+ });
182
+ }
183
+ function hostPorts(authority, worker) {
184
+ return {
185
+ state: authority.state,
186
+ submit: worker.submit,
187
+ input: async (runId) => {
188
+ const digest = (await authority.state()).details[runId]?.input;
189
+ return typeof digest === "string"
190
+ ? await authority.queries.document(digest)
191
+ : undefined;
192
+ },
193
+ document: authority.queries.document,
194
+ requestEffect: worker.requestEffect,
195
+ reportEffect: worker.reportEffect,
196
+ openGate: worker.openGate,
197
+ registerWait: worker.registerWait,
198
+ operation: authority.effects.operation,
199
+ workflowId: async (runId) => (await authority.queries.workflowIds())[runId],
200
+ };
201
+ }
202
+ function message(error) {
203
+ return String(Reflect.get(Object(error), "message"));
204
+ }
205
+ async function hosted(options, ports) {
206
+ try {
207
+ return { kind: "started", host: await options.host?.(ports) };
208
+ }
209
+ catch (error) {
210
+ return refused("host-unavailable", message(error));
211
+ }
212
+ }
@@ -0,0 +1,4 @@
1
+ import { type Fields, type Reply } from "../protocol.ts";
2
+ import { type ServiceContext } from "./replies.ts";
3
+ export declare function runIdentity(commandId: string): string;
4
+ export declare function submissionHandler(context: ServiceContext): (parameters: Fields) => Promise<Reply>;
@@ -0,0 +1,206 @@
1
+ import { createHash } from "node:crypto";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { isIdentifier as isWorkflowIdentifier } from "../authority/commands.js";
4
+ import { documentDigest } from "../broker/decision-restore.js";
5
+ import { record } from "../protocol.js";
6
+ import { checkResolution, checkSubmission, normalizedRequest, } from "../submission.js";
7
+ import { committed, failed, invalidRequest, isIdentifier, publicReceipt, rejection, result, } from "./replies.js";
8
+ export function runIdentity(commandId) {
9
+ return `run-${createHash("sha256").update(commandId).digest("hex").slice(0, 32)}`;
10
+ }
11
+ function resolverIdentity(text) {
12
+ const separator = text.lastIndexOf(":");
13
+ return { id: text.slice(0, separator), version: text.slice(separator + 1) };
14
+ }
15
+ function admitted(stored, outcome) {
16
+ const { command } = stored;
17
+ return result("run-admitted", {
18
+ runId: stored.runId,
19
+ workflowId: outcome.workflowId,
20
+ commandId: stored.commandId,
21
+ replayed: outcome.replayed,
22
+ receipt: publicReceipt(stored),
23
+ binding: {
24
+ workflowPin: command.workflow,
25
+ resolver: resolverIdentity(String(command.resolver)),
26
+ requestDigest: command.submission,
27
+ executionInputDigest: command.input,
28
+ },
29
+ });
30
+ }
31
+ function conflict(commandId) {
32
+ return failed("conflicting-command", {
33
+ commandId,
34
+ detail: "The command ID is known with a different request.",
35
+ });
36
+ }
37
+ function replayed(existing, request) {
38
+ const submission = record(request.submission);
39
+ const same = existing.command.kind === "admit-run" &&
40
+ submission !== undefined &&
41
+ documentDigest(normalizedRequest(request.workflowId, submission)) ===
42
+ existing.command.submission;
43
+ return same
44
+ ? admitted(existing, { workflowId: request.workflowId, replayed: true })
45
+ : conflict(existing.commandId);
46
+ }
47
+ function effectBudget(workflow) {
48
+ if (workflow.effectLimit === undefined)
49
+ return {};
50
+ return {
51
+ effectLimit: workflow.effectLimit,
52
+ capabilities: JSON.stringify([...workflow.manifest.capabilities].sort()),
53
+ };
54
+ }
55
+ function usable(workflow, workflowId) {
56
+ if (workflow === undefined)
57
+ return {
58
+ kind: "unusable",
59
+ reply: failed("unknown-workflow", {
60
+ detail: `No admitted workflow has the ID ${workflowId}.`,
61
+ }),
62
+ };
63
+ if (workflow.availability !== "available")
64
+ return {
65
+ kind: "unusable",
66
+ reply: failed("workflow-unavailable", {
67
+ detail: `The workflow ${workflowId} is not available. A required capability did not pass admission.`,
68
+ }),
69
+ };
70
+ return { kind: "usable", workflow };
71
+ }
72
+ async function resolved(context, admission) {
73
+ const { workflow, workflowId, commandId, submission } = admission;
74
+ const limit = new AbortController();
75
+ const timer = new AbortController();
76
+ const request = { workflowId, submission, commandId, signal: limit.signal };
77
+ const call = Promise.resolve(request)
78
+ .then((given) => workflow.resolver.resolve(given))
79
+ .then((value) => checkResolution(value) ?? "failure")
80
+ .catch(() => "failure");
81
+ const expired = delay(context.resolverMilliseconds, "timeout", {
82
+ signal: timer.signal,
83
+ });
84
+ try {
85
+ const outcome = await Promise.race([call, expired]);
86
+ if (outcome === "timeout")
87
+ limit.abort();
88
+ return outcome;
89
+ }
90
+ finally {
91
+ timer.abort();
92
+ }
93
+ }
94
+ function unresolved(context, outcome) {
95
+ const { kind, commandId } = outcome;
96
+ if (kind === "timeout")
97
+ return failed("resolver-timeout", {
98
+ commandId,
99
+ detail: `The resolver gave no result in ${String(context.resolverMilliseconds)} ms. Send the command again with the same command ID.`,
100
+ });
101
+ return failed("resolver-failure", {
102
+ commandId,
103
+ detail: "The resolver of the workflow failed or gave a result that is not valid. Nothing is admitted.",
104
+ });
105
+ }
106
+ async function admit(context, admission) {
107
+ const { workflow, workflowId, commandId, normalized } = admission;
108
+ const resolution = await resolved(context, admission);
109
+ if (typeof resolution === "string")
110
+ return unresolved(context, { kind: resolution, commandId });
111
+ if (resolution.kind === "rejected")
112
+ return failed(resolution.code, { commandId, detail: resolution.detail });
113
+ const { input } = resolution;
114
+ if (Buffer.byteLength(input) > context.documentBytes)
115
+ return unresolved(context, { kind: "failure", commandId });
116
+ const receipt = await context.gateway.execute({
117
+ principal: "operator",
118
+ command: {
119
+ kind: "admit-run",
120
+ commandId,
121
+ runId: runIdentity(commandId),
122
+ workflow: workflow.pin,
123
+ submission: documentDigest(normalized),
124
+ input: documentDigest(input),
125
+ resolver: `${workflow.resolver.id}:${workflow.resolver.version}`,
126
+ ...effectBudget(workflow),
127
+ },
128
+ documents: [normalized, input],
129
+ });
130
+ if (!committed(receipt))
131
+ return rejection(receipt, { commandId });
132
+ const stored = await context.authority.queries.receipt(commandId);
133
+ if (stored === undefined)
134
+ return conflict(commandId);
135
+ return admitted(stored, {
136
+ workflowId,
137
+ replayed: receipt.kind === "duplicate",
138
+ });
139
+ }
140
+ async function submitted(context, parameters) {
141
+ const { workflowId, commandId } = parameters;
142
+ if (!isWorkflowIdentifier(workflowId) || !isIdentifier(commandId))
143
+ return invalidRequest("The workflow ID or the command ID is not valid.");
144
+ const existing = await context.authority.queries.receipt(commandId);
145
+ if (existing !== undefined)
146
+ return replayed(existing, {
147
+ workflowId,
148
+ submission: parameters["submission"],
149
+ });
150
+ const found = usable(context.registry.byId(workflowId), workflowId);
151
+ if (found.kind === "unusable")
152
+ return found.reply;
153
+ const contract = found.workflow.submission;
154
+ const check = checkSubmission({
155
+ ...contract,
156
+ maximumBytes: Math.min(contract.maximumBytes, context.documentBytes),
157
+ }, {
158
+ workflowId,
159
+ submission: parameters["submission"],
160
+ source: parameters["source"],
161
+ });
162
+ if (check.kind === "rejected")
163
+ return failed(check.code, { commandId, detail: check.detail });
164
+ if (found.workflow.admission === "when-idle" &&
165
+ (await activeWorkflow(context, workflowId)))
166
+ return failed("workflow-active", {
167
+ commandId,
168
+ detail: `The workflow ${workflowId} already has an active run.`,
169
+ });
170
+ return admit(context, {
171
+ workflow: found.workflow,
172
+ workflowId,
173
+ commandId,
174
+ submission: check.submission,
175
+ normalized: check.normalized,
176
+ });
177
+ }
178
+ async function activeWorkflow(context, workflowId) {
179
+ const workflows = await context.authority.queries.workflowIds();
180
+ const state = await context.authority.state();
181
+ return Object.values(state.runs).some((run) => workflows[run.runId] === workflowId &&
182
+ !["completed", "failed", "cancelled"].includes(run.status));
183
+ }
184
+ export function submissionHandler(context) {
185
+ const pending = new Map();
186
+ return (parameters) => {
187
+ const keys = [`command:${String(parameters["commandId"])}`];
188
+ const workflowId = String(parameters["workflowId"]);
189
+ if (context.registry.byId(workflowId)?.admission === "when-idle")
190
+ keys.push(`workflow:${workflowId}`);
191
+ const next = () => submitted(context, parameters);
192
+ const previous = keys
193
+ .map((key) => pending.get(key))
194
+ .filter((reply) => reply !== undefined);
195
+ const reply = Promise.allSettled(previous).then(next);
196
+ for (const key of keys)
197
+ pending.set(key, reply);
198
+ const settled = () => {
199
+ for (const key of keys)
200
+ if (pending.get(key) === reply)
201
+ pending.delete(key);
202
+ };
203
+ reply.then(settled, settled);
204
+ return reply;
205
+ };
206
+ }
@@ -0,0 +1,16 @@
1
+ import { type Reply, type ServiceRequest } from "../protocol.ts";
2
+ import type { Connection } from "./event-handler.ts";
3
+ export type Handle = (request: ServiceRequest, connection: Connection) => Promise<Reply | undefined>;
4
+ export interface Listener {
5
+ readonly close: () => Promise<void>;
6
+ }
7
+ export interface ConnectionLimits {
8
+ readonly idleMilliseconds: number;
9
+ }
10
+ export declare const connectionLimits: ConnectionLimits;
11
+ export declare function listen(options: {
12
+ readonly path: string;
13
+ readonly handle: Handle;
14
+ readonly limits?: ConnectionLimits;
15
+ }): Promise<Listener>;
16
+ export declare function reachable(path: string): Promise<boolean>;
@@ -0,0 +1,141 @@
1
+ import { chmod, rm } from "node:fs/promises";
2
+ import net from "node:net";
3
+ import { eventLine, maximumFrameBytes, parseRequest, replyLine, } from "../protocol.js";
4
+ function tooLarge() {
5
+ return {
6
+ kind: "error",
7
+ error: {
8
+ code: "request-too-large",
9
+ detail: `A request has at most ${String(maximumFrameBytes)} bytes.`,
10
+ },
11
+ };
12
+ }
13
+ function unavailable(error) {
14
+ return {
15
+ kind: "error",
16
+ error: {
17
+ code: "authority-unavailable",
18
+ detail: String(Reflect.get(Object(error), "message")),
19
+ },
20
+ };
21
+ }
22
+ function flushed(socket, limit) {
23
+ return new Promise((settle) => {
24
+ const settled = (outcome) => () => {
25
+ clearTimeout(timer);
26
+ socket.off("drain", onDrain);
27
+ socket.off("close", onStall);
28
+ if (outcome === "stalled")
29
+ socket.destroy();
30
+ settle(outcome === "drained");
31
+ };
32
+ const onDrain = settled("drained");
33
+ const onStall = settled("stalled");
34
+ const timer = setTimeout(onStall, limit);
35
+ socket.once("drain", onDrain);
36
+ socket.once("close", onStall);
37
+ });
38
+ }
39
+ function served(socket, serving) {
40
+ const { handle, limits } = serving;
41
+ let buffered = "";
42
+ let handled = false;
43
+ const connection = {
44
+ send: (events) => {
45
+ if (socket.destroyed)
46
+ return Promise.resolve(false);
47
+ const written = events.map((event) => socket.write(eventLine(event)));
48
+ return written.includes(false)
49
+ ? flushed(socket, limits.idleMilliseconds)
50
+ : Promise.resolve(true);
51
+ },
52
+ closed: () => socket.destroyed || socket.readableEnded,
53
+ };
54
+ socket.setTimeout(limits.idleMilliseconds, () => {
55
+ if (!handled)
56
+ socket.destroy();
57
+ });
58
+ const finish = (reply) => {
59
+ if (socket.destroyed)
60
+ return;
61
+ if (reply === undefined)
62
+ socket.destroy();
63
+ else
64
+ socket.end(replyLine(reply));
65
+ setTimeout(() => socket.destroy(), limits.idleMilliseconds).unref();
66
+ };
67
+ socket.setEncoding("utf8");
68
+ socket.on("error", () => undefined);
69
+ socket.on("data", (data) => {
70
+ if (handled)
71
+ return;
72
+ buffered += data;
73
+ const end = buffered.indexOf("\n");
74
+ if (end < 0 && Buffer.byteLength(buffered) <= maximumFrameBytes)
75
+ return;
76
+ handled = true;
77
+ if (end < 0 || end > maximumFrameBytes) {
78
+ finish(tooLarge());
79
+ return;
80
+ }
81
+ const parsed = parseRequest(buffered.slice(0, end));
82
+ if (parsed.kind === "error") {
83
+ finish(parsed);
84
+ return;
85
+ }
86
+ Promise.resolve(parsed.request)
87
+ .then((request) => handle(request, connection))
88
+ .then(finish, (error) => {
89
+ finish(unavailable(error));
90
+ });
91
+ });
92
+ socket.on("end", () => {
93
+ if (!handled)
94
+ socket.end();
95
+ });
96
+ }
97
+ export const connectionLimits = {
98
+ idleMilliseconds: 30_000,
99
+ };
100
+ export async function listen(options) {
101
+ const { path, handle } = options;
102
+ const limits = options.limits ?? connectionLimits;
103
+ const sockets = new Set();
104
+ const server = net.createServer({ allowHalfOpen: true }, (socket) => {
105
+ sockets.add(socket);
106
+ socket.on("close", () => sockets.delete(socket));
107
+ served(socket, { handle, limits });
108
+ });
109
+ await new Promise((ready, refuse) => {
110
+ server.once("error", refuse);
111
+ server.listen(path, () => {
112
+ server.off("error", refuse);
113
+ ready();
114
+ });
115
+ });
116
+ await chmod(path, 0o600);
117
+ return {
118
+ close: async () => {
119
+ for (const socket of sockets)
120
+ socket.destroy();
121
+ await new Promise((closed) => {
122
+ server.close(() => {
123
+ closed();
124
+ });
125
+ });
126
+ await rm(path, { force: true });
127
+ },
128
+ };
129
+ }
130
+ export function reachable(path) {
131
+ return new Promise((settle) => {
132
+ const socket = net.connect(path);
133
+ socket.on("connect", () => {
134
+ socket.destroy();
135
+ settle(true);
136
+ });
137
+ socket.on("error", () => {
138
+ settle(false);
139
+ });
140
+ });
141
+ }
@@ -0,0 +1,85 @@
1
+ import type { Authority, OperationView, StoreReceipt, StoredDisposition } from "../broker/actor/authority.ts";
2
+ import type { Command, Gateway } from "./gateway.ts";
3
+ interface Identified {
4
+ readonly runId: string;
5
+ readonly commandId: string;
6
+ }
7
+ interface Revised extends Identified {
8
+ readonly expectedRevision: number;
9
+ }
10
+ export interface GateOpening extends Revised {
11
+ readonly gateId: string;
12
+ readonly kind: "question" | "approval";
13
+ readonly prompt: string;
14
+ readonly subject: string;
15
+ readonly expiresAt?: string;
16
+ }
17
+ export interface WaitRegistration extends Identified {
18
+ readonly gateId: string;
19
+ }
20
+ export interface ObservationReport extends Identified {
21
+ readonly condition: string;
22
+ readonly reason: string;
23
+ readonly evidence?: string;
24
+ readonly retryAt?: string;
25
+ readonly operationId?: string;
26
+ readonly attempt?: number;
27
+ readonly limit?: number;
28
+ }
29
+ export interface EffectScope {
30
+ readonly phase: string;
31
+ readonly operation: string;
32
+ readonly round: number;
33
+ readonly key?: string;
34
+ readonly stage?: {
35
+ readonly id: string;
36
+ readonly visit: string;
37
+ readonly branch: string;
38
+ };
39
+ }
40
+ export interface EffectRequest extends Identified {
41
+ readonly scope: EffectScope;
42
+ readonly capability: string;
43
+ readonly method: string;
44
+ readonly target: string;
45
+ readonly payload: string;
46
+ readonly units: number;
47
+ readonly resource?: string;
48
+ readonly transport?: string;
49
+ readonly source?: string;
50
+ readonly sourceGeneration?: number;
51
+ readonly epoch?: number;
52
+ }
53
+ export interface EffectReport extends Identified {
54
+ readonly operationId: string;
55
+ readonly inputDigest: string;
56
+ readonly leaseGeneration: number;
57
+ readonly worker: string;
58
+ readonly outcome: "completed" | "failed" | "stopped";
59
+ readonly result?: string;
60
+ readonly reason?: string;
61
+ readonly evidence?: string;
62
+ readonly epoch?: number;
63
+ }
64
+ export interface EffectReply {
65
+ readonly receipt: StoreReceipt;
66
+ readonly disposition: StoredDisposition | null;
67
+ readonly operation: OperationView | null;
68
+ }
69
+ export interface WorkerPort {
70
+ readonly submit: (command: Command, documents?: readonly string[]) => Promise<StoreReceipt>;
71
+ readonly started: (run: Revised) => Promise<StoreReceipt>;
72
+ readonly openGate: (opening: GateOpening) => Promise<StoreReceipt>;
73
+ readonly registerWait: (wait: WaitRegistration) => Promise<StoreReceipt>;
74
+ readonly observe: (report: ObservationReport) => Promise<StoreReceipt>;
75
+ readonly completed: (run: Revised) => Promise<StoreReceipt>;
76
+ readonly failed: (run: Revised) => Promise<StoreReceipt>;
77
+ readonly requestEffect: (request: EffectRequest) => Promise<EffectReply>;
78
+ readonly reportEffect: (report: EffectReport) => Promise<EffectReply>;
79
+ }
80
+ interface Parts {
81
+ readonly gateway: Gateway;
82
+ readonly authority: Authority;
83
+ }
84
+ export declare function workerPort(parts: Parts): WorkerPort;
85
+ export {};