cloving 0.3.20 → 1.1.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 (515) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +606 -182
  3. package/dist/src/authority/budgets.d.ts +12 -0
  4. package/dist/src/authority/budgets.js +42 -0
  5. package/dist/src/authority/commands.d.ts +7 -0
  6. package/dist/src/authority/commands.js +271 -0
  7. package/dist/src/authority/details.d.ts +28 -0
  8. package/dist/src/authority/details.js +33 -0
  9. package/dist/src/authority/dispatch-decision.d.ts +40 -0
  10. package/dist/src/authority/dispatch-decision.js +47 -0
  11. package/dist/src/authority/effect-requests.d.ts +2 -0
  12. package/dist/src/authority/effect-requests.js +139 -0
  13. package/dist/src/authority/effect-results.d.ts +4 -0
  14. package/dist/src/authority/effect-results.js +236 -0
  15. package/dist/src/authority/events.d.ts +2 -0
  16. package/dist/src/authority/events.js +45 -0
  17. package/dist/src/authority/gate-reduction.d.ts +8 -0
  18. package/dist/src/authority/gate-reduction.js +109 -0
  19. package/dist/src/authority/gates.d.ts +48 -0
  20. package/dist/src/authority/gates.js +77 -0
  21. package/dist/src/authority/history-state.d.ts +15 -0
  22. package/dist/src/authority/history-state.js +61 -0
  23. package/dist/src/authority/history.d.ts +13 -0
  24. package/dist/src/authority/history.js +37 -0
  25. package/dist/src/authority/instants.d.ts +3 -0
  26. package/dist/src/authority/instants.js +38 -0
  27. package/dist/src/authority/leases.d.ts +15 -0
  28. package/dist/src/authority/leases.js +113 -0
  29. package/dist/src/authority/operations.d.ts +101 -0
  30. package/dist/src/authority/operations.js +75 -0
  31. package/dist/src/authority/reconciliation.d.ts +29 -0
  32. package/dist/src/authority/reconciliation.js +156 -0
  33. package/dist/src/authority/reducer.d.ts +41 -0
  34. package/dist/src/authority/reducer.js +139 -0
  35. package/dist/src/authority/reduction-state.d.ts +36 -0
  36. package/dist/src/authority/reduction-state.js +68 -0
  37. package/dist/src/authority/reduction.d.ts +6 -0
  38. package/dist/src/authority/reduction.js +160 -0
  39. package/dist/src/authority/status-closure.d.ts +4 -0
  40. package/dist/src/authority/status-closure.js +57 -0
  41. package/dist/src/authority/status-effects.d.ts +17 -0
  42. package/dist/src/authority/status-effects.js +43 -0
  43. package/dist/src/authority/status-input.d.ts +45 -0
  44. package/dist/src/authority/status-input.js +9 -0
  45. package/dist/src/authority/status.d.ts +32 -0
  46. package/dist/src/authority/status.js +256 -0
  47. package/dist/src/authority/stop-sequence.d.ts +37 -0
  48. package/dist/src/authority/stop-sequence.js +91 -0
  49. package/dist/src/authority/transitions.d.ts +63 -0
  50. package/dist/src/authority/transitions.js +124 -0
  51. package/dist/src/broker/actor/adapter-calls.d.ts +13 -0
  52. package/dist/src/broker/actor/adapter-calls.js +34 -0
  53. package/dist/src/broker/actor/adapter-outcomes.d.ts +28 -0
  54. package/dist/src/broker/actor/adapter-outcomes.js +80 -0
  55. package/dist/src/broker/actor/authority-actor.d.ts +25 -0
  56. package/dist/src/broker/actor/authority-actor.js +169 -0
  57. package/dist/src/broker/actor/authority-changes.d.ts +31 -0
  58. package/dist/src/broker/actor/authority-changes.js +46 -0
  59. package/dist/src/broker/actor/authority-connection.d.ts +15 -0
  60. package/dist/src/broker/actor/authority-connection.js +44 -0
  61. package/dist/src/broker/actor/authority-conversion.d.ts +10 -0
  62. package/dist/src/broker/actor/authority-conversion.js +72 -0
  63. package/dist/src/broker/actor/authority-delivery.d.ts +13 -0
  64. package/dist/src/broker/actor/authority-delivery.js +162 -0
  65. package/dist/src/broker/actor/authority-logger.d.ts +2 -0
  66. package/dist/src/broker/actor/authority-logger.js +19 -0
  67. package/dist/src/broker/actor/authority-policy.d.ts +9 -0
  68. package/dist/src/broker/actor/authority-policy.js +11 -0
  69. package/dist/src/broker/actor/authority-queries.d.ts +45 -0
  70. package/dist/src/broker/actor/authority-queries.js +85 -0
  71. package/dist/src/broker/actor/authority-receipts.d.ts +28 -0
  72. package/dist/src/broker/actor/authority-receipts.js +84 -0
  73. package/dist/src/broker/actor/authority-release.d.ts +13 -0
  74. package/dist/src/broker/actor/authority-release.js +69 -0
  75. package/dist/src/broker/actor/authority-runtime.d.ts +60 -0
  76. package/dist/src/broker/actor/authority-runtime.js +204 -0
  77. package/dist/src/broker/actor/authority-session.d.ts +67 -0
  78. package/dist/src/broker/actor/authority-session.js +251 -0
  79. package/dist/src/broker/actor/authority-settings.d.ts +33 -0
  80. package/dist/src/broker/actor/authority-settings.js +63 -0
  81. package/dist/src/broker/actor/authority-upgrades.d.ts +16 -0
  82. package/dist/src/broker/actor/authority-upgrades.js +12 -0
  83. package/dist/src/broker/actor/authority-watchdog.d.ts +14 -0
  84. package/dist/src/broker/actor/authority-watchdog.js +41 -0
  85. package/dist/src/broker/actor/authority.d.ts +14 -0
  86. package/dist/src/broker/actor/authority.js +115 -0
  87. package/dist/src/broker/actor/delivery-intents.d.ts +68 -0
  88. package/dist/src/broker/actor/delivery-intents.js +77 -0
  89. package/dist/src/broker/actor/delivery-plan.d.ts +2 -0
  90. package/dist/src/broker/actor/delivery-plan.js +109 -0
  91. package/dist/src/broker/actor/delivery-results.d.ts +11 -0
  92. package/dist/src/broker/actor/delivery-results.js +63 -0
  93. package/dist/src/broker/actor/effect-delivery.d.ts +19 -0
  94. package/dist/src/broker/actor/effect-delivery.js +118 -0
  95. package/dist/src/broker/actor/effect-plan.d.ts +41 -0
  96. package/dist/src/broker/actor/effect-plan.js +173 -0
  97. package/dist/src/broker/actor/effect-queries.d.ts +27 -0
  98. package/dist/src/broker/actor/effect-queries.js +80 -0
  99. package/dist/src/broker/actor/effect-turn.d.ts +25 -0
  100. package/dist/src/broker/actor/effect-turn.js +84 -0
  101. package/dist/src/broker/actor/pin-check.d.ts +6 -0
  102. package/dist/src/broker/actor/pin-check.js +12 -0
  103. package/dist/src/broker/actor/runtime-parts.d.ts +23 -0
  104. package/dist/src/broker/actor/runtime-parts.js +34 -0
  105. package/dist/src/broker/actor/stop-plan.d.ts +20 -0
  106. package/dist/src/broker/actor/stop-plan.js +46 -0
  107. package/dist/src/broker/actor/stop-turn.d.ts +17 -0
  108. package/dist/src/broker/actor/stop-turn.js +42 -0
  109. package/dist/src/broker/actor/turn-draft.d.ts +31 -0
  110. package/dist/src/broker/actor/turn-draft.js +138 -0
  111. package/dist/src/broker/actor/turn-plan.d.ts +17 -0
  112. package/dist/src/broker/actor/turn-plan.js +136 -0
  113. package/dist/src/broker/actor/turn-refusals.d.ts +8 -0
  114. package/dist/src/broker/actor/turn-refusals.js +35 -0
  115. package/dist/src/broker/actor/turn-staging.d.ts +78 -0
  116. package/dist/src/broker/actor/turn-staging.js +34 -0
  117. package/dist/src/broker/actor/turn-state.d.ts +34 -0
  118. package/dist/src/broker/actor/turn-state.js +208 -0
  119. package/dist/src/broker/authority-admission.d.ts +21 -0
  120. package/dist/src/broker/authority-admission.js +70 -0
  121. package/dist/src/broker/authority-restore.d.ts +30 -0
  122. package/dist/src/broker/authority-restore.js +165 -0
  123. package/dist/src/broker/decision-restore.d.ts +16 -0
  124. package/dist/src/broker/decision-restore.js +158 -0
  125. package/dist/src/broker/decision-upgrade.d.ts +3 -0
  126. package/dist/src/broker/decision-upgrade.js +12 -0
  127. package/dist/src/broker/effect-restore.d.ts +20 -0
  128. package/dist/src/broker/effect-restore.js +111 -0
  129. package/dist/src/broker/effect-upgrade.d.ts +3 -0
  130. package/dist/src/broker/effect-upgrade.js +9 -0
  131. package/dist/src/broker/operation-digest.d.ts +1 -0
  132. package/dist/src/broker/operation-digest.js +4 -0
  133. package/dist/src/broker/socket-address.d.ts +9 -0
  134. package/dist/src/broker/socket-address.js +14 -0
  135. package/dist/src/broker/workflow-pin.d.ts +2 -0
  136. package/dist/src/broker/workflow-pin.js +5 -0
  137. package/dist/src/chats/analysis-batches.d.ts +24 -0
  138. package/dist/src/chats/analysis-batches.js +83 -0
  139. package/dist/src/chats/analysis-contract.d.ts +80 -0
  140. package/dist/src/chats/analysis-contract.js +16 -0
  141. package/dist/src/chats/analysis-data.d.ts +3 -0
  142. package/dist/src/chats/analysis-data.js +85 -0
  143. package/dist/src/chats/analysis-input.d.ts +12 -0
  144. package/dist/src/chats/analysis-input.js +83 -0
  145. package/dist/src/chats/analysis-links.d.ts +2 -0
  146. package/dist/src/chats/analysis-links.js +25 -0
  147. package/dist/src/chats/analysis-prompt.d.ts +10 -0
  148. package/dist/src/chats/analysis-prompt.js +16 -0
  149. package/dist/src/chats/analysis-proposal.d.ts +2 -0
  150. package/dist/src/chats/analysis-proposal.js +32 -0
  151. package/dist/src/chats/analysis-provenance.d.ts +4 -0
  152. package/dist/src/chats/analysis-provenance.js +99 -0
  153. package/dist/src/chats/analysis-shape.d.ts +3 -0
  154. package/dist/src/chats/analysis-shape.js +228 -0
  155. package/dist/src/chats/analysis.d.ts +3 -0
  156. package/dist/src/chats/analysis.js +42 -0
  157. package/dist/src/chats/corpus-input.d.ts +5 -0
  158. package/dist/src/chats/corpus-input.js +288 -0
  159. package/dist/src/chats/destination.d.ts +4 -0
  160. package/dist/src/chats/destination.js +96 -0
  161. package/dist/src/chats/import.d.ts +15 -0
  162. package/dist/src/chats/import.js +243 -0
  163. package/dist/src/chats/input-file.d.ts +3 -0
  164. package/dist/src/chats/input-file.js +32 -0
  165. package/dist/src/chats/normalize.d.ts +29 -0
  166. package/dist/src/chats/normalize.js +155 -0
  167. package/dist/src/chats/previous-import.d.ts +5 -0
  168. package/dist/src/chats/previous-import.js +34 -0
  169. package/dist/src/chats/reader.d.ts +21 -0
  170. package/dist/src/chats/reader.js +118 -0
  171. package/dist/src/chats/redact-import.d.ts +14 -0
  172. package/dist/src/chats/redact-import.js +141 -0
  173. package/dist/src/chats/redaction.d.ts +41 -0
  174. package/dist/src/chats/redaction.js +161 -0
  175. package/dist/src/chats/revision-input.d.ts +3 -0
  176. package/dist/src/chats/revision-input.js +180 -0
  177. package/dist/src/chats/revision.d.ts +48 -0
  178. package/dist/src/chats/revision.js +94 -0
  179. package/dist/src/chats/selection.d.ts +25 -0
  180. package/dist/src/chats/selection.js +109 -0
  181. package/dist/src/chats/source.d.ts +23 -0
  182. package/dist/src/chats/source.js +135 -0
  183. package/dist/src/chats/structure.d.ts +57 -0
  184. package/dist/src/chats/structure.js +216 -0
  185. package/dist/src/cli/arguments.d.ts +31 -0
  186. package/dist/src/cli/arguments.js +235 -0
  187. package/dist/src/cli/client.d.ts +16 -0
  188. package/dist/src/cli/client.js +159 -0
  189. package/dist/src/cli/commands.d.ts +17 -0
  190. package/dist/src/cli/commands.js +271 -0
  191. package/dist/src/cli/main.d.ts +2 -0
  192. package/dist/src/cli/main.js +127 -0
  193. package/dist/src/cli/render.d.ts +10 -0
  194. package/dist/src/cli/render.js +254 -0
  195. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  196. package/dist/src/cli/runtime-arguments.js +248 -0
  197. package/dist/src/cli/runtime-directory.d.ts +4 -0
  198. package/dist/src/cli/runtime-directory.js +25 -0
  199. package/dist/src/cli/toolchain.d.ts +3 -0
  200. package/dist/src/cli/toolchain.js +74 -0
  201. package/dist/src/cli/usage-render.d.ts +3 -0
  202. package/dist/src/cli/usage-render.js +28 -0
  203. package/dist/src/cli/usage.d.ts +5 -0
  204. package/dist/src/cli/usage.js +156 -0
  205. package/dist/src/cli/validate.d.ts +38 -0
  206. package/dist/src/cli/validate.js +116 -0
  207. package/dist/src/cli/watch-actions.d.ts +10 -0
  208. package/dist/src/cli/watch-actions.js +58 -0
  209. package/dist/src/cli/watch-board-view.d.ts +54 -0
  210. package/dist/src/cli/watch-board-view.js +201 -0
  211. package/dist/src/cli/watch-board.d.ts +15 -0
  212. package/dist/src/cli/watch-board.js +179 -0
  213. package/dist/src/cli/watch-card-client.d.ts +1 -0
  214. package/dist/src/cli/watch-card-client.js +44 -0
  215. package/dist/src/cli/watch-card-forms.d.ts +2 -0
  216. package/dist/src/cli/watch-card-forms.js +33 -0
  217. package/dist/src/cli/watch-card-reply.d.ts +5 -0
  218. package/dist/src/cli/watch-card-reply.js +34 -0
  219. package/dist/src/cli/watch-card-view.d.ts +40 -0
  220. package/dist/src/cli/watch-card-view.js +86 -0
  221. package/dist/src/cli/watch-client.d.ts +1 -0
  222. package/dist/src/cli/watch-client.js +118 -0
  223. package/dist/src/cli/watch-element.d.ts +11 -0
  224. package/dist/src/cli/watch-element.js +6 -0
  225. package/dist/src/cli/watch-model.d.ts +29 -0
  226. package/dist/src/cli/watch-model.js +278 -0
  227. package/dist/src/cli/watch-navigation.d.ts +9 -0
  228. package/dist/src/cli/watch-navigation.js +40 -0
  229. package/dist/src/cli/watch-page.d.ts +1 -0
  230. package/dist/src/cli/watch-page.js +258 -0
  231. package/dist/src/cli/watch-paths.d.ts +2 -0
  232. package/dist/src/cli/watch-paths.js +52 -0
  233. package/dist/src/cli/watch-phases.d.ts +7 -0
  234. package/dist/src/cli/watch-phases.js +148 -0
  235. package/dist/src/cli/watch-pr-board.d.ts +3 -0
  236. package/dist/src/cli/watch-pr-board.js +26 -0
  237. package/dist/src/cli/watch-pr-command.d.ts +15 -0
  238. package/dist/src/cli/watch-pr-command.js +37 -0
  239. package/dist/src/cli/watch-pr-identity.d.ts +20 -0
  240. package/dist/src/cli/watch-pr-identity.js +62 -0
  241. package/dist/src/cli/watch-pr-observer.d.ts +19 -0
  242. package/dist/src/cli/watch-pr-observer.js +108 -0
  243. package/dist/src/cli/watch-pr-settings.d.ts +8 -0
  244. package/dist/src/cli/watch-pr-settings.js +47 -0
  245. package/dist/src/cli/watch-reads.d.ts +28 -0
  246. package/dist/src/cli/watch-reads.js +248 -0
  247. package/dist/src/cli/watch-render.d.ts +153 -0
  248. package/dist/src/cli/watch-render.js +102 -0
  249. package/dist/src/cli/watch-run-input.d.ts +14 -0
  250. package/dist/src/cli/watch-run-input.js +49 -0
  251. package/dist/src/cli/watch-server.d.ts +13 -0
  252. package/dist/src/cli/watch-server.js +214 -0
  253. package/dist/src/cli/watch-start-view.d.ts +18 -0
  254. package/dist/src/cli/watch-start-view.js +77 -0
  255. package/dist/src/cli/watch-stream.d.ts +11 -0
  256. package/dist/src/cli/watch-stream.js +128 -0
  257. package/dist/src/cli/watch-turn.d.ts +30 -0
  258. package/dist/src/cli/watch-turn.js +135 -0
  259. package/dist/src/cli/watch-usage.d.ts +6 -0
  260. package/dist/src/cli/watch-usage.js +65 -0
  261. package/dist/src/cli/watch-view.d.ts +54 -0
  262. package/dist/src/cli/watch-view.js +267 -0
  263. package/dist/src/cli.d.ts +2 -0
  264. package/dist/src/cli.js +104 -0
  265. package/dist/src/daemon/analysis-launch.d.ts +5 -0
  266. package/dist/src/daemon/analysis-launch.js +81 -0
  267. package/dist/src/daemon/analysis-token.d.ts +6 -0
  268. package/dist/src/daemon/analysis-token.js +88 -0
  269. package/dist/src/daemon/analysis-worker.d.ts +22 -0
  270. package/dist/src/daemon/analysis-worker.js +219 -0
  271. package/dist/src/daemon/chats-files.d.ts +15 -0
  272. package/dist/src/daemon/chats-files.js +113 -0
  273. package/dist/src/daemon/chats-worker.d.ts +12 -0
  274. package/dist/src/daemon/chats-worker.js +200 -0
  275. package/dist/src/daemon/claude-turn.d.ts +38 -0
  276. package/dist/src/daemon/claude-turn.js +216 -0
  277. package/dist/src/daemon/claude-worker.d.ts +29 -0
  278. package/dist/src/daemon/claude-worker.js +276 -0
  279. package/dist/src/daemon/codex-stream.d.ts +4 -0
  280. package/dist/src/daemon/codex-stream.js +129 -0
  281. package/dist/src/daemon/daemon.d.ts +49 -0
  282. package/dist/src/daemon/daemon.js +195 -0
  283. package/dist/src/daemon/delivery-router.d.ts +10 -0
  284. package/dist/src/daemon/delivery-router.js +34 -0
  285. package/dist/src/daemon/github-calls.d.ts +29 -0
  286. package/dist/src/daemon/github-calls.js +127 -0
  287. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  288. package/dist/src/daemon/github-issue-methods.js +99 -0
  289. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  290. package/dist/src/daemon/github-issue-privacy.js +131 -0
  291. package/dist/src/daemon/github-merge.d.ts +18 -0
  292. package/dist/src/daemon/github-merge.js +259 -0
  293. package/dist/src/daemon/github-methods.d.ts +5 -0
  294. package/dist/src/daemon/github-methods.js +202 -0
  295. package/dist/src/daemon/github-operation.d.ts +38 -0
  296. package/dist/src/daemon/github-operation.js +57 -0
  297. package/dist/src/daemon/github-ticket-status.d.ts +3 -0
  298. package/dist/src/daemon/github-ticket-status.js +268 -0
  299. package/dist/src/daemon/github-worker.d.ts +17 -0
  300. package/dist/src/daemon/github-worker.js +281 -0
  301. package/dist/src/daemon/host-environment.d.ts +8 -0
  302. package/dist/src/daemon/host-environment.js +14 -0
  303. package/dist/src/daemon/issue-queue.d.ts +10 -0
  304. package/dist/src/daemon/issue-queue.js +254 -0
  305. package/dist/src/daemon/notify-message.d.ts +14 -0
  306. package/dist/src/daemon/notify-message.js +48 -0
  307. package/dist/src/daemon/notify.d.ts +12 -0
  308. package/dist/src/daemon/notify.js +161 -0
  309. package/dist/src/daemon/operation-journal.d.ts +43 -0
  310. package/dist/src/daemon/operation-journal.js +55 -0
  311. package/dist/src/daemon/retrying-turn.d.ts +9 -0
  312. package/dist/src/daemon/retrying-turn.js +185 -0
  313. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  314. package/dist/src/daemon/ticket-registration.js +177 -0
  315. package/dist/src/daemon/ticket-source.d.ts +17 -0
  316. package/dist/src/daemon/ticket-source.js +36 -0
  317. package/dist/src/daemon/work-tree.d.ts +26 -0
  318. package/dist/src/daemon/work-tree.js +206 -0
  319. package/dist/src/effect-authorization.d.ts +21 -0
  320. package/dist/src/effect-authorization.js +14 -0
  321. package/dist/src/execution-pin.d.ts +4 -0
  322. package/dist/src/execution-pin.js +68 -0
  323. package/dist/src/host/start-delivery.d.ts +41 -0
  324. package/dist/src/host/start-delivery.js +68 -0
  325. package/dist/src/host/step-bridge-host.d.ts +79 -0
  326. package/dist/src/host/step-bridge-host.js +205 -0
  327. package/dist/src/host/step-claims.d.ts +31 -0
  328. package/dist/src/host/step-claims.js +85 -0
  329. package/dist/src/host/world-host.d.ts +21 -0
  330. package/dist/src/host/world-host.js +51 -0
  331. package/dist/src/host/world-reconciliation.d.ts +39 -0
  332. package/dist/src/host/world-reconciliation.js +81 -0
  333. package/dist/src/host/world-runs.d.ts +14 -0
  334. package/dist/src/host/world-runs.js +69 -0
  335. package/dist/src/operation-identity.d.ts +7 -0
  336. package/dist/src/operation-identity.js +59 -0
  337. package/dist/src/protocol.d.ts +35 -0
  338. package/dist/src/protocol.js +64 -0
  339. package/dist/src/resource-files.d.ts +1 -0
  340. package/dist/src/resource-files.js +29 -0
  341. package/dist/src/service/changes.d.ts +11 -0
  342. package/dist/src/service/changes.js +32 -0
  343. package/dist/src/service/decision-handler.d.ts +9 -0
  344. package/dist/src/service/decision-handler.js +233 -0
  345. package/dist/src/service/event-handler.d.ts +10 -0
  346. package/dist/src/service/event-handler.js +70 -0
  347. package/dist/src/service/expiry.d.ts +13 -0
  348. package/dist/src/service/expiry.js +53 -0
  349. package/dist/src/service/gateway.d.ts +21 -0
  350. package/dist/src/service/gateway.js +120 -0
  351. package/dist/src/service/registry.d.ts +40 -0
  352. package/dist/src/service/registry.js +13 -0
  353. package/dist/src/service/replies.d.ts +26 -0
  354. package/dist/src/service/replies.js +56 -0
  355. package/dist/src/service/run-handlers.d.ts +4 -0
  356. package/dist/src/service/run-handlers.js +263 -0
  357. package/dist/src/service/service.d.ts +58 -0
  358. package/dist/src/service/service.js +212 -0
  359. package/dist/src/service/submission-handler.d.ts +4 -0
  360. package/dist/src/service/submission-handler.js +206 -0
  361. package/dist/src/service/transport.d.ts +16 -0
  362. package/dist/src/service/transport.js +141 -0
  363. package/dist/src/service/worker-port.d.ts +85 -0
  364. package/dist/src/service/worker-port.js +126 -0
  365. package/dist/src/service/worker-totals.d.ts +3 -0
  366. package/dist/src/service/worker-totals.js +28 -0
  367. package/dist/src/step-bridge.d.ts +57 -0
  368. package/dist/src/step-bridge.js +4 -0
  369. package/dist/src/steps/decision-gate.d.ts +2 -0
  370. package/dist/src/steps/decision-gate.js +8 -0
  371. package/dist/src/steps/load-cycle.d.ts +10 -0
  372. package/dist/src/steps/load-cycle.js +11 -0
  373. package/dist/src/steps/protected-effect.d.ts +2 -0
  374. package/dist/src/steps/protected-effect.js +8 -0
  375. package/dist/src/storage/decision-rows.d.ts +54 -0
  376. package/dist/src/storage/decision-rows.js +72 -0
  377. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  378. package/dist/src/storage/decision-snapshots.js +25 -0
  379. package/dist/src/storage/domain-changes.d.ts +48 -0
  380. package/dist/src/storage/domain-changes.js +213 -0
  381. package/dist/src/storage/domain-rows.d.ts +85 -0
  382. package/dist/src/storage/domain-rows.js +129 -0
  383. package/dist/src/storage/domain-schema.d.ts +32 -0
  384. package/dist/src/storage/domain-schema.js +193 -0
  385. package/dist/src/storage/effect-changes.d.ts +5 -0
  386. package/dist/src/storage/effect-changes.js +105 -0
  387. package/dist/src/storage/effect-rows.d.ts +67 -0
  388. package/dist/src/storage/effect-rows.js +74 -0
  389. package/dist/src/storage/effect-schema.d.ts +1 -0
  390. package/dist/src/storage/effect-schema.js +59 -0
  391. package/dist/src/storage/statements.d.ts +9 -0
  392. package/dist/src/storage/statements.js +8 -0
  393. package/dist/src/submission.d.ts +42 -0
  394. package/dist/src/submission.js +71 -0
  395. package/dist/src/ticket-status.d.ts +8 -0
  396. package/dist/src/ticket-status.js +45 -0
  397. package/dist/src/token-prices.d.ts +19 -0
  398. package/dist/src/token-prices.js +76 -0
  399. package/dist/src/turn-profile.d.ts +13 -0
  400. package/dist/src/turn-profile.js +100 -0
  401. package/dist/src/worker-usage.d.ts +22 -0
  402. package/dist/src/worker-usage.js +44 -0
  403. package/dist/src/workflow-admission.d.ts +45 -0
  404. package/dist/src/workflow-admission.js +151 -0
  405. package/dist/src/workflow-candidate.d.ts +29 -0
  406. package/dist/src/workflow-candidate.js +59 -0
  407. package/dist/src/workflow-contracts.d.ts +29 -0
  408. package/dist/src/workflow-contracts.js +110 -0
  409. package/dist/src/workflow-declaration.d.ts +11 -0
  410. package/dist/src/workflow-declaration.js +59 -0
  411. package/dist/src/workflow-resources.d.ts +8 -0
  412. package/dist/src/workflow-resources.js +14 -0
  413. package/dist/src/workflows.d.ts +6 -0
  414. package/dist/src/workflows.js +4 -0
  415. package/dist/tools/compile-workflows.d.ts +1 -0
  416. package/dist/tools/compile-workflows.js +33 -0
  417. package/dist/tools/self-host-processes.d.ts +10 -0
  418. package/dist/tools/self-host-processes.js +156 -0
  419. package/dist/tools/self-host-workflows.d.ts +15 -0
  420. package/dist/tools/self-host-workflows.js +78 -0
  421. package/dist/tools/self-host.d.ts +1 -0
  422. package/dist/tools/self-host.js +261 -0
  423. package/dist/tools/self-update-host.d.ts +13 -0
  424. package/dist/tools/self-update-host.js +88 -0
  425. package/dist/tools/self-update.d.ts +11 -0
  426. package/dist/tools/self-update.js +177 -0
  427. package/dist/tools/workflow-manifest.d.ts +3 -0
  428. package/dist/tools/workflow-manifest.js +34 -0
  429. package/dist/workflows/analyze-chats.d.ts +10 -0
  430. package/dist/workflows/analyze-chats.declaration.json +9 -0
  431. package/dist/workflows/analyze-chats.js +73 -0
  432. package/dist/workflows/develop-prd.d.ts +7 -0
  433. package/dist/workflows/develop-prd.js +97 -0
  434. package/dist/workflows/develop-ticket.d.ts +9 -0
  435. package/dist/workflows/develop-ticket.js +202 -0
  436. package/dist/workflows/issue-labels.d.ts +16 -0
  437. package/dist/workflows/issue-labels.js +70 -0
  438. package/dist/workflows/ticket-prompts.d.ts +35 -0
  439. package/dist/workflows/ticket-prompts.js +133 -0
  440. package/package.json +84 -75
  441. package/dist/abstract_gpt/index.js +0 -55
  442. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  443. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  444. package/dist/cloving_gpt/adapters/claude.js +0 -128
  445. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  446. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  447. package/dist/cloving_gpt/adapters/index.js +0 -2
  448. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  449. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  450. package/dist/cloving_gpt/adapters/openai.js +0 -100
  451. package/dist/cloving_gpt/index.js +0 -192
  452. package/dist/commands/analyze.js +0 -47
  453. package/dist/commands/chat.js +0 -14
  454. package/dist/commands/check.js +0 -7
  455. package/dist/commands/commit.js +0 -44
  456. package/dist/commands/config.js +0 -167
  457. package/dist/commands/describe.js +0 -235
  458. package/dist/commands/generate/code.js +0 -21
  459. package/dist/commands/generate/commit.js +0 -11
  460. package/dist/commands/generate/context.js +0 -82
  461. package/dist/commands/generate/docs.js +0 -11
  462. package/dist/commands/generate/documentation.js +0 -11
  463. package/dist/commands/generate/fizzbuzz.js +0 -35
  464. package/dist/commands/generate/init.js +0 -15
  465. package/dist/commands/generate/review.js +0 -11
  466. package/dist/commands/generate/sh.js +0 -95
  467. package/dist/commands/generate/shell.js +0 -11
  468. package/dist/commands/generate/unit_tests.js +0 -11
  469. package/dist/commands/init.js +0 -13
  470. package/dist/commands/models.js +0 -22
  471. package/dist/commands/project/build.js +0 -88
  472. package/dist/commands/project/complete.js +0 -12
  473. package/dist/commands/project/init.js +0 -82
  474. package/dist/commands/project/plan.js +0 -108
  475. package/dist/commands/proxy.js +0 -11
  476. package/dist/commands/review.js +0 -50
  477. package/dist/commands/tokens.js +0 -75
  478. package/dist/commands/unit_tests.js +0 -150
  479. package/dist/commands/update.js +0 -7
  480. package/dist/file2.js +0 -4
  481. package/dist/index.js +0 -136
  482. package/dist/managers/BlockManager.js +0 -120
  483. package/dist/managers/ChatManager.js +0 -653
  484. package/dist/managers/ChunkManager.js +0 -32
  485. package/dist/managers/CodeManager.js +0 -185
  486. package/dist/managers/CommitManager.js +0 -78
  487. package/dist/managers/DocsManager.js +0 -88
  488. package/dist/managers/DocumentationManager.js +0 -114
  489. package/dist/managers/InitManager.js +0 -230
  490. package/dist/managers/ProxyManager.js +0 -210
  491. package/dist/managers/ReviewManager.js +0 -131
  492. package/dist/managers/ShellManager.js +0 -163
  493. package/dist/managers/StreamManager.js +0 -308
  494. package/dist/managers/UnitTestManager.js +0 -243
  495. package/dist/managers/src/managers/ProxyManager.js +0 -1
  496. package/dist/newfile.js +0 -2
  497. package/dist/package.json +0 -86
  498. package/dist/utils/command_utils.js +0 -384
  499. package/dist/utils/config_utils.js +0 -249
  500. package/dist/utils/gitUtils.js +0 -42
  501. package/dist/utils/git_utils.js +0 -217
  502. package/dist/utils/modelUtils.js +0 -7
  503. package/dist/utils/model_utils.js +0 -7
  504. package/dist/utils/prompt_utils.js +0 -333
  505. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  506. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  507. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  508. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  509. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  510. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  511. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  512. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  513. package/dist/utils/prompts/index.js +0 -27
  514. package/dist/utils/string_utils.js +0 -505
  515. package/dist/utils/types.js +0 -2
