cloving 1.1.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 (568) hide show
  1. package/README.md +584 -144
  2. package/assets/watch-fonts/fira-code-OFL.md +93 -0
  3. package/assets/watch-fonts/fira-code-latin-400-normal.woff2 +0 -0
  4. package/assets/watch-fonts/fira-code-latin-500-normal.woff2 +0 -0
  5. package/assets/watch-fonts/heebo-OFL.md +93 -0
  6. package/assets/watch-fonts/heebo-latin-500-normal.woff2 +0 -0
  7. package/assets/watch-fonts/heebo-latin-700-normal.woff2 +0 -0
  8. package/assets/watch-fonts/heebo-latin-800-normal.woff2 +0 -0
  9. package/assets/watch-fonts/manifest.json +112 -0
  10. package/assets/watch-fonts/space-grotesk-OFL.md +93 -0
  11. package/assets/watch-fonts/space-grotesk-latin-400-normal.woff2 +0 -0
  12. package/assets/watch-fonts/space-grotesk-latin-500-normal.woff2 +0 -0
  13. package/assets/watch-fonts/space-grotesk-latin-600-normal.woff2 +0 -0
  14. package/assets/watch-fonts/space-grotesk-latin-700-normal.woff2 +0 -0
  15. package/dist/src/agent-harness-shell.d.ts +12 -0
  16. package/dist/src/agent-harness-shell.js +90 -0
  17. package/dist/src/agent-harness-versions.d.ts +8 -0
  18. package/dist/src/agent-harness-versions.js +49 -0
  19. package/dist/src/agent-harnesses.d.ts +4 -0
  20. package/dist/src/agent-harnesses.js +13 -0
  21. package/dist/src/authority/commands.d.ts +2 -0
  22. package/dist/src/authority/commands.js +49 -8
  23. package/dist/src/authority/dispatch-decision.d.ts +1 -0
  24. package/dist/src/authority/dispatch-decision.js +7 -4
  25. package/dist/src/authority/events.js +2 -2
  26. package/dist/src/authority/gate-reduction.d.ts +1 -0
  27. package/dist/src/authority/gate-reduction.js +18 -3
  28. package/dist/src/authority/gates.d.ts +2 -1
  29. package/dist/src/authority/gates.js +5 -1
  30. package/dist/src/authority/handoff-chain.d.ts +24 -0
  31. package/dist/src/authority/handoff-chain.js +46 -0
  32. package/dist/src/authority/operations.js +1 -1
  33. package/dist/src/authority/reconciliation.d.ts +1 -0
  34. package/dist/src/authority/reconciliation.js +18 -11
  35. package/dist/src/authority/reduction.d.ts +1 -1
  36. package/dist/src/authority/reduction.js +6 -1
  37. package/dist/src/authority/status-input.d.ts +1 -1
  38. package/dist/src/authority/status.d.ts +1 -0
  39. package/dist/src/authority/status.js +27 -3
  40. package/dist/src/authority/transitions.d.ts +5 -5
  41. package/dist/src/authority/transitions.js +9 -0
  42. package/dist/src/broker/actor/authority-delivery.js +1 -0
  43. package/dist/src/broker/actor/authority-queries.d.ts +11 -1
  44. package/dist/src/broker/actor/authority-queries.js +67 -3
  45. package/dist/src/broker/actor/authority-receipts.js +11 -1
  46. package/dist/src/broker/actor/authority-session.js +2 -2
  47. package/dist/src/broker/actor/authority-settings.js +4 -0
  48. package/dist/src/broker/actor/delivery-intents.d.ts +3 -1
  49. package/dist/src/broker/actor/delivery-intents.js +4 -4
  50. package/dist/src/broker/actor/effect-delivery.js +13 -1
  51. package/dist/src/broker/actor/effect-queries.d.ts +1 -0
  52. package/dist/src/broker/actor/effect-queries.js +7 -0
  53. package/dist/src/broker/actor/pin-check.js +1 -1
  54. package/dist/src/broker/actor/stop-plan.js +1 -1
  55. package/dist/src/broker/actor/turn-state.js +1 -1
  56. package/dist/src/broker/authority-admission.js +26 -5
  57. package/dist/src/broker/authority-restore.js +1 -0
  58. package/dist/src/broker/decision-restore.js +4 -4
  59. package/dist/src/broker/socket-address.d.ts +3 -1
  60. package/dist/src/broker/socket-address.js +2 -2
  61. package/dist/src/cli/arguments.d.ts +11 -13
  62. package/dist/src/cli/arguments.js +37 -107
  63. package/dist/src/cli/command-effects.d.ts +7 -0
  64. package/dist/src/cli/command-effects.js +39 -0
  65. package/dist/src/cli/commands.js +11 -4
  66. package/dist/src/cli/config-arguments.d.ts +11 -0
  67. package/dist/src/cli/config-arguments.js +59 -0
  68. package/dist/src/cli/config-command.d.ts +2 -0
  69. package/dist/src/cli/config-command.js +105 -0
  70. package/dist/src/cli/config-file.d.ts +3 -0
  71. package/dist/src/cli/config-file.js +50 -0
  72. package/dist/src/cli/config-lock.d.ts +7 -0
  73. package/dist/src/cli/config-lock.js +61 -0
  74. package/dist/src/cli/config-notice.d.ts +5 -0
  75. package/dist/src/cli/config-notice.js +46 -0
  76. package/dist/src/cli/doctor-github.d.ts +9 -0
  77. package/dist/src/cli/doctor-github.js +138 -0
  78. package/dist/src/cli/doctor-harness.d.ts +13 -0
  79. package/dist/src/cli/doctor-harness.js +242 -0
  80. package/dist/src/cli/doctor-local.d.ts +18 -0
  81. package/dist/src/cli/doctor-local.js +77 -0
  82. package/dist/src/cli/doctor-runtime.d.ts +15 -0
  83. package/dist/src/cli/doctor-runtime.js +176 -0
  84. package/dist/src/cli/doctor-service.d.ts +1 -0
  85. package/dist/src/cli/doctor-service.js +11 -0
  86. package/dist/src/cli/doctor-workflows.d.ts +3 -0
  87. package/dist/src/cli/doctor-workflows.js +45 -0
  88. package/dist/src/cli/doctor.d.ts +15 -0
  89. package/dist/src/cli/doctor.js +190 -0
  90. package/dist/src/cli/github-ci-progress.d.ts +8 -0
  91. package/dist/src/cli/github-ci-progress.js +83 -0
  92. package/dist/src/cli/github-retry.d.ts +6 -0
  93. package/dist/src/cli/github-retry.js +47 -0
  94. package/dist/src/cli/harness-probes.d.ts +22 -0
  95. package/dist/src/cli/harness-probes.js +183 -0
  96. package/dist/src/cli/main.d.ts +7 -1
  97. package/dist/src/cli/main.js +39 -61
  98. package/dist/src/cli/phone-arguments.d.ts +14 -0
  99. package/dist/src/cli/phone-arguments.js +37 -0
  100. package/dist/src/cli/phone-client.d.ts +2 -0
  101. package/dist/src/cli/phone-client.js +32 -0
  102. package/dist/src/cli/phone-command.d.ts +13 -0
  103. package/dist/src/cli/phone-command.js +101 -0
  104. package/dist/src/cli/probe-command.d.ts +36 -0
  105. package/dist/src/cli/probe-command.js +59 -0
  106. package/dist/src/cli/project-settings.d.ts +4 -0
  107. package/dist/src/cli/project-settings.js +33 -0
  108. package/dist/src/cli/render.d.ts +3 -1
  109. package/dist/src/cli/render.js +102 -39
  110. package/dist/src/cli/report-github.d.ts +18 -0
  111. package/dist/src/cli/report-github.js +200 -0
  112. package/dist/src/cli/report.d.ts +17 -0
  113. package/dist/src/cli/report.js +192 -0
  114. package/dist/src/cli/repository-arguments.d.ts +5 -0
  115. package/dist/src/cli/repository-arguments.js +34 -0
  116. package/dist/src/cli/runtime-arguments.d.ts +4 -0
  117. package/dist/src/cli/runtime-arguments.js +15 -0
  118. package/dist/src/cli/runtime-directory.d.ts +6 -2
  119. package/dist/src/cli/runtime-directory.js +72 -14
  120. package/dist/src/cli/toolchain.d.ts +2 -0
  121. package/dist/src/cli/toolchain.js +22 -2
  122. package/dist/src/cli/usage-render.d.ts +5 -0
  123. package/dist/src/cli/usage-render.js +40 -1
  124. package/dist/src/cli/usage.d.ts +3 -3
  125. package/dist/src/cli/usage.js +74 -45
  126. package/dist/src/cli/watch-actions.d.ts +2 -0
  127. package/dist/src/cli/watch-actions.js +4 -4
  128. package/dist/src/cli/watch-board-view.d.ts +12 -1
  129. package/dist/src/cli/watch-board-view.js +64 -12
  130. package/dist/src/cli/watch-board.d.ts +7 -1
  131. package/dist/src/cli/watch-board.js +61 -16
  132. package/dist/src/cli/watch-card-forms.js +2 -2
  133. package/dist/src/cli/watch-client.d.ts +1 -1
  134. package/dist/src/cli/watch-client.js +12 -3
  135. package/dist/src/cli/watch-header-view.d.ts +27 -0
  136. package/dist/src/cli/watch-header-view.js +116 -0
  137. package/dist/src/cli/watch-model.d.ts +10 -4
  138. package/dist/src/cli/watch-model.js +49 -59
  139. package/dist/src/cli/watch-page.js +67 -14
  140. package/dist/src/cli/watch-phases.js +3 -3
  141. package/dist/src/cli/watch-phone-client.d.ts +1 -0
  142. package/dist/src/cli/watch-phone-client.js +84 -0
  143. package/dist/src/cli/watch-phone-view.d.ts +56 -0
  144. package/dist/src/cli/watch-phone-view.js +113 -0
  145. package/dist/src/cli/watch-phone.d.ts +5 -0
  146. package/dist/src/cli/watch-phone.js +53 -0
  147. package/dist/src/cli/watch-pr-command.d.ts +5 -2
  148. package/dist/src/cli/watch-pr-command.js +41 -4
  149. package/dist/src/cli/watch-pr-identity.d.ts +14 -2
  150. package/dist/src/cli/watch-pr-identity.js +25 -0
  151. package/dist/src/cli/watch-pr-observer.d.ts +1 -0
  152. package/dist/src/cli/watch-pr-observer.js +48 -6
  153. package/dist/src/cli/watch-pull-request.d.ts +12 -0
  154. package/dist/src/cli/watch-pull-request.js +134 -0
  155. package/dist/src/cli/watch-reads.d.ts +7 -1
  156. package/dist/src/cli/watch-reads.js +42 -20
  157. package/dist/src/cli/watch-render.d.ts +23 -2
  158. package/dist/src/cli/watch-render.js +2 -1
  159. package/dist/src/cli/watch-server.js +56 -7
  160. package/dist/src/cli/watch-turn.d.ts +4 -1
  161. package/dist/src/cli/watch-turn.js +38 -2
  162. package/dist/src/cli/watch-usage.js +5 -1
  163. package/dist/src/cli/watch-view.d.ts +10 -17
  164. package/dist/src/cli/watch-view.js +33 -77
  165. package/dist/src/cli.js +106 -23
  166. package/dist/src/command-settings.d.ts +16 -0
  167. package/dist/src/command-settings.js +42 -0
  168. package/dist/src/configuration-change.d.ts +11 -0
  169. package/dist/src/configuration-change.js +62 -0
  170. package/dist/src/configuration-display.d.ts +21 -0
  171. package/dist/src/configuration-display.js +69 -0
  172. package/dist/src/configuration-schema.d.ts +49 -0
  173. package/dist/src/configuration-schema.js +159 -0
  174. package/dist/src/daemon/claude-turn.d.ts +20 -5
  175. package/dist/src/daemon/claude-turn.js +116 -53
  176. package/dist/src/daemon/claude-worker.d.ts +3 -5
  177. package/dist/src/daemon/claude-worker.js +64 -80
  178. package/dist/src/daemon/command-journal.d.ts +5 -0
  179. package/dist/src/daemon/command-journal.js +50 -0
  180. package/dist/src/daemon/command-process.d.ts +28 -0
  181. package/dist/src/daemon/command-process.js +164 -0
  182. package/dist/src/daemon/command-worker.d.ts +19 -0
  183. package/dist/src/daemon/command-worker.js +182 -0
  184. package/dist/src/daemon/cursor-stream.d.ts +4 -0
  185. package/dist/src/daemon/cursor-stream.js +154 -0
  186. package/dist/src/daemon/daemon-adapters.d.ts +58 -0
  187. package/dist/src/daemon/daemon-adapters.js +102 -0
  188. package/dist/src/daemon/daemon-loops.d.ts +14 -0
  189. package/dist/src/daemon/daemon-loops.js +39 -0
  190. package/dist/src/daemon/daemon.d.ts +3 -30
  191. package/dist/src/daemon/daemon.js +132 -110
  192. package/dist/src/daemon/declared-input.d.ts +3 -0
  193. package/dist/src/daemon/declared-input.js +9 -0
  194. package/dist/src/daemon/delivery-router.js +7 -1
  195. package/dist/src/daemon/gemini-stream.d.ts +4 -0
  196. package/dist/src/daemon/gemini-stream.js +129 -0
  197. package/dist/src/daemon/github-calls.d.ts +4 -0
  198. package/dist/src/daemon/github-calls.js +16 -7
  199. package/dist/src/daemon/github-ci-rerun.d.ts +26 -0
  200. package/dist/src/daemon/github-ci-rerun.js +92 -0
  201. package/dist/src/daemon/github-ci.d.ts +6 -0
  202. package/dist/src/daemon/github-ci.js +251 -0
  203. package/dist/src/daemon/github-merge-call.d.ts +16 -0
  204. package/dist/src/daemon/github-merge-call.js +73 -0
  205. package/dist/src/daemon/github-merge.d.ts +3 -5
  206. package/dist/src/daemon/github-merge.js +59 -98
  207. package/dist/src/daemon/github-methods.d.ts +28 -0
  208. package/dist/src/daemon/github-methods.js +90 -16
  209. package/dist/src/daemon/github-operation.d.ts +3 -0
  210. package/dist/src/daemon/github-retry.d.ts +6 -0
  211. package/dist/src/daemon/github-retry.js +13 -0
  212. package/dist/src/daemon/github-ticket-status.js +27 -1
  213. package/dist/src/daemon/github-worker.js +2 -1
  214. package/dist/src/daemon/handoff-worker.d.ts +10 -0
  215. package/dist/src/daemon/handoff-worker.js +232 -0
  216. package/dist/src/daemon/issue-queue.d.ts +2 -0
  217. package/dist/src/daemon/issue-queue.js +92 -63
  218. package/dist/src/daemon/notify-journal.d.ts +18 -0
  219. package/dist/src/daemon/notify-journal.js +108 -0
  220. package/dist/src/daemon/notify-message.js +2 -1
  221. package/dist/src/daemon/notify.js +177 -37
  222. package/dist/src/daemon/opencode-stream.d.ts +5 -0
  223. package/dist/src/daemon/opencode-stream.js +87 -0
  224. package/dist/src/daemon/queue-status.d.ts +4 -0
  225. package/dist/src/daemon/queue-status.js +38 -0
  226. package/dist/src/daemon/retry-worktree.d.ts +18 -0
  227. package/dist/src/daemon/retry-worktree.js +139 -0
  228. package/dist/src/daemon/retrying-turn.d.ts +5 -0
  229. package/dist/src/daemon/retrying-turn.js +145 -21
  230. package/dist/src/daemon/schedule-journal.d.ts +19 -0
  231. package/dist/src/daemon/schedule-journal.js +57 -0
  232. package/dist/src/daemon/text-output.d.ts +18 -0
  233. package/dist/src/daemon/text-output.js +44 -0
  234. package/dist/src/daemon/ticket-dependency-waits.d.ts +18 -0
  235. package/dist/src/daemon/ticket-dependency-waits.js +60 -0
  236. package/dist/src/daemon/ticket-registration.d.ts +10 -8
  237. package/dist/src/daemon/ticket-registration.js +146 -47
  238. package/dist/src/daemon/ticket-source.d.ts +4 -1
  239. package/dist/src/daemon/ticket-source.js +8 -2
  240. package/dist/src/daemon/turn-command.d.ts +10 -0
  241. package/dist/src/daemon/turn-command.js +33 -0
  242. package/dist/src/daemon/turn-report.d.ts +18 -0
  243. package/dist/src/daemon/turn-report.js +79 -0
  244. package/dist/src/daemon/work-tree.d.ts +2 -1
  245. package/dist/src/daemon/work-tree.js +15 -12
  246. package/dist/src/daemon/workflow-generations.d.ts +32 -0
  247. package/dist/src/daemon/workflow-generations.js +57 -0
  248. package/dist/src/daemon/workflow-replay.d.ts +16 -0
  249. package/dist/src/daemon/workflow-replay.js +58 -0
  250. package/dist/src/daemon/workflow-schedules.d.ts +27 -0
  251. package/dist/src/daemon/workflow-schedules.js +185 -0
  252. package/dist/src/decision-visibility.d.ts +2 -0
  253. package/dist/src/decision-visibility.js +10 -0
  254. package/dist/src/decision-wait.d.ts +1 -0
  255. package/dist/src/decision-wait.js +3 -0
  256. package/dist/src/delivery-backoff.d.ts +1 -0
  257. package/dist/src/delivery-backoff.js +3 -0
  258. package/dist/src/doctor-report.d.ts +24 -0
  259. package/dist/src/doctor-report.js +70 -0
  260. package/dist/src/execution-pin.d.ts +9 -0
  261. package/dist/src/execution-pin.js +86 -2
  262. package/dist/src/grok-result.d.ts +12 -0
  263. package/dist/src/grok-result.js +61 -0
  264. package/dist/src/harness-defaults.d.ts +35 -0
  265. package/dist/src/harness-defaults.js +121 -0
  266. package/dist/src/host/decision-resume.d.ts +35 -0
  267. package/dist/src/host/decision-resume.js +86 -0
  268. package/dist/src/host/gate-bridge.d.ts +48 -0
  269. package/dist/src/host/gate-bridge.js +124 -0
  270. package/dist/src/host/run-wait.d.ts +26 -0
  271. package/dist/src/host/run-wait.js +37 -0
  272. package/dist/src/host/start-delivery.d.ts +3 -2
  273. package/dist/src/host/start-delivery.js +11 -4
  274. package/dist/src/host/step-bridge-host.d.ts +6 -19
  275. package/dist/src/host/step-bridge-host.js +57 -55
  276. package/dist/src/host/world-reconciliation.d.ts +1 -0
  277. package/dist/src/host/world-reconciliation.js +3 -0
  278. package/dist/src/host/world-runs.js +5 -0
  279. package/dist/src/issue-identity.d.ts +6 -0
  280. package/dist/src/issue-identity.js +23 -0
  281. package/dist/src/merge-request.d.ts +19 -0
  282. package/dist/src/merge-request.js +32 -0
  283. package/dist/src/phone/canonical-json.d.ts +1 -0
  284. package/dist/src/phone/canonical-json.js +16 -0
  285. package/dist/src/phone/phone-link.d.ts +7 -0
  286. package/dist/src/phone/phone-link.js +21 -0
  287. package/dist/src/phone/qr-data.d.ts +8 -0
  288. package/dist/src/phone/qr-data.js +133 -0
  289. package/dist/src/phone/qr-matrix.d.ts +6 -0
  290. package/dist/src/phone/qr-matrix.js +175 -0
  291. package/dist/src/phone/qr-penalty.d.ts +3 -0
  292. package/dist/src/phone/qr-penalty.js +67 -0
  293. package/dist/src/phone/qr-picture.d.ts +5 -0
  294. package/dist/src/phone/qr-picture.js +24 -0
  295. package/dist/src/private-config.schema.json +263 -0
  296. package/dist/src/project-config.schema.json +65 -0
  297. package/dist/src/project-settings.d.ts +19 -0
  298. package/dist/src/project-settings.js +131 -0
  299. package/dist/src/relay/answer-check.d.ts +24 -0
  300. package/dist/src/relay/answer-check.js +145 -0
  301. package/dist/src/relay/answer-inbox.d.ts +15 -0
  302. package/dist/src/relay/answer-inbox.js +173 -0
  303. package/dist/src/relay/daemon-keys.d.ts +16 -0
  304. package/dist/src/relay/daemon-keys.js +75 -0
  305. package/dist/src/relay/decision-check.d.ts +3 -0
  306. package/dist/src/relay/decision-check.js +77 -0
  307. package/dist/src/relay/decision-close.d.ts +6 -0
  308. package/dist/src/relay/decision-close.js +72 -0
  309. package/dist/src/relay/decision-envelopes.d.ts +29 -0
  310. package/dist/src/relay/decision-envelopes.js +93 -0
  311. package/dist/src/relay/decision-watch.d.ts +14 -0
  312. package/dist/src/relay/decision-watch.js +68 -0
  313. package/dist/src/relay/envelope-post.d.ts +8 -0
  314. package/dist/src/relay/envelope-post.js +71 -0
  315. package/dist/src/relay/envelope.d.ts +28 -0
  316. package/dist/src/relay/envelope.js +53 -0
  317. package/dist/src/relay/hpke.d.ts +25 -0
  318. package/dist/src/relay/hpke.js +108 -0
  319. package/dist/src/relay/pairing-checks.d.ts +42 -0
  320. package/dist/src/relay/pairing-checks.js +172 -0
  321. package/dist/src/relay/pairing-follow.d.ts +8 -0
  322. package/dist/src/relay/pairing-follow.js +95 -0
  323. package/dist/src/relay/pairing-session.d.ts +29 -0
  324. package/dist/src/relay/pairing-session.js +87 -0
  325. package/dist/src/relay/phone-delivery.d.ts +51 -0
  326. package/dist/src/relay/phone-delivery.js +139 -0
  327. package/dist/src/relay/phone-devices.d.ts +36 -0
  328. package/dist/src/relay/phone-devices.js +46 -0
  329. package/dist/src/relay/phone-inbox.d.ts +18 -0
  330. package/dist/src/relay/phone-inbox.js +17 -0
  331. package/dist/src/relay/phone-operations.d.ts +18 -0
  332. package/dist/src/relay/phone-operations.js +121 -0
  333. package/dist/src/relay/phone-outbox.d.ts +21 -0
  334. package/dist/src/relay/phone-outbox.js +25 -0
  335. package/dist/src/relay/phone-socket.d.ts +6 -0
  336. package/dist/src/relay/phone-socket.js +63 -0
  337. package/dist/src/relay/relay-control.d.ts +7 -0
  338. package/dist/src/relay/relay-control.js +24 -0
  339. package/dist/src/relay/relay-files.d.ts +2 -0
  340. package/dist/src/relay/relay-files.js +23 -0
  341. package/dist/src/relay/relay-heartbeat.d.ts +17 -0
  342. package/dist/src/relay/relay-heartbeat.js +81 -0
  343. package/dist/src/relay/relay-http.d.ts +14 -0
  344. package/dist/src/relay/relay-http.js +63 -0
  345. package/dist/src/relay/relay-registration.d.ts +15 -0
  346. package/dist/src/relay/relay-registration.js +63 -0
  347. package/dist/src/relay/relay-service.d.ts +25 -0
  348. package/dist/src/relay/relay-service.js +216 -0
  349. package/dist/src/relay/relay-store.d.ts +48 -0
  350. package/dist/src/relay/relay-store.js +131 -0
  351. package/dist/src/relay/sealed-post.d.ts +25 -0
  352. package/dist/src/relay/sealed-post.js +52 -0
  353. package/dist/src/relay.d.ts +1 -0
  354. package/dist/src/relay.js +8 -0
  355. package/dist/src/report-statistics.d.ts +50 -0
  356. package/dist/src/report-statistics.js +70 -0
  357. package/dist/src/report.d.ts +171 -0
  358. package/dist/src/report.js +119 -0
  359. package/dist/src/repository-identity.d.ts +4 -0
  360. package/dist/src/repository-identity.js +4 -0
  361. package/dist/src/review-subject.d.ts +41 -0
  362. package/dist/src/review-subject.js +91 -0
  363. package/dist/src/run-wait.d.ts +23 -0
  364. package/dist/src/run-wait.js +20 -0
  365. package/dist/src/service/active-tickets.d.ts +4 -0
  366. package/dist/src/service/active-tickets.js +49 -0
  367. package/dist/src/service/command-effects.d.ts +4 -0
  368. package/dist/src/service/command-effects.js +16 -0
  369. package/dist/src/service/decision-handler.d.ts +4 -0
  370. package/dist/src/service/decision-handler.js +39 -4
  371. package/dist/src/service/gateway.js +18 -3
  372. package/dist/src/service/queue-runs.d.ts +3 -0
  373. package/dist/src/service/queue-runs.js +39 -0
  374. package/dist/src/service/registry.d.ts +22 -3
  375. package/dist/src/service/registry.js +51 -8
  376. package/dist/src/service/replies.d.ts +10 -0
  377. package/dist/src/service/replies.js +12 -0
  378. package/dist/src/service/run-handlers.js +45 -54
  379. package/dist/src/service/run-metadata.d.ts +8 -0
  380. package/dist/src/service/run-metadata.js +53 -0
  381. package/dist/src/service/run-waits.d.ts +3 -0
  382. package/dist/src/service/run-waits.js +41 -0
  383. package/dist/src/service/service.d.ts +21 -2
  384. package/dist/src/service/service.js +23 -5
  385. package/dist/src/service/submission-handler.js +70 -19
  386. package/dist/src/service/worker-port.d.ts +1 -0
  387. package/dist/src/service/worker-totals.js +10 -1
  388. package/dist/src/step-bridge.d.ts +32 -0
  389. package/dist/src/steps/decision-gate.d.ts +2 -1
  390. package/dist/src/steps/decision-gate.js +7 -0
  391. package/dist/src/steps/handoff.d.ts +2 -0
  392. package/dist/src/steps/handoff.js +13 -0
  393. package/dist/src/steps/merge-by-person.d.ts +2 -0
  394. package/dist/src/steps/merge-by-person.js +18 -0
  395. package/dist/src/steps/merge-when-green.d.ts +2 -0
  396. package/dist/src/steps/merge-when-green.js +62 -0
  397. package/dist/src/steps/review-by-agent.d.ts +5 -0
  398. package/dist/src/steps/review-by-agent.js +124 -0
  399. package/dist/src/steps/review-by-person.d.ts +4 -0
  400. package/dist/src/steps/review-by-person.js +16 -0
  401. package/dist/src/steps/review-subject.d.ts +2 -0
  402. package/dist/src/steps/review-subject.js +11 -0
  403. package/dist/src/steps/run-command.d.ts +2 -0
  404. package/dist/src/steps/run-command.js +15 -0
  405. package/dist/src/steps/sleep.d.ts +3 -0
  406. package/dist/src/steps/sleep.js +19 -0
  407. package/dist/src/steps/wait-for-decision.d.ts +2 -0
  408. package/dist/src/steps/wait-for-decision.js +71 -0
  409. package/dist/src/steps/wait-for-run.d.ts +5 -0
  410. package/dist/src/steps/wait-for-run.js +9 -0
  411. package/dist/src/storage/decision-snapshots.d.ts +1 -0
  412. package/dist/src/storage/decision-snapshots.js +7 -1
  413. package/dist/src/submission.d.ts +4 -0
  414. package/dist/src/submission.js +6 -2
  415. package/dist/src/testing.d.ts +29 -0
  416. package/dist/src/testing.js +264 -0
  417. package/dist/src/ticket-dependencies.d.ts +1 -0
  418. package/dist/src/ticket-dependencies.js +15 -0
  419. package/dist/src/ticket-status-stream.d.ts +9 -0
  420. package/dist/src/ticket-status-stream.js +94 -0
  421. package/dist/src/ticket-status.js +7 -4
  422. package/dist/src/token-prices.d.ts +14 -4
  423. package/dist/src/token-prices.js +56 -11
  424. package/dist/src/turn-profile.d.ts +1 -0
  425. package/dist/src/turn-profile.js +8 -1
  426. package/dist/src/worker-usage.d.ts +25 -0
  427. package/dist/src/worker-usage.js +58 -1
  428. package/dist/src/workflow-admission.d.ts +6 -0
  429. package/dist/src/workflow-candidate.d.ts +7 -2
  430. package/dist/src/workflow-candidate.js +48 -5
  431. package/dist/src/workflow-contracts.d.ts +2 -0
  432. package/dist/src/workflow-contracts.js +8 -3
  433. package/dist/src/workflow-declaration.d.ts +31 -2
  434. package/dist/src/workflow-declaration.js +140 -16
  435. package/dist/src/workflow-discovery.d.ts +19 -0
  436. package/dist/src/workflow-discovery.js +36 -0
  437. package/dist/src/workflow-refusals.d.ts +6 -0
  438. package/dist/src/workflow-refusals.js +42 -0
  439. package/dist/src/workflow-schedule.d.ts +22 -0
  440. package/dist/src/workflow-schedule.js +53 -0
  441. package/dist/src/workflows.d.ts +12 -1
  442. package/dist/src/workflows.js +9 -0
  443. package/dist/tools/admit-workflow.d.ts +14 -0
  444. package/dist/tools/admit-workflow.js +107 -0
  445. package/dist/tools/doctor-adoption.d.ts +1 -0
  446. package/dist/tools/doctor-adoption.js +11 -0
  447. package/dist/tools/project-configuration.d.ts +4 -0
  448. package/dist/tools/project-configuration.js +47 -0
  449. package/dist/tools/self-host-processes.d.ts +1 -0
  450. package/dist/tools/self-host-processes.js +33 -22
  451. package/dist/tools/self-host-project.d.ts +21 -0
  452. package/dist/tools/self-host-project.js +224 -0
  453. package/dist/tools/self-host-runtime.d.ts +16 -0
  454. package/dist/tools/self-host-runtime.js +60 -0
  455. package/dist/tools/self-host-workflows.d.ts +1 -0
  456. package/dist/tools/self-host-workflows.js +36 -1
  457. package/dist/tools/self-host.js +106 -135
  458. package/dist/tools/workflow-bundle-dependencies.d.ts +5 -0
  459. package/dist/tools/workflow-bundle-dependencies.js +93 -0
  460. package/dist/tools/workflow-bundles.d.ts +20 -0
  461. package/dist/tools/workflow-bundles.js +173 -0
  462. package/dist/tools/workflow-candidate-counts.d.ts +12 -0
  463. package/dist/tools/workflow-candidate-counts.js +266 -0
  464. package/dist/tools/workflow-candidate-fields.d.ts +5 -0
  465. package/dist/tools/workflow-candidate-fields.js +24 -0
  466. package/dist/tools/workflow-candidate-helper-counts.d.ts +10 -0
  467. package/dist/tools/workflow-candidate-helper-counts.js +129 -0
  468. package/dist/tools/workflow-candidate-program.d.ts +13 -0
  469. package/dist/tools/workflow-candidate-program.js +106 -0
  470. package/dist/tools/workflow-candidate-source.d.ts +6 -0
  471. package/dist/tools/workflow-candidate-source.js +169 -0
  472. package/dist/tools/workflow-candidate-syntax.d.ts +21 -0
  473. package/dist/tools/workflow-candidate-syntax.js +263 -0
  474. package/dist/tools/workflow-command.d.ts +1 -0
  475. package/dist/tools/workflow-command.js +143 -0
  476. package/dist/tools/workflow-folder-capture.d.ts +18 -0
  477. package/dist/tools/workflow-folder-capture.js +261 -0
  478. package/dist/tools/workflow-folders.d.ts +49 -0
  479. package/dist/tools/workflow-folders.js +203 -0
  480. package/dist/tools/workflow-source-effects.d.ts +10 -0
  481. package/dist/tools/workflow-source-effects.js +213 -0
  482. package/dist/tools/workflow-test-hook.d.ts +7 -0
  483. package/dist/tools/workflow-test-hook.js +16 -0
  484. package/dist/tools/workflow-test-loader.d.ts +1 -0
  485. package/dist/tools/workflow-test-loader.js +10 -0
  486. package/dist/workflows/develop-prd.js +71 -3
  487. package/dist/workflows/develop-ticket.js +6 -1
  488. package/dist/workflows/ticket-prompts.js +17 -3
  489. package/package.json +66 -6
  490. package/templates/develop/README.md +78 -0
  491. package/templates/develop/develop/accept.ts +11 -0
  492. package/templates/develop/develop/flow-tests.ts +357 -0
  493. package/templates/develop/develop/local.ts +40 -0
  494. package/templates/develop/develop/option-tests.ts +174 -0
  495. package/templates/develop/develop/partial-choice.ts +29 -0
  496. package/templates/develop/develop/partial.ts +28 -0
  497. package/templates/develop/develop/pull.ts +152 -0
  498. package/templates/develop/develop/queue-partial.ts +39 -0
  499. package/templates/develop/develop/refusal-tests.ts +174 -0
  500. package/templates/develop/develop/report.ts +156 -0
  501. package/templates/develop/develop/round.ts +40 -0
  502. package/templates/develop/develop/scenarios.ts +87 -0
  503. package/templates/develop/develop/turn.ts +67 -0
  504. package/templates/develop/develop.declaration.json +24 -0
  505. package/templates/develop/develop.test.ts +287 -0
  506. package/templates/develop/develop.ts +30 -0
  507. package/templates/develop/template.json +153 -0
  508. package/dist/src/chats/analysis-batches.d.ts +0 -24
  509. package/dist/src/chats/analysis-batches.js +0 -83
  510. package/dist/src/chats/analysis-contract.d.ts +0 -80
  511. package/dist/src/chats/analysis-contract.js +0 -16
  512. package/dist/src/chats/analysis-data.d.ts +0 -3
  513. package/dist/src/chats/analysis-data.js +0 -85
  514. package/dist/src/chats/analysis-input.d.ts +0 -12
  515. package/dist/src/chats/analysis-input.js +0 -83
  516. package/dist/src/chats/analysis-links.d.ts +0 -2
  517. package/dist/src/chats/analysis-links.js +0 -25
  518. package/dist/src/chats/analysis-prompt.d.ts +0 -10
  519. package/dist/src/chats/analysis-prompt.js +0 -16
  520. package/dist/src/chats/analysis-proposal.d.ts +0 -2
  521. package/dist/src/chats/analysis-proposal.js +0 -32
  522. package/dist/src/chats/analysis-provenance.d.ts +0 -4
  523. package/dist/src/chats/analysis-provenance.js +0 -99
  524. package/dist/src/chats/analysis-shape.d.ts +0 -3
  525. package/dist/src/chats/analysis-shape.js +0 -228
  526. package/dist/src/chats/analysis.d.ts +0 -3
  527. package/dist/src/chats/analysis.js +0 -42
  528. package/dist/src/chats/corpus-input.d.ts +0 -5
  529. package/dist/src/chats/corpus-input.js +0 -288
  530. package/dist/src/chats/destination.d.ts +0 -4
  531. package/dist/src/chats/destination.js +0 -96
  532. package/dist/src/chats/import.d.ts +0 -15
  533. package/dist/src/chats/import.js +0 -243
  534. package/dist/src/chats/input-file.d.ts +0 -3
  535. package/dist/src/chats/input-file.js +0 -32
  536. package/dist/src/chats/normalize.d.ts +0 -29
  537. package/dist/src/chats/normalize.js +0 -155
  538. package/dist/src/chats/previous-import.d.ts +0 -5
  539. package/dist/src/chats/previous-import.js +0 -34
  540. package/dist/src/chats/reader.d.ts +0 -21
  541. package/dist/src/chats/reader.js +0 -118
  542. package/dist/src/chats/redact-import.d.ts +0 -14
  543. package/dist/src/chats/redact-import.js +0 -141
  544. package/dist/src/chats/redaction.d.ts +0 -41
  545. package/dist/src/chats/redaction.js +0 -161
  546. package/dist/src/chats/revision-input.d.ts +0 -3
  547. package/dist/src/chats/revision-input.js +0 -180
  548. package/dist/src/chats/revision.d.ts +0 -48
  549. package/dist/src/chats/revision.js +0 -94
  550. package/dist/src/chats/selection.d.ts +0 -25
  551. package/dist/src/chats/selection.js +0 -109
  552. package/dist/src/chats/source.d.ts +0 -23
  553. package/dist/src/chats/source.js +0 -135
  554. package/dist/src/chats/structure.d.ts +0 -57
  555. package/dist/src/chats/structure.js +0 -216
  556. package/dist/src/daemon/analysis-launch.d.ts +0 -5
  557. package/dist/src/daemon/analysis-launch.js +0 -81
  558. package/dist/src/daemon/analysis-token.d.ts +0 -6
  559. package/dist/src/daemon/analysis-token.js +0 -88
  560. package/dist/src/daemon/analysis-worker.d.ts +0 -22
  561. package/dist/src/daemon/analysis-worker.js +0 -219
  562. package/dist/src/daemon/chats-files.d.ts +0 -15
  563. package/dist/src/daemon/chats-files.js +0 -113
  564. package/dist/src/daemon/chats-worker.d.ts +0 -12
  565. package/dist/src/daemon/chats-worker.js +0 -200
  566. package/dist/workflows/analyze-chats.d.ts +0 -10
  567. package/dist/workflows/analyze-chats.declaration.json +0 -9
  568. package/dist/workflows/analyze-chats.js +0 -73
