cloving 1.2.0 → 1.3.0

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