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,288 @@
1
+ import { parsePreservedJson } from "./normalize.js";
2
+ function object(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ function keys(value, fields) {
6
+ const { required, optional = [] } = fields;
7
+ return (required.every((key) => Object.hasOwn(value, key)) &&
8
+ Object.keys(value).every((key) => required.includes(key) || optional.includes(key)));
9
+ }
10
+ function natural(value) {
11
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
12
+ }
13
+ function optionalText(value) {
14
+ return value === null || typeof value === "string";
15
+ }
16
+ function block(value) {
17
+ if (!object(value) || !natural(value["position"]))
18
+ return false;
19
+ if (value["type"] === "text")
20
+ return (keys(value, { required: ["type", "position", "text"] }) &&
21
+ typeof value["text"] === "string");
22
+ if (value["type"] === "tool_use")
23
+ return (keys(value, { required: ["type", "position", "id", "name", "input"] }) &&
24
+ typeof value["id"] === "string" &&
25
+ typeof value["name"] === "string");
26
+ if (value["type"] !== "tool_result")
27
+ return false;
28
+ return toolResult(value);
29
+ }
30
+ function toolResult(value) {
31
+ return (keys(value, {
32
+ required: ["type", "position", "tool_use_id", "content"],
33
+ optional: ["is_error"],
34
+ }) &&
35
+ typeof value["tool_use_id"] === "string" &&
36
+ (!Object.hasOwn(value, "is_error") ||
37
+ typeof value["is_error"] === "boolean"));
38
+ }
39
+ function identityFields(value) {
40
+ return ((value["uuid"] === null ||
41
+ (typeof value["uuid"] === "string" && value["uuid"] !== "")) &&
42
+ (value["isSidechain"] === null ||
43
+ typeof value["isSidechain"] === "boolean") &&
44
+ (!Object.hasOwn(value, "parentUuid") ||
45
+ value["parentUuid"] === null ||
46
+ (typeof value["parentUuid"] === "string" && value["parentUuid"] !== "")));
47
+ }
48
+ function versionFields(value) {
49
+ const required = [
50
+ "schemaVersion",
51
+ "sourceId",
52
+ "role",
53
+ "timestamp",
54
+ "sessionId",
55
+ "text",
56
+ "blocks",
57
+ ];
58
+ const version = value["schemaVersion"];
59
+ if (version !== 1 && version !== 2)
60
+ return false;
61
+ const fields = version === 1
62
+ ? { required }
63
+ : {
64
+ required: [...required, "uuid", "isSidechain"],
65
+ optional: ["parentUuid"],
66
+ };
67
+ return keys(value, fields) && (version === 1 || identityFields(value));
68
+ }
69
+ function messageFields(value) {
70
+ return (versionFields(value) &&
71
+ typeof value["sourceId"] === "string" &&
72
+ value["sourceId"] !== "" &&
73
+ ["user", "assistant"].includes(String(value["role"])) &&
74
+ optionalText(value["timestamp"]) &&
75
+ optionalText(value["sessionId"]) &&
76
+ typeof value["text"] === "string");
77
+ }
78
+ function message(value) {
79
+ if (!object(value) || !messageFields(value))
80
+ return false;
81
+ if (!Array.isArray(value["blocks"]) || !value["blocks"].every(block))
82
+ return false;
83
+ let position = -1;
84
+ for (const item of value["blocks"]) {
85
+ const next = item["position"];
86
+ if (!natural(next) || next <= position)
87
+ return false;
88
+ position = next;
89
+ }
90
+ return true;
91
+ }
92
+ export function parseCorpusRecord(line) {
93
+ const value = parsePreservedJson(line);
94
+ if (!message(value))
95
+ throw new Error("invalid-import");
96
+ return value;
97
+ }
98
+ export function parseCorpus(text) {
99
+ const lines = text.split("\n");
100
+ if (lines.at(-1) === "")
101
+ lines.pop();
102
+ return lines.map(parseCorpusRecord);
103
+ }
104
+ function coverageFile(value) {
105
+ if (!object(value) ||
106
+ typeof value["path"] !== "string" ||
107
+ typeof value["reason"] !== "string")
108
+ return false;
109
+ if (!["included", "unreadable", "unsupported", "too-large"].includes(String(value["status"])))
110
+ return false;
111
+ if (!optionalText(value["digest"]) || !natural(value["recordCount"]))
112
+ return false;
113
+ if (!coverageSize(value))
114
+ return false;
115
+ const omissions = value["omissions"];
116
+ return (object(omissions) &&
117
+ natural(omissions["metadataRecords"]) &&
118
+ natural(omissions["thinkingBlocks"]));
119
+ }
120
+ export function validateCoverage(text, importId) {
121
+ const value = JSON.parse(text);
122
+ if (!object(value) || value["importId"] !== importId)
123
+ throw new Error("invalid-import");
124
+ if (value["schemaVersion"] === 2 && scanCoverage(value))
125
+ return;
126
+ if (value["schemaVersion"] === 1 &&
127
+ Array.isArray(value["files"]) &&
128
+ value["files"].every(coverageFile))
129
+ return;
130
+ throw new Error("invalid-import");
131
+ }
132
+ function scanCoverage(value) {
133
+ const roots = value["roots"];
134
+ const exclusions = value["exclusions"];
135
+ const limits = value["limits"];
136
+ const entries = value["entries"];
137
+ return (keys(value, {
138
+ required: [
139
+ "schemaVersion",
140
+ "importId",
141
+ "roots",
142
+ "exclusions",
143
+ "limits",
144
+ "entries",
145
+ ],
146
+ }) &&
147
+ Array.isArray(roots) &&
148
+ roots.length > 0 &&
149
+ roots.every(absolutePath) &&
150
+ Array.isArray(exclusions) &&
151
+ exclusions.every((name) => typeof name === "string" &&
152
+ name !== "" &&
153
+ name !== "." &&
154
+ name !== ".." &&
155
+ !["/", "\\", "\0", "*", "?", "[", "]"].some((character) => name.includes(character))) &&
156
+ coverageLimits(limits) &&
157
+ Array.isArray(entries) &&
158
+ entries.every((entry) => scanCoverageEntry(entry, roots)));
159
+ }
160
+ function coverageLimits(value) {
161
+ return (object(value) &&
162
+ keys(value, {
163
+ required: ["depth", "files", "sourceBytes", "corpusBytes"],
164
+ }) &&
165
+ value["depth"] === 4 &&
166
+ value["files"] === 100 &&
167
+ value["sourceBytes"] === 10_485_760 &&
168
+ value["corpusBytes"] === 52_428_800);
169
+ }
170
+ function scanCoverageEntry(value, roots) {
171
+ if (!object(value) || !coverageFile({ ...value, status: "included" }))
172
+ return false;
173
+ if (!keys(value, {
174
+ required: [
175
+ "kind",
176
+ "path",
177
+ "selection",
178
+ "status",
179
+ "reason",
180
+ "digest",
181
+ "recordCount",
182
+ "omissions",
183
+ ],
184
+ optional: ["byteSize"],
185
+ }))
186
+ return false;
187
+ const selection = value["selection"];
188
+ if (!coverageSelection(selection, roots.length))
189
+ return false;
190
+ if (!["file", "subtree"].includes(String(value["kind"])))
191
+ return false;
192
+ if (selection["kind"] === "file" && value["kind"] !== "file")
193
+ return false;
194
+ if (selection.kind === "root" &&
195
+ !withinRoot(roots[selection.index], value["path"]))
196
+ return false;
197
+ return scanStatus(value, selection["kind"]);
198
+ }
199
+ function coverageSelection(value, rootCount) {
200
+ if (!object(value) ||
201
+ !keys(value, { required: ["kind", "index"] }) ||
202
+ !natural(value["index"]))
203
+ return false;
204
+ return (value["kind"] === "file" ||
205
+ (value["kind"] === "root" && value["index"] < rootCount));
206
+ }
207
+ function scanStatus(value, selection) {
208
+ const status = value["status"];
209
+ const reason = value["reason"];
210
+ if (status === "included")
211
+ return (value["kind"] === "file" &&
212
+ reason === "supported" &&
213
+ typeof value["digest"] === "string");
214
+ if (status === "unreadable")
215
+ return reason === "source-unreadable" && emptyCoverageEntry(value);
216
+ if (["too-large", "excluded", "pending"].includes(String(status)))
217
+ return scanOmission(value, selection);
218
+ return scanRefusal(value);
219
+ }
220
+ function scanRefusal(value) {
221
+ if (value["status"] !== "unsupported" || value["recordCount"] !== 0)
222
+ return false;
223
+ const contentReasons = [
224
+ "invalid-utf8",
225
+ "empty-file",
226
+ "invalid-json",
227
+ "unsupported-record",
228
+ "unsupported-message",
229
+ "unsupported-block",
230
+ ];
231
+ if (contentReasons.includes(String(value["reason"])))
232
+ return value["kind"] === "file" && typeof value["digest"] === "string";
233
+ const reasons = value["kind"] === "subtree"
234
+ ? [
235
+ "symbolic-link",
236
+ "nonregular-file",
237
+ "outside-root",
238
+ "repository-root",
239
+ "source-changed",
240
+ "non-directory-root",
241
+ ]
242
+ : [
243
+ "symbolic-link",
244
+ "nonregular-file",
245
+ "outside-root",
246
+ "source-changed",
247
+ "unsupported-extension",
248
+ "file-too-large",
249
+ ];
250
+ return reasons.includes(String(value["reason"])) && emptyCoverageEntry(value);
251
+ }
252
+ function absolutePath(value) {
253
+ return (typeof value === "string" &&
254
+ value.startsWith("/") &&
255
+ !value.includes("\0") &&
256
+ value.split("/").every((part) => part !== "." && part !== ".."));
257
+ }
258
+ export function withinRoot(root, path) {
259
+ if (root === undefined || !absolutePath(path))
260
+ return false;
261
+ const parent = root.split("/").filter(Boolean);
262
+ const child = path.split("/").filter(Boolean);
263
+ return parent.every((part, index) => part === child[index]);
264
+ }
265
+ function scanOmission(value, selection) {
266
+ if (!emptyCoverageEntry(value))
267
+ return false;
268
+ if (value["status"] === "too-large")
269
+ return selection === "file" && value["reason"] === "file-too-large";
270
+ if (selection !== "root")
271
+ return false;
272
+ if (value["status"] === "excluded")
273
+ return (value["kind"] === "subtree" && value["reason"] === "project-excluded");
274
+ return (value["reason"] ===
275
+ (value["kind"] === "subtree" ? "depth-limit" : "file-limit"));
276
+ }
277
+ function emptyCoverageEntry(value) {
278
+ const omissions = value["omissions"];
279
+ return (value["digest"] === null &&
280
+ value["recordCount"] === 0 &&
281
+ object(omissions) &&
282
+ omissions["metadataRecords"] === 0 &&
283
+ omissions["thinkingBlocks"] === 0);
284
+ }
285
+ function coverageSize(value) {
286
+ return (!Object.hasOwn(value, "byteSize") ||
287
+ (natural(value["byteSize"]) && value["byteSize"] <= 10_485_760));
288
+ }
@@ -0,0 +1,4 @@
1
+ import { type FileHandle } from "node:fs/promises";
2
+ export declare function importDirectory(runtime: string, importId: string): Promise<string>;
3
+ export declare function validateDestination(directory: string): Promise<void>;
4
+ export declare function createPrivateFile(path: string): Promise<FileHandle>;
@@ -0,0 +1,96 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, mkdir, open, realpath, } from "node:fs/promises";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ function missing(error) {
5
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
6
+ }
7
+ async function canonical(path) {
8
+ try {
9
+ await lstat(path);
10
+ }
11
+ catch (error) {
12
+ if (!missing(error))
13
+ throw error;
14
+ return join(await canonical(dirname(path)), basename(path));
15
+ }
16
+ return realpath(path);
17
+ }
18
+ async function outsideRepository(path) {
19
+ let ancestor = path;
20
+ for (;;) {
21
+ try {
22
+ await lstat(join(ancestor, ".git"));
23
+ throw new Error("destination-refused");
24
+ }
25
+ catch (error) {
26
+ if (!missing(error))
27
+ throw error;
28
+ }
29
+ const parent = dirname(ancestor);
30
+ if (parent === ancestor)
31
+ return;
32
+ ancestor = parent;
33
+ }
34
+ }
35
+ async function privateDirectory(path) {
36
+ try {
37
+ const stats = await lstat(path);
38
+ if (!stats.isDirectory())
39
+ throw new Error("destination-refused");
40
+ return;
41
+ }
42
+ catch (error) {
43
+ if (!missing(error))
44
+ throw error;
45
+ }
46
+ await privateDirectory(dirname(path));
47
+ try {
48
+ await mkdir(path, { mode: 0o700 });
49
+ }
50
+ catch (error) {
51
+ if (!(error instanceof Error && "code" in error && error.code === "EEXIST"))
52
+ throw error;
53
+ if (!(await lstat(path)).isDirectory())
54
+ throw new Error("destination-refused", { cause: error });
55
+ }
56
+ }
57
+ export async function importDirectory(runtime, importId) {
58
+ if (process.platform !== "darwin")
59
+ throw new Error("platform-unsupported");
60
+ let chats;
61
+ try {
62
+ chats = await canonical(join(resolve(runtime), "chats"));
63
+ await outsideRepository(chats);
64
+ }
65
+ catch {
66
+ throw new Error("destination-refused");
67
+ }
68
+ await privateDirectory(chats);
69
+ await validateDestination(chats);
70
+ const directory = join(chats, importId);
71
+ await mkdir(directory, { mode: 0o700 });
72
+ await validateDestination(directory);
73
+ return directory;
74
+ }
75
+ export async function validateDestination(directory) {
76
+ if (process.platform !== "darwin")
77
+ throw new Error("platform-unsupported");
78
+ if ((await realpath(directory)) !== directory)
79
+ throw new Error("destination-refused");
80
+ await outsideRepository(directory);
81
+ }
82
+ export async function createPrivateFile(path) {
83
+ await validateDestination(dirname(path));
84
+ const darwinNoFollowAny = 0x20000000;
85
+ try {
86
+ return await open(path, constants.O_WRONLY |
87
+ constants.O_CREAT |
88
+ constants.O_EXCL |
89
+ darwinNoFollowAny, 0o600);
90
+ }
91
+ catch (error) {
92
+ if (error instanceof Error && "code" in error && error.code === "ELOOP")
93
+ throw new Error("destination-refused", { cause: error });
94
+ throw error;
95
+ }
96
+ }
@@ -0,0 +1,15 @@
1
+ import { type StructureCounts } from "./structure.ts";
2
+ import { type SelectionRequest } from "./selection.ts";
3
+ export interface ImportRequest extends SelectionRequest {
4
+ readonly runtimeDirectory: string | undefined;
5
+ readonly previousImportId?: string;
6
+ }
7
+ export interface ImportSummary extends StructureCounts {
8
+ readonly code: "import-complete" | "import-partial" | "runtime-directory-unknown" | "platform-unsupported" | "destination-refused" | "output-failed" | "previous-import-refused";
9
+ readonly importId: string | null;
10
+ readonly included: number;
11
+ readonly refused: number;
12
+ readonly excluded?: number;
13
+ readonly pending?: number;
14
+ }
15
+ export declare function importChats(request: ImportRequest): Promise<ImportSummary>;
@@ -0,0 +1,243 @@
1
+ import { readPreviousImport } from "./previous-import.js";
2
+ import { pairEvidence, compareEvidence, } from "./revision.js";
3
+ import { structureImport } from "./structure.js";
4
+ import { randomUUID } from "node:crypto";
5
+ import { rm } from "node:fs/promises";
6
+ import { join, resolve } from "node:path";
7
+ import { createPrivateFile, importDirectory, validateDestination, } from "./destination.js";
8
+ import { readTranscript } from "./reader.js";
9
+ import { selectChatSources, } from "./selection.js";
10
+ const corpusLimit = 52_428_800;
11
+ function boundedCorpusLine(record, previousBytes) {
12
+ const line = `${JSON.stringify(record)}\n`;
13
+ const bytes = previousBytes + Buffer.byteLength(line);
14
+ if (bytes > corpusLimit)
15
+ throw new Error("corpus-too-large");
16
+ return { line, bytes };
17
+ }
18
+ async function writeImport(directory, data) {
19
+ const { request, previous } = data;
20
+ const selection = await selectChatSources(request);
21
+ const keys = selection.entries.map((selected) => selectionKey(selected, selection.roots));
22
+ const pairs = pairEvidence({ previous, current: keys });
23
+ const evidence = [];
24
+ const files = [];
25
+ const records = [];
26
+ let corpusBytes = 0;
27
+ const corpus = await createPrivateFile(join(directory, "corpus.jsonl"));
28
+ try {
29
+ for (const [index, selected] of selection.entries.entries()) {
30
+ const matched = pairs[index];
31
+ const before = matched === null || matched === undefined
32
+ ? undefined
33
+ : previous[matched];
34
+ const result = await readSelected(selected, before?.byteSize);
35
+ evidence.push({
36
+ ...selectionKey(selected, selection.roots),
37
+ ...result.coverage,
38
+ ...(result.prefixDigest === undefined
39
+ ? {}
40
+ : { prefixDigest: result.prefixDigest }),
41
+ });
42
+ files.push({
43
+ ...result.coverage,
44
+ kind: selected.kind,
45
+ selection: selected.selection,
46
+ });
47
+ for (const record of result.records) {
48
+ const next = boundedCorpusLine(record, corpusBytes);
49
+ await corpus.writeFile(next.line);
50
+ corpusBytes = next.bytes;
51
+ records.push(record);
52
+ }
53
+ }
54
+ }
55
+ finally {
56
+ await corpus.close();
57
+ }
58
+ return { roots: selection.roots, files, records, evidence };
59
+ }
60
+ function selectionKey(selected, roots) {
61
+ return {
62
+ path: selected.path,
63
+ root: selected.selection.kind === "root"
64
+ ? (roots[selected.selection.index] ?? null)
65
+ : null,
66
+ };
67
+ }
68
+ async function readSelected(selected, prefixBytes) {
69
+ if (selected.outcome !== undefined)
70
+ return {
71
+ coverage: {
72
+ path: selected.path,
73
+ ...selected.outcome,
74
+ digest: null,
75
+ recordCount: 0,
76
+ omissions: { metadataRecords: 0, thinkingBlocks: 0 },
77
+ },
78
+ records: [],
79
+ };
80
+ return readTranscript(selected.path, {
81
+ ...(selected.inspection === undefined
82
+ ? {}
83
+ : { inspection: selected.inspection }),
84
+ ...(prefixBytes === undefined ? {} : { prefixBytes }),
85
+ });
86
+ }
87
+ async function writeMetadata(path, data) {
88
+ const handle = await createPrivateFile(path);
89
+ try {
90
+ await handle.writeFile(`${JSON.stringify({ schemaVersion: 1, ...data }, null, 2)}\n`);
91
+ }
92
+ finally {
93
+ await handle.close();
94
+ }
95
+ }
96
+ async function writeCoverage(directory, coverage) {
97
+ const manifest = join(directory, "coverage.json");
98
+ let created = false;
99
+ try {
100
+ const handle = await createPrivateFile(manifest);
101
+ created = true;
102
+ try {
103
+ await handle.writeFile(`${JSON.stringify(coverage, null, 2)}\n`);
104
+ }
105
+ finally {
106
+ await handle.close();
107
+ }
108
+ }
109
+ catch (error) {
110
+ if (created) {
111
+ await validateDestination(directory);
112
+ await rm(manifest, { force: true });
113
+ }
114
+ throw error;
115
+ }
116
+ }
117
+ export async function importChats(request) {
118
+ const empty = emptyImport(request);
119
+ if (process.platform !== "darwin")
120
+ return { ...empty, code: "platform-unsupported" };
121
+ if (request.runtimeDirectory === undefined)
122
+ return { ...empty, code: "runtime-directory-unknown" };
123
+ try {
124
+ const runtime = resolve(request.workingDirectory, request.runtimeDirectory);
125
+ const previous = request.previousImportId === undefined
126
+ ? undefined
127
+ : await readPreviousImport(runtime, request.previousImportId);
128
+ const importId = randomUUID();
129
+ const directory = await importDirectory(runtime, importId);
130
+ return await completeImport(directory, { request, previous, importId });
131
+ }
132
+ catch (error) {
133
+ return {
134
+ ...empty,
135
+ code: error instanceof Error &&
136
+ (error.message === "destination-refused" ||
137
+ error.message === "previous-import-refused")
138
+ ? error.message
139
+ : "output-failed",
140
+ };
141
+ }
142
+ }
143
+ function importTotals(files) {
144
+ return {
145
+ included: files.filter((file) => file.status === "included").length,
146
+ refused: files.filter((file) => ["unreadable", "unsupported", "too-large"].includes(file.status)).length,
147
+ excluded: files.filter((file) => file.status === "excluded").length,
148
+ pending: files.filter((file) => file.status === "pending").length,
149
+ };
150
+ }
151
+ function coverageManifest(data) {
152
+ const { importId, roots, files, exclusions } = data;
153
+ if (roots.length > 0)
154
+ return {
155
+ schemaVersion: 2,
156
+ importId,
157
+ roots,
158
+ exclusions,
159
+ limits: {
160
+ depth: 4,
161
+ files: 100,
162
+ sourceBytes: 10_485_760,
163
+ corpusBytes: corpusLimit,
164
+ },
165
+ entries: files,
166
+ };
167
+ return {
168
+ schemaVersion: 1,
169
+ importId,
170
+ files: files.map((entry) => ({
171
+ path: entry.path,
172
+ status: entry.status,
173
+ reason: entry.reason,
174
+ digest: entry.digest,
175
+ ...(entry.byteSize === undefined ? {} : { byteSize: entry.byteSize }),
176
+ recordCount: entry.recordCount,
177
+ omissions: entry.omissions,
178
+ })),
179
+ };
180
+ }
181
+ function emptyImport(request) {
182
+ return {
183
+ importId: null,
184
+ included: 0,
185
+ refused: 0,
186
+ ...((request.roots?.length ?? 0) === 0 ? {} : { excluded: 0, pending: 0 }),
187
+ ...structureImport([]).counts,
188
+ };
189
+ }
190
+ async function completeImport(directory, data) {
191
+ const { request, previous, importId } = data;
192
+ const { roots, files, records, evidence } = await writeImport(directory, {
193
+ request,
194
+ previous: previous?.entries ?? [],
195
+ });
196
+ const structure = structureImport(records);
197
+ await writeMetadata(join(directory, "structure.json"), {
198
+ importId,
199
+ ...structure,
200
+ });
201
+ const partial = await writeRevision(directory, {
202
+ previous,
203
+ evidence,
204
+ importId,
205
+ });
206
+ const totals = importTotals(files);
207
+ const { refused, pending } = totals;
208
+ await writeCoverage(directory, coverageManifest({
209
+ importId,
210
+ roots,
211
+ files,
212
+ exclusions: request.excludeProjects ?? [],
213
+ }));
214
+ return {
215
+ code: refused + pending + partial === 0 ? "import-complete" : "import-partial",
216
+ importId,
217
+ included: totals.included,
218
+ refused,
219
+ ...(roots.length === 0 ? {} : { excluded: totals.excluded, pending }),
220
+ ...structure.counts,
221
+ };
222
+ }
223
+ async function writeRevision(directory, data) {
224
+ const { previous, evidence, importId } = data;
225
+ if (previous === undefined)
226
+ return 0;
227
+ const comparison = compareEvidence({
228
+ previous: previous.entries,
229
+ current: evidence,
230
+ });
231
+ try {
232
+ await writeMetadata(join(directory, "revision.json"), {
233
+ importId,
234
+ previousImportId: previous.importId,
235
+ evidenceRevision: previous.evidenceRevision,
236
+ ...comparison,
237
+ });
238
+ }
239
+ catch {
240
+ throw new Error("output-failed");
241
+ }
242
+ return comparison.counts.missing + comparison.counts.truncated;
243
+ }
@@ -0,0 +1,3 @@
1
+ import { type FileHandle } from "node:fs/promises";
2
+ export declare function openInput(path: string): Promise<FileHandle>;
3
+ export declare function readInput(path: string): Promise<string>;
@@ -0,0 +1,32 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, open } from "node:fs/promises";
3
+ export async function openInput(path) {
4
+ if (process.platform !== "darwin")
5
+ throw new Error("platform-unsupported");
6
+ const before = await lstat(path);
7
+ if (!before.isFile() || before.nlink !== 1)
8
+ throw new Error("invalid-import");
9
+ const handle = await open(path, constants.O_RDONLY | constants.O_NONBLOCK | 0x20000000);
10
+ try {
11
+ const opened = await handle.stat();
12
+ if (!opened.isFile() ||
13
+ opened.nlink !== 1 ||
14
+ opened.dev !== before.dev ||
15
+ opened.ino !== before.ino)
16
+ throw new Error("invalid-import");
17
+ return handle;
18
+ }
19
+ catch (error) {
20
+ await handle.close();
21
+ throw error;
22
+ }
23
+ }
24
+ export async function readInput(path) {
25
+ const handle = await openInput(path);
26
+ try {
27
+ return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(await handle.readFile());
28
+ }
29
+ finally {
30
+ await handle.close();
31
+ }
32
+ }