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,9 @@
1
+ export interface Statement {
2
+ readonly sql: string;
3
+ readonly parameters: readonly unknown[];
4
+ }
5
+ export declare function upsert(target: {
6
+ readonly table: string;
7
+ readonly names: readonly string[];
8
+ readonly key: number;
9
+ }): string;
@@ -0,0 +1,8 @@
1
+ export function upsert(target) {
2
+ const { table, names, key } = target;
3
+ const updates = names
4
+ .slice(key)
5
+ .map((name) => `${name} = excluded.${name}`)
6
+ .join(", ");
7
+ return `INSERT INTO ${table} (${names.join(", ")}) VALUES (${names.map(() => "?").join(", ")}) ON CONFLICT (${names.slice(0, key).join(", ")}) DO UPDATE SET ${updates}`;
8
+ }
@@ -0,0 +1,42 @@
1
+ import { type Fields } from "./protocol.ts";
2
+ export type SubmissionField = {
3
+ readonly type: "string";
4
+ readonly optional?: boolean;
5
+ } | {
6
+ readonly type: "boolean";
7
+ readonly optional?: boolean;
8
+ } | {
9
+ readonly type: "integer";
10
+ readonly optional?: boolean;
11
+ readonly minimum?: number;
12
+ readonly maximum?: number;
13
+ };
14
+ export interface SubmissionContract {
15
+ readonly maximumBytes: number;
16
+ readonly fields: Readonly<Record<string, "string" | SubmissionField>>;
17
+ }
18
+ export type SubmissionCheck = {
19
+ readonly kind: "valid";
20
+ readonly normalized: string;
21
+ readonly submission: Fields;
22
+ } | {
23
+ readonly kind: "rejected";
24
+ readonly code: string;
25
+ readonly detail: string;
26
+ };
27
+ export interface SubmissionRequest {
28
+ readonly workflowId: string;
29
+ readonly submission: unknown;
30
+ readonly source: unknown;
31
+ }
32
+ export declare function normalizedRequest(workflowId: string, submission: Fields): string;
33
+ export declare function checkSubmission(contract: SubmissionContract, request: SubmissionRequest): SubmissionCheck;
34
+ export type CheckedResolution = {
35
+ readonly kind: "resolved";
36
+ readonly input: string;
37
+ } | {
38
+ readonly kind: "rejected";
39
+ readonly code: string;
40
+ readonly detail: string;
41
+ };
42
+ export declare function checkResolution(value: unknown): CheckedResolution | undefined;
@@ -0,0 +1,71 @@
1
+ import { record } from "./protocol.js";
2
+ function rejected(code, detail) {
3
+ return { kind: "rejected", code, detail };
4
+ }
5
+ function sorted(fields) {
6
+ return Object.fromEntries(Object.keys(fields)
7
+ .sort()
8
+ .map((key) => [key, fields[key]]));
9
+ }
10
+ function invalidField(contract, submission) {
11
+ const undeclared = Object.keys(submission).find((key) => !Object.hasOwn(contract.fields, key));
12
+ if (undeclared !== undefined)
13
+ return undeclared;
14
+ return Object.entries(contract.fields).find(([key, rule]) => {
15
+ if (rule !== "string" && rule.optional && !Object.hasOwn(submission, key))
16
+ return false;
17
+ return !validValue(rule, submission[key]);
18
+ })?.[0];
19
+ }
20
+ function validValue(rule, value) {
21
+ if (rule === "string" || rule.type === "string")
22
+ return typeof value === "string" && value.trim().length > 0;
23
+ if (rule.type === "boolean")
24
+ return typeof value === "boolean";
25
+ return (typeof value === "number" &&
26
+ Number.isInteger(value) &&
27
+ (rule.minimum === undefined || value >= rule.minimum) &&
28
+ (rule.maximum === undefined || value <= rule.maximum));
29
+ }
30
+ export function normalizedRequest(workflowId, submission) {
31
+ return JSON.stringify({ submission: sorted(submission), workflowId });
32
+ }
33
+ export function checkSubmission(contract, request) {
34
+ if (request.source === "prompt" && !Object.hasOwn(contract.fields, "prompt"))
35
+ return rejected("unsupported-prompt", "The workflow does not accept a prompt. Use --input with its fields.");
36
+ const submission = record(request.submission);
37
+ if (submission === undefined)
38
+ return rejected("invalid-submission", "The submission is not an object.");
39
+ const bytes = new TextEncoder().encode(JSON.stringify(submission)).length;
40
+ if (bytes > contract.maximumBytes)
41
+ return rejected("input-too-large", `The input has ${String(bytes)} bytes. The limit is ${String(contract.maximumBytes)}.`);
42
+ const field = invalidField(contract, submission);
43
+ if (field !== undefined)
44
+ return rejected("invalid-submission", `Field ${field} is not valid.`);
45
+ return {
46
+ kind: "valid",
47
+ normalized: normalizedRequest(request.workflowId, submission),
48
+ submission,
49
+ };
50
+ }
51
+ function inputText(input) {
52
+ try {
53
+ const text = JSON.stringify(input);
54
+ return typeof text === "string" ? text : undefined;
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ }
60
+ export function checkResolution(value) {
61
+ const fields = record(value);
62
+ if (fields === undefined)
63
+ return undefined;
64
+ const { kind, code, detail } = fields;
65
+ if (kind === "rejected" && typeof code === "string" && code.length > 0)
66
+ return { kind, code, detail: typeof detail === "string" ? detail : code };
67
+ if (kind !== "resolved")
68
+ return undefined;
69
+ const input = inputText(fields["input"]);
70
+ return input === undefined ? undefined : { kind, input };
71
+ }
@@ -0,0 +1,8 @@
1
+ export type TicketStatus = {
2
+ readonly kind: "complete";
3
+ } | {
4
+ readonly kind: "partial";
5
+ readonly remaining: readonly string[];
6
+ };
7
+ export declare function ticketStatus(summary: string, preserved?: unknown): TicketStatus;
8
+ export declare function isTicketStatus(value: unknown): value is "complete" | "partial";
@@ -0,0 +1,45 @@
1
+ function parsedStatus(summary) {
2
+ const lines = summary.trimEnd().split(/\r?\n/);
3
+ if (lines.filter((line) => /^Ticket status:/i.test(line)).length !== 1)
4
+ return undefined;
5
+ const status = lines.pop();
6
+ if (status === "Ticket status: complete")
7
+ return { kind: "complete" };
8
+ if (status !== "Ticket status: partial")
9
+ return undefined;
10
+ const heading = lines.lastIndexOf("Remaining:");
11
+ if (heading === -1)
12
+ return undefined;
13
+ const items = lines.slice(heading + 1);
14
+ if (items.length === 0 || items.some((line) => !/^- \S.*$/.test(line)))
15
+ return undefined;
16
+ return { kind: "partial", remaining: items.map((line) => line.slice(2)) };
17
+ }
18
+ function preservedStatus(value) {
19
+ if (typeof value !== "object" || value === null)
20
+ return undefined;
21
+ const kind = Reflect.get(value, "kind");
22
+ if (kind === "complete")
23
+ return { kind };
24
+ const remaining = Reflect.get(value, "remaining");
25
+ if (kind !== "partial" ||
26
+ !Array.isArray(remaining) ||
27
+ remaining.length === 0 ||
28
+ remaining.some((item) => typeof item !== "string" || item.trim() === "" || /[\r\n]/.test(item)))
29
+ return undefined;
30
+ return { kind, remaining: remaining.map(String) };
31
+ }
32
+ export function ticketStatus(summary, preserved) {
33
+ const parsed = preserved === undefined
34
+ ? parsedStatus(summary)
35
+ : preservedStatus(preserved);
36
+ if (parsed !== undefined)
37
+ return parsed;
38
+ return {
39
+ kind: "partial",
40
+ remaining: ["The worker report has no ticket status line."],
41
+ };
42
+ }
43
+ export function isTicketStatus(value) {
44
+ return value === "complete" || value === "partial";
45
+ }
@@ -0,0 +1,19 @@
1
+ import { type WorkerUsage } from "./worker-usage.ts";
2
+ export interface TokenPrice {
3
+ readonly input: number;
4
+ readonly cachedInput: number;
5
+ readonly output: number;
6
+ }
7
+ export type TokenPrices = Readonly<Record<string, TokenPrice>>;
8
+ export declare const builtInPriceTable: {
9
+ readonly date: string;
10
+ readonly source: string;
11
+ readonly prices: TokenPrices;
12
+ };
13
+ export declare function parseTokenPrices(value: string | undefined): TokenPrices;
14
+ export declare function priceForModel(prices: TokenPrices, model: string | null): TokenPrice | undefined;
15
+ export declare function commandModel(command: readonly string[]): string | null;
16
+ export declare function estimatedCostUsd(usage: WorkerUsage, pricing: {
17
+ readonly worker: "claude" | "codex";
18
+ readonly price: TokenPrice | undefined;
19
+ }): number | null;
@@ -0,0 +1,76 @@
1
+ import { priceOf, usageOf } from "./worker-usage.js";
2
+ import { record } from "./protocol.js";
3
+ export const builtInPriceTable = {
4
+ date: "2026-10-18",
5
+ source: "https://openai.com/api/pricing/",
6
+ prices: {
7
+ "gpt-6.1-sol": { input: 2, cachedInput: 0.1, output: 10 },
8
+ "gpt-6-astra": { input: 10, cachedInput: 1, output: 50 },
9
+ },
10
+ };
11
+ function tokenPrice(value) {
12
+ const fields = record(value);
13
+ const input = priceOf(fields?.["input"]);
14
+ const cachedInput = priceOf(fields?.["cachedInput"]);
15
+ const output = priceOf(fields?.["output"]);
16
+ if (input === null || cachedInput === null || output === null)
17
+ throw new Error("Invalid CLOVING_TOKEN_PRICES");
18
+ return { input, cachedInput, output };
19
+ }
20
+ export function parseTokenPrices(value) {
21
+ if (value === undefined)
22
+ return { ...builtInPriceTable.prices };
23
+ try {
24
+ const fields = record(JSON.parse(value));
25
+ if (fields === undefined)
26
+ throw new Error("Invalid CLOVING_TOKEN_PRICES");
27
+ return {
28
+ ...builtInPriceTable.prices,
29
+ ...Object.fromEntries(Object.entries(fields).map(([model, price]) => [
30
+ model,
31
+ tokenPrice(price),
32
+ ])),
33
+ };
34
+ }
35
+ catch {
36
+ throw new Error("Invalid CLOVING_TOKEN_PRICES");
37
+ }
38
+ }
39
+ export function priceForModel(prices, model) {
40
+ return model !== null && Object.hasOwn(prices, model)
41
+ ? prices[model]
42
+ : undefined;
43
+ }
44
+ export function commandModel(command) {
45
+ let model = null;
46
+ for (let index = 1; index < command.length; index += 1) {
47
+ const argument = command[index] ?? "";
48
+ if (argument === "--")
49
+ break;
50
+ if (argument.startsWith("--model="))
51
+ model = argument.slice(8) || null;
52
+ if (argument === "--model" || argument === "-m") {
53
+ const next = command[index + 1];
54
+ model = next && !next.startsWith("-") ? next : null;
55
+ index += 1;
56
+ }
57
+ }
58
+ return model;
59
+ }
60
+ export function estimatedCostUsd(usage, pricing) {
61
+ const { worker, price } = pricing;
62
+ const counts = usageOf(usage);
63
+ const cached = counts.cache_read_input_tokens;
64
+ const output = counts.output_tokens;
65
+ if (price === undefined ||
66
+ counts.input_tokens === null ||
67
+ cached === null ||
68
+ output === null)
69
+ return null;
70
+ const input = counts.input_tokens - (worker === "codex" ? cached : 0);
71
+ if (input < 0)
72
+ return null;
73
+ return priceOf((input / 1_000_000) * price.input +
74
+ (cached / 1_000_000) * price.cachedInput +
75
+ (output / 1_000_000) * price.output);
76
+ }
@@ -0,0 +1,13 @@
1
+ export interface TurnProfile {
2
+ readonly env?: Readonly<Record<string, string>>;
3
+ readonly allowedTools?: readonly string[];
4
+ readonly model?: string;
5
+ readonly permissionMode?: string;
6
+ readonly maxBudgetUsd?: number;
7
+ readonly workflows?: readonly string[];
8
+ }
9
+ export type TurnProfiles = Readonly<Record<string, TurnProfile>>;
10
+ export declare function isProfilesFile(value: unknown): value is {
11
+ readonly profiles: TurnProfiles;
12
+ };
13
+ export declare function profileCommand(command: readonly string[], profile: TurnProfile): readonly string[];
@@ -0,0 +1,100 @@
1
+ const fields = [
2
+ "env",
3
+ "allowedTools",
4
+ "model",
5
+ "permissionMode",
6
+ "maxBudgetUsd",
7
+ "workflows",
8
+ ];
9
+ const reserved = [
10
+ "GH_TOKEN",
11
+ "GITHUB_TOKEN",
12
+ "GH_ENTERPRISE_TOKEN",
13
+ "GITHUB_ENTERPRISE_TOKEN",
14
+ "GH_CONFIG_DIR",
15
+ ];
16
+ function record(value) {
17
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18
+ }
19
+ function text(value) {
20
+ return typeof value === "string" && !value.includes("\0");
21
+ }
22
+ function texts(value) {
23
+ return Array.isArray(value) && value.every(text);
24
+ }
25
+ function environment(value) {
26
+ return (record(value) &&
27
+ Object.entries(value).every(([name, item]) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) &&
28
+ !reserved.includes(name) &&
29
+ text(item)));
30
+ }
31
+ function validField(name, value) {
32
+ if (name === "env")
33
+ return environment(value);
34
+ if (name === "allowedTools" || name === "workflows")
35
+ return texts(value);
36
+ if (name === "model" || name === "permissionMode")
37
+ return text(value);
38
+ return typeof value === "number" && Number.isFinite(value) && value > 0;
39
+ }
40
+ function profile(value) {
41
+ return (record(value) &&
42
+ Object.entries(value).every(([name, item]) => fields.includes(name) && validField(name, item)));
43
+ }
44
+ export function isProfilesFile(value) {
45
+ if (!record(value) ||
46
+ Object.keys(value).length !== 1 ||
47
+ !record(value["profiles"]))
48
+ return false;
49
+ return Object.entries(value["profiles"]).every(([name, item]) => /^[A-Za-z0-9_-]{1,119}$/.test(name) && profile(item));
50
+ }
51
+ function replacements(profile) {
52
+ const values = new Map();
53
+ if (profile.allowedTools !== undefined)
54
+ values.set("--allowedTools", profile.allowedTools.join(","));
55
+ if (profile.model !== undefined)
56
+ values.set("--model", profile.model);
57
+ if (profile.permissionMode !== undefined)
58
+ values.set("--permission-mode", profile.permissionMode);
59
+ if (profile.maxBudgetUsd !== undefined)
60
+ values.set("--max-budget-usd", String(profile.maxBudgetUsd));
61
+ return values;
62
+ }
63
+ function following(argumentsList, index) {
64
+ let next = index + 1;
65
+ while (next < argumentsList.length && !argumentsList[next]?.startsWith("-"))
66
+ next += 1;
67
+ return next;
68
+ }
69
+ function retained(argumentsList, values) {
70
+ const kept = [];
71
+ for (let index = 0; index < argumentsList.length;) {
72
+ const argument = argumentsList[index] ?? "";
73
+ const name = argument.split("=")[0] ?? "";
74
+ const flag = name === "--allowed-tools" ? "--allowedTools" : name;
75
+ if (!values.has(flag)) {
76
+ kept.push(argument);
77
+ index += 1;
78
+ continue;
79
+ }
80
+ if (argument.includes("=")) {
81
+ index += 1;
82
+ continue;
83
+ }
84
+ index =
85
+ flag === "--allowedTools" ? following(argumentsList, index) : index + 2;
86
+ }
87
+ return kept;
88
+ }
89
+ export function profileCommand(command, profile) {
90
+ const [executable = "", ...argumentsList] = command;
91
+ const separator = argumentsList.indexOf("--");
92
+ const boundary = separator === -1 ? argumentsList.length : separator;
93
+ const values = replacements(profile);
94
+ return [
95
+ executable,
96
+ ...retained(argumentsList.slice(0, boundary), values),
97
+ ...[...values].flat(),
98
+ ...argumentsList.slice(boundary),
99
+ ];
100
+ }
@@ -0,0 +1,22 @@
1
+ export interface WorkerUsage {
2
+ readonly input_tokens: number | null;
3
+ readonly cache_read_input_tokens: number | null;
4
+ readonly output_tokens: number | null;
5
+ }
6
+ export interface WorkerTurnUsage {
7
+ readonly estimatedCostUsd: number | null;
8
+ readonly operationId: string;
9
+ readonly usage: WorkerUsage;
10
+ readonly costUsd: number | null;
11
+ }
12
+ export interface WorkerTotals {
13
+ readonly estimatedCostUsd: number | null;
14
+ readonly workerTurns: readonly WorkerTurnUsage[];
15
+ readonly usage: WorkerUsage;
16
+ readonly claudeCostUsd: number | null;
17
+ }
18
+ export declare function priceOf(value: unknown): number | null;
19
+ export declare function tokenCount(value: unknown): number | null;
20
+ export declare function usageOf(value: unknown): WorkerUsage;
21
+ export declare function sumUsage(values: readonly WorkerUsage[]): WorkerUsage;
22
+ export declare function workerTotals(workerTurns: readonly WorkerTurnUsage[]): WorkerTotals;
@@ -0,0 +1,44 @@
1
+ export function priceOf(value) {
2
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
3
+ ? value
4
+ : null;
5
+ }
6
+ export function tokenCount(value) {
7
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
8
+ ? value
9
+ : null;
10
+ }
11
+ export function usageOf(value) {
12
+ const fields = typeof value === "object" && value !== null ? value : {};
13
+ return {
14
+ input_tokens: tokenCount(Reflect.get(fields, "input_tokens")),
15
+ cache_read_input_tokens: tokenCount(Reflect.get(fields, "cache_read_input_tokens")),
16
+ output_tokens: tokenCount(Reflect.get(fields, "output_tokens")),
17
+ };
18
+ }
19
+ function total(values) {
20
+ if (values.length === 0 || values.includes(null))
21
+ return null;
22
+ return tokenCount(values.reduce((sum, value) => sum + (value ?? 0), 0));
23
+ }
24
+ export function sumUsage(values) {
25
+ return {
26
+ input_tokens: total(values.map((value) => value.input_tokens)),
27
+ cache_read_input_tokens: total(values.map((value) => value.cache_read_input_tokens)),
28
+ output_tokens: total(values.map((value) => value.output_tokens)),
29
+ };
30
+ }
31
+ function sumPrices(values) {
32
+ const prices = values.map(priceOf);
33
+ if (prices.length === 0 || prices.includes(null))
34
+ return null;
35
+ return priceOf(prices.reduce((sum, price) => sum + (price ?? 0), 0));
36
+ }
37
+ export function workerTotals(workerTurns) {
38
+ return {
39
+ workerTurns,
40
+ usage: sumUsage(workerTurns.map((turn) => turn.usage)),
41
+ claudeCostUsd: sumPrices(workerTurns.map((turn) => turn.costUsd)),
42
+ estimatedCostUsd: sumPrices(workerTurns.map((turn) => turn.estimatedCostUsd)),
43
+ };
44
+ }
@@ -0,0 +1,45 @@
1
+ export interface ToolchainIdentity {
2
+ readonly sdk: string;
3
+ readonly world: string;
4
+ readonly builder: string;
5
+ readonly node: string;
6
+ readonly dependencies: string;
7
+ }
8
+ export interface WorkflowRegistration {
9
+ readonly name: string;
10
+ readonly workflowId: string;
11
+ readonly steps: readonly string[];
12
+ readonly capabilities: readonly string[];
13
+ readonly resources: readonly string[];
14
+ }
15
+ export interface CompiledWorkflow {
16
+ readonly manifest: unknown;
17
+ readonly artifacts: Readonly<Record<string, string>>;
18
+ readonly resources: Readonly<Record<string, string>>;
19
+ readonly toolchain: ToolchainIdentity;
20
+ }
21
+ export interface AdmissionPolicy {
22
+ readonly toolchain: ToolchainIdentity;
23
+ readonly capabilities: readonly string[];
24
+ }
25
+ export interface ExecutionManifest {
26
+ readonly name: string;
27
+ readonly workflowId: string;
28
+ readonly steps: readonly string[];
29
+ readonly capabilities: readonly string[];
30
+ readonly artifacts: Readonly<Record<string, string>>;
31
+ readonly resources: Readonly<Record<string, string>>;
32
+ readonly toolchain: ToolchainIdentity;
33
+ }
34
+ export type AdmissionResult = {
35
+ readonly kind: "admitted";
36
+ readonly manifest: ExecutionManifest;
37
+ } | {
38
+ readonly kind: "rejected";
39
+ readonly reason: string;
40
+ readonly detail: string;
41
+ };
42
+ export declare function admitWorkflow(proposedRegistration: unknown, admission: {
43
+ readonly compiled: unknown;
44
+ readonly policy: AdmissionPolicy;
45
+ }): AdmissionResult;
@@ -0,0 +1,151 @@
1
+ import { resolveResources } from "./workflow-resources.js";
2
+ const versionedStep = /^step\/\/(?!\.)(?:@[^/@]+\/)?[^@]+@[^/@]+\/\/.+$/;
3
+ export function admitWorkflow(proposedRegistration, admission) {
4
+ const { compiled: proposedCompiled, policy } = admission;
5
+ const registration = readRegistration(proposedRegistration);
6
+ if (!registration)
7
+ return rejected("invalid-registration", "registration");
8
+ const compiled = record(proposedCompiled) ?? {};
9
+ const toolchain = readToolchain(compiled["toolchain"]);
10
+ const rejection = registrationRejection(registration, policy) ??
11
+ toolchainRejection(toolchain, policy.toolchain) ??
12
+ manifestRejection(registration, compiled["manifest"]);
13
+ if (rejection)
14
+ return rejection;
15
+ const artifacts = readArtifacts(compiled["artifacts"]);
16
+ if (!artifacts)
17
+ return rejected("invalid-artifacts", "artifacts");
18
+ const resources = resolveResources(registration.resources, compiled["resources"]);
19
+ if (resources.kind === "inaccessible")
20
+ return rejected("inaccessible-resource", resources.path);
21
+ return {
22
+ kind: "admitted",
23
+ manifest: Object.freeze({
24
+ name: registration.name,
25
+ workflowId: registration.workflowId,
26
+ steps: Object.freeze([...registration.steps]),
27
+ capabilities: Object.freeze([...registration.capabilities]),
28
+ artifacts: Object.freeze(artifacts),
29
+ resources: Object.freeze(resources.resources),
30
+ toolchain: Object.freeze(toolchain),
31
+ }),
32
+ };
33
+ }
34
+ function readRegistration(value) {
35
+ const fields = record(value);
36
+ if (!fields)
37
+ return null;
38
+ const { name, workflowId, steps, capabilities, resources } = fields;
39
+ if (typeof name !== "string" ||
40
+ typeof workflowId !== "string" ||
41
+ !textList(steps) ||
42
+ !textList(capabilities) ||
43
+ !textList(resources))
44
+ return null;
45
+ return { name, workflowId, steps, capabilities, resources };
46
+ }
47
+ function readToolchain(value) {
48
+ const fields = record(value) ?? {};
49
+ const textField = (key) => {
50
+ const field = fields[key];
51
+ return typeof field === "string" ? field : "";
52
+ };
53
+ return {
54
+ sdk: textField("sdk"),
55
+ world: textField("world"),
56
+ builder: textField("builder"),
57
+ node: textField("node"),
58
+ dependencies: textField("dependencies"),
59
+ };
60
+ }
61
+ function readArtifacts(value) {
62
+ const entries = [];
63
+ for (const [name, digest] of Object.entries(record(value) ?? {})) {
64
+ if (typeof digest !== "string" || !/^[0-9a-f]{64}$/.test(digest))
65
+ return null;
66
+ entries.push([name, digest]);
67
+ }
68
+ return entries.length > 0 ? Object.fromEntries(entries) : null;
69
+ }
70
+ function textList(value) {
71
+ return (Array.isArray(value) && value.every((item) => typeof item === "string"));
72
+ }
73
+ function registrationRejection(registration, policy) {
74
+ if (!text(registration.name) ||
75
+ !text(registration.workflowId) ||
76
+ !distinctTexts(registration.steps) ||
77
+ !distinctTexts(registration.capabilities) ||
78
+ !distinctTexts(registration.resources))
79
+ return rejected("invalid-registration", "registration");
80
+ const unversioned = registration.steps.find((step) => !versionedStep.test(step));
81
+ if (unversioned !== undefined)
82
+ return rejected("unversioned-step", unversioned);
83
+ const unsupported = registration.capabilities.find((capability) => !policy.capabilities.includes(capability));
84
+ if (unsupported !== undefined)
85
+ return rejected("unsupported-capability", unsupported);
86
+ return null;
87
+ }
88
+ function toolchainRejection(compiled, accepted) {
89
+ const keys = ["sdk", "world", "builder", "node", "dependencies"];
90
+ const changed = keys.find((key) => compiled[key] !== accepted[key]);
91
+ if (changed !== undefined)
92
+ return rejected("incompatible-toolchain", changed);
93
+ return null;
94
+ }
95
+ function manifestRejection(registration, manifest) {
96
+ const registry = readRegistry(manifest);
97
+ if (!registry)
98
+ return rejected("invalid-manifest", "manifest");
99
+ const identifiers = [...registry.workflows, ...registry.steps];
100
+ const duplicate = identifiers.find((identifier, index) => identifiers.indexOf(identifier) !== index);
101
+ if (duplicate !== undefined)
102
+ return rejected("duplicate-registration", duplicate);
103
+ if (!registry.workflows.includes(registration.workflowId))
104
+ return rejected("unresolved-workflow", registration.workflowId);
105
+ const missing = registration.steps.find((step) => !registry.steps.includes(step));
106
+ if (missing !== undefined)
107
+ return rejected("unresolved-step", missing);
108
+ return null;
109
+ }
110
+ function text(value) {
111
+ return value.trim().length > 0;
112
+ }
113
+ function distinctTexts(values) {
114
+ return values.every(text) && new Set(values).size === values.length;
115
+ }
116
+ function rejected(reason, detail) {
117
+ return { kind: "rejected", reason, detail };
118
+ }
119
+ function readRegistry(manifest) {
120
+ const categories = record(manifest);
121
+ if (!categories)
122
+ return null;
123
+ const workflows = identifiers(categories["workflows"], "workflowId");
124
+ const steps = identifiers(categories["steps"], "stepId");
125
+ if (!workflows || !steps)
126
+ return null;
127
+ return { workflows, steps };
128
+ }
129
+ function identifiers(category, key) {
130
+ const files = record(category);
131
+ if (!files)
132
+ return null;
133
+ const found = [];
134
+ for (const entries of Object.values(files)) {
135
+ const named = record(entries);
136
+ if (!named)
137
+ return null;
138
+ for (const entry of Object.values(named)) {
139
+ const identifier = record(entry)?.[key];
140
+ if (typeof identifier !== "string")
141
+ return null;
142
+ found.push(identifier);
143
+ }
144
+ }
145
+ return found;
146
+ }
147
+ function record(value) {
148
+ if (!value || typeof value !== "object" || Array.isArray(value))
149
+ return null;
150
+ return Object.fromEntries(Object.entries(value));
151
+ }