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,81 @@
1
+ import { execFile } from "node:child_process";
2
+ import { join } from "node:path";
3
+ import { promisify } from "node:util";
4
+ import { analysisInstruction } from "../chats/analysis-prompt.js";
5
+ export { analysisInstruction } from "../chats/analysis-prompt.js";
6
+ export const analysisMethod = "run-turn:analyze-chats";
7
+ const controls = [
8
+ "--safe-mode",
9
+ "--restricted",
10
+ "--strict-mcp-config",
11
+ "--disable-slash-commands",
12
+ "--no-chrome",
13
+ "--no-session-persistence",
14
+ ];
15
+ export function analysisCommand() {
16
+ return [
17
+ "claude",
18
+ ...controls,
19
+ "--print",
20
+ "--output-format",
21
+ "stream-json",
22
+ "--verbose",
23
+ "--tools",
24
+ "",
25
+ "--disallowedTools",
26
+ "mcp__*",
27
+ "--mcp-config",
28
+ '{"mcpServers":{}}',
29
+ "--setting-sources",
30
+ "",
31
+ "--settings",
32
+ '{"disableAllHooks":true}',
33
+ "--permission-prompts",
34
+ "none",
35
+ "--max-turns",
36
+ "1",
37
+ "--max-budget-usd",
38
+ "5",
39
+ "--model",
40
+ "sonnet",
41
+ "--system-prompt",
42
+ analysisInstruction,
43
+ ];
44
+ }
45
+ export function analysisEnvironment(folder) {
46
+ return {
47
+ PATH: process.env["PATH"],
48
+ HOME: join(folder, "configuration"),
49
+ CLAUDE_CONFIG_DIR: join(folder, "configuration"),
50
+ TMPDIR: join(folder, "configuration"),
51
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1",
52
+ };
53
+ }
54
+ function supportedVersion(line) {
55
+ const match = /^2\.(0|[1-9]\d*)\.(0|[1-9]\d*) \(Claude Code\)$/.exec(line.trim());
56
+ if (match?.[1] === undefined || match[2] === undefined)
57
+ return false;
58
+ const minor = BigInt(match[1]);
59
+ return minor > 1n || (minor === 1n && BigInt(match[2]) >= 302n);
60
+ }
61
+ export async function analysisAvailable(folder) {
62
+ const probe = (flag) => promisify(execFile)("claude", [flag], {
63
+ cwd: folder,
64
+ env: analysisEnvironment(folder),
65
+ timeout: 5_000,
66
+ maxBuffer: 131_072,
67
+ });
68
+ try {
69
+ const version = await probe("--version");
70
+ if (!supportedVersion(version.stdout))
71
+ return false;
72
+ const help = await probe("--help");
73
+ const advertised = new Set(help.stdout.match(/--[a-zA-Z][a-zA-Z0-9-]*/g) ?? []);
74
+ return analysisCommand()
75
+ .filter((argument) => argument.startsWith("--"))
76
+ .every((flag) => advertised.has(flag));
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
@@ -0,0 +1,6 @@
1
+ export type AnalysisToken = {
2
+ readonly token: string;
3
+ } | {
4
+ readonly error: string;
5
+ };
6
+ export declare function analysisToken(folder: string, signal?: AbortSignal): Promise<AnalysisToken>;
@@ -0,0 +1,88 @@
1
+ import { spawn } from "node:child_process";
2
+ function failed(category) {
3
+ return { error: "analysis-token-command-" + category };
4
+ }
5
+ function commandOf(setting) {
6
+ try {
7
+ const parsed = JSON.parse(setting);
8
+ if (!Array.isArray(parsed) || parsed.length === 0)
9
+ return undefined;
10
+ const entries = parsed;
11
+ if (entries.every((entry) => typeof entry === "string" && entry.length > 0))
12
+ return entries;
13
+ return undefined;
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ function tokenOf(chunks) {
20
+ const token = Buffer.concat(chunks)
21
+ .toString("utf8")
22
+ .replace(/(?:\r\n|[\r\n])$/, "");
23
+ return /^[!-~]{1,512}$/.test(token) ? { token } : failed("output-invalid");
24
+ }
25
+ function captured(command, request) {
26
+ return new Promise((settle) => {
27
+ const [program = "", ...arguments_] = command;
28
+ const child = spawn(program, arguments_, {
29
+ cwd: request.folder,
30
+ shell: false,
31
+ stdio: ["ignore", "pipe", "pipe"],
32
+ signal: request.signal,
33
+ killSignal: "SIGKILL",
34
+ });
35
+ const chunks = [];
36
+ let bytes = 0;
37
+ let stopped = false;
38
+ const stop = (category) => {
39
+ stopped = true;
40
+ clearTimeout(timer);
41
+ child.kill("SIGKILL");
42
+ child.stdout.destroy();
43
+ child.stderr.destroy();
44
+ settle(failed(category));
45
+ };
46
+ const timer = setTimeout(() => {
47
+ stop("timeout");
48
+ }, 10_000);
49
+ const received = (chunk, output) => {
50
+ if (stopped)
51
+ return;
52
+ bytes += chunk.length;
53
+ if (bytes > 4_096) {
54
+ stop("output-too-large");
55
+ return;
56
+ }
57
+ output?.push(chunk);
58
+ };
59
+ child.stdout.on("data", (chunk) => {
60
+ received(chunk, chunks);
61
+ });
62
+ child.stderr.on("data", (chunk) => {
63
+ received(chunk);
64
+ });
65
+ child.once("error", () => {
66
+ stop("failed");
67
+ });
68
+ child.once("close", (code) => {
69
+ clearTimeout(timer);
70
+ if (!stopped)
71
+ settle(code === 0 ? tokenOf(chunks) : failed("failed"));
72
+ });
73
+ });
74
+ }
75
+ export async function analysisToken(folder, signal) {
76
+ const setting = process.env["CLOVING_ANALYSIS_TOKEN_COMMAND"];
77
+ if (setting === undefined)
78
+ return failed("unset");
79
+ const command = commandOf(setting);
80
+ if (command === undefined)
81
+ return failed("invalid");
82
+ try {
83
+ return await captured(command, { folder, signal });
84
+ }
85
+ catch {
86
+ return failed("failed");
87
+ }
88
+ }
@@ -0,0 +1,22 @@
1
+ import type { AdapterOutcome, DeliveryIntent } from "../broker/actor/delivery-intents.ts";
2
+ import { type TokenPrices } from "../token-prices.ts";
3
+ import { type RetrySettings } from "./retrying-turn.ts";
4
+ import { type WorkerReport } from "./operation-journal.ts";
5
+ interface Settings extends RetrySettings {
6
+ readonly tokenPrices?: TokenPrices;
7
+ readonly journal: string;
8
+ readonly document: (digest: string) => Promise<string | undefined>;
9
+ readonly report: (report: WorkerReport) => Promise<unknown>;
10
+ readonly stopMilliseconds?: number;
11
+ }
12
+ interface AnalysisWorker {
13
+ readonly deliver: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome | {
14
+ readonly receipt: string;
15
+ readonly worker: string;
16
+ }>;
17
+ readonly reconcile: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
18
+ readonly stop: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
19
+ readonly close: () => Promise<void>;
20
+ }
21
+ export declare function analysisWorker(settings: Settings): AnalysisWorker;
22
+ export {};
@@ -0,0 +1,219 @@
1
+ import { mkdir, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { analysisPrompt } from "../chats/analysis-prompt.js";
4
+ import { isAnalysisSnapshot } from "../chats/analysis-input.js";
5
+ import { record } from "../protocol.js";
6
+ import { estimatedCostUsd, priceForModel, } from "../token-prices.js";
7
+ import { startRetriedTurn } from "./retrying-turn.js";
8
+ import { analysisAvailable, analysisMethod } from "./analysis-launch.js";
9
+ import { analysisToken } from "./analysis-token.js";
10
+ import { located, readRecord, writeRecord, replied, reportOf, interrupted, } from "./operation-journal.js";
11
+ function own(intent) {
12
+ return (intent.kind === "protected-effect" &&
13
+ intent.capability === "claude" &&
14
+ intent.method === analysisMethod &&
15
+ intent.target !== undefined &&
16
+ intent.payload !== undefined &&
17
+ intent.leaseGeneration !== undefined);
18
+ }
19
+ function failed(reason) {
20
+ return { kind: "failed", reason };
21
+ }
22
+ function snapshotOf(text) {
23
+ try {
24
+ return record(JSON.parse(text ?? "null"))?.["snapshot"];
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ async function cleaned(folder) {
31
+ await Promise.all(["configuration", "working"].map((name) => rm(join(folder, name), { recursive: true, force: true })));
32
+ }
33
+ async function privateRecord(folder, entry) {
34
+ await writeRecord(folder, { ...entry, permissions: "private" });
35
+ }
36
+ function outcome(end, prices) {
37
+ const endedAt = new Date().toISOString();
38
+ if (end.stopped)
39
+ return { outcome: "stopped", endedAt };
40
+ const result = end.result;
41
+ if (result === undefined)
42
+ return { ...interrupted("analysis-turn-failed"), endedAt };
43
+ const fields = {
44
+ costUsd: result.costUsd,
45
+ usage: result.usage,
46
+ model: result.model,
47
+ sessionId: result.sessionId,
48
+ turns: result.turns,
49
+ estimatedCostUsd: estimatedCostUsd(result.usage, {
50
+ worker: "claude",
51
+ price: priceForModel(prices, result.model),
52
+ }),
53
+ };
54
+ if (end.exitCode !== 0 || result.failed)
55
+ return {
56
+ outcome: "failed",
57
+ reason: "analysis-turn-failed",
58
+ endedAt,
59
+ result: JSON.stringify(fields),
60
+ };
61
+ if (Buffer.byteLength(result.text, "utf8") > 16_000)
62
+ return {
63
+ outcome: "failed",
64
+ reason: "analysis-reply-too-large",
65
+ endedAt,
66
+ result: JSON.stringify(fields),
67
+ };
68
+ return {
69
+ outcome: "completed",
70
+ endedAt,
71
+ result: JSON.stringify({ ...fields, reply: result.text }),
72
+ };
73
+ }
74
+ function running(processId) {
75
+ if (typeof processId !== "number")
76
+ return false;
77
+ try {
78
+ process.kill(processId, 0);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ async function reconcile(parts, intent) {
86
+ if (!own(intent))
87
+ return failed("unsupported-effect");
88
+ const { key, folder } = located(parts.settings.journal, intent.operationId);
89
+ const result = await readRecord(folder, "result.json");
90
+ if (result !== undefined) {
91
+ await cleaned(folder);
92
+ return replied({ receipt: key, worker: "claude" }, result);
93
+ }
94
+ if (parts.active.has(key))
95
+ return { kind: "accepted", receipt: key, worker: "claude" };
96
+ const started = await readRecord(folder, "started.json");
97
+ if (started === undefined)
98
+ return { kind: "absent" };
99
+ if (running(record(started)?.["processId"]))
100
+ return { kind: "unknown", evidence: key };
101
+ const ending = interrupted("analysis-turn-failed");
102
+ await privateRecord(folder, { name: "result.json", value: ending });
103
+ await cleaned(folder);
104
+ return replied({ receipt: key, worker: "claude" }, ending);
105
+ }
106
+ async function begun(parts, opening) {
107
+ const { intent, folder, key, directory, prompt } = opening;
108
+ const started = {
109
+ operationId: intent.operationId,
110
+ target: intent.target,
111
+ mode: "analysis",
112
+ startedAt: new Date().toISOString(),
113
+ };
114
+ const turn = await startRetriedTurn({
115
+ mode: "analysis",
116
+ analysisToken: opening.token,
117
+ command: [],
118
+ folder,
119
+ directory,
120
+ prompt,
121
+ }, { ...parts.settings, metadata: started });
122
+ const done = turn.ended
123
+ .then(async (end) => {
124
+ const result = outcome(end, parts.settings.tokenPrices ?? {});
125
+ await privateRecord(folder, { name: "result.json", value: result });
126
+ await cleaned(folder);
127
+ await parts.settings.report(reportOf({ intent, worker: "claude", commandId: `analysis-turn:${key}` }, result));
128
+ })
129
+ .catch(() => undefined)
130
+ .finally(() => parts.active.delete(key));
131
+ parts.active.set(key, { turn, done });
132
+ }
133
+ function cancelled(parts, signal) {
134
+ return signal.aborted || parts.stopping.signal.aborted;
135
+ }
136
+ async function deliver(parts, call) {
137
+ const { intent, signal } = call;
138
+ if (!own(intent))
139
+ return failed("unsupported-effect");
140
+ const known = await reconcile(parts, intent);
141
+ if (known.kind !== "absent")
142
+ return known;
143
+ const { key, folder } = located(parts.settings.journal, intent.operationId);
144
+ const text = await parts.settings.document(intent.payload);
145
+ const snapshot = snapshotOf(text);
146
+ if (!isAnalysisSnapshot(snapshot) || snapshot.importId !== intent.target)
147
+ return failed("analysis-input-refused");
148
+ await mkdir(join(folder, "configuration"), { recursive: true, mode: 0o700 });
149
+ if (!(await analysisAvailable(folder))) {
150
+ await cleaned(folder);
151
+ return failed("analysis-worker-unavailable");
152
+ }
153
+ if (cancelled(parts, signal)) {
154
+ await cleaned(folder);
155
+ return failed("analysis-turn-failed");
156
+ }
157
+ const credential = await analysisToken(folder, signal);
158
+ if (cancelled(parts, signal)) {
159
+ await cleaned(folder);
160
+ return failed("analysis-turn-failed");
161
+ }
162
+ if ("error" in credential) {
163
+ await cleaned(folder);
164
+ return {
165
+ ...failed("analysis-worker-unavailable"),
166
+ result: JSON.stringify({ error: credential.error }),
167
+ };
168
+ }
169
+ const directory = join(folder, "working");
170
+ await mkdir(directory, { mode: 0o700 });
171
+ await begun(parts, {
172
+ intent,
173
+ key,
174
+ folder,
175
+ directory,
176
+ prompt: analysisPrompt(snapshot),
177
+ token: credential.token,
178
+ });
179
+ return { receipt: key, worker: "claude" };
180
+ }
181
+ async function halted(parts, active) {
182
+ active.turn.stop(parts.settings.stopMilliseconds ?? 2_000);
183
+ await active.done;
184
+ }
185
+ function delivered(parts, call) {
186
+ if (cancelled(parts, call.signal))
187
+ return Promise.resolve(failed("analysis-turn-failed"));
188
+ const key = call.intent.operationId;
189
+ const known = parts.preparing.get(key);
190
+ if (known !== undefined)
191
+ return known;
192
+ const signal = AbortSignal.any([call.signal, parts.stopping.signal]);
193
+ const pending = deliver(parts, { ...call, signal }).finally(() => parts.preparing.delete(key));
194
+ parts.preparing.set(key, pending);
195
+ return pending;
196
+ }
197
+ export function analysisWorker(settings) {
198
+ const parts = {
199
+ settings,
200
+ active: new Map(),
201
+ preparing: new Map(),
202
+ stopping: new AbortController(),
203
+ };
204
+ return {
205
+ deliver: (intent, signal) => delivered(parts, { intent, signal }),
206
+ reconcile: (intent) => reconcile(parts, intent),
207
+ stop: async (intent) => {
208
+ const active = parts.active.get(located(settings.journal, intent.operationId).key);
209
+ if (active !== undefined)
210
+ await halted(parts, active);
211
+ return reconcile(parts, intent);
212
+ },
213
+ close: async () => {
214
+ parts.stopping.abort();
215
+ await Promise.all(parts.preparing.values());
216
+ await Promise.all([...parts.active.values()].map((active) => halted(parts, active)));
217
+ },
218
+ };
219
+ }
@@ -0,0 +1,15 @@
1
+ import { type AnalysisSnapshot } from "../chats/analysis-input.ts";
2
+ export declare function analysisDirectory(runtime: string, importId: string): Promise<string>;
3
+ export declare function boundedAnalysisFile(path: string, options?: {
4
+ readonly permissions?: number;
5
+ }): Promise<string>;
6
+ export declare function readAnalysisSnapshot(directory: string, importId: string): Promise<AnalysisSnapshot>;
7
+ export declare function matchingPrivateFile(path: string, text: string): Promise<void>;
8
+ interface AnalysisOutput {
9
+ readonly cycleId: string;
10
+ readonly analysis: string;
11
+ readonly proposal: string;
12
+ }
13
+ export declare function inspectAnalysisFiles(directory: string, output: AnalysisOutput): Promise<"complete" | "absent">;
14
+ export declare function saveAnalysisFiles(directory: string, output: AnalysisOutput): Promise<void>;
15
+ export {};
@@ -0,0 +1,113 @@
1
+ import { lstat } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { openInput } from "../chats/input-file.js";
4
+ import { createPrivateFile, validateDestination, } from "../chats/destination.js";
5
+ import { analysisDocumentBytes, } from "../chats/analysis-input.js";
6
+ export async function analysisDirectory(runtime, importId) {
7
+ if (process.platform !== "darwin")
8
+ throw new Error("platform-unsupported");
9
+ const directory = resolve(runtime, "chats", importId);
10
+ await checkedDirectory(directory);
11
+ return directory;
12
+ }
13
+ async function checkedDirectory(directory) {
14
+ try {
15
+ if (!(await lstat(directory)).isDirectory())
16
+ throw new Error("analysis-input-refused");
17
+ }
18
+ catch (error) {
19
+ if (Reflect.get(Object(error), "code") !== "ENOENT")
20
+ throw error;
21
+ const parent = dirname(directory);
22
+ if (parent === directory)
23
+ throw error;
24
+ await checkedDirectory(parent);
25
+ throw error;
26
+ }
27
+ await validateDestination(directory);
28
+ }
29
+ export async function boundedAnalysisFile(path, options = {}) {
30
+ const handle = await openInput(path);
31
+ try {
32
+ if (options.permissions !== undefined &&
33
+ ((await handle.stat()).mode & 0o777) !== options.permissions)
34
+ throw new Error("analysis-output-failed");
35
+ const buffer = Buffer.alloc(analysisDocumentBytes + 1);
36
+ let size = 0;
37
+ while (size < buffer.length) {
38
+ const { bytesRead } = await handle.read(buffer, size, buffer.length - size, null);
39
+ if (bytesRead === 0)
40
+ break;
41
+ size += bytesRead;
42
+ }
43
+ if (size > analysisDocumentBytes)
44
+ throw new Error("analysis-too-large");
45
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(buffer.subarray(0, size));
46
+ }
47
+ finally {
48
+ await handle.close();
49
+ }
50
+ }
51
+ export async function readAnalysisSnapshot(directory, importId) {
52
+ const required = async (name) => {
53
+ try {
54
+ return await boundedAnalysisFile(join(directory, name));
55
+ }
56
+ catch (error) {
57
+ if (Reflect.get(Object(error), "code") === "ENOENT")
58
+ throw new Error("redaction-required", { cause: error });
59
+ throw error;
60
+ }
61
+ };
62
+ return {
63
+ importId,
64
+ redaction: await required("redaction.json"),
65
+ corpus: await required("redacted.jsonl"),
66
+ structure: await boundedAnalysisFile(join(directory, "structure.json")),
67
+ };
68
+ }
69
+ export async function matchingPrivateFile(path, text) {
70
+ try {
71
+ const existing = await boundedAnalysisFile(path, { permissions: 0o600 });
72
+ if (existing !== text)
73
+ throw new Error("analysis-output-failed");
74
+ return;
75
+ }
76
+ catch (error) {
77
+ if (Reflect.get(Object(error), "code") !== "ENOENT")
78
+ throw error;
79
+ }
80
+ const handle = await createPrivateFile(path);
81
+ try {
82
+ await handle.writeFile(text);
83
+ }
84
+ finally {
85
+ await handle.close();
86
+ }
87
+ }
88
+ export async function inspectAnalysisFiles(directory, output) {
89
+ const proposal = join(directory, `proposal-${output.cycleId}.txt`);
90
+ const analysis = join(directory, `analysis-${output.cycleId}.json`);
91
+ const marker = await boundedAnalysisFile(analysis, {
92
+ permissions: 0o600,
93
+ }).catch((error) => {
94
+ if (Reflect.get(Object(error), "code") === "ENOENT")
95
+ return undefined;
96
+ throw error;
97
+ });
98
+ if (marker === undefined)
99
+ return "absent";
100
+ if (marker !== output.analysis ||
101
+ (await boundedAnalysisFile(proposal, { permissions: 0o600 })) !==
102
+ output.proposal)
103
+ throw new Error("analysis-output-failed");
104
+ return "complete";
105
+ }
106
+ export async function saveAnalysisFiles(directory, output) {
107
+ if ((await inspectAnalysisFiles(directory, output)) === "complete")
108
+ return;
109
+ const proposal = join(directory, `proposal-${output.cycleId}.txt`);
110
+ const analysis = join(directory, `analysis-${output.cycleId}.json`);
111
+ await matchingPrivateFile(proposal, output.proposal);
112
+ await matchingPrivateFile(analysis, output.analysis);
113
+ }
@@ -0,0 +1,12 @@
1
+ import type { AdapterOutcome, DeliveryIntent } from "../broker/actor/delivery-intents.ts";
2
+ import type { EffectDelivery } from "./delivery-router.ts";
3
+ export interface ChatsWorkerSettings {
4
+ readonly runtimeDirectory: string;
5
+ readonly document: (digest: string) => Promise<string | undefined>;
6
+ readonly workflowId: (runId: string) => Promise<string | undefined>;
7
+ }
8
+ export interface ChatsWorker extends EffectDelivery {
9
+ readonly deliver: (intent: DeliveryIntent, signal: AbortSignal) => Promise<AdapterOutcome>;
10
+ readonly close: () => Promise<void>;
11
+ }
12
+ export declare function chatsWorker(settings: ChatsWorkerSettings): ChatsWorker;