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
@@ -0,0 +1,106 @@
1
+ import { dirname, join, resolve, sep } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import ts from "typescript";
4
+ import metadata from "#package" with { type: "json" };
5
+ import { workflowHelperPath } from "../src/workflow-candidate.js";
6
+ export const candidatePackageRoot = dirname(fileURLToPath(import.meta.resolve("#package")));
7
+ export function resolvedSymbol(checker, symbol) {
8
+ if (!symbol || (symbol.flags & ts.SymbolFlags.Alias) === 0)
9
+ return symbol;
10
+ return checker.getAliasedSymbol(symbol);
11
+ }
12
+ export function candidateProgram(text, installed = {}) {
13
+ const packageRoot = resolve(installed.packageRoot ?? candidatePackageRoot);
14
+ const candidate = join(packageRoot, "candidate.ts");
15
+ const sources = new Map([[candidate, text]]);
16
+ for (const [name, content] of Object.entries(installed.helpers ?? {})) {
17
+ if (workflowHelperPath("candidate.ts", `./${name}`) !== name)
18
+ throw new Error("invalid-workflow-helper");
19
+ sources.set(join(packageRoot, name), content);
20
+ }
21
+ const entries = new Map(Object.entries(metadata.exports).map(([name, entry]) => [
22
+ `cloving${name.slice(1)}`,
23
+ resolve(packageRoot, entry.types),
24
+ ]));
25
+ const options = {
26
+ target: ts.ScriptTarget.ES2024,
27
+ module: ts.ModuleKind.ESNext,
28
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
29
+ lib: ["lib.es2024.d.ts", "lib.dom.d.ts"],
30
+ types: [],
31
+ strict: true,
32
+ noEmit: true,
33
+ };
34
+ const host = trustedHost({ sources, options, entries, packageRoot });
35
+ const program = ts.createProgram([...sources.keys(), ...entries.values()], options, host);
36
+ const source = program.getSourceFile(candidate);
37
+ if (!source)
38
+ throw new Error("candidate-analysis-unavailable");
39
+ const modules = new Map();
40
+ for (const [name, file] of entries) {
41
+ const declaration = program.getSourceFile(file);
42
+ if (!declaration)
43
+ throw new Error("candidate-surface-unavailable");
44
+ modules.set(name, declaration);
45
+ }
46
+ return {
47
+ program,
48
+ source,
49
+ modules,
50
+ sources: [...sources.keys()].map((name) => {
51
+ const entry = program.getSourceFile(name);
52
+ if (!entry)
53
+ throw new Error("candidate-analysis-unavailable");
54
+ return entry;
55
+ }),
56
+ };
57
+ }
58
+ function trustedHost(input) {
59
+ const { sources, options, entries, packageRoot } = input;
60
+ const libraries = dirname(ts.getDefaultLibFilePath(options)) + sep;
61
+ const declarations = join(packageRoot, "dist/src") + sep;
62
+ const readFile = (file) => {
63
+ if (sources.has(file))
64
+ return sources.get(file);
65
+ const absolute = resolve(file);
66
+ if (!absolute.endsWith(".d.ts"))
67
+ return undefined;
68
+ if (!absolute.startsWith(libraries) && !absolute.startsWith(declarations))
69
+ return undefined;
70
+ return ts.sys.readFile(absolute);
71
+ };
72
+ const host = ts.createCompilerHost(options);
73
+ host.readFile = readFile;
74
+ host.fileExists = (file) => readFile(file) !== undefined;
75
+ host.getSourceFile = (file, languageVersion) => {
76
+ const content = readFile(file);
77
+ return content === undefined
78
+ ? undefined
79
+ : ts.createSourceFile(file, content, languageVersion, true);
80
+ };
81
+ host.resolveModuleNameLiterals = (names, containingFile) => names.map(({ text: name }) => {
82
+ const installed = entries.get(name);
83
+ if (installed)
84
+ return {
85
+ resolvedModule: {
86
+ resolvedFileName: installed,
87
+ extension: ts.Extension.Dts,
88
+ },
89
+ };
90
+ if (sources.has(containingFile)) {
91
+ const importer = containingFile
92
+ .slice(packageRoot.length + 1)
93
+ .split(sep)
94
+ .join("/");
95
+ const local = workflowHelperPath(importer, name);
96
+ const target = local && join(packageRoot, local);
97
+ return {
98
+ resolvedModule: target && sources.has(target)
99
+ ? { resolvedFileName: target, extension: ts.Extension.Ts }
100
+ : undefined,
101
+ };
102
+ }
103
+ return ts.resolveModuleName(name, containingFile, options, host);
104
+ });
105
+ return host;
106
+ }
@@ -0,0 +1,6 @@
1
+ import { type CandidatePackageOptions } from "./workflow-candidate-program.ts";
2
+ import type { CandidateAnalysis, InstalledWorkflowExports } from "../src/workflow-candidate.ts";
3
+ export declare function analyzeWorkflowCandidate(text: string, installed?: CandidatePackageOptions): {
4
+ readonly analysis: CandidateAnalysis;
5
+ readonly installedExports: InstalledWorkflowExports;
6
+ };
@@ -0,0 +1,169 @@
1
+ import ts from "typescript";
2
+ import { dirname, relative, sep } from "node:path";
3
+ import { candidateProgram, resolvedSymbol, } from "./workflow-candidate-program.js";
4
+ import { protectedEffectFact, passiveCandidateModule, unsupportedCandidateNode, workflowShape, } from "./workflow-candidate-syntax.js";
5
+ import { sourceEffectNodes } from "./workflow-source-effects.js";
6
+ import { candidateEffectTotals } from "./workflow-candidate-counts.js";
7
+ import { helperEffectTotals } from "./workflow-candidate-helper-counts.js";
8
+ function exportSnapshot(modules, checker) {
9
+ return Object.fromEntries([...modules].map(([name, declaration]) => {
10
+ const symbol = checker.getSymbolAtLocation(declaration);
11
+ return [
12
+ name,
13
+ symbol
14
+ ? checker
15
+ .getExportsOfModule(symbol)
16
+ .map((entry) => entry.name)
17
+ .sort()
18
+ : [],
19
+ ];
20
+ }));
21
+ }
22
+ function protectedHelper(modules, options) {
23
+ const { checker } = options;
24
+ const protectedModule = modules.get(options.subpath);
25
+ const moduleSymbol = protectedModule && checker.getSymbolAtLocation(protectedModule);
26
+ return (moduleSymbol &&
27
+ resolvedSymbol(checker, checker
28
+ .getExportsOfModule(moduleSymbol)
29
+ .find((entry) => entry.name === options.name)));
30
+ }
31
+ function sourceFacts(symbols) {
32
+ const { source } = symbols;
33
+ const imports = [];
34
+ const effects = [];
35
+ const unsupportedForms = [];
36
+ function visit(node) {
37
+ const imported = sourceImport(node);
38
+ if (imported)
39
+ imports.push(imported);
40
+ const effect = protectedEffectFact(node, symbols);
41
+ if (effect)
42
+ effects.push(effect);
43
+ if (unsupportedCandidateNode(node, symbols))
44
+ unsupportedForms.push("unsupported-syntax");
45
+ ts.forEachChild(node, visit);
46
+ }
47
+ visit(source);
48
+ return {
49
+ imports,
50
+ effects,
51
+ directEffects: sourceEffectNodes(source, {
52
+ checker: symbols.checker,
53
+ profile: "candidate",
54
+ })
55
+ .filter((node) => !ts.isIdentifier(node) || node.text !== "require")
56
+ .map(() => "restricted-effect"),
57
+ unsupportedForms,
58
+ ...candidateEffectTotals(source, symbols),
59
+ };
60
+ }
61
+ function sourceImport(node) {
62
+ if (!ts.isImportDeclaration(node) ||
63
+ !ts.isStringLiteral(node.moduleSpecifier))
64
+ return undefined;
65
+ const bindings = node.importClause?.namedBindings;
66
+ return {
67
+ module: node.moduleSpecifier.text,
68
+ names: bindings && ts.isNamedImports(bindings)
69
+ ? bindings.elements.map((entry) => entry.propertyName?.text ?? entry.name.text)
70
+ : [],
71
+ };
72
+ }
73
+ function mergeHelpers(modules, checker) {
74
+ return [
75
+ ["merge-when-green", "mergeWhenGreen"],
76
+ ["merge-by-person", "mergeByPerson"],
77
+ ].flatMap(([module, name]) => {
78
+ const symbol = protectedHelper(modules, {
79
+ checker,
80
+ subpath: `cloving/workflows/steps/${String(module)}`,
81
+ name: String(name),
82
+ });
83
+ return symbol === undefined ? [] : [symbol];
84
+ });
85
+ }
86
+ export function analyzeWorkflowCandidate(text, installed = {}) {
87
+ const { program, source, sources, modules } = candidateProgram(text, installed);
88
+ const checker = program.getTypeChecker();
89
+ const symbols = {
90
+ checker,
91
+ source,
92
+ protectedSymbol: protectedHelper(modules, {
93
+ checker,
94
+ subpath: "cloving/workflows/steps/protected-effect",
95
+ name: "protectedEffect",
96
+ }),
97
+ handoffSymbol: protectedHelper(modules, {
98
+ checker,
99
+ subpath: "cloving/workflows/steps/handoff",
100
+ name: "handoff",
101
+ }),
102
+ commandSymbol: protectedHelper(modules, {
103
+ checker,
104
+ subpath: "cloving/workflows/steps/run-command",
105
+ name: "runCommand",
106
+ }),
107
+ reviewSymbol: protectedHelper(modules, {
108
+ checker,
109
+ subpath: "cloving/workflows/steps/review-by-agent",
110
+ name: "reviewByAgent",
111
+ }),
112
+ mergeSymbols: mergeHelpers(modules, checker),
113
+ };
114
+ const facts = sources.map((entry) => analyzedSource({ ...symbols, source: entry }, { program, workflow: source }));
115
+ return {
116
+ analysis: combineFacts({
117
+ localSources: Object.keys(installed.helpers ?? {}),
118
+ facts,
119
+ expanded: helperEffectTotals({
120
+ symbols: { ...symbols, source },
121
+ sources,
122
+ }),
123
+ }),
124
+ installedExports: exportSnapshot(modules, checker),
125
+ };
126
+ }
127
+ function analyzedSource(symbols, input) {
128
+ const { source } = symbols;
129
+ const facts = sourceFacts(symbols);
130
+ const kind = source === input.workflow ? "workflow" : "helper";
131
+ const path = relative(dirname(input.workflow.fileName), source.fileName)
132
+ .split(sep)
133
+ .join("/");
134
+ const invalid = source.referencedFiles.length > 0 ||
135
+ source.typeReferenceDirectives.length > 0 ||
136
+ source.libReferenceDirectives.length > 0 ||
137
+ input.program.getSyntacticDiagnostics(source).length > 0;
138
+ return {
139
+ ...facts,
140
+ imports: facts.imports.map((entry) => kind === "workflow" ? entry : { ...entry, source: path }),
141
+ unsupportedForms: [
142
+ ...facts.unsupportedForms,
143
+ ...(invalid || (kind === "workflow" && !workflowShape(source))
144
+ ? ["workflow-shape"]
145
+ : []),
146
+ ...(facts.directEffects.length === 0 &&
147
+ !passiveCandidateModule(source, kind)
148
+ ? ["module-initialization"]
149
+ : []),
150
+ ],
151
+ };
152
+ }
153
+ function combineFacts(input) {
154
+ const { localSources, facts } = input;
155
+ return {
156
+ localSources,
157
+ imports: facts.flatMap((entry) => entry.imports),
158
+ effects: facts.flatMap((entry) => entry.effects),
159
+ directEffects: facts.flatMap((entry) => entry.directEffects),
160
+ unsupportedForms: [
161
+ ...facts.flatMap((entry) => entry.unsupportedForms),
162
+ ...input.expanded.unsupportedForms,
163
+ ],
164
+ knownCallCount: input.expanded.totals?.knownCallCount ??
165
+ facts.reduce((total, entry) => total + entry.knownCallCount, 0),
166
+ knownUnitTotal: input.expanded.totals?.knownUnitTotal ??
167
+ facts.reduce((total, entry) => total + entry.knownUnitTotal, 0),
168
+ };
169
+ }
@@ -0,0 +1,21 @@
1
+ import ts from "typescript";
2
+ import type { CandidateEffect } from "../src/workflow-candidate.ts";
3
+ export interface CandidateSymbols {
4
+ readonly checker: ts.TypeChecker;
5
+ readonly source: ts.SourceFile;
6
+ readonly protectedSymbol: ts.Symbol | undefined;
7
+ readonly handoffSymbol: ts.Symbol | undefined;
8
+ readonly commandSymbol: ts.Symbol | undefined;
9
+ readonly reviewSymbol: ts.Symbol | undefined;
10
+ readonly mergeSymbols: readonly ts.Symbol[];
11
+ }
12
+ export declare function protectedCall(node: ts.Node, symbols: CandidateSymbols): node is ts.CallExpression;
13
+ export declare function handoffCall(node: ts.CallExpression, symbols: CandidateSymbols): boolean;
14
+ export declare function commandCall(node: ts.CallExpression, symbols: CandidateSymbols): boolean;
15
+ export declare function reviewCall(node: ts.CallExpression, symbols: CandidateSymbols): boolean;
16
+ export declare function helperCall(node: ts.CallExpression, symbols: CandidateSymbols): boolean;
17
+ export declare function mergeCall(node: ts.CallExpression, symbols: CandidateSymbols): boolean;
18
+ export declare function protectedEffectFact(node: ts.Node, symbols: CandidateSymbols): CandidateEffect | undefined;
19
+ export declare function unsupportedCandidateNode(node: ts.Node, symbols: CandidateSymbols): boolean;
20
+ export declare function workflowShape(source: ts.SourceFile): boolean;
21
+ export declare function passiveCandidateModule(source: ts.SourceFile, kind?: "workflow" | "helper"): boolean;
@@ -0,0 +1,263 @@
1
+ import ts from "typescript";
2
+ import { resolvedSymbol } from "./workflow-candidate-program.js";
3
+ import { referenceSymbol } from "./workflow-source-effects.js";
4
+ import { invalidFields, literalField, propertyInitializer, } from "./workflow-candidate-fields.js";
5
+ export function protectedCall(node, symbols) {
6
+ if (!ts.isCallExpression(node) || !ts.isIdentifier(node.expression))
7
+ return false;
8
+ const symbol = resolvedSymbol(symbols.checker, symbols.checker.getSymbolAtLocation(node.expression));
9
+ return (symbol !== undefined &&
10
+ [
11
+ symbols.protectedSymbol,
12
+ symbols.handoffSymbol,
13
+ symbols.commandSymbol,
14
+ symbols.reviewSymbol,
15
+ ...symbols.mergeSymbols,
16
+ ].includes(symbol));
17
+ }
18
+ function calledSymbol(node, symbols) {
19
+ return resolvedSymbol(symbols.checker, symbols.checker.getSymbolAtLocation(node.expression));
20
+ }
21
+ export function handoffCall(node, symbols) {
22
+ const symbol = symbols.handoffSymbol;
23
+ return symbol !== undefined && calledSymbol(node, symbols) === symbol;
24
+ }
25
+ export function commandCall(node, symbols) {
26
+ const symbol = symbols.commandSymbol;
27
+ return symbol !== undefined && calledSymbol(node, symbols) === symbol;
28
+ }
29
+ export function reviewCall(node, symbols) {
30
+ const symbol = symbols.reviewSymbol;
31
+ return symbol !== undefined && calledSymbol(node, symbols) === symbol;
32
+ }
33
+ export function helperCall(node, symbols) {
34
+ return [handoffCall, commandCall, reviewCall, mergeCall].some((call) => call(node, symbols));
35
+ }
36
+ export function mergeCall(node, symbols) {
37
+ const symbol = calledSymbol(node, symbols);
38
+ return symbol !== undefined && symbols.mergeSymbols.includes(symbol);
39
+ }
40
+ export function protectedEffectFact(node, symbols) {
41
+ if (!protectedCall(node, symbols))
42
+ return undefined;
43
+ if (handoffCall(node, symbols))
44
+ return undefined;
45
+ const argument = node.arguments[0];
46
+ if (!argument || !ts.isObjectLiteralExpression(argument))
47
+ return undefined;
48
+ if (reviewCall(node, symbols))
49
+ return reviewEffectFact(propertyInitializer(argument, "reviewer"));
50
+ if (mergeCall(node, symbols))
51
+ return { capability: "github", method: "merge" };
52
+ if (commandCall(node, symbols)) {
53
+ const name = literalField(argument, "name");
54
+ return {
55
+ capability: "command",
56
+ method: name === null ? null : `run:${name}`,
57
+ };
58
+ }
59
+ return {
60
+ capability: literalField(argument, "capability"),
61
+ method: literalField(argument, "method"),
62
+ };
63
+ }
64
+ function reviewEffectFact(reviewer) {
65
+ const kind = literalField(reviewer, "kind");
66
+ if (kind === "greptile")
67
+ return { capability: "github", method: "wait-review" };
68
+ const profile = literalField(reviewer, "profile");
69
+ if (kind === "turn" &&
70
+ profile !== null &&
71
+ /^[A-Za-z0-9_-]{1,119}$/.test(profile))
72
+ return { capability: "claude", method: `run-turn:${profile}` };
73
+ return { capability: null, method: null };
74
+ }
75
+ function escapedHelper(node, symbols) {
76
+ if (!ts.isIdentifier(node))
77
+ return false;
78
+ const symbol = resolvedSymbol(symbols.checker, referenceSymbol(node, { parent: node.parent, checker: symbols.checker }));
79
+ if (symbol === undefined ||
80
+ ![
81
+ symbols.protectedSymbol,
82
+ symbols.handoffSymbol,
83
+ symbols.commandSymbol,
84
+ symbols.reviewSymbol,
85
+ ...symbols.mergeSymbols,
86
+ ].includes(symbol))
87
+ return false;
88
+ if (ts.isImportSpecifier(node.parent))
89
+ return false;
90
+ return (!ts.isCallExpression(node.parent) ||
91
+ node.parent.expression !== node ||
92
+ node.parent.questionDotToken !== undefined);
93
+ }
94
+ function invalidImport(node) {
95
+ if (!ts.isImportDeclaration(node))
96
+ return false;
97
+ const clause = node.importClause;
98
+ return (!clause ||
99
+ clause.name !== undefined ||
100
+ !clause.namedBindings ||
101
+ !ts.isNamedImports(clause.namedBindings) ||
102
+ node.attributes !== undefined);
103
+ }
104
+ function invalidRequest(node, symbols) {
105
+ if (!protectedCall(node, symbols))
106
+ return false;
107
+ if (!workflowBodyCall(node))
108
+ return true;
109
+ const argument = node.arguments[0];
110
+ if (node.arguments.length !== 1 ||
111
+ !argument ||
112
+ !ts.isObjectLiteralExpression(argument))
113
+ return true;
114
+ const reviewer = reviewCall(node, symbols)
115
+ ? propertyInitializer(argument, "reviewer")
116
+ : undefined;
117
+ return (invalidFields(argument) ||
118
+ (reviewer !== undefined &&
119
+ ts.isObjectLiteralExpression(reviewer) &&
120
+ invalidFields(reviewer)));
121
+ }
122
+ function workflowBodyCall(node) {
123
+ let child = node;
124
+ let parent = node.parent;
125
+ while (!ts.isFunctionLike(parent)) {
126
+ if (ts.isSourceFile(parent) || ts.isClassLike(parent))
127
+ return false;
128
+ child = parent;
129
+ parent = parent.parent;
130
+ }
131
+ if (!ts.isFunctionDeclaration(parent) || !ts.isSourceFile(parent.parent))
132
+ return false;
133
+ return (parent.body === child &&
134
+ (ts.getCombinedModifierFlags(parent) & ts.ModifierFlags.Export) !== 0);
135
+ }
136
+ function dynamicLoading(node, symbols) {
137
+ if (node.kind === ts.SyntaxKind.ImportKeyword ||
138
+ ts.isImportEqualsDeclaration(node) ||
139
+ ts.isImportTypeNode(node) ||
140
+ ts.isMetaProperty(node))
141
+ return true;
142
+ if (!ts.isIdentifier(node) || node.text !== "require")
143
+ return false;
144
+ const symbol = symbols.checker.getSymbolAtLocation(node);
145
+ return !symbol?.declarations?.some((entry) => entry.getSourceFile() === symbols.source);
146
+ }
147
+ function ambientDeclaration(node) {
148
+ if (ts.isModuleDeclaration(node))
149
+ return true;
150
+ return (ts.canHaveModifiers(node) &&
151
+ (ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.DeclareKeyword));
152
+ }
153
+ function computedAccess(node) {
154
+ if (ts.isComputedPropertyName(node))
155
+ return true;
156
+ return (ts.isElementAccessExpression(node) &&
157
+ !ts.isStringLiteral(node.argumentExpression) &&
158
+ !ts.isNumericLiteral(node.argumentExpression));
159
+ }
160
+ export function unsupportedCandidateNode(node, symbols) {
161
+ const checks = [
162
+ escapedHelper(node, symbols),
163
+ invalidImport(node),
164
+ invalidRequest(node, symbols),
165
+ dynamicLoading(node, symbols),
166
+ ambientDeclaration(node),
167
+ computedAccess(node),
168
+ ts.isExportDeclaration(node) || ts.isExportAssignment(node),
169
+ ts.isSpreadAssignment(node) || ts.isSpreadElement(node),
170
+ node.kind === ts.SyntaxKind.ThisKeyword || ts.isWithStatement(node),
171
+ ts.isStringLiteral(node) && node.text === "use step",
172
+ ];
173
+ return checks.some(Boolean);
174
+ }
175
+ export function workflowShape(source) {
176
+ const exported = source.statements.filter((node) => ts.isFunctionDeclaration(node) &&
177
+ (ts.getModifiers(node) ?? []).some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword));
178
+ const candidate = exported[0];
179
+ if (exported.length !== 1 ||
180
+ !candidate ||
181
+ !ts.isFunctionDeclaration(candidate))
182
+ return false;
183
+ if (!workflowFunction(candidate))
184
+ return false;
185
+ const directives = [];
186
+ function visit(node) {
187
+ if (ts.isStringLiteral(node) && node.text === "use workflow")
188
+ directives.push(node);
189
+ ts.forEachChild(node, visit);
190
+ }
191
+ visit(source);
192
+ return directives.length === 1;
193
+ }
194
+ function workflowFunction(candidate) {
195
+ if (!candidate.name || !candidate.body || candidate.asteriskToken)
196
+ return false;
197
+ const modifiers = ts.getModifiers(candidate) ?? [];
198
+ if (!modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ||
199
+ modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.DefaultKeyword))
200
+ return false;
201
+ const first = candidate.body.statements[0];
202
+ return first !== undefined && workflowDirective(first);
203
+ }
204
+ function workflowDirective(node) {
205
+ return (ts.isExpressionStatement(node) &&
206
+ ts.isStringLiteral(node.expression) &&
207
+ node.expression.text === "use workflow");
208
+ }
209
+ function unwrappedInitializer(node) {
210
+ if (ts.isParenthesizedExpression(node) ||
211
+ ts.isAsExpression(node) ||
212
+ ts.isSatisfiesExpression(node) ||
213
+ ts.isTypeAssertionExpression(node))
214
+ return node.expression;
215
+ return undefined;
216
+ }
217
+ function passiveCompound(node) {
218
+ if (ts.isArrayLiteralExpression(node))
219
+ return node.elements.every((element) => ts.isOmittedExpression(element) || passiveInitializer(element));
220
+ if (ts.isObjectLiteralExpression(node))
221
+ return node.properties.every((property) => ts.isPropertyAssignment(property) &&
222
+ !ts.isComputedPropertyName(property.name) &&
223
+ passiveInitializer(property.initializer));
224
+ return false;
225
+ }
226
+ function passiveInitializer(node) {
227
+ if (!node)
228
+ return false;
229
+ if (ts.isLiteralExpression(node))
230
+ return true;
231
+ if ([
232
+ ts.SyntaxKind.TrueKeyword,
233
+ ts.SyntaxKind.FalseKeyword,
234
+ ts.SyntaxKind.NullKeyword,
235
+ ].includes(node.kind))
236
+ return true;
237
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node))
238
+ return true;
239
+ if (ts.isPrefixUnaryExpression(node))
240
+ return ([ts.SyntaxKind.PlusToken, ts.SyntaxKind.MinusToken].includes(node.operator) && ts.isNumericLiteral(node.operand));
241
+ const inner = unwrappedInitializer(node);
242
+ return inner ? passiveInitializer(inner) : passiveCompound(node);
243
+ }
244
+ function passiveStatement(node, kind) {
245
+ if (ts.isVariableStatement(node))
246
+ return ((node.declarationList.flags & ts.NodeFlags.Const) !== 0 &&
247
+ node.declarationList.declarations.every((declaration) => (kind === "helper" ||
248
+ (ts.getCombinedModifierFlags(declaration) &
249
+ ts.ModifierFlags.Export) ===
250
+ 0) &&
251
+ ts.isIdentifier(declaration.name) &&
252
+ passiveInitializer(declaration.initializer)));
253
+ if (ts.isExpressionStatement(node))
254
+ return ts.isStringLiteral(node.expression);
255
+ return (ts.isImportDeclaration(node) ||
256
+ ts.isTypeAliasDeclaration(node) ||
257
+ ts.isInterfaceDeclaration(node) ||
258
+ ts.isFunctionDeclaration(node) ||
259
+ ts.isEmptyStatement(node));
260
+ }
261
+ export function passiveCandidateModule(source, kind = "workflow") {
262
+ return source.statements.every((node) => passiveStatement(node, kind));
263
+ }
@@ -0,0 +1 @@
1
+ export declare function workflowCommand(argumentsList: readonly string[]): Promise<number>;