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,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
- }>;
@@ -1,109 +0,0 @@
1
- import { readdir } from "node:fs/promises";
2
- import { basename, join, relative, resolve } from "node:path";
3
- import { inspectScanSource, noFollowPath, refuseRepositoryRoot, sourceFailure, verifyScanSource, verifyScanAncestor, } from "./source.js";
4
- function outcome(reason) {
5
- return {
6
- status: reason === "source-unreadable" ? "unreadable" : "unsupported",
7
- reason,
8
- };
9
- }
10
- async function scanEntry(entry, context) {
11
- try {
12
- const { exclusions, depth } = context;
13
- const root = entry.inspection?.root ?? entry.path;
14
- const inspection = await inspectScanSource(entry.path, root);
15
- if (entry.inspection !== undefined)
16
- verifyScanAncestor(entry.inspection, inspection);
17
- const inspected = { ...entry, kind: inspection.kind, inspection };
18
- const disposition = entryDisposition(inspected, context);
19
- if (disposition !== undefined)
20
- return [{ ...inspected, outcome: disposition }];
21
- if (inspection.kind === "file")
22
- return [inspected];
23
- const entries = [];
24
- const children = await readdir(noFollowPath(entry.path), {
25
- withFileTypes: true,
26
- });
27
- await verifyScanSource(inspection);
28
- for (const child of children) {
29
- const scanned = await scanEntry({
30
- ...inspected,
31
- kind: child.isDirectory() ? "subtree" : "file",
32
- path: join(entry.path, child.name),
33
- }, { exclusions, depth: depth + 1 });
34
- for (const selected of scanned)
35
- entries.push(selected);
36
- }
37
- return entries;
38
- }
39
- catch (error) {
40
- return [{ ...entry, outcome: outcome(sourceFailure(error)) }];
41
- }
42
- }
43
- function entryDisposition(entry, context) {
44
- if (entry.kind === "file")
45
- return entry.path.endsWith(".jsonl")
46
- ? undefined
47
- : outcome("unsupported-extension");
48
- if (context.depth === 1 && context.exclusions.includes(basename(entry.path)))
49
- return { status: "excluded", reason: "project-excluded" };
50
- if (context.depth === 4)
51
- return { status: "pending", reason: "depth-limit" };
52
- return;
53
- }
54
- async function prepareRoot(path) {
55
- const entry = {
56
- path,
57
- kind: "subtree",
58
- selection: { kind: "root", index: 0 },
59
- };
60
- try {
61
- const inspection = await inspectScanSource(path, path);
62
- if (inspection.kind !== "subtree")
63
- throw new Error("non-directory-root");
64
- await refuseRepositoryRoot(inspection.root);
65
- return { ...entry, path: inspection.root, inspection };
66
- }
67
- catch (error) {
68
- return { ...entry, outcome: outcome(sourceFailure(error)) };
69
- }
70
- }
71
- export async function selectChatSources(request) {
72
- const entries = request.paths.map((path, index) => ({
73
- path: resolve(request.workingDirectory, path),
74
- kind: "file",
75
- selection: { kind: "file", index },
76
- }));
77
- const selectedRoots = [];
78
- for (const value of request.roots ?? [])
79
- selectedRoots.push(await prepareRoot(resolve(request.workingDirectory, value)));
80
- selectedRoots.sort((left, right) => stringOrder(left.path, right.path));
81
- const roots = selectedRoots.map((root) => root.path);
82
- for (const [index, root] of selectedRoots.entries()) {
83
- const selected = { ...root, selection: { kind: "root", index } };
84
- const scanned = root.outcome === undefined
85
- ? await scanEntry(selected, {
86
- exclusions: request.excludeProjects ?? [],
87
- depth: 0,
88
- })
89
- : [selected];
90
- scanned.sort((left, right) => stringOrder(relative(root.path, left.path), relative(root.path, right.path)));
91
- for (const entry of scanned)
92
- entries.push(entry);
93
- }
94
- let attempts = 0;
95
- return {
96
- roots,
97
- entries: entries.map((entry) => {
98
- if (entry.selection.kind === "file" || entry.outcome !== undefined)
99
- return entry;
100
- attempts++;
101
- return attempts <= 100
102
- ? entry
103
- : { ...entry, outcome: { status: "pending", reason: "file-limit" } };
104
- }),
105
- };
106
- }
107
- function stringOrder(left, right) {
108
- return left < right ? -1 : Number(left > right);
109
- }
@@ -1,23 +0,0 @@
1
- import type { Stats } from "node:fs";
2
- export interface SourceIdentity {
3
- readonly path: string;
4
- readonly device: number;
5
- readonly inode: number;
6
- }
7
- export interface ScanSource {
8
- readonly path: string;
9
- readonly root: string;
10
- readonly identities: readonly SourceIdentity[];
11
- readonly size: number;
12
- readonly modified: number;
13
- readonly changed: number;
14
- readonly kind: "file" | "subtree";
15
- }
16
- export declare function contained(root: string, path: string): boolean;
17
- export declare function inspectScanSource(path: string, root: string): Promise<ScanSource>;
18
- export declare function noFollowPath(path: string): string;
19
- export declare function refuseRepositoryRoot(path: string): Promise<void>;
20
- export declare function sourceFailure(error: unknown): string;
21
- export declare function verifyScanSource(expected: ScanSource): Promise<void>;
22
- export declare function verifyOpenSource(expected: ScanSource, stats: Stats): void;
23
- export declare function verifyScanAncestor(expected: ScanSource, current: ScanSource): void;
@@ -1,135 +0,0 @@
1
- import { lstat, realpath } from "node:fs/promises";
2
- import { dirname, isAbsolute, join, relative, sep } from "node:path";
3
- export function contained(root, path) {
4
- const suffix = relative(root, path);
5
- return (!isAbsolute(suffix) && suffix !== ".." && !suffix.startsWith(`..${sep}`));
6
- }
7
- async function inspectComponents(path) {
8
- const identities = [];
9
- let ancestor = path;
10
- const ancestors = [];
11
- for (;;) {
12
- ancestors.unshift(ancestor);
13
- const parent = dirname(ancestor);
14
- if (parent === ancestor)
15
- break;
16
- ancestor = parent;
17
- }
18
- let stats;
19
- for (const component of ancestors) {
20
- const next = await lstat(noFollowPath(component));
21
- if (next.isSymbolicLink())
22
- throw new Error("symbolic-link");
23
- identities.unshift({ path: component, device: next.dev, inode: next.ino });
24
- stats = next;
25
- }
26
- if (stats === undefined)
27
- throw new Error("source-unreadable");
28
- return { identities, stats };
29
- }
30
- export async function inspectScanSource(path, root) {
31
- const { identities, stats } = await inspectComponents(path);
32
- const canonicalPath = await realpath(path);
33
- const canonicalRoot = path === root ? canonicalPath : root;
34
- if (!contained(canonicalRoot, canonicalPath))
35
- throw new Error("outside-root");
36
- const canonicalStats = await lstat(noFollowPath(canonicalPath));
37
- if (canonicalStats.dev !== stats.dev || canonicalStats.ino !== stats.ino)
38
- throw new Error("source-changed");
39
- const confirmation = await inspectComponents(path);
40
- if (JSON.stringify(confirmation.identities) !== JSON.stringify(identities))
41
- throw new Error("source-changed");
42
- if (!stats.isDirectory() && !stats.isFile())
43
- throw new Error("nonregular-file");
44
- return {
45
- path,
46
- root: canonicalRoot,
47
- identities,
48
- size: stats.size,
49
- modified: stats.mtimeMs,
50
- changed: stats.ctimeMs,
51
- kind: stats.isDirectory() ? "subtree" : "file",
52
- };
53
- }
54
- export function noFollowPath(path) {
55
- if (process.platform !== "darwin")
56
- throw new Error("platform-unsupported");
57
- if (!isAbsolute(path))
58
- throw new Error("source-unreadable");
59
- return `/.nofollow${path}`;
60
- }
61
- async function metadata(path) {
62
- try {
63
- return await lstat(noFollowPath(path));
64
- }
65
- catch (error) {
66
- if (error instanceof Error && "code" in error && error.code === "ENOENT")
67
- return;
68
- throw error;
69
- }
70
- }
71
- async function repositoryMarker(path) {
72
- if (await metadata(join(path, ".git")))
73
- return true;
74
- const [head, objects, references] = await Promise.all([
75
- metadata(join(path, "HEAD")),
76
- metadata(join(path, "objects")),
77
- metadata(join(path, "refs")),
78
- ]);
79
- return (head?.isFile() === true &&
80
- objects?.isDirectory() === true &&
81
- references?.isDirectory() === true);
82
- }
83
- export async function refuseRepositoryRoot(path) {
84
- let ancestor = path;
85
- for (;;) {
86
- if (await repositoryMarker(ancestor))
87
- throw new Error("repository-root");
88
- const parent = dirname(ancestor);
89
- if (parent === ancestor)
90
- return;
91
- ancestor = parent;
92
- }
93
- }
94
- export function sourceFailure(error) {
95
- if (error instanceof Error && "code" in error && error.code === "ELOOP")
96
- return "symbolic-link";
97
- const reason = error instanceof Error ? error.message : "";
98
- return [
99
- "symbolic-link",
100
- "outside-root",
101
- "nonregular-file",
102
- "repository-root",
103
- "source-changed",
104
- "non-directory-root",
105
- ].includes(reason)
106
- ? reason
107
- : "source-unreadable";
108
- }
109
- export async function verifyScanSource(expected) {
110
- const current = await inspectScanSource(expected.path, expected.root);
111
- if (JSON.stringify(current.identities) !== JSON.stringify(expected.identities))
112
- throw new Error("source-changed");
113
- if (expected.kind === "file" &&
114
- (current.size !== expected.size ||
115
- current.modified !== expected.modified ||
116
- current.changed !== expected.changed))
117
- throw new Error("source-changed");
118
- }
119
- export function verifyOpenSource(expected, stats) {
120
- const identity = expected.identities[0];
121
- if (!stats.isFile() ||
122
- identity === undefined ||
123
- stats.dev !== identity.device ||
124
- stats.ino !== identity.inode ||
125
- stats.size !== expected.size ||
126
- stats.mtimeMs !== expected.modified ||
127
- stats.ctimeMs !== expected.changed)
128
- throw new Error("source-changed");
129
- }
130
- export function verifyScanAncestor(expected, current) {
131
- const ancestors = current.identities.slice(-expected.identities.length);
132
- if (expected.identities.some((identity, index) => identity.device !== ancestors[index]?.device ||
133
- identity.inode !== ancestors[index].inode))
134
- throw new Error("source-changed");
135
- }
@@ -1,57 +0,0 @@
1
- import type { MessageRecord } from "./normalize.ts";
2
- export interface OccurrenceReference {
3
- readonly recordIndex: number;
4
- readonly sourceId: string;
5
- }
6
- export interface Occurrence extends OccurrenceReference {
7
- readonly uuid: string | null;
8
- readonly sessionId: string | null;
9
- readonly isSidechain: boolean | null;
10
- readonly parentUuid?: string | null;
11
- readonly copyOf?: OccurrenceReference;
12
- }
13
- interface ConflictGroup {
14
- readonly uuid: string;
15
- readonly variants: readonly (readonly OccurrenceReference[])[];
16
- }
17
- interface ParentLink {
18
- readonly childUuid: string | null;
19
- readonly parentUuid: string | null;
20
- readonly occurrences: readonly OccurrenceReference[];
21
- readonly status: "root" | "resolved" | "missing" | "ambiguous";
22
- }
23
- interface SessionNode {
24
- readonly uuid: string | null;
25
- readonly occurrences: readonly OccurrenceReference[];
26
- }
27
- interface SessionStructure {
28
- readonly sessionId: string;
29
- readonly nodes: readonly SessionNode[];
30
- readonly links: readonly ParentLink[];
31
- readonly forkPoints: readonly {
32
- parentUuid: string;
33
- childUuids: readonly string[];
34
- }[];
35
- readonly unknownParents: readonly OccurrenceReference[];
36
- readonly missingParentTargets: readonly string[];
37
- readonly cycles: readonly (readonly string[])[];
38
- }
39
- export interface StructureCounts {
40
- readonly records: number;
41
- readonly knownSessions: number;
42
- readonly forks: number;
43
- readonly copies: number;
44
- readonly conflictGroups: number;
45
- readonly unknownIdentities: number;
46
- readonly missingParentTargets: number;
47
- }
48
- export interface ImportStructure {
49
- readonly historyCompleteness: "unknown";
50
- readonly counts: StructureCounts;
51
- readonly occurrences: readonly Occurrence[];
52
- readonly conflictGroups: readonly ConflictGroup[];
53
- readonly sessions: readonly SessionStructure[];
54
- readonly unknownSessions: readonly OccurrenceReference[];
55
- }
56
- export declare function structureImport(records: readonly MessageRecord[]): ImportStructure;
57
- export {};
@@ -1,216 +0,0 @@
1
- function reference(occurrence) {
2
- return { recordIndex: occurrence.recordIndex, sourceId: occurrence.sourceId };
3
- }
4
- function rawJsonApi(value) {
5
- return "isRawJSON" in value && typeof value.isRawJSON === "function";
6
- }
7
- function canonical(value) {
8
- if (rawJsonApi(JSON) && JSON.isRawJSON(value))
9
- return JSON.stringify(value);
10
- if (Array.isArray(value))
11
- return `[${value.map(canonical).join(",")}]`;
12
- if (value === null || typeof value !== "object")
13
- return JSON.stringify(value);
14
- return `{${Object.entries(value)
15
- .sort(([left], [right]) => (left < right ? -1 : Number(left > right)))
16
- .map(([key, member]) => `${JSON.stringify(key)}:${canonical(member)}`)
17
- .join(",")}}`;
18
- }
19
- function occurrence(record, context) {
20
- const { recordIndex, identities } = context;
21
- const metadata = record.schemaVersion === 2
22
- ? {
23
- uuid: record.uuid,
24
- isSidechain: record.isSidechain,
25
- ...(Object.hasOwn(record, "parentUuid")
26
- ? { parentUuid: record.parentUuid }
27
- : {}),
28
- }
29
- : { uuid: null, isSidechain: null };
30
- const current = {
31
- ...reference({ recordIndex, sourceId: record.sourceId }),
32
- sessionId: record.sessionId,
33
- ...metadata,
34
- };
35
- if (current.uuid === null)
36
- return current;
37
- const variants = identities.get(current.uuid) ?? new Map();
38
- identities.set(current.uuid, variants);
39
- const content = canonical([record.role, record.text, record.blocks]);
40
- const matches = variants.get(content) ?? [];
41
- variants.set(content, matches);
42
- const first = matches[0];
43
- matches.push(reference(current));
44
- return first === undefined ? current : { ...current, copyOf: { ...first } };
45
- }
46
- function groupNodes(occurrences) {
47
- const groups = new Map();
48
- for (const item of occurrences) {
49
- const key = item.uuid ?? item.recordIndex;
50
- const group = groups.get(key) ?? [];
51
- groups.set(key, group);
52
- group.push(item);
53
- }
54
- return [...groups.values()];
55
- }
56
- function parentLinks(group, known) {
57
- const parents = new Map();
58
- for (const item of group) {
59
- if (item.parentUuid === undefined)
60
- continue;
61
- const references = parents.get(item.parentUuid) ?? [];
62
- parents.set(item.parentUuid, references);
63
- references.push(reference(item));
64
- }
65
- const childUuid = group[0]?.uuid ?? null;
66
- return [...parents].map(([parentUuid, occurrences]) => {
67
- let status = "resolved";
68
- if (parentUuid === null)
69
- status = "root";
70
- if (parentUuid !== null && !known.has(parentUuid))
71
- status = "missing";
72
- if (childUuid === null || parents.size > 1)
73
- status = "ambiguous";
74
- return { childUuid, parentUuid, occurrences, status };
75
- });
76
- }
77
- function forkPoints(links) {
78
- const children = new Map();
79
- for (const link of links) {
80
- if (link.status === "ambiguous" ||
81
- link.parentUuid === null ||
82
- link.childUuid === null)
83
- continue;
84
- const ids = children.get(link.parentUuid) ?? new Set();
85
- children.set(link.parentUuid, ids);
86
- ids.add(link.childUuid);
87
- }
88
- return [...children]
89
- .filter(([, ids]) => ids.size > 1)
90
- .map(([parentUuid, ids]) => ({ parentUuid, childUuids: [...ids] }));
91
- }
92
- function finishFrom(graph, state) {
93
- const { visited, order } = state;
94
- const stack = [{ id: state.start, expanded: false }];
95
- while (stack.length > 0) {
96
- const item = stack.pop();
97
- if (item === undefined)
98
- break;
99
- if (item.expanded) {
100
- order.push(item.id);
101
- continue;
102
- }
103
- if (visited.has(item.id))
104
- continue;
105
- visited.add(item.id);
106
- stack.push({ id: item.id, expanded: true });
107
- for (const id of graph.get(item.id) ?? [])
108
- stack.push({ id, expanded: false });
109
- }
110
- }
111
- function finishOrder(graph) {
112
- const visited = new Set();
113
- const order = [];
114
- for (const start of graph.keys())
115
- finishFrom(graph, { start, visited, order });
116
- return order;
117
- }
118
- function observedGraph(known, links) {
119
- const graph = new Map([...known].map((id) => [id, []]));
120
- const reverse = new Map([...known].map((id) => [id, []]));
121
- for (const link of links) {
122
- if (link.childUuid === null ||
123
- link.parentUuid === null ||
124
- !known.has(link.parentUuid))
125
- continue;
126
- graph.get(link.childUuid)?.push(link.parentUuid);
127
- reverse.get(link.parentUuid)?.push(link.childUuid);
128
- }
129
- return { graph, reverse };
130
- }
131
- function componentFrom(graph, state) {
132
- const component = [];
133
- const stack = [state.start];
134
- while (stack.length > 0) {
135
- const id = stack.pop();
136
- if (id === undefined || state.visited.has(id))
137
- continue;
138
- state.visited.add(id);
139
- component.push(id);
140
- for (const parent of graph.get(id) ?? [])
141
- stack.push(parent);
142
- }
143
- return component;
144
- }
145
- function cycleGroups(known, links) {
146
- const { graph, reverse } = observedGraph(known, links);
147
- const rank = new Map([...known].map((id, index) => [id, index]));
148
- const visited = new Set();
149
- const cycles = [];
150
- for (const start of finishOrder(graph).reverse()) {
151
- if (visited.has(start))
152
- continue;
153
- const component = componentFrom(reverse, { start, visited });
154
- if (component.length > 1 || graph.get(start)?.includes(start))
155
- cycles.push(component.sort((left, right) => Number(rank.get(left)) - Number(rank.get(right))));
156
- }
157
- return cycles.sort((left, right) => Number(rank.get(String(left[0]))) - Number(rank.get(String(right[0]))));
158
- }
159
- function sessionStructure(sessionId, occurrences) {
160
- const groups = groupNodes(occurrences);
161
- const known = new Set(occurrences.flatMap((item) => (item.uuid === null ? [] : [item.uuid])));
162
- const links = groups.flatMap((group) => parentLinks(group, known));
163
- return {
164
- sessionId,
165
- nodes: groups.map((group) => ({
166
- uuid: group[0]?.uuid ?? null,
167
- occurrences: group.map(reference),
168
- })),
169
- links,
170
- forkPoints: forkPoints(links),
171
- unknownParents: occurrences
172
- .filter((item) => !Object.hasOwn(item, "parentUuid"))
173
- .map(reference),
174
- missingParentTargets: [
175
- ...new Set(links.flatMap((link) => link.parentUuid !== null && !known.has(link.parentUuid)
176
- ? [link.parentUuid]
177
- : [])),
178
- ],
179
- cycles: cycleGroups(known, links),
180
- };
181
- }
182
- export function structureImport(records) {
183
- const identities = new Map();
184
- const occurrences = records.map((record, index) => occurrence(record, { recordIndex: index, identities }));
185
- const grouped = new Map();
186
- for (const item of occurrences) {
187
- if (item.sessionId === null || item.sessionId === "")
188
- continue;
189
- const group = grouped.get(item.sessionId) ?? [];
190
- grouped.set(item.sessionId, group);
191
- group.push(item);
192
- }
193
- const sessions = [...grouped].map(([id, group]) => sessionStructure(id, group));
194
- const conflictGroups = [...identities]
195
- .filter(([, variants]) => variants.size > 1)
196
- .map(([uuid, variants]) => ({ uuid, variants: [...variants.values()] }));
197
- return {
198
- historyCompleteness: "unknown",
199
- counts: {
200
- records: records.length,
201
- knownSessions: sessions.length,
202
- forks: sessions.reduce((sum, session) => sum + session.forkPoints.length, 0),
203
- copies: occurrences.filter((item) => item.copyOf !== undefined).length,
204
- conflictGroups: conflictGroups.length,
205
- unknownIdentities: occurrences.filter((item) => item.uuid === null)
206
- .length,
207
- missingParentTargets: sessions.reduce((sum, session) => sum + session.missingParentTargets.length, 0),
208
- },
209
- occurrences,
210
- conflictGroups,
211
- sessions,
212
- unknownSessions: occurrences
213
- .filter((item) => item.sessionId === null || item.sessionId === "")
214
- .map(reference),
215
- };
216
- }
@@ -1,5 +0,0 @@
1
- export { analysisInstruction } from "../chats/analysis-prompt.ts";
2
- export declare const analysisMethod = "run-turn:analyze-chats";
3
- export declare function analysisCommand(): readonly string[];
4
- export declare function analysisEnvironment(folder: string): NodeJS.ProcessEnv;
5
- export declare function analysisAvailable(folder: string): Promise<boolean>;
@@ -1,81 +0,0 @@
1
- import { execFile } from "node:child_process";
2
- import { join } from "node:path";
3
- import { promisify } from "node:util";
4
- import { analysisInstruction } from "../chats/analysis-prompt.js";
5
- export { analysisInstruction } from "../chats/analysis-prompt.js";
6
- export const analysisMethod = "run-turn:analyze-chats";
7
- const controls = [
8
- "--safe-mode",
9
- "--restricted",
10
- "--strict-mcp-config",
11
- "--disable-slash-commands",
12
- "--no-chrome",
13
- "--no-session-persistence",
14
- ];
15
- export function analysisCommand() {
16
- return [
17
- "claude",
18
- ...controls,
19
- "--print",
20
- "--output-format",
21
- "stream-json",
22
- "--verbose",
23
- "--tools",
24
- "",
25
- "--disallowedTools",
26
- "mcp__*",
27
- "--mcp-config",
28
- '{"mcpServers":{}}',
29
- "--setting-sources",
30
- "",
31
- "--settings",
32
- '{"disableAllHooks":true}',
33
- "--permission-prompts",
34
- "none",
35
- "--max-turns",
36
- "1",
37
- "--max-budget-usd",
38
- "5",
39
- "--model",
40
- "sonnet",
41
- "--system-prompt",
42
- analysisInstruction,
43
- ];
44
- }
45
- export function analysisEnvironment(folder) {
46
- return {
47
- PATH: process.env["PATH"],
48
- HOME: join(folder, "configuration"),
49
- CLAUDE_CONFIG_DIR: join(folder, "configuration"),
50
- TMPDIR: join(folder, "configuration"),
51
- CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1",
52
- };
53
- }
54
- function supportedVersion(line) {
55
- const match = /^2\.(0|[1-9]\d*)\.(0|[1-9]\d*) \(Claude Code\)$/.exec(line.trim());
56
- if (match?.[1] === undefined || match[2] === undefined)
57
- return false;
58
- const minor = BigInt(match[1]);
59
- return minor > 1n || (minor === 1n && BigInt(match[2]) >= 302n);
60
- }
61
- export async function analysisAvailable(folder) {
62
- const probe = (flag) => promisify(execFile)("claude", [flag], {
63
- cwd: folder,
64
- env: analysisEnvironment(folder),
65
- timeout: 5_000,
66
- maxBuffer: 131_072,
67
- });
68
- try {
69
- const version = await probe("--version");
70
- if (!supportedVersion(version.stdout))
71
- return false;
72
- const help = await probe("--help");
73
- const advertised = new Set(help.stdout.match(/--[a-zA-Z][a-zA-Z0-9-]*/g) ?? []);
74
- return analysisCommand()
75
- .filter((argument) => argument.startsWith("--"))
76
- .every((flag) => advertised.has(flag));
77
- }
78
- catch {
79
- return false;
80
- }
81
- }
@@ -1,6 +0,0 @@
1
- export type AnalysisToken = {
2
- readonly token: string;
3
- } | {
4
- readonly error: string;
5
- };
6
- export declare function analysisToken(folder: string, signal?: AbortSignal): Promise<AnalysisToken>;