@@ -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
- }
@@ -1,29 +0,0 @@
1
- export interface Omissions {
2
- metadataRecords: number;
3
- thinkingBlocks: number;
4
- }
5
- interface MessageFields {
6
- readonly sourceId: string;
7
- readonly role: "user" | "assistant";
8
- readonly timestamp: string | null;
9
- readonly sessionId: string | null;
10
- readonly text: string;
11
- readonly blocks: readonly Record<string, unknown>[];
12
- }
13
- export type MessageRecord = MessageFields & ({
14
- readonly schemaVersion: 1;
15
- } | {
16
- readonly schemaVersion: 2;
17
- readonly uuid: string | null;
18
- readonly isSidechain: boolean | null;
19
- readonly parentUuid?: string | null;
20
- });
21
- export interface NormalizedTranscript {
22
- readonly status: "included" | "unsupported";
23
- readonly reason: string;
24
- readonly records: readonly MessageRecord[];
25
- readonly omissions: Omissions;
26
- }
27
- export declare function parsePreservedJson(text: string): unknown;
28
- export declare function normalizeTranscript(text: string, digest: string): NormalizedTranscript;
29
- export {};
@@ -1,155 +0,0 @@
1
- function object(value) {
2
- return value !== null && typeof value === "object" && !Array.isArray(value);
3
- }
4
- function supportedBlock(block) {
5
- const type = block["type"];
6
- if (type === "text" && typeof block["text"] === "string")
7
- return { type, text: block["text"] };
8
- if (type === "tool_use" &&
9
- typeof block["id"] === "string" &&
10
- typeof block["name"] === "string" &&
11
- Object.hasOwn(block, "input")) {
12
- return {
13
- type,
14
- id: block["id"],
15
- name: block["name"],
16
- input: block["input"],
17
- };
18
- }
19
- if (type === "tool_result")
20
- return toolResult(block);
21
- throw new Error("unsupported-block");
22
- }
23
- function toolResult(block) {
24
- if (typeof block["tool_use_id"] !== "string" ||
25
- !Object.hasOwn(block, "content"))
26
- throw new Error("unsupported-block");
27
- if (Object.hasOwn(block, "is_error") &&
28
- typeof block["is_error"] !== "boolean")
29
- throw new Error("unsupported-block");
30
- return {
31
- type: "tool_result",
32
- tool_use_id: block["tool_use_id"],
33
- content: block["content"],
34
- ...(Object.hasOwn(block, "is_error")
35
- ? { is_error: block["is_error"] }
36
- : {}),
37
- };
38
- }
39
- function optionalText(value) {
40
- if (value === undefined || value === null)
41
- return null;
42
- if (typeof value !== "string")
43
- throw new Error("unsupported-message");
44
- return value;
45
- }
46
- function rawJsonApi(value) {
47
- return "rawJSON" in value && typeof value.rawJSON === "function";
48
- }
49
- function preserveJson(...argumentsList) {
50
- const [, value, context] = argumentsList;
51
- if (typeof value !== "number")
52
- return value;
53
- if (!object(context) || typeof context["source"] !== "string")
54
- throw new Error("unsupported-record");
55
- if (JSON.stringify(value) === context["source"])
56
- return value;
57
- if (!rawJsonApi(JSON))
58
- throw new Error("unsupported-record");
59
- return JSON.rawJSON(context["source"]);
60
- }
61
- export function parsePreservedJson(text) {
62
- return JSON.parse(text, preserveJson);
63
- }
64
- function blocks(content, omissions) {
65
- if (typeof content === "string")
66
- return [{ position: 0, type: "text", text: content }];
67
- if (!Array.isArray(content))
68
- throw new Error("unsupported-message");
69
- return content.flatMap((block, position) => {
70
- if (!object(block))
71
- throw new Error("unsupported-block");
72
- if (block["type"] === "thinking") {
73
- omissions.thinkingBlocks++;
74
- return [];
75
- }
76
- return [{ ...supportedBlock(block), position }];
77
- });
78
- }
79
- function identity(value) {
80
- const uuid = value["uuid"];
81
- const parent = value["parentUuid"];
82
- const sidechain = value["isSidechain"];
83
- return {
84
- uuid: typeof uuid === "string" && uuid !== "" ? uuid : null,
85
- isSidechain: typeof sidechain === "boolean" ? sidechain : null,
86
- ...(parent === null || (typeof parent === "string" && parent !== "")
87
- ? { parentUuid: parent }
88
- : {}),
89
- };
90
- }
91
- function message(value, context) {
92
- if (!object(value) || typeof value["type"] !== "string")
93
- throw new Error("unsupported-record");
94
- if (value["type"] !== "user" &&
95
- value["type"] !== "assistant" &&
96
- Object.hasOwn(value, "message"))
97
- throw new Error("unsupported-message");
98
- if (value["type"] !== "user" && value["type"] !== "assistant") {
99
- context.omissions.metadataRecords++;
100
- return null;
101
- }
102
- const envelope = value["message"];
103
- if (!object(envelope) || envelope["role"] !== value["type"])
104
- throw new Error("unsupported-message");
105
- const normalized = blocks(envelope["content"], context.omissions);
106
- return {
107
- schemaVersion: 2,
108
- ...identity(value),
109
- sourceId: context.sourceId,
110
- role: value["type"],
111
- timestamp: optionalText(value["timestamp"]),
112
- sessionId: optionalText(value["sessionId"]),
113
- text: normalized
114
- .filter((block) => block["type"] === "text")
115
- .map((block) => block["text"])
116
- .join("\n"),
117
- blocks: normalized,
118
- };
119
- }
120
- export function normalizeTranscript(text, digest) {
121
- const omissions = { metadataRecords: 0, thinkingBlocks: 0 };
122
- const records = [];
123
- if (text === "")
124
- return { status: "unsupported", reason: "empty-file", records, omissions };
125
- let offset = 0;
126
- const lines = text.split("\n");
127
- if (lines.at(-1) === "")
128
- lines.pop();
129
- try {
130
- for (const line of lines) {
131
- const parsed = parsePreservedJson(line);
132
- const record = message(parsed, {
133
- sourceId: `${digest}:${String(offset)}`,
134
- omissions,
135
- });
136
- if (record !== null)
137
- records.push(record);
138
- offset += new TextEncoder().encode(line).length + 1;
139
- }
140
- }
141
- catch (error) {
142
- let reason = "unsupported-record";
143
- if (error instanceof Error)
144
- reason = error.message;
145
- if (error instanceof SyntaxError)
146
- reason = "invalid-json";
147
- return {
148
- status: "unsupported",
149
- reason,
150
- records: [],
151
- omissions,
152
- };
153
- }
154
- return { status: "included", reason: "supported", records, omissions };
155
- }
@@ -1,5 +0,0 @@
1
- export declare function readPreviousImport(runtime: string, importId: string): Promise<{
2
- importId: string;
3
- entries: readonly import("./revision.ts").EvidenceSource[];
4
- evidenceRevision: number;
5
- }>;
@@ -1,34 +0,0 @@
1
- import { lstat } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { validateDestination } from "./destination.js";
4
- import { readInput } from "./input-file.js";
5
- import { parseEvidenceCoverage, nextEvidenceRevision, } from "./revision-input.js";
6
- async function optionalRevision(path) {
7
- try {
8
- await lstat(path);
9
- }
10
- catch (error) {
11
- if (error instanceof Error && "code" in error && error.code === "ENOENT")
12
- return;
13
- throw error;
14
- }
15
- return readInput(path);
16
- }
17
- export async function readPreviousImport(runtime, importId) {
18
- if (process.platform !== "darwin")
19
- throw new Error("platform-unsupported");
20
- try {
21
- if (!/^[a-f\d]{8}-[a-f\d]{4}-4[a-f\d]{3}-[89ab][a-f\d]{3}-[a-f\d]{12}$/.test(importId))
22
- throw new Error("invalid-import");
23
- const directory = join(runtime, "chats", importId);
24
- await validateDestination(directory);
25
- if (!(await lstat(directory)).isDirectory())
26
- throw new Error("invalid-import");
27
- const entries = parseEvidenceCoverage(await readInput(join(directory, "coverage.json")), importId);
28
- const evidenceRevision = nextEvidenceRevision(await optionalRevision(join(directory, "revision.json")), importId);
29
- return { importId, entries, evidenceRevision };
30
- }
31
- catch {
32
- throw new Error("previous-import-refused");
33
- }
34
- }
@@ -1,21 +0,0 @@
1
- import { type ScanSource } from "./source.ts";
2
- import { type MessageRecord, type Omissions } from "./normalize.ts";
3
- export declare const transcriptLimit = 10485760;
4
- export interface SelectedTranscript {
5
- readonly path: string;
6
- readonly status: "included" | "unreadable" | "unsupported" | "too-large";
7
- readonly reason: string;
8
- readonly digest: string | null;
9
- readonly byteSize?: number;
10
- readonly recordCount: number;
11
- readonly omissions: Omissions;
12
- }
13
- export interface ReadTranscript {
14
- readonly coverage: SelectedTranscript;
15
- readonly records: readonly MessageRecord[];
16
- readonly prefixDigest?: string;
17
- }
18
- export declare function readTranscript(path: string, options?: {
19
- readonly inspection?: ScanSource;
20
- readonly prefixBytes?: number;
21
- }): Promise<ReadTranscript>;
@@ -1,118 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import { constants } from "node:fs";
3
- import { lstat, open } from "node:fs/promises";
4
- import { sourceFailure, verifyScanSource, verifyOpenSource, } from "./source.js";
5
- import { normalizeTranscript, } from "./normalize.js";
6
- export const transcriptLimit = 10_485_760;
7
- function refused(path, reason) {
8
- const status = reason === "source-unreadable" ? "unreadable" : "unsupported";
9
- return {
10
- coverage: {
11
- path,
12
- status: reason === "file-too-large" ? "too-large" : status,
13
- reason,
14
- digest: null,
15
- recordCount: 0,
16
- omissions: { metadataRecords: 0, thinkingBlocks: 0 },
17
- },
18
- records: [],
19
- };
20
- }
21
- async function boundedBytes(handle) {
22
- const stats = await handle.stat();
23
- if (!stats.isFile())
24
- return "nonregular-file";
25
- if (stats.size > transcriptLimit)
26
- return "file-too-large";
27
- const chunks = [];
28
- let total = 0;
29
- while (total <= transcriptLimit) {
30
- const buffer = Buffer.alloc(Math.min(65_536, transcriptLimit + 1 - total));
31
- const { bytesRead } = await handle.read(buffer, 0, buffer.length, total);
32
- if (bytesRead === 0)
33
- break;
34
- total += bytesRead;
35
- chunks.push(buffer.subarray(0, bytesRead));
36
- }
37
- if (total > transcriptLimit || (await handle.stat()).size > transcriptLimit)
38
- return "file-too-large";
39
- return Buffer.concat(chunks, total);
40
- }
41
- function normalizeBytes(path, options) {
42
- const { bytes } = options;
43
- const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
44
- let text;
45
- try {
46
- text = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
47
- }
48
- catch {
49
- const result = refused(path, "invalid-utf8");
50
- return { ...result, coverage: { ...result.coverage, digest } };
51
- }
52
- const result = normalizeTranscript(text, digest);
53
- return {
54
- coverage: {
55
- path,
56
- status: result.status,
57
- reason: result.reason,
58
- digest,
59
- ...(result.status === "included" ? { byteSize: bytes.length } : {}),
60
- recordCount: result.records.length,
61
- omissions: result.omissions,
62
- },
63
- records: result.records,
64
- ...(options.prefixBytes !== undefined &&
65
- options.prefixBytes >= 0 &&
66
- options.prefixBytes < bytes.length
67
- ? {
68
- prefixDigest: `sha256:${createHash("sha256").update(bytes.subarray(0, options.prefixBytes)).digest("hex")}`,
69
- }
70
- : {}),
71
- };
72
- }
73
- async function readSourceBytes(path, inspection) {
74
- const handle = await open(path, constants.O_RDONLY |
75
- constants.O_NONBLOCK |
76
- (inspection === undefined ? constants.O_NOFOLLOW : 0x20000000));
77
- try {
78
- if (inspection !== undefined) {
79
- verifyOpenSource(inspection, await handle.stat());
80
- await verifyScanSource(inspection);
81
- }
82
- return await boundedBytes(handle);
83
- }
84
- finally {
85
- await handle.close();
86
- }
87
- }
88
- export async function readTranscript(path, options = {}) {
89
- const { inspection } = options;
90
- try {
91
- if (inspection !== undefined)
92
- await verifyScanSource(inspection);
93
- const stats = await lstat(path);
94
- if (stats.isSymbolicLink())
95
- return refused(path, "symbolic-link");
96
- if (!stats.isFile())
97
- return refused(path, "nonregular-file");
98
- const bytes = await readSourceBytes(path, inspection);
99
- const result = typeof bytes === "string"
100
- ? refused(path, bytes)
101
- : normalizeBytes(path, { bytes, ...options });
102
- return scannedResult(result, inspection);
103
- }
104
- catch (error) {
105
- return readFailure(path, { error, inspection });
106
- }
107
- }
108
- function scannedResult(result, inspection) {
109
- if (inspection === undefined || result.coverage.status !== "too-large")
110
- return result;
111
- return { ...result, coverage: { ...result.coverage, status: "unsupported" } };
112
- }
113
- function readFailure(path, data) {
114
- const { error, inspection } = data;
115
- if (error instanceof Error && "code" in error && error.code === "ELOOP")
116
- return refused(path, "symbolic-link");
117
- return refused(path, inspection === undefined ? "source-unreadable" : sourceFailure(error));
118
- }
@@ -1,14 +0,0 @@
1
- import { type RedactionSettings } from "./redaction.ts";
2
- export interface RedactImportRequest {
3
- readonly importId: string;
4
- readonly workingDirectory: string;
5
- readonly runtimeDirectory: string | undefined;
6
- readonly settings: RedactionSettings;
7
- }
8
- export declare function redactImport(request: RedactImportRequest): Promise<{
9
- code: string;
10
- importId: string;
11
- recordCount: number;
12
- counts: import("./redaction.ts").RedactionCounts;
13
- totalCount: number;
14
- }>;