cloving 1.2.0 → 1.3.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 (518) hide show
  1. package/README.md +525 -185
  2. package/dist/src/agent-harness-shell.d.ts +12 -0
  3. package/dist/src/agent-harness-shell.js +90 -0
  4. package/dist/src/agent-harness-versions.d.ts +8 -0
  5. package/dist/src/agent-harness-versions.js +49 -0
  6. package/dist/src/agent-harnesses.d.ts +4 -0
  7. package/dist/src/agent-harnesses.js +13 -0
  8. package/dist/src/authority/commands.d.ts +1 -0
  9. package/dist/src/authority/commands.js +24 -4
  10. package/dist/src/authority/gate-reduction.d.ts +1 -0
  11. package/dist/src/authority/gate-reduction.js +18 -3
  12. package/dist/src/authority/gates.d.ts +2 -1
  13. package/dist/src/authority/gates.js +5 -1
  14. package/dist/src/authority/operations.js +1 -1
  15. package/dist/src/authority/reduction.d.ts +1 -1
  16. package/dist/src/authority/reduction.js +6 -1
  17. package/dist/src/authority/status-input.d.ts +1 -1
  18. package/dist/src/authority/status.d.ts +1 -0
  19. package/dist/src/authority/status.js +27 -3
  20. package/dist/src/authority/transitions.d.ts +5 -5
  21. package/dist/src/authority/transitions.js +6 -0
  22. package/dist/src/broker/actor/authority-delivery.js +1 -0
  23. package/dist/src/broker/actor/authority-queries.d.ts +7 -1
  24. package/dist/src/broker/actor/authority-queries.js +17 -2
  25. package/dist/src/broker/actor/authority-receipts.js +11 -1
  26. package/dist/src/broker/actor/authority-session.js +2 -2
  27. package/dist/src/broker/actor/authority-settings.js +4 -0
  28. package/dist/src/broker/actor/delivery-intents.d.ts +2 -1
  29. package/dist/src/broker/actor/delivery-intents.js +4 -4
  30. package/dist/src/broker/actor/effect-delivery.js +4 -1
  31. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  32. package/dist/src/broker/actor/effect-queries.js +7 -0
  33. package/dist/src/broker/actor/pin-check.js +1 -1
  34. package/dist/src/broker/actor/stop-plan.js +1 -1
  35. package/dist/src/broker/actor/turn-state.js +1 -1
  36. package/dist/src/broker/authority-admission.js +22 -9
  37. package/dist/src/broker/authority-restore.js +1 -0
  38. package/dist/src/broker/decision-restore.js +4 -4
  39. package/dist/src/broker/socket-address.d.ts +3 -1
  40. package/dist/src/broker/socket-address.js +2 -2
  41. package/dist/src/cli/arguments.d.ts +11 -13
  42. package/dist/src/cli/arguments.js +37 -107
  43. package/dist/src/cli/command-effects.d.ts +7 -0
  44. package/dist/src/cli/command-effects.js +39 -0
  45. package/dist/src/cli/commands.js +11 -4
  46. package/dist/src/cli/config-arguments.d.ts +11 -0
  47. package/dist/src/cli/config-arguments.js +59 -0
  48. package/dist/src/cli/config-command.d.ts +2 -0
  49. package/dist/src/cli/config-command.js +105 -0
  50. package/dist/src/cli/config-file.d.ts +3 -0
  51. package/dist/src/cli/config-file.js +50 -0
  52. package/dist/src/cli/config-lock.d.ts +7 -0
  53. package/dist/src/cli/config-lock.js +61 -0
  54. package/dist/src/cli/config-notice.d.ts +5 -0
  55. package/dist/src/cli/config-notice.js +46 -0
  56. package/dist/src/cli/doctor-github.d.ts +9 -0
  57. package/dist/src/cli/doctor-github.js +138 -0
  58. package/dist/src/cli/doctor-harness.d.ts +13 -0
  59. package/dist/src/cli/doctor-harness.js +242 -0
  60. package/dist/src/cli/doctor-local.d.ts +18 -0
  61. package/dist/src/cli/doctor-local.js +77 -0
  62. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  63. package/dist/src/cli/doctor-runtime.js +176 -0
  64. package/dist/src/cli/doctor-service.d.ts +1 -0
  65. package/dist/src/cli/doctor-service.js +11 -0
  66. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  67. package/dist/src/cli/doctor-workflows.js +45 -0
  68. package/dist/src/cli/doctor.d.ts +15 -0
  69. package/dist/src/cli/doctor.js +190 -0
  70. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  71. package/dist/src/cli/github-ci-progress.js +83 -0
  72. package/dist/src/cli/github-retry.d.ts +6 -0
  73. package/dist/src/cli/github-retry.js +47 -0
  74. package/dist/src/cli/harness-probes.d.ts +22 -0
  75. package/dist/src/cli/harness-probes.js +183 -0
  76. package/dist/src/cli/main.d.ts +7 -1
  77. package/dist/src/cli/main.js +39 -61
  78. package/dist/src/cli/phone-arguments.d.ts +14 -0
  79. package/dist/src/cli/phone-arguments.js +37 -0
  80. package/dist/src/cli/phone-client.d.ts +2 -0
  81. package/dist/src/cli/phone-client.js +32 -0
  82. package/dist/src/cli/phone-command.d.ts +13 -0
  83. package/dist/src/cli/phone-command.js +101 -0
  84. package/dist/src/cli/probe-command.d.ts +36 -0
  85. package/dist/src/cli/probe-command.js +59 -0
  86. package/dist/src/cli/project-settings.d.ts +4 -0
  87. package/dist/src/cli/project-settings.js +33 -0
  88. package/dist/src/cli/render.d.ts +2 -1
  89. package/dist/src/cli/render.js +44 -28
  90. package/dist/src/cli/report-github.d.ts +18 -0
  91. package/dist/src/cli/report-github.js +200 -0
  92. package/dist/src/cli/report.d.ts +17 -0
  93. package/dist/src/cli/report.js +192 -0
  94. package/dist/src/cli/repository-arguments.d.ts +5 -0
  95. package/dist/src/cli/repository-arguments.js +34 -0
  96. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  97. package/dist/src/cli/runtime-arguments.js +15 -0
  98. package/dist/src/cli/runtime-directory.d.ts +6 -2
  99. package/dist/src/cli/runtime-directory.js +72 -14
  100. package/dist/src/cli/toolchain.d.ts +2 -0
  101. package/dist/src/cli/toolchain.js +22 -2
  102. package/dist/src/cli/usage-render.d.ts +5 -0
  103. package/dist/src/cli/usage-render.js +40 -1
  104. package/dist/src/cli/usage.d.ts +3 -3
  105. package/dist/src/cli/usage.js +70 -44
  106. package/dist/src/cli/watch-actions.d.ts +2 -0
  107. package/dist/src/cli/watch-actions.js +4 -4
  108. package/dist/src/cli/watch-board-view.d.ts +1 -1
  109. package/dist/src/cli/watch-board-view.js +8 -2
  110. package/dist/src/cli/watch-board.js +23 -10
  111. package/dist/src/cli/watch-card-forms.js +2 -2
  112. package/dist/src/cli/watch-client.d.ts +1 -1
  113. package/dist/src/cli/watch-client.js +7 -2
  114. package/dist/src/cli/watch-header-view.d.ts +27 -0
  115. package/dist/src/cli/watch-header-view.js +116 -0
  116. package/dist/src/cli/watch-model.js +17 -4
  117. package/dist/src/cli/watch-page.js +48 -12
  118. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  119. package/dist/src/cli/watch-phone-client.js +84 -0
  120. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  121. package/dist/src/cli/watch-phone-view.js +113 -0
  122. package/dist/src/cli/watch-phone.d.ts +5 -0
  123. package/dist/src/cli/watch-phone.js +53 -0
  124. package/dist/src/cli/watch-pull-request.d.ts +3 -1
  125. package/dist/src/cli/watch-pull-request.js +4 -0
  126. package/dist/src/cli/watch-render.d.ts +9 -1
  127. package/dist/src/cli/watch-server.js +23 -5
  128. package/dist/src/cli/watch-turn.d.ts +4 -1
  129. package/dist/src/cli/watch-turn.js +37 -1
  130. package/dist/src/cli/watch-usage.js +5 -1
  131. package/dist/src/cli/watch-view.d.ts +6 -20
  132. package/dist/src/cli/watch-view.js +14 -106
  133. package/dist/src/cli.js +106 -23
  134. package/dist/src/command-settings.d.ts +16 -0
  135. package/dist/src/command-settings.js +42 -0
  136. package/dist/src/configuration-change.d.ts +11 -0
  137. package/dist/src/configuration-change.js +62 -0
  138. package/dist/src/configuration-display.d.ts +21 -0
  139. package/dist/src/configuration-display.js +69 -0
  140. package/dist/src/configuration-schema.d.ts +49 -0
  141. package/dist/src/configuration-schema.js +159 -0
  142. package/dist/src/daemon/claude-turn.d.ts +19 -5
  143. package/dist/src/daemon/claude-turn.js +116 -53
  144. package/dist/src/daemon/claude-worker.d.ts +3 -3
  145. package/dist/src/daemon/claude-worker.js +65 -76
  146. package/dist/src/daemon/command-journal.d.ts +5 -0
  147. package/dist/src/daemon/command-journal.js +50 -0
  148. package/dist/src/daemon/command-process.d.ts +28 -0
  149. package/dist/src/daemon/command-process.js +164 -0
  150. package/dist/src/daemon/command-worker.d.ts +19 -0
  151. package/dist/src/daemon/command-worker.js +182 -0
  152. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  153. package/dist/src/daemon/cursor-stream.js +154 -0
  154. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  155. package/dist/src/daemon/daemon-adapters.js +102 -0
  156. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  157. package/dist/src/daemon/daemon-loops.js +39 -0
  158. package/dist/src/daemon/daemon.d.ts +2 -33
  159. package/dist/src/daemon/daemon.js +126 -132
  160. package/dist/src/daemon/declared-input.d.ts +3 -0
  161. package/dist/src/daemon/declared-input.js +9 -0
  162. package/dist/src/daemon/delivery-router.js +1 -1
  163. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  164. package/dist/src/daemon/gemini-stream.js +129 -0
  165. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  166. package/dist/src/daemon/github-ci-rerun.js +92 -0
  167. package/dist/src/daemon/github-ci.js +89 -8
  168. package/dist/src/daemon/github-merge-call.d.ts +2 -0
  169. package/dist/src/daemon/github-merge.js +7 -3
  170. package/dist/src/daemon/github-methods.js +10 -0
  171. package/dist/src/daemon/github-operation.d.ts +1 -0
  172. package/dist/src/daemon/github-retry.js +8 -44
  173. package/dist/src/daemon/issue-queue.d.ts +1 -0
  174. package/dist/src/daemon/issue-queue.js +3 -26
  175. package/dist/src/daemon/notify.js +2 -1
  176. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  177. package/dist/src/daemon/opencode-stream.js +87 -0
  178. package/dist/src/daemon/queue-status.d.ts +4 -0
  179. package/dist/src/daemon/queue-status.js +38 -0
  180. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  181. package/dist/src/daemon/retry-worktree.js +139 -0
  182. package/dist/src/daemon/retrying-turn.d.ts +2 -0
  183. package/dist/src/daemon/retrying-turn.js +108 -30
  184. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  185. package/dist/src/daemon/schedule-journal.js +57 -0
  186. package/dist/src/daemon/text-output.d.ts +18 -0
  187. package/dist/src/daemon/text-output.js +44 -0
  188. package/dist/src/daemon/ticket-registration.d.ts +5 -7
  189. package/dist/src/daemon/ticket-registration.js +85 -40
  190. package/dist/src/daemon/turn-command.d.ts +10 -0
  191. package/dist/src/daemon/turn-command.js +33 -0
  192. package/dist/src/daemon/turn-report.d.ts +18 -0
  193. package/dist/src/daemon/turn-report.js +79 -0
  194. package/dist/src/daemon/work-tree.d.ts +2 -1
  195. package/dist/src/daemon/work-tree.js +15 -12
  196. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  197. package/dist/src/daemon/workflow-generations.js +57 -0
  198. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  199. package/dist/src/daemon/workflow-replay.js +58 -0
  200. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  201. package/dist/src/daemon/workflow-schedules.js +185 -0
  202. package/dist/src/decision-wait.d.ts +1 -0
  203. package/dist/src/decision-wait.js +3 -0
  204. package/dist/src/delivery-backoff.d.ts +1 -0
  205. package/dist/src/delivery-backoff.js +3 -0
  206. package/dist/src/doctor-report.d.ts +24 -0
  207. package/dist/src/doctor-report.js +70 -0
  208. package/dist/src/execution-pin.d.ts +5 -0
  209. package/dist/src/execution-pin.js +67 -4
  210. package/dist/src/grok-result.d.ts +12 -0
  211. package/dist/src/grok-result.js +61 -0
  212. package/dist/src/harness-defaults.d.ts +35 -0
  213. package/dist/src/harness-defaults.js +121 -0
  214. package/dist/src/host/decision-resume.d.ts +35 -0
  215. package/dist/src/host/decision-resume.js +86 -0
  216. package/dist/src/host/gate-bridge.d.ts +48 -0
  217. package/dist/src/host/gate-bridge.js +124 -0
  218. package/dist/src/host/run-wait.d.ts +26 -0
  219. package/dist/src/host/run-wait.js +37 -0
  220. package/dist/src/host/start-delivery.d.ts +1 -1
  221. package/dist/src/host/start-delivery.js +10 -3
  222. package/dist/src/host/step-bridge-host.d.ts +6 -20
  223. package/dist/src/host/step-bridge-host.js +44 -58
  224. package/dist/src/merge-request.d.ts +19 -0
  225. package/dist/src/merge-request.js +32 -0
  226. package/dist/src/phone/canonical-json.d.ts +1 -0
  227. package/dist/src/phone/canonical-json.js +16 -0
  228. package/dist/src/phone/phone-link.d.ts +7 -0
  229. package/dist/src/phone/phone-link.js +21 -0
  230. package/dist/src/phone/qr-data.d.ts +8 -0
  231. package/dist/src/phone/qr-data.js +133 -0
  232. package/dist/src/phone/qr-matrix.d.ts +6 -0
  233. package/dist/src/phone/qr-matrix.js +175 -0
  234. package/dist/src/phone/qr-penalty.d.ts +3 -0
  235. package/dist/src/phone/qr-penalty.js +67 -0
  236. package/dist/src/phone/qr-picture.d.ts +5 -0
  237. package/dist/src/phone/qr-picture.js +24 -0
  238. package/dist/src/private-config.schema.json +263 -0
  239. package/dist/src/project-config.schema.json +65 -0
  240. package/dist/src/project-settings.d.ts +19 -0
  241. package/dist/src/project-settings.js +131 -0
  242. package/dist/src/relay/answer-check.d.ts +24 -0
  243. package/dist/src/relay/answer-check.js +145 -0
  244. package/dist/src/relay/answer-inbox.d.ts +15 -0
  245. package/dist/src/relay/answer-inbox.js +173 -0
  246. package/dist/src/relay/daemon-keys.d.ts +16 -0
  247. package/dist/src/relay/daemon-keys.js +75 -0
  248. package/dist/src/relay/decision-check.d.ts +3 -0
  249. package/dist/src/relay/decision-check.js +77 -0
  250. package/dist/src/relay/decision-close.d.ts +6 -0
  251. package/dist/src/relay/decision-close.js +72 -0
  252. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  253. package/dist/src/relay/decision-envelopes.js +93 -0
  254. package/dist/src/relay/decision-watch.d.ts +14 -0
  255. package/dist/src/relay/decision-watch.js +68 -0
  256. package/dist/src/relay/envelope-post.d.ts +8 -0
  257. package/dist/src/relay/envelope-post.js +71 -0
  258. package/dist/src/relay/envelope.d.ts +28 -0
  259. package/dist/src/relay/envelope.js +53 -0
  260. package/dist/src/relay/hpke.d.ts +25 -0
  261. package/dist/src/relay/hpke.js +108 -0
  262. package/dist/src/relay/pairing-checks.d.ts +42 -0
  263. package/dist/src/relay/pairing-checks.js +172 -0
  264. package/dist/src/relay/pairing-follow.d.ts +8 -0
  265. package/dist/src/relay/pairing-follow.js +95 -0
  266. package/dist/src/relay/pairing-session.d.ts +29 -0
  267. package/dist/src/relay/pairing-session.js +87 -0
  268. package/dist/src/relay/phone-delivery.d.ts +51 -0
  269. package/dist/src/relay/phone-delivery.js +139 -0
  270. package/dist/src/relay/phone-devices.d.ts +36 -0
  271. package/dist/src/relay/phone-devices.js +46 -0
  272. package/dist/src/relay/phone-inbox.d.ts +18 -0
  273. package/dist/src/relay/phone-inbox.js +17 -0
  274. package/dist/src/relay/phone-operations.d.ts +18 -0
  275. package/dist/src/relay/phone-operations.js +121 -0
  276. package/dist/src/relay/phone-outbox.d.ts +21 -0
  277. package/dist/src/relay/phone-outbox.js +25 -0
  278. package/dist/src/relay/phone-socket.d.ts +6 -0
  279. package/dist/src/relay/phone-socket.js +63 -0
  280. package/dist/src/relay/relay-control.d.ts +7 -0
  281. package/dist/src/relay/relay-control.js +24 -0
  282. package/dist/src/relay/relay-files.d.ts +2 -0
  283. package/dist/src/relay/relay-files.js +23 -0
  284. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  285. package/dist/src/relay/relay-heartbeat.js +81 -0
  286. package/dist/src/relay/relay-http.d.ts +14 -0
  287. package/dist/src/relay/relay-http.js +63 -0
  288. package/dist/src/relay/relay-registration.d.ts +15 -0
  289. package/dist/src/relay/relay-registration.js +63 -0
  290. package/dist/src/relay/relay-service.d.ts +25 -0
  291. package/dist/src/relay/relay-service.js +216 -0
  292. package/dist/src/relay/relay-store.d.ts +48 -0
  293. package/dist/src/relay/relay-store.js +131 -0
  294. package/dist/src/relay/sealed-post.d.ts +25 -0
  295. package/dist/src/relay/sealed-post.js +52 -0
  296. package/dist/src/relay.d.ts +1 -0
  297. package/dist/src/relay.js +8 -0
  298. package/dist/src/report-statistics.d.ts +50 -0
  299. package/dist/src/report-statistics.js +70 -0
  300. package/dist/src/report.d.ts +171 -0
  301. package/dist/src/report.js +119 -0
  302. package/dist/src/repository-identity.d.ts +4 -0
  303. package/dist/src/repository-identity.js +4 -0
  304. package/dist/src/review-subject.d.ts +41 -0
  305. package/dist/src/review-subject.js +91 -0
  306. package/dist/src/run-wait.d.ts +23 -0
  307. package/dist/src/run-wait.js +20 -0
  308. package/dist/src/service/active-tickets.d.ts +4 -0
  309. package/dist/src/service/active-tickets.js +49 -0
  310. package/dist/src/service/command-effects.d.ts +4 -0
  311. package/dist/src/service/command-effects.js +16 -0
  312. package/dist/src/service/decision-handler.d.ts +4 -0
  313. package/dist/src/service/decision-handler.js +39 -4
  314. package/dist/src/service/gateway.js +18 -3
  315. package/dist/src/service/registry.d.ts +16 -3
  316. package/dist/src/service/registry.js +34 -3
  317. package/dist/src/service/replies.d.ts +9 -1
  318. package/dist/src/service/replies.js +12 -0
  319. package/dist/src/service/run-handlers.js +14 -55
  320. package/dist/src/service/run-metadata.d.ts +8 -0
  321. package/dist/src/service/run-metadata.js +53 -0
  322. package/dist/src/service/run-waits.d.ts +3 -0
  323. package/dist/src/service/run-waits.js +41 -0
  324. package/dist/src/service/service.d.ts +18 -2
  325. package/dist/src/service/service.js +23 -7
  326. package/dist/src/service/submission-handler.d.ts +0 -1
  327. package/dist/src/service/submission-handler.js +6 -34
  328. package/dist/src/service/worker-port.d.ts +1 -0
  329. package/dist/src/service/worker-totals.js +8 -23
  330. package/dist/src/step-bridge.d.ts +23 -0
  331. package/dist/src/steps/decision-gate.d.ts +2 -1
  332. package/dist/src/steps/decision-gate.js +7 -0
  333. package/dist/src/steps/merge-by-person.d.ts +2 -0
  334. package/dist/src/steps/merge-by-person.js +18 -0
  335. package/dist/src/steps/merge-when-green.d.ts +2 -0
  336. package/dist/src/steps/merge-when-green.js +62 -0
  337. package/dist/src/steps/review-by-agent.d.ts +5 -0
  338. package/dist/src/steps/review-by-agent.js +124 -0
  339. package/dist/src/steps/review-by-person.d.ts +4 -0
  340. package/dist/src/steps/review-by-person.js +16 -0
  341. package/dist/src/steps/review-subject.d.ts +2 -0
  342. package/dist/src/steps/review-subject.js +11 -0
  343. package/dist/src/steps/run-command.d.ts +2 -0
  344. package/dist/src/steps/run-command.js +15 -0
  345. package/dist/src/steps/sleep.d.ts +3 -0
  346. package/dist/src/steps/sleep.js +19 -0
  347. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  348. package/dist/src/steps/wait-for-decision.js +71 -0
  349. package/dist/src/steps/wait-for-run.d.ts +5 -0
  350. package/dist/src/steps/wait-for-run.js +9 -0
  351. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  352. package/dist/src/storage/decision-snapshots.js +7 -1
  353. package/dist/src/submission.d.ts +4 -0
  354. package/dist/src/submission.js +6 -2
  355. package/dist/src/testing.d.ts +29 -0
  356. package/dist/src/testing.js +264 -0
  357. package/dist/src/ticket-status-stream.d.ts +9 -0
  358. package/dist/src/ticket-status-stream.js +94 -0
  359. package/dist/src/token-prices.d.ts +12 -4
  360. package/dist/src/token-prices.js +15 -2
  361. package/dist/src/turn-profile.d.ts +1 -0
  362. package/dist/src/turn-profile.js +8 -1
  363. package/dist/src/worker-usage.d.ts +16 -0
  364. package/dist/src/worker-usage.js +57 -0
  365. package/dist/src/workflow-admission.d.ts +5 -0
  366. package/dist/src/workflow-candidate.d.ts +7 -2
  367. package/dist/src/workflow-candidate.js +47 -5
  368. package/dist/src/workflow-declaration.d.ts +21 -3
  369. package/dist/src/workflow-declaration.js +77 -9
  370. package/dist/src/workflow-discovery.d.ts +2 -1
  371. package/dist/src/workflow-discovery.js +4 -1
  372. package/dist/src/workflow-refusals.js +3 -0
  373. package/dist/src/workflow-schedule.d.ts +22 -0
  374. package/dist/src/workflow-schedule.js +53 -0
  375. package/dist/src/workflows.d.ts +11 -1
  376. package/dist/src/workflows.js +8 -0
  377. package/dist/tools/admit-workflow.d.ts +1 -0
  378. package/dist/tools/admit-workflow.js +18 -5
  379. package/dist/tools/doctor-adoption.d.ts +1 -0
  380. package/dist/tools/doctor-adoption.js +11 -0
  381. package/dist/tools/project-configuration.d.ts +4 -0
  382. package/dist/tools/project-configuration.js +47 -0
  383. package/dist/tools/self-host-processes.d.ts +1 -0
  384. package/dist/tools/self-host-processes.js +33 -22
  385. package/dist/tools/self-host-project.d.ts +4 -0
  386. package/dist/tools/self-host-project.js +61 -14
  387. package/dist/tools/self-host-runtime.d.ts +16 -0
  388. package/dist/tools/self-host-runtime.js +60 -0
  389. package/dist/tools/self-host-workflows.d.ts +1 -0
  390. package/dist/tools/self-host-workflows.js +36 -1
  391. package/dist/tools/self-host.js +86 -61
  392. package/dist/tools/workflow-candidate-counts.d.ts +6 -2
  393. package/dist/tools/workflow-candidate-counts.js +31 -16
  394. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  395. package/dist/tools/workflow-candidate-fields.js +24 -0
  396. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  397. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  398. package/dist/tools/workflow-candidate-program.d.ts +2 -0
  399. package/dist/tools/workflow-candidate-program.js +36 -8
  400. package/dist/tools/workflow-candidate-source.js +77 -15
  401. package/dist/tools/workflow-candidate-syntax.d.ts +8 -2
  402. package/dist/tools/workflow-candidate-syntax.js +70 -26
  403. package/dist/tools/workflow-command.d.ts +1 -0
  404. package/dist/tools/workflow-command.js +143 -0
  405. package/dist/tools/workflow-folder-capture.d.ts +1 -0
  406. package/dist/tools/workflow-folder-capture.js +47 -2
  407. package/dist/tools/workflow-folders.d.ts +17 -1
  408. package/dist/tools/workflow-folders.js +59 -6
  409. package/dist/tools/workflow-test-hook.d.ts +7 -0
  410. package/dist/tools/workflow-test-hook.js +16 -0
  411. package/dist/tools/workflow-test-loader.d.ts +1 -0
  412. package/dist/tools/workflow-test-loader.js +10 -0
  413. package/dist/workflows/develop-ticket.js +1 -1
  414. package/dist/workflows/ticket-prompts.js +5 -1
  415. package/package.json +46 -4
  416. package/templates/develop/README.md +78 -0
  417. package/templates/develop/develop/accept.ts +11 -0
  418. package/templates/develop/develop/flow-tests.ts +357 -0
  419. package/templates/develop/develop/local.ts +40 -0
  420. package/templates/develop/develop/option-tests.ts +174 -0
  421. package/templates/develop/develop/partial-choice.ts +29 -0
  422. package/templates/develop/develop/partial.ts +28 -0
  423. package/templates/develop/develop/pull.ts +152 -0
  424. package/templates/develop/develop/queue-partial.ts +39 -0
  425. package/templates/develop/develop/refusal-tests.ts +174 -0
  426. package/templates/develop/develop/report.ts +156 -0
  427. package/templates/develop/develop/round.ts +40 -0
  428. package/templates/develop/develop/scenarios.ts +87 -0
  429. package/templates/develop/develop/turn.ts +67 -0
  430. package/templates/develop/develop.declaration.json +24 -0
  431. package/templates/develop/develop.test.ts +287 -0
  432. package/templates/develop/develop.ts +30 -0
  433. package/templates/develop/template.json +153 -0
  434. package/dist/src/chats/analysis-batches.d.ts +0 -42
  435. package/dist/src/chats/analysis-batches.js +0 -97
  436. package/dist/src/chats/analysis-checkpoint.d.ts +0 -29
  437. package/dist/src/chats/analysis-checkpoint.js +0 -31
  438. package/dist/src/chats/analysis-contract.d.ts +0 -80
  439. package/dist/src/chats/analysis-contract.js +0 -16
  440. package/dist/src/chats/analysis-data.d.ts +0 -3
  441. package/dist/src/chats/analysis-data.js +0 -85
  442. package/dist/src/chats/analysis-input.d.ts +0 -18
  443. package/dist/src/chats/analysis-input.js +0 -97
  444. package/dist/src/chats/analysis-links.d.ts +0 -2
  445. package/dist/src/chats/analysis-links.js +0 -25
  446. package/dist/src/chats/analysis-merge.d.ts +0 -16
  447. package/dist/src/chats/analysis-merge.js +0 -134
  448. package/dist/src/chats/analysis-prompt.d.ts +0 -18
  449. package/dist/src/chats/analysis-prompt.js +0 -42
  450. package/dist/src/chats/analysis-proposal.d.ts +0 -4
  451. package/dist/src/chats/analysis-proposal.js +0 -41
  452. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  453. package/dist/src/chats/analysis-provenance.js +0 -99
  454. package/dist/src/chats/analysis-shape.d.ts +0 -4
  455. package/dist/src/chats/analysis-shape.js +0 -235
  456. package/dist/src/chats/analysis.d.ts +0 -3
  457. package/dist/src/chats/analysis.js +0 -42
  458. package/dist/src/chats/corpus-input.d.ts +0 -5
  459. package/dist/src/chats/corpus-input.js +0 -288
  460. package/dist/src/chats/destination.d.ts +0 -4
  461. package/dist/src/chats/destination.js +0 -96
  462. package/dist/src/chats/import.d.ts +0 -15
  463. package/dist/src/chats/import.js +0 -243
  464. package/dist/src/chats/input-file.d.ts +0 -3
  465. package/dist/src/chats/input-file.js +0 -32
  466. package/dist/src/chats/normalize.d.ts +0 -29
  467. package/dist/src/chats/normalize.js +0 -155
  468. package/dist/src/chats/previous-import.d.ts +0 -5
  469. package/dist/src/chats/previous-import.js +0 -34
  470. package/dist/src/chats/reader.d.ts +0 -21
  471. package/dist/src/chats/reader.js +0 -118
  472. package/dist/src/chats/redact-import.d.ts +0 -14
  473. package/dist/src/chats/redact-import.js +0 -141
  474. package/dist/src/chats/redaction.d.ts +0 -41
  475. package/dist/src/chats/redaction.js +0 -161
  476. package/dist/src/chats/reference-mapping.d.ts +0 -16
  477. package/dist/src/chats/reference-mapping.js +0 -153
  478. package/dist/src/chats/revision-input.d.ts +0 -3
  479. package/dist/src/chats/revision-input.js +0 -180
  480. package/dist/src/chats/revision.d.ts +0 -48
  481. package/dist/src/chats/revision.js +0 -94
  482. package/dist/src/chats/selection.d.ts +0 -25
  483. package/dist/src/chats/selection.js +0 -109
  484. package/dist/src/chats/source.d.ts +0 -23
  485. package/dist/src/chats/source.js +0 -135
  486. package/dist/src/chats/structure.d.ts +0 -57
  487. package/dist/src/chats/structure.js +0 -216
  488. package/dist/src/chats/workflow-generation-projection.d.ts +0 -8
  489. package/dist/src/chats/workflow-generation-projection.js +0 -75
  490. package/dist/src/chats/workflow-generation-source.d.ts +0 -25
  491. package/dist/src/chats/workflow-generation-source.js +0 -124
  492. package/dist/src/chats/workflow-generation-text.d.ts +0 -23
  493. package/dist/src/chats/workflow-generation-text.js +0 -74
  494. package/dist/src/chats/workflow-generation.d.ts +0 -69
  495. package/dist/src/chats/workflow-generation.js +0 -142
  496. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  497. package/dist/src/daemon/analysis-launch.js +0 -81
  498. package/dist/src/daemon/analysis-token.d.ts +0 -6
  499. package/dist/src/daemon/analysis-token.js +0 -88
  500. package/dist/src/daemon/analysis-worker.d.ts +0 -20
  501. package/dist/src/daemon/analysis-worker.js +0 -271
  502. package/dist/src/daemon/chats-batch-binding.d.ts +0 -23
  503. package/dist/src/daemon/chats-batch-binding.js +0 -99
  504. package/dist/src/daemon/chats-capture.d.ts +0 -18
  505. package/dist/src/daemon/chats-capture.js +0 -194
  506. package/dist/src/daemon/chats-checkpoints.d.ts +0 -41
  507. package/dist/src/daemon/chats-checkpoints.js +0 -186
  508. package/dist/src/daemon/chats-files.d.ts +0 -42
  509. package/dist/src/daemon/chats-files.js +0 -252
  510. package/dist/src/daemon/chats-follow-up.d.ts +0 -38
  511. package/dist/src/daemon/chats-follow-up.js +0 -180
  512. package/dist/src/daemon/chats-question.d.ts +0 -15
  513. package/dist/src/daemon/chats-question.js +0 -93
  514. package/dist/src/daemon/chats-worker.d.ts +0 -13
  515. package/dist/src/daemon/chats-worker.js +0 -201
  516. package/dist/workflows/analyze-chats.d.ts +0 -15
  517. package/dist/workflows/analyze-chats.declaration.json +0 -22
  518. package/dist/workflows/analyze-chats.js +0 -250
@@ -1,288 +0,0 @@
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
- }
@@ -1,4 +0,0 @@
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>;
@@ -1,96 +0,0 @@
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
- }
@@ -1,15 +0,0 @@
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>;
@@ -1,243 +0,0 @@
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
- }
@@ -1,3 +0,0 @@
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>;
@@ -1,32 +0,0 @@
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
- }