@@ -0,0 +1,254 @@
1
+ import { priceText, usageText, totalsSuffix } from "./usage-render.js";
2
+ import { record } from "../protocol.js";
3
+ function show(value) {
4
+ return typeof value === "string" ? value : JSON.stringify(value);
5
+ }
6
+ function escaped(character) {
7
+ return `\\u${(character.codePointAt(0) ?? 0).toString(16).padStart(4, "0")}`;
8
+ }
9
+ const hiddenRanges = [
10
+ [0x00, 0x1f],
11
+ [0x7f, 0x9f],
12
+ [0x061c, 0x061c],
13
+ [0x200b, 0x200f],
14
+ [0x2028, 0x202e],
15
+ [0x2060, 0x2069],
16
+ [0xfeff, 0xfeff],
17
+ ];
18
+ function hidden(character) {
19
+ const code = character.codePointAt(0) ?? 0;
20
+ return hiddenRanges.some(([first, last]) => code >= first && code <= last);
21
+ }
22
+ function visible(value) {
23
+ return show(value)
24
+ .split("\n")
25
+ .map((line) => Array.from(line, (character) => hidden(character) ? escaped(character) : character).join(""))
26
+ .join("\n ");
27
+ }
28
+ export function errorText(error) {
29
+ const { candidates } = error;
30
+ const lines = [`${visible(error["code"])}: ${visible(error["detail"])}`];
31
+ if (Array.isArray(candidates))
32
+ lines.push(`Candidates: ${candidates.map(visible).join(", ")}`);
33
+ return lines.map((line) => `${line}\n`).join("");
34
+ }
35
+ function part(value, name) {
36
+ return record(value)?.[name];
37
+ }
38
+ function listing(value) {
39
+ const items = Array.isArray(value) ? value.map(show) : [];
40
+ return items.length === 0 ? "none" : items.join(", ");
41
+ }
42
+ function receiptLines(result) {
43
+ const receipt = result["receipt"];
44
+ return [
45
+ `Command ID: ${show(result["commandId"])}`,
46
+ `Receipt: sequence ${show(part(receipt, "sequence"))}, recorded at ${show(part(receipt, "recordedAt"))}`,
47
+ ...(result["replayed"] === true
48
+ ? ["This is the receipt of the earlier equal command."]
49
+ : []),
50
+ ];
51
+ }
52
+ function admitted(result) {
53
+ return [
54
+ `Run ${show(result["runId"])} is admitted.`,
55
+ ...receiptLines(result),
56
+ "The run is queued. Admission is not completed work.",
57
+ ];
58
+ }
59
+ function runLine(run) {
60
+ return ` ${show(part(run, "runId"))} ${show(part(run, "workflowId"))} ${show(part(run, "condition"))} revision ${show(part(run, "revision"))} latest at ${show(part(run, "latestAt") ?? "none")}`;
61
+ }
62
+ function ended(run) {
63
+ return ["completed", "failed", "cancelled"].includes(show(run["state"]));
64
+ }
65
+ function newest(first, second) {
66
+ return show(second["latestAt"] ?? "").localeCompare(show(first["latestAt"] ?? ""));
67
+ }
68
+ export function runOverview(result) {
69
+ const listed = result["runs"];
70
+ const runs = Array.isArray(listed)
71
+ ? listed.map(record).filter((run) => run !== undefined)
72
+ : [];
73
+ const active = runs.filter((run) => !ended(run)).toSorted(newest);
74
+ const finished = runs.filter(ended).toSorted(newest);
75
+ return {
76
+ ...result,
77
+ runs: [...active, ...finished.slice(0, 20)],
78
+ hiddenRuns: Math.max(0, finished.length - 20),
79
+ };
80
+ }
81
+ function runList(result) {
82
+ const runs = result["runs"];
83
+ const lines = Array.isArray(runs) ? runs.map(runLine) : [];
84
+ const hiddenRuns = result["hiddenRuns"];
85
+ return [
86
+ `Workflows: ${visible(listing(result["workflows"]))}`,
87
+ "Runs:",
88
+ ...(lines.length === 0 ? [" none"] : lines),
89
+ ...(typeof hiddenRuns === "number" && hiddenRuns > 0
90
+ ? [
91
+ `${String(hiddenRuns)} older runs: use --limit and --after to see them`,
92
+ ]
93
+ : []),
94
+ ];
95
+ }
96
+ function observation(value) {
97
+ if (record(value) === undefined)
98
+ return "none";
99
+ return `${show(part(value, "at"))} (sequence ${show(part(value, "sequence"))}, ${show(part(value, "source"))})`;
100
+ }
101
+ function feedbackLines(value) {
102
+ return (Array.isArray(value) ? value : []).map((item) => `Feedback of ${show(part(item, "decisionId"))}: ${visible(part(item, "text"))}`);
103
+ }
104
+ function outcome(value) {
105
+ if (record(value) === undefined)
106
+ return "none";
107
+ const reason = part(value, "reason");
108
+ const kind = visible(part(value, "kind"));
109
+ return typeof reason === "string" ? `${kind}: ${visible(reason)}` : kind;
110
+ }
111
+ function workerLines(value) {
112
+ return (Array.isArray(value) ? value : []).flatMap((turn) => [
113
+ `Worker turn ${visible(part(turn, "operationId"))}: ${priceText(part(turn, "costUsd"), part(turn, "estimatedCostUsd"))}`,
114
+ ` ${usageText(part(turn, "usage"))}`,
115
+ ]);
116
+ }
117
+ export function statusJson(result) {
118
+ const run = record(result["run"]);
119
+ if (result["kind"] !== "run-status" || run === undefined)
120
+ return result;
121
+ const turns = run["workerTurns"];
122
+ return {
123
+ ...result,
124
+ run: {
125
+ ...run,
126
+ costDisplay: priceText(run["claudeCostUsd"], run["estimatedCostUsd"]),
127
+ ...(Array.isArray(turns)
128
+ ? {
129
+ workerTurns: turns.map((turn) => {
130
+ const fields = record(turn);
131
+ if (fields === undefined)
132
+ return turn;
133
+ return {
134
+ ...fields,
135
+ costDisplay: priceText(fields["costUsd"], fields["estimatedCostUsd"]),
136
+ };
137
+ }),
138
+ }
139
+ : {}),
140
+ },
141
+ };
142
+ }
143
+ export function runStatus(result) {
144
+ const run = result["run"];
145
+ const reason = part(run, "reason");
146
+ const recovery = part(run, "recovery");
147
+ const at = part(run, "nextActionAt") ?? null;
148
+ const suffix = totalsSuffix(part(run, "state"));
149
+ return [
150
+ `Run ${show(part(run, "runId"))} (${show(part(run, "workflowId"))})`,
151
+ `Title: ${visible(part(run, "title") ?? "none")}`,
152
+ `State: ${show(part(run, "state"))}`,
153
+ `Outcome: ${outcome(part(run, "outcome"))}`,
154
+ ...(typeof part(part(run, "outcome"), "ticketStatus") === "string"
155
+ ? [
156
+ `Ticket status: ${visible(part(part(run, "outcome"), "ticketStatus"))}`,
157
+ ]
158
+ : []),
159
+ ...(part(part(run, "outcome"), "issueUpdate") === "failed"
160
+ ? ["Issue status update failed; check the GitHub operation."]
161
+ : []),
162
+ `Condition: ${show(part(run, "condition"))}`,
163
+ `Reason: ${show(part(reason, "code"))}: ${show(part(reason, "detail"))}`,
164
+ `Revision: ${show(part(run, "revision"))}, latest sequence ${show(part(run, "latestSequence"))}`,
165
+ `Latest at: ${show(part(run, "latestAt") ?? "none")}`,
166
+ `Pending decisions: ${listing(part(run, "pendingDecisions"))}`,
167
+ `Evidence: ${listing(part(run, "evidence"))}`,
168
+ `Last confirmed observation: ${observation(part(run, "lastConfirmedObservation"))}`,
169
+ `Recovery: ${show(part(recovery, "attempts"))} of ${show(part(recovery, "limit") ?? "no limit")}`,
170
+ `Cost${suffix}: ${priceText(part(run, "claudeCostUsd"), part(run, "estimatedCostUsd"))}`,
171
+ `Token usage${suffix}: ${usageText(part(run, "usage"))}`,
172
+ ...workerLines(part(run, "workerTurns")),
173
+ `Next action: ${show(part(run, "nextAction") ?? "none")}${at === null ? "" : ` at ${show(at)}`}`,
174
+ `Human input can help: ${part(run, "humanInputCanHelp") === true ? "yes" : "no"}`,
175
+ ...feedbackLines(part(run, "feedback")),
176
+ ];
177
+ }
178
+ function binding(decision) {
179
+ return `--expected-revision ${show(part(decision, "revision"))} --generation ${show(part(decision, "generation"))} --subject-digest ${show(part(decision, "subjectDigest"))}`;
180
+ }
181
+ function suggestion(decision, command) {
182
+ const reference = part(decision, "label") ?? part(decision, "decisionId");
183
+ const head = ` cloving ${show(command)} ${show(reference)}`;
184
+ const tail = binding(decision);
185
+ if (command === "answer")
186
+ return `${head} --text <answer> ${tail}`;
187
+ if (command === "deny")
188
+ return `${head} --text "<feedback>" ${tail}`;
189
+ return `${head} ${tail}`;
190
+ }
191
+ export function decisionLines(decision) {
192
+ const allowed = part(decision, "allowed");
193
+ const label = part(decision, "label");
194
+ return [
195
+ `${label === null ? "" : `${show(label)} `}${show(part(decision, "type"))} ${show(part(decision, "decisionId"))}`,
196
+ ` Prompt: ${visible(part(decision, "prompt"))}`,
197
+ ...feedbackLines(part(decision, "feedback")).map((line) => ` ${line}`),
198
+ ...(Array.isArray(allowed) ? allowed : []).map((command) => suggestion(decision, command)),
199
+ ];
200
+ }
201
+ export function decisionList(result) {
202
+ const decisions = result["decisions"];
203
+ const lines = Array.isArray(decisions)
204
+ ? decisions.flatMap(decisionLines)
205
+ : [];
206
+ return lines.length === 0 ? ["No decision waits."] : lines;
207
+ }
208
+ function decisionRecorded(result) {
209
+ const run = result["run"];
210
+ return [
211
+ `Decision ${show(result["decisionId"])} is recorded as ${show(result["decision"])}.`,
212
+ ...receiptLines(result),
213
+ `Run state: ${show(part(run, "state"))}, revision ${show(part(run, "revision"))}`,
214
+ `Continuation: ${show(result["continuation"])}`,
215
+ ];
216
+ }
217
+ function runCommand(result) {
218
+ const committed = result["committed"];
219
+ const observed = result["observed"];
220
+ return [
221
+ `Run ${show(result["runId"])}: ${show(result["command"])} is committed. State ${show(part(committed, "state"))}, revision ${show(part(committed, "revision"))}.`,
222
+ ...receiptLines(result),
223
+ `Revoked intents: ${show(part(committed, "revokedIntents"))}`,
224
+ `Observed: ${show(part(observed, "condition"))}`,
225
+ `Unresolved effects: ${listing(part(observed, "unresolvedEffects"))}`,
226
+ ];
227
+ }
228
+ export function eventText(event) {
229
+ return `${show(event["sequence"])} ${show(event["recordedAt"])} ${show(event["type"])} ${show(event["runId"])} ${JSON.stringify(event["payload"])}`;
230
+ }
231
+ function eventPage(result) {
232
+ const events = result["events"];
233
+ return (Array.isArray(events) ? events : []).map((event) => eventText(record(event) ?? {}));
234
+ }
235
+ const renderers = new Map([
236
+ ["run-admitted", admitted],
237
+ ["run-list", runList],
238
+ ["run-status", runStatus],
239
+ ["decision-list", decisionList],
240
+ ["decision-recorded", decisionRecorded],
241
+ ["run-command", runCommand],
242
+ ["event-page", eventPage],
243
+ ]);
244
+ export function rendered(result) {
245
+ const lines = renderers.get(show(result["kind"]))?.(result) ?? [];
246
+ return lines.map((line) => `${line}\n`).join("");
247
+ }
248
+ export function pendingSummary(result) {
249
+ const decisions = result["decisions"];
250
+ const lines = (Array.isArray(decisions) ? decisions : []).map((decision) => ` ${show(part(decision, "label") ?? part(decision, "type"))} ${show(part(decision, "decisionId"))}: ${visible(part(decision, "prompt"))}`);
251
+ return ["Pending decisions:", ...(lines.length === 0 ? [" none"] : lines)]
252
+ .map((line) => `${line}\n`)
253
+ .join("");
254
+ }
@@ -0,0 +1,73 @@
1
+ export type RunSource = {
2
+ readonly kind: "prompt";
3
+ readonly text: string;
4
+ } | {
5
+ readonly kind: "ticket";
6
+ readonly id: string;
7
+ } | {
8
+ readonly kind: "input";
9
+ readonly file: string;
10
+ };
11
+ type DecisionCommand = "answer" | "approve" | "deny";
12
+ type RunCommand = "pause" | "resume" | "drop";
13
+ export type RuntimeInvocation = {
14
+ readonly kind: "command-help";
15
+ readonly command: string;
16
+ } | {
17
+ readonly kind: "run";
18
+ readonly workflowId: string;
19
+ readonly source: RunSource;
20
+ readonly commandId: string | null;
21
+ readonly json: boolean;
22
+ } | {
23
+ readonly kind: "status";
24
+ readonly runId: string | null;
25
+ readonly limit: number | null;
26
+ readonly after: string | null;
27
+ readonly json: boolean;
28
+ } | {
29
+ readonly kind: "questions";
30
+ readonly runId: string | null;
31
+ readonly json: boolean;
32
+ } | {
33
+ readonly kind: "decision";
34
+ readonly command: DecisionCommand;
35
+ readonly reference: string;
36
+ readonly text: string | null;
37
+ readonly expectedRevision: number;
38
+ readonly generation: number;
39
+ readonly subjectDigest: string;
40
+ readonly commandId: string | null;
41
+ readonly json: boolean;
42
+ } | {
43
+ readonly kind: "run-command";
44
+ readonly command: RunCommand;
45
+ readonly runId: string;
46
+ readonly expectedRevision: number;
47
+ readonly commandId: string | null;
48
+ readonly json: boolean;
49
+ } | {
50
+ readonly kind: "events";
51
+ readonly runId: string | null;
52
+ readonly after: number;
53
+ readonly limit: number | null;
54
+ readonly follow: boolean;
55
+ readonly json: boolean;
56
+ } | {
57
+ readonly kind: "watch";
58
+ readonly port: number | null;
59
+ readonly json: boolean;
60
+ };
61
+ export interface GivenOption {
62
+ readonly name: string;
63
+ readonly value: string | undefined;
64
+ }
65
+ export interface RuntimeRequest {
66
+ readonly command: string;
67
+ readonly positionals: readonly string[];
68
+ readonly options: readonly GivenOption[];
69
+ }
70
+ type Outcome = RuntimeInvocation | string;
71
+ export declare function isRuntimeCommand(command: string): boolean;
72
+ export declare function runtimeInvocation(request: RuntimeRequest): Outcome;
73
+ export {};
@@ -0,0 +1,248 @@
1
+ import { isRecordKey } from "../authority/commands.js";
2
+ const identifier = /^[A-Za-z0-9._:/-]{1,128}$/;
3
+ const decisionReference = /^[A-Za-z0-9._:/-]{1,256}$/;
4
+ const sha256Digest = /^sha256:[0-9a-f]{64}$/;
5
+ const wholeNumber = /^(?:0|[1-9][0-9]*)$/;
6
+ const invalid = Symbol("invalid");
7
+ const revisions = { minimum: 1, maximum: Number.MAX_SAFE_INTEGER };
8
+ const sequences = { minimum: 0, maximum: Number.MAX_SAFE_INTEGER };
9
+ const bindingOptions = ["expected-revision", "generation", "subject-digest"];
10
+ const mutationOptions = ["command-id", "json"];
11
+ const shapes = new Map([
12
+ [
13
+ "run",
14
+ {
15
+ subject: "required",
16
+ required: [],
17
+ allowed: () => ["prompt", "input", "ticket", "next", ...mutationOptions],
18
+ build: run,
19
+ },
20
+ ],
21
+ [
22
+ "status",
23
+ {
24
+ subject: "optional",
25
+ required: [],
26
+ allowed: statusOptions,
27
+ build: status,
28
+ },
29
+ ],
30
+ [
31
+ "questions",
32
+ {
33
+ subject: "optional",
34
+ required: [],
35
+ allowed: () => ["json"],
36
+ build: questions,
37
+ },
38
+ ],
39
+ ["answer", decisionShape("answer")],
40
+ ["approve", decisionShape("approve")],
41
+ ["deny", decisionShape("deny")],
42
+ ["pause", runCommandShape("pause")],
43
+ ["resume", runCommandShape("resume")],
44
+ ["drop", runCommandShape("drop")],
45
+ [
46
+ "events",
47
+ {
48
+ subject: "optional",
49
+ required: [],
50
+ allowed: eventOptions,
51
+ build: events,
52
+ },
53
+ ],
54
+ [
55
+ "watch",
56
+ {
57
+ subject: "none",
58
+ required: [],
59
+ allowed: () => ["port"],
60
+ build: watch,
61
+ },
62
+ ],
63
+ ]);
64
+ export function isRuntimeCommand(command) {
65
+ return shapes.has(command);
66
+ }
67
+ export function runtimeInvocation(request) {
68
+ const shape = shapes.get(request.command);
69
+ if (shape === undefined)
70
+ return "unknown-command";
71
+ const names = request.options.map((option) => option.name);
72
+ if (new Set(names).size !== names.length)
73
+ return "repeated-option";
74
+ if (names.includes("help"))
75
+ return { kind: "command-help", command: request.command };
76
+ return shapeFailure(shape, request) ?? shape.build(request);
77
+ }
78
+ function shapeFailure(shape, request) {
79
+ const names = request.options.map((option) => option.name);
80
+ const allowed = shape.allowed(request);
81
+ const count = request.positionals.length;
82
+ if (names.some((name) => !allowed.includes(name)))
83
+ return "unexpected-option";
84
+ if (shape.subject === "required" && count === 0)
85
+ return "missing-argument";
86
+ if (count > (shape.subject === "none" ? 0 : 1))
87
+ return "unexpected-argument";
88
+ if (shape.required.some((name) => !names.includes(name)))
89
+ return "missing-option";
90
+ return undefined;
91
+ }
92
+ function decisionShape(command) {
93
+ const required = command === "answer" ? [...bindingOptions, "text"] : bindingOptions;
94
+ const optional = command === "deny" ? ["text"] : [];
95
+ return {
96
+ subject: "required",
97
+ required,
98
+ allowed: () => [...required, ...optional, ...mutationOptions],
99
+ build: (request) => decision(command, request),
100
+ };
101
+ }
102
+ function runCommandShape(command) {
103
+ return {
104
+ subject: "required",
105
+ required: ["expected-revision"],
106
+ allowed: () => ["expected-revision", ...mutationOptions],
107
+ build: (request) => runCommand(command, request),
108
+ };
109
+ }
110
+ function statusOptions(request) {
111
+ return request.positionals.length === 0
112
+ ? ["limit", "after", "json"]
113
+ : ["json"];
114
+ }
115
+ function eventOptions(request) {
116
+ return given(request, "follow")
117
+ ? ["after", "follow", "json"]
118
+ : ["after", "limit", "follow", "json"];
119
+ }
120
+ function given(request, name) {
121
+ return request.options.some((option) => option.name === name);
122
+ }
123
+ function valueOf(request, name) {
124
+ return request.options.find((option) => option.name === name)?.value;
125
+ }
126
+ function blank(value) {
127
+ return value?.trim() === "";
128
+ }
129
+ function matching(value, pattern) {
130
+ if (value === undefined)
131
+ return null;
132
+ return pattern.test(value) ? value : invalid;
133
+ }
134
+ function key(value) {
135
+ if (value === undefined)
136
+ return null;
137
+ return isRecordKey(value) ? value : invalid;
138
+ }
139
+ function whole(value, range) {
140
+ if (value === undefined)
141
+ return null;
142
+ if (!wholeNumber.test(value))
143
+ return invalid;
144
+ const number = Number(value);
145
+ return number >= range.minimum && number <= range.maximum ? number : invalid;
146
+ }
147
+ function inputSource(request) {
148
+ const prompt = valueOf(request, "prompt");
149
+ const input = valueOf(request, "input");
150
+ const ticket = valueOf(request, "ticket");
151
+ const next = given(request, "next");
152
+ const sources = [prompt, input, ticket].filter((value) => value !== undefined);
153
+ if (sources.length + Number(next) > 1)
154
+ return "conflicting-input-sources";
155
+ if (prompt !== undefined)
156
+ return { kind: "prompt", text: prompt };
157
+ if (input !== undefined)
158
+ return { kind: "input", file: input };
159
+ if (ticket !== undefined)
160
+ return { kind: "ticket", id: ticket };
161
+ if (next)
162
+ return { kind: "ticket", id: "next" };
163
+ return "missing-input-source";
164
+ }
165
+ function run(request) {
166
+ const source = inputSource(request);
167
+ if (typeof source === "string")
168
+ return source;
169
+ if (blank(valueOf(request, "prompt")))
170
+ return "empty-prompt";
171
+ const workflowId = matching(request.positionals[0], identifier);
172
+ const commandId = key(valueOf(request, "command-id"));
173
+ const unusable = typeof workflowId !== "string" ||
174
+ key(valueOf(request, "ticket")) === invalid;
175
+ if (unusable || commandId === invalid)
176
+ return "invalid-option-value";
177
+ const json = given(request, "json");
178
+ return { kind: "run", workflowId, source, commandId, json };
179
+ }
180
+ function status(request) {
181
+ const runId = key(request.positionals[0]);
182
+ const limit = whole(valueOf(request, "limit"), { minimum: 1, maximum: 500 });
183
+ const after = matching(valueOf(request, "after"), identifier);
184
+ if (runId === invalid || limit === invalid || after === invalid)
185
+ return "invalid-option-value";
186
+ const json = given(request, "json");
187
+ return { kind: "status", runId, limit, after, json };
188
+ }
189
+ function watch(request) {
190
+ const port = whole(valueOf(request, "port"), { minimum: 0, maximum: 65535 });
191
+ if (port === invalid)
192
+ return "invalid-option-value";
193
+ return { kind: "watch", port, json: false };
194
+ }
195
+ function questions(request) {
196
+ const runId = key(request.positionals[0]);
197
+ if (runId === invalid)
198
+ return "invalid-option-value";
199
+ return { kind: "questions", runId, json: given(request, "json") };
200
+ }
201
+ function decision(command, request) {
202
+ const answer = valueOf(request, "text");
203
+ if (blank(answer))
204
+ return "empty-prompt";
205
+ const reference = matching(request.positionals[0], decisionReference);
206
+ const expectedRevision = whole(valueOf(request, "expected-revision"), revisions);
207
+ const generation = whole(valueOf(request, "generation"), revisions);
208
+ const subjectDigest = matching(valueOf(request, "subject-digest"), sha256Digest);
209
+ const commandId = key(valueOf(request, "command-id"));
210
+ if (typeof reference !== "string" ||
211
+ typeof expectedRevision !== "number" ||
212
+ typeof generation !== "number" ||
213
+ typeof subjectDigest !== "string" ||
214
+ commandId === invalid)
215
+ return "invalid-option-value";
216
+ const subject = { command, reference, text: answer ?? null };
217
+ const binding = { expectedRevision, generation, subjectDigest };
218
+ const json = given(request, "json");
219
+ return { kind: "decision", ...subject, ...binding, commandId, json };
220
+ }
221
+ function runCommand(command, request) {
222
+ const runId = key(request.positionals[0]);
223
+ const expectedRevision = whole(valueOf(request, "expected-revision"), revisions);
224
+ const commandId = key(valueOf(request, "command-id"));
225
+ if (typeof runId !== "string" ||
226
+ typeof expectedRevision !== "number" ||
227
+ commandId === invalid)
228
+ return "invalid-option-value";
229
+ const json = given(request, "json");
230
+ return {
231
+ kind: "run-command",
232
+ command,
233
+ runId,
234
+ expectedRevision,
235
+ commandId,
236
+ json,
237
+ };
238
+ }
239
+ function events(request) {
240
+ const runId = key(request.positionals[0]);
241
+ const after = whole(valueOf(request, "after"), sequences);
242
+ const limit = whole(valueOf(request, "limit"), { minimum: 1, maximum: 1000 });
243
+ if (runId === invalid || after === invalid || limit === invalid)
244
+ return "invalid-option-value";
245
+ const follow = given(request, "follow");
246
+ const json = given(request, "json");
247
+ return { kind: "events", runId, after: after ?? 0, limit, follow, json };
248
+ }
@@ -0,0 +1,4 @@
1
+ type Environment = Readonly<Record<string, string | undefined>>;
2
+ export declare function clientCommand(environment: Environment): string;
3
+ export declare function runtimeDirectory(environment: Environment): string | undefined;
4
+ export {};
@@ -0,0 +1,25 @@
1
+ import { join } from "node:path";
2
+ function given(value) {
3
+ return value !== undefined && value.length > 0;
4
+ }
5
+ export function clientCommand(environment) {
6
+ const explicit = environment["CLOVING_RUNTIME_DIR"];
7
+ return given(explicit)
8
+ ? `CLOVING_RUNTIME_DIR=${explicit} cloving`
9
+ : "cloving";
10
+ }
11
+ export function runtimeDirectory(environment) {
12
+ const explicit = environment["CLOVING_RUNTIME_DIR"];
13
+ if (given(explicit))
14
+ return explicit;
15
+ const runtime = environment["XDG_RUNTIME_DIR"];
16
+ if (given(runtime))
17
+ return join(runtime, "cloving");
18
+ const state = environment["XDG_STATE_HOME"];
19
+ if (given(state))
20
+ return join(state, "cloving", "run");
21
+ const home = environment["HOME"];
22
+ return given(home)
23
+ ? join(home, ".local", "state", "cloving", "run")
24
+ : undefined;
25
+ }
@@ -0,0 +1,3 @@
1
+ import type { ToolchainIdentity } from "../workflow-admission.ts";
2
+ export declare function observedToolchain(start: string): Promise<ToolchainIdentity>;
3
+ export declare function qualifiedToolchain(observed: ToolchainIdentity, start: string): Promise<ToolchainIdentity>;
@@ -0,0 +1,74 @@
1
+ import { findPackageJSON } from "node:module";
2
+ import { createHash } from "node:crypto";
3
+ import { access, readFile, realpath } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import packageMetadata from "#package" with { type: "json" };
6
+ const qualifiedNode = "v26.9.0";
7
+ export async function observedToolchain(start) {
8
+ const root = await projectRoot(start);
9
+ const sdk = await packageDirectory(start, "workflow");
10
+ const core = sdk === undefined
11
+ ? undefined
12
+ : await packageDirectory(sdk, "@workflow/core");
13
+ const lock = await readFile(join(root, "package-lock.json")).catch(() => null);
14
+ return {
15
+ sdk: `workflow@${await installedVersion(start, "workflow")}`,
16
+ world: `@workflow/world-local@${await installedVersion(core ?? start, "@workflow/world-local")}`,
17
+ builder: `@workflow/builders@${await installedVersion(start, "@workflow/builders")}`,
18
+ node: process.version,
19
+ dependencies: lock === null
20
+ ? "missing"
21
+ : createHash("sha256").update(lock).digest("hex"),
22
+ };
23
+ }
24
+ export async function qualifiedToolchain(observed, start) {
25
+ const sdk = await packageDirectory(start, "workflow");
26
+ const core = await packageFields(sdk ?? start, "@workflow/core");
27
+ const declared = fields(core["dependencies"])["@workflow/world-local"];
28
+ return {
29
+ sdk: `workflow@${packageMetadata.dependencies.workflow}`,
30
+ world: `@workflow/world-local@${typeof declared === "string" ? declared : "undeclared"}`,
31
+ builder: `@workflow/builders@${packageMetadata.dependencies["@workflow/builders"]}`,
32
+ node: qualifiedNode,
33
+ dependencies: observed.dependencies,
34
+ };
35
+ }
36
+ async function projectRoot(start) {
37
+ let directory = start;
38
+ for (;;) {
39
+ const found = await access(join(directory, "package-lock.json")).then(() => true, () => false);
40
+ const parent = dirname(directory);
41
+ if (found || parent === directory)
42
+ return directory;
43
+ directory = parent;
44
+ }
45
+ }
46
+ async function installedVersion(root, name) {
47
+ const version = (await packageFields(root, name))["version"];
48
+ return typeof version === "string" ? version : "missing";
49
+ }
50
+ async function packageFields(root, name) {
51
+ const directory = await packageDirectory(root, name);
52
+ if (directory === undefined)
53
+ return {};
54
+ const text = await readFile(join(directory, "package.json"), "utf8").catch(() => "{}");
55
+ return fields(JSON.parse(text));
56
+ }
57
+ function fields(value) {
58
+ if (!value || typeof value !== "object" || Array.isArray(value))
59
+ return {};
60
+ return Object.fromEntries(Object.entries(value));
61
+ }
62
+ async function packageDirectory(start, name) {
63
+ try {
64
+ const file = findPackageJSON(name, join(start, "package.json"));
65
+ return file === undefined ? undefined : dirname(await realpath(file));
66
+ }
67
+ catch (error) {
68
+ if (error instanceof Error &&
69
+ "code" in error &&
70
+ error.code === "ERR_MODULE_NOT_FOUND")
71
+ return undefined;
72
+ throw error;
73
+ }
74
+ }