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,161 +0,0 @@
1
- export const replacements = {
2
- privateKey: "[PRIVATE_KEY]",
3
- credentialUrl: "[CREDENTIAL_URL]",
4
- homePath: "[HOME_PATH]",
5
- token: "[TOKEN]",
6
- email: "[EMAIL]",
7
- privateText: "[PRIVATE_TEXT]",
8
- };
9
- export const categories = [
10
- "privateKey",
11
- "credentialUrl",
12
- "homePath",
13
- "token",
14
- "email",
15
- "privateText",
16
- ];
17
- export function emptyCounts() {
18
- return {
19
- privateKey: 0,
20
- credentialUrl: 0,
21
- homePath: 0,
22
- token: 0,
23
- email: 0,
24
- privateText: 0,
25
- };
26
- }
27
- function escaped(text) {
28
- return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
29
- }
30
- function patternSpans(text, rule) {
31
- return [...text.matchAll(rule.pattern)].map((match) => ({
32
- start: match.index,
33
- end: match.index + match[0].length,
34
- category: rule.category,
35
- }));
36
- }
37
- function homeRoot(home) {
38
- if (home === null || home === "")
39
- return "~";
40
- if (home === "/")
41
- return "(?:(?=/)|~)";
42
- return `(?:${escaped(home.replace(/\/$/, ""))}|~)`;
43
- }
44
- function homeSpans(text, home) {
45
- const root = homeRoot(home);
46
- const pattern = new RegExp(String.raw `(?<![\p{L}\p{N}_./~\\-])${root}(?=$|[\s/\x22'\x60<>,;:!?()\[\]{}])(?:/[^\s\x22'\x60<>]*)?`, "gu");
47
- return patternSpans(text, { pattern, category: "homePath" }).map((span) => {
48
- const quote = text[span.start - 1];
49
- if (quote !== '"' && quote !== "'" && quote !== "`")
50
- return span;
51
- const end = text.indexOf(quote, span.end);
52
- return end === -1 ? span : { ...span, end };
53
- });
54
- }
55
- function spans(text, settings) {
56
- const rules = [
57
- {
58
- pattern: /-----BEGIN ((?:[A-Z0-9]+ )*PRIVATE KEY)-----[\s\S]*?-----END \1-----/g,
59
- category: "privateKey",
60
- },
61
- {
62
- pattern: /\b[a-z][a-z\d+.-]*:\/\/[^\s<>"'`/?#]*@[^\s<>"'`]+/gi,
63
- category: "credentialUrl",
64
- },
65
- {
66
- pattern: /(?<![\p{L}\p{N}_])(?:gh[pousr]_|github_pat_|sk-ant-|sk-(?:proj-|svcacct-)?)[a-z\d_-]+/giu,
67
- category: "token",
68
- },
69
- {
70
- pattern: /[\w.!#$%&'*+/=?^`{|}~-]+@[\w.-]+\.[a-z]{2,}/gi,
71
- category: "email",
72
- },
73
- ];
74
- const matches = rules.flatMap((rule) => patternSpans(text, rule));
75
- for (const match of homeSpans(text, settings.home))
76
- matches.push(match);
77
- for (const privateText of settings.privateTexts) {
78
- if (privateText.trim() === "")
79
- throw new Error("invalid-settings");
80
- const pattern = new RegExp(`(?=(${escaped(privateText)}))`, "gi");
81
- for (const match of text.matchAll(pattern))
82
- matches.push({
83
- start: match.index,
84
- end: match.index + String(match[1]).length,
85
- category: "privateText",
86
- });
87
- }
88
- return mergeSpans(matches);
89
- }
90
- function mergeSpans(matches) {
91
- const priority = categories;
92
- const merged = [];
93
- for (const match of matches.sort((left, right) => left.start - right.start)) {
94
- const previous = merged.at(-1);
95
- if (previous === undefined || previous.end <= match.start) {
96
- merged.push({ ...match });
97
- continue;
98
- }
99
- previous.end = Math.max(previous.end, match.end);
100
- if (priority.indexOf(match.category) < priority.indexOf(previous.category))
101
- previous.category = match.category;
102
- }
103
- return merged;
104
- }
105
- function redactText(text, context) {
106
- const { settings, counts } = context;
107
- let result = "";
108
- let cursor = 0;
109
- for (const span of spans(text, settings)) {
110
- result += text.slice(cursor, span.start) + replacements[span.category];
111
- cursor = span.end;
112
- counts[span.category]++;
113
- }
114
- return result + text.slice(cursor);
115
- }
116
- function rawJsonApi(value) {
117
- return "isRawJSON" in value && typeof value.isRawJSON === "function";
118
- }
119
- function rawJson(value) {
120
- return rawJsonApi(JSON) && JSON.isRawJSON(value);
121
- }
122
- function nested(value, context) {
123
- if (typeof value === "string")
124
- return redactText(value, context);
125
- if (rawJson(value))
126
- return value;
127
- if (Array.isArray(value))
128
- return value.map((item) => nested(item, context));
129
- if (value === null || typeof value !== "object")
130
- return value;
131
- const result = {};
132
- for (const [key, item] of Object.entries(value)) {
133
- const redactedKey = redactText(key, context);
134
- if (Object.hasOwn(result, redactedKey))
135
- throw new Error("member-name-collision");
136
- Object.defineProperty(result, redactedKey, {
137
- value: nested(item, context),
138
- enumerable: true,
139
- });
140
- }
141
- return result;
142
- }
143
- export function redactRecord(record, settings) {
144
- const counts = emptyCounts();
145
- const context = { settings, counts };
146
- const blocks = record.blocks.map((block) => {
147
- if (block["type"] === "tool_use")
148
- return { ...block, input: nested(block["input"], context) };
149
- if (block["type"] === "tool_result")
150
- return { ...block, content: nested(block["content"], context) };
151
- if (block["type"] === "text" && typeof block["text"] === "string")
152
- return { ...block, text: redactText(block["text"], context) };
153
- return block;
154
- });
155
- const text = redactText(record.text, context);
156
- return {
157
- record: { ...record, text, blocks },
158
- counts,
159
- totalCount: Object.values(counts).reduce((sum, count) => sum + count, 0),
160
- };
161
- }
@@ -1,16 +0,0 @@
1
- import { type RevisionEntry } from "./revision.ts";
2
- import type { OccurrenceReference } from "./structure.ts";
3
- export interface EvidenceMappingSnapshot {
4
- readonly importId: string;
5
- readonly coverage: string;
6
- readonly corpus: string;
7
- }
8
- export interface EvidenceReferenceMapping {
9
- readonly previous: OccurrenceReference;
10
- readonly current: OccurrenceReference;
11
- }
12
- export declare function mapEvidenceReferences(data: {
13
- readonly previous: EvidenceMappingSnapshot;
14
- readonly current: EvidenceMappingSnapshot;
15
- readonly revision: readonly RevisionEntry[];
16
- }): readonly EvidenceReferenceMapping[];
@@ -1,153 +0,0 @@
1
- import { parseCorpus } from "./corpus-input.js";
2
- import { parseEvidenceCoverage } from "./revision-input.js";
3
- import { compareEvidence, pairEvidence, } from "./revision.js";
4
- function coverageEntries(coverage) {
5
- if ("files" in coverage)
6
- return coverage.files;
7
- if ("entries" in coverage)
8
- return coverage.entries;
9
- throw new Error("analysis-reference-map-refused");
10
- }
11
- function coverageCounts(text) {
12
- const coverage = JSON.parse(text);
13
- if (coverage === null || typeof coverage !== "object")
14
- throw new Error("analysis-reference-map-refused");
15
- const entries = coverageEntries(coverage);
16
- if (!Array.isArray(entries))
17
- throw new Error("analysis-reference-map-refused");
18
- return entries.map((entry) => {
19
- if (entry === null ||
20
- typeof entry !== "object" ||
21
- !("recordCount" in entry) ||
22
- typeof entry.recordCount !== "number" ||
23
- !Number.isSafeInteger(entry.recordCount) ||
24
- entry.recordCount < 0)
25
- throw new Error("analysis-reference-map-refused");
26
- return entry.recordCount;
27
- });
28
- }
29
- function occurrence(source, reference) {
30
- const match = /^(sha256:[a-f\d]{64}):(0|[1-9]\d*)$/.exec(reference.sourceId);
31
- if (match === null || match[1] !== source.digest)
32
- throw new Error("analysis-reference-map-refused");
33
- const offset = Number(match[2]);
34
- if (!Number.isSafeInteger(offset) ||
35
- (source.byteSize !== undefined && offset >= source.byteSize))
36
- throw new Error("analysis-reference-map-refused");
37
- return { reference, offset };
38
- }
39
- function readSelections(snapshot) {
40
- if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(snapshot.importId))
41
- throw new Error("analysis-reference-map-refused");
42
- const sources = parseEvidenceCoverage(snapshot.coverage, snapshot.importId);
43
- const records = parseCorpus(snapshot.corpus);
44
- const counts = coverageCounts(snapshot.coverage);
45
- if (counts.reduce((total, count) => total + count, 0) !== records.length ||
46
- sources.some((source, index) => source.status !== "included" && counts[index] !== 0))
47
- throw new Error("analysis-reference-map-refused");
48
- let index = 0;
49
- return sources.map((source, selectionIndex) => {
50
- const count = counts[selectionIndex];
51
- if (count === undefined)
52
- throw new Error("analysis-reference-map-refused");
53
- const occurrences = records
54
- .slice(index, index + count)
55
- .map((record, offset) => occurrence(source, {
56
- recordIndex: index + offset,
57
- sourceId: record.sourceId,
58
- }));
59
- if (occurrences.some((item, offset) => offset > 0 && item.offset <= (occurrences[offset - 1]?.offset ?? -1)))
60
- throw new Error("analysis-reference-map-refused");
61
- index += count;
62
- return { ...source, occurrences };
63
- });
64
- }
65
- function revisionIdentity(entry) {
66
- return JSON.stringify([
67
- entry.path,
68
- entry.root,
69
- entry.status,
70
- entry.reason,
71
- entry.before === null ? null : [entry.before.digest, entry.before.byteSize],
72
- entry.after === null ? null : [entry.after.digest, entry.after.byteSize],
73
- ]);
74
- }
75
- function verifyRevision(data) {
76
- const expected = compareEvidence({
77
- previous: data.previous,
78
- current: data.current.map((source, index) => {
79
- const revision = data.revision[index];
80
- return {
81
- ...source,
82
- prefixDigest: revision?.status === "extended"
83
- ? (revision.before?.digest ?? undefined)
84
- : undefined,
85
- };
86
- }),
87
- }).entries;
88
- if (data.revision.length !== expected.length ||
89
- expected.some((entry, index) => {
90
- const actual = data.revision[index];
91
- return (actual === undefined ||
92
- revisionIdentity(entry) !== revisionIdentity(actual));
93
- }))
94
- throw new Error("analysis-reference-map-refused");
95
- }
96
- function verifyUnchangedSelection(before, after) {
97
- if (before.byteSize !== undefined &&
98
- after.byteSize !== undefined &&
99
- before.byteSize !== after.byteSize)
100
- throw new Error("analysis-reference-map-refused");
101
- if (before.occurrences.length !== after.occurrences.length)
102
- throw new Error("analysis-reference-map-refused");
103
- }
104
- function verifyExtendedSelection(before, after) {
105
- const prefix = after.occurrences.filter((item) => item.offset < (before.byteSize ?? 0));
106
- if (prefix.length !== before.occurrences.length ||
107
- prefix.some((item, index) => item.offset !== before.occurrences[index]?.offset))
108
- throw new Error("analysis-reference-map-refused");
109
- }
110
- function mapSelection(data) {
111
- const { before, after, revision } = data;
112
- if (revision?.status !== "unchanged" && revision?.status !== "extended")
113
- return [];
114
- if (revision.status === "unchanged")
115
- verifyUnchangedSelection(before, after);
116
- if (revision.status === "extended")
117
- verifyExtendedSelection(before, after);
118
- const indexes = new Map(after.occurrences.map((item, index) => [item.offset, index]));
119
- return before.occurrences.flatMap((item) => {
120
- const index = indexes.get(item.offset);
121
- const matched = index === undefined ? undefined : after.occurrences[index];
122
- if (matched === undefined || index === undefined)
123
- throw new Error("analysis-reference-map-refused");
124
- const next = after.occurrences[index + 1];
125
- if (revision.status === "extended" &&
126
- (before.byteSize === undefined ||
127
- next === undefined ||
128
- next.offset > before.byteSize))
129
- return [];
130
- return [{ previous: item.reference, current: matched.reference }];
131
- });
132
- }
133
- export function mapEvidenceReferences(data) {
134
- try {
135
- const previous = readSelections(data.previous);
136
- const current = readSelections(data.current);
137
- verifyRevision({ previous, current, revision: data.revision });
138
- const pairs = pairEvidence({ previous, current });
139
- const mappings = current.flatMap((after, index) => {
140
- const beforeIndex = pairs[index];
141
- const before = beforeIndex === null || beforeIndex === undefined
142
- ? undefined
143
- : previous[beforeIndex];
144
- return before === undefined
145
- ? []
146
- : mapSelection({ before, after, revision: data.revision[index] });
147
- });
148
- return mappings.sort((left, right) => left.previous.recordIndex - right.previous.recordIndex);
149
- }
150
- catch {
151
- throw new Error("analysis-reference-map-refused");
152
- }
153
- }
@@ -1,3 +0,0 @@
1
- import { type EvidenceSource } from "./revision.ts";
2
- export declare function parseEvidenceCoverage(text: string, importId: string): readonly EvidenceSource[];
3
- export declare function nextEvidenceRevision(text: string | undefined, importId: string): number;
@@ -1,180 +0,0 @@
1
- import { validateCoverage, withinRoot } from "./corpus-input.js";
2
- import { evidenceReason, revisionReasons, } from "./revision.js";
3
- function object(value) {
4
- return value !== null && typeof value === "object" && !Array.isArray(value);
5
- }
6
- function exact(value, fields) {
7
- const { required, optional = [] } = fields;
8
- return (required.every((key) => Object.hasOwn(value, key)) &&
9
- Object.keys(value).every((key) => required.includes(key) || optional.includes(key)));
10
- }
11
- function natural(value) {
12
- return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
13
- }
14
- function absolute(value) {
15
- return (typeof value === "string" &&
16
- value.startsWith("/") &&
17
- !value.includes("\0") &&
18
- value.split("/").every((part) => part !== "." && part !== ".."));
19
- }
20
- function digest(value) {
21
- return (value === null ||
22
- (typeof value === "string" && /^sha256:[a-f\d]{64}$/.test(value)));
23
- }
24
- function evidenceValue(value) {
25
- return (object(value) &&
26
- digest(value["digest"]) &&
27
- (!Object.hasOwn(value, "byteSize") ||
28
- (natural(value["byteSize"]) && value["byteSize"] <= 10_485_760)));
29
- }
30
- function source(value, roots) {
31
- if (!evidenceValue(value) ||
32
- !absolute(value["path"]) ||
33
- typeof value["status"] !== "string")
34
- throw new Error("invalid-import");
35
- return {
36
- path: value["path"],
37
- root: selectedRoot(value["selection"], roots),
38
- status: value["status"],
39
- digest: value.digest,
40
- ...(value.byteSize === undefined ? {} : { byteSize: value.byteSize }),
41
- };
42
- }
43
- export function parseEvidenceCoverage(text, importId) {
44
- validateCoverage(text, importId);
45
- const value = JSON.parse(text);
46
- if (!object(value))
47
- throw new Error("invalid-import");
48
- const entries = value["schemaVersion"] === 1 ? value["files"] : value["entries"];
49
- const roots = value["schemaVersion"] === 1 ? [] : value["roots"];
50
- if (!Array.isArray(entries) ||
51
- !Array.isArray(roots) ||
52
- !roots.every((root) => typeof root === "string"))
53
- throw new Error("invalid-import");
54
- return entries.map((entry) => source(entry, roots));
55
- }
56
- function revisionValue(value) {
57
- return (value === null ||
58
- (evidenceValue(value) &&
59
- exact(value, { required: ["digest"], optional: ["byteSize"] })));
60
- }
61
- function revisionEntry(value) {
62
- if (!object(value) ||
63
- !exact(value, {
64
- required: ["path", "root", "before", "after", "status", "reason"],
65
- }))
66
- return false;
67
- if (!selectionKey(value))
68
- return false;
69
- const reason = value["reason"];
70
- if (typeof reason !== "string" || !Object.hasOwn(revisionReasons, reason))
71
- return false;
72
- const expected = Object.entries(revisionReasons).find(([key]) => key === reason)?.[1];
73
- return (value["status"] === expected &&
74
- revisionPresence(value) &&
75
- consistentReason(value));
76
- }
77
- function revisionPresence(value) {
78
- const reason = value["reason"];
79
- if (reason === "no-previous-entry")
80
- return value["before"] === null && value["after"] !== null;
81
- if (reason === "not-selected")
82
- return value["before"] !== null && value["after"] === null;
83
- return value["before"] !== null && value["after"] !== null;
84
- }
85
- function validCounts(value, entries) {
86
- const statuses = [
87
- "new",
88
- "missing",
89
- "unchanged",
90
- "changed",
91
- "truncated",
92
- "extended",
93
- ];
94
- return (object(value) &&
95
- exact(value, { required: statuses }) &&
96
- statuses.every((status) => natural(value[status]) &&
97
- value[status] ===
98
- entries.filter((entry) => entry["status"] === status).length));
99
- }
100
- export function nextEvidenceRevision(text, importId) {
101
- if (text === undefined)
102
- return 1;
103
- const value = JSON.parse(text);
104
- if (!object(value) ||
105
- !exact(value, {
106
- required: [
107
- "schemaVersion",
108
- "importId",
109
- "previousImportId",
110
- "evidenceRevision",
111
- "counts",
112
- "entries",
113
- ],
114
- }))
115
- throw new Error("invalid-import");
116
- if (!revisionHeader(value, importId))
117
- throw new Error("invalid-import");
118
- const entries = value["entries"];
119
- if (!Array.isArray(entries) ||
120
- !entries.every(revisionEntry) ||
121
- !validCounts(value["counts"], entries))
122
- throw new Error("invalid-import");
123
- const revision = value["evidenceRevision"];
124
- if (!natural(revision))
125
- throw new Error("invalid-import");
126
- return revision + 1;
127
- }
128
- function selectedRoot(selection, roots) {
129
- if (roots.length === 0 || !object(selection) || selection["kind"] !== "root")
130
- return null;
131
- const index = selection["index"];
132
- if (!natural(index) || roots[index] === undefined)
133
- throw new Error("invalid-import");
134
- return roots[index];
135
- }
136
- function selectionKey(value) {
137
- return (absolute(value["path"]) &&
138
- (value["root"] === null ||
139
- (absolute(value["root"]) && withinRoot(value["root"], value["path"]))));
140
- }
141
- function revisionHeader(value, importId) {
142
- const revision = value["evidenceRevision"];
143
- if (value["schemaVersion"] !== 1 ||
144
- value["importId"] !== importId ||
145
- !natural(revision) ||
146
- revision === 0 ||
147
- revision === Number.MAX_SAFE_INTEGER)
148
- return false;
149
- const previous = value["previousImportId"];
150
- if (typeof previous !== "string" ||
151
- previous === importId ||
152
- !/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(previous))
153
- return false;
154
- return true;
155
- }
156
- function consistentReason(value) {
157
- const before = value["before"];
158
- const after = value["after"];
159
- if (!revisionValue(before) || !revisionValue(after))
160
- return false;
161
- const reason = value["reason"];
162
- const unverified = [
163
- "no-previous-entry",
164
- "not-selected",
165
- "not-included",
166
- ].includes(String(reason));
167
- if (!unverified && after?.digest === null)
168
- return false;
169
- const prefix = reason === "verified-prefix" ? before?.digest : undefined;
170
- return (evidenceReason({
171
- before: comparable(before, { status: "included" }),
172
- after: comparable(after, {
173
- status: reason === "not-included" ? "unsupported" : "included",
174
- prefixDigest: prefix ?? undefined,
175
- }),
176
- }) === reason);
177
- }
178
- function comparable(value, state) {
179
- return value === null ? null : { ...value, ...state };
180
- }
@@ -1,48 +0,0 @@
1
- export interface SelectionKey {
2
- readonly path: string;
3
- readonly root: string | null;
4
- }
5
- export interface EvidenceValue {
6
- readonly digest: string | null;
7
- readonly byteSize?: number | undefined;
8
- }
9
- export interface ComparableEvidence extends EvidenceValue {
10
- readonly status: string;
11
- readonly prefixDigest?: string | undefined;
12
- }
13
- export interface EvidenceSource extends SelectionKey, ComparableEvidence {
14
- }
15
- export declare const revisionReasons: {
16
- readonly "no-previous-entry": "new";
17
- readonly "not-selected": "missing";
18
- readonly "not-included": "missing";
19
- readonly "same-digest": "unchanged";
20
- readonly "previous-digest-unknown": "changed";
21
- readonly "previous-size-unknown": "changed";
22
- readonly "shorter-source": "truncated";
23
- readonly "verified-prefix": "extended";
24
- readonly "digest-changed": "changed";
25
- };
26
- export type RevisionReason = keyof typeof revisionReasons;
27
- export type RevisionStatus = (typeof revisionReasons)[RevisionReason];
28
- export interface RevisionEntry extends SelectionKey {
29
- readonly before: EvidenceValue | null;
30
- readonly after: EvidenceValue | null;
31
- readonly status: RevisionStatus;
32
- readonly reason: RevisionReason;
33
- }
34
- export declare function pairEvidence(data: {
35
- readonly previous: readonly SelectionKey[];
36
- readonly current: readonly SelectionKey[];
37
- }): readonly (number | null)[];
38
- export declare function evidenceReason(data: {
39
- readonly before: ComparableEvidence | null;
40
- readonly after: ComparableEvidence | null;
41
- }): RevisionReason;
42
- export declare function compareEvidence(data: {
43
- readonly previous: readonly EvidenceSource[];
44
- readonly current: readonly EvidenceSource[];
45
- }): {
46
- counts: Record<RevisionStatus, number>;
47
- entries: RevisionEntry[];
48
- };
@@ -1,94 +0,0 @@
1
- export const revisionReasons = {
2
- "no-previous-entry": "new",
3
- "not-selected": "missing",
4
- "not-included": "missing",
5
- "same-digest": "unchanged",
6
- "previous-digest-unknown": "changed",
7
- "previous-size-unknown": "changed",
8
- "shorter-source": "truncated",
9
- "verified-prefix": "extended",
10
- "digest-changed": "changed",
11
- };
12
- export function pairEvidence(data) {
13
- const queues = new Map();
14
- const key = (entry) => JSON.stringify([entry.path, entry.root]);
15
- data.previous.forEach((entry, index) => {
16
- const encoded = key(entry);
17
- const queue = queues.get(encoded) ?? [];
18
- queue.push(index);
19
- queues.set(encoded, queue);
20
- });
21
- return data.current.map((entry) => queues.get(key(entry))?.shift() ?? null);
22
- }
23
- export function evidenceReason(data) {
24
- const { before, after } = data;
25
- if (before === null)
26
- return "no-previous-entry";
27
- if (after === null)
28
- return "not-selected";
29
- if (after.status !== "included")
30
- return "not-included";
31
- if (before.digest !== null && before.digest === after.digest)
32
- return "same-digest";
33
- if (before.digest === null)
34
- return "previous-digest-unknown";
35
- if (before.byteSize === undefined)
36
- return "previous-size-unknown";
37
- return sizeReason({ ...before, byteSize: before.byteSize }, after);
38
- }
39
- function sizeReason(before, after) {
40
- if (after.byteSize !== undefined && after.byteSize < before.byteSize)
41
- return "shorter-source";
42
- if (after.byteSize !== undefined &&
43
- after.byteSize > before.byteSize &&
44
- after.prefixDigest === before.digest)
45
- return "verified-prefix";
46
- return "digest-changed";
47
- }
48
- function value(source) {
49
- if (source === undefined)
50
- return null;
51
- return {
52
- digest: source.digest,
53
- ...(source.byteSize === undefined ? {} : { byteSize: source.byteSize }),
54
- };
55
- }
56
- function entry(before, after) {
57
- const key = after ?? before;
58
- if (key === undefined)
59
- throw new Error("invalid-evidence");
60
- const why = evidenceReason({ before: before ?? null, after: after ?? null });
61
- return {
62
- path: key.path,
63
- root: key.root,
64
- before: value(before),
65
- after: value(after),
66
- status: revisionReasons[why],
67
- reason: why,
68
- };
69
- }
70
- export function compareEvidence(data) {
71
- const pairs = pairEvidence(data);
72
- const used = new Set(pairs);
73
- const entries = data.current.map((after, index) => {
74
- const matched = pairs[index];
75
- return entry(matched === null || matched === undefined
76
- ? undefined
77
- : data.previous[matched], after);
78
- });
79
- data.previous.forEach((before, index) => {
80
- if (!used.has(index))
81
- entries.push(entry(before, undefined));
82
- });
83
- const counts = {
84
- new: 0,
85
- missing: 0,
86
- unchanged: 0,
87
- changed: 0,
88
- truncated: 0,
89
- extended: 0,
90
- };
91
- for (const item of entries)
92
- counts[item.status]++;
93
- return { counts, entries };
94
- }
@@ -1,25 +0,0 @@
1
- import { type ScanSource } from "./source.ts";
2
- export interface SelectionRequest {
3
- readonly paths: readonly string[];
4
- readonly roots?: readonly string[];
5
- readonly excludeProjects?: readonly string[];
6
- readonly workingDirectory: string;
7
- }
8
- export interface SelectionOutcome {
9
- readonly status: "unreadable" | "unsupported" | "excluded" | "pending";
10
- readonly reason: string;
11
- }
12
- export interface SourceSelection {
13
- readonly kind: "file" | "subtree";
14
- readonly path: string;
15
- readonly selection: {
16
- readonly kind: "file" | "root";
17
- readonly index: number;
18
- };
19
- readonly outcome?: SelectionOutcome;
20
- readonly inspection?: ScanSource;
21
- }
22
- export declare function selectChatSources(request: SelectionRequest): Promise<{
23
- roots: string[];
24
- entries: SourceSelection[];
25
- }>;