cloving 0.3.20 → 1.0.1

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 (416) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +475 -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 +263 -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 +27 -0
  32. package/dist/src/authority/reconciliation.js +147 -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 +122 -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 +65 -0
  78. package/dist/src/broker/actor/authority-session.js +252 -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/destination.d.ts +4 -0
  138. package/dist/src/chats/destination.js +94 -0
  139. package/dist/src/chats/import.d.ts +13 -0
  140. package/dist/src/chats/import.js +71 -0
  141. package/dist/src/chats/normalize.d.ts +20 -0
  142. package/dist/src/chats/normalize.js +139 -0
  143. package/dist/src/chats/reader.d.ts +15 -0
  144. package/dist/src/chats/reader.js +87 -0
  145. package/dist/src/cli/arguments.d.ts +23 -0
  146. package/dist/src/cli/arguments.js +154 -0
  147. package/dist/src/cli/client.d.ts +15 -0
  148. package/dist/src/cli/client.js +122 -0
  149. package/dist/src/cli/commands.d.ts +14 -0
  150. package/dist/src/cli/commands.js +253 -0
  151. package/dist/src/cli/main.d.ts +1 -0
  152. package/dist/src/cli/main.js +80 -0
  153. package/dist/src/cli/render.d.ts +8 -0
  154. package/dist/src/cli/render.js +186 -0
  155. package/dist/src/cli/runtime-arguments.d.ts +73 -0
  156. package/dist/src/cli/runtime-arguments.js +248 -0
  157. package/dist/src/cli/runtime-directory.d.ts +4 -0
  158. package/dist/src/cli/runtime-directory.js +25 -0
  159. package/dist/src/cli/toolchain.d.ts +3 -0
  160. package/dist/src/cli/toolchain.js +74 -0
  161. package/dist/src/cli/usage.d.ts +4 -0
  162. package/dist/src/cli/usage.js +124 -0
  163. package/dist/src/cli/validate.d.ts +38 -0
  164. package/dist/src/cli/validate.js +116 -0
  165. package/dist/src/cli/watch-board-view.d.ts +22 -0
  166. package/dist/src/cli/watch-board-view.js +128 -0
  167. package/dist/src/cli/watch-board.d.ts +15 -0
  168. package/dist/src/cli/watch-board.js +174 -0
  169. package/dist/src/cli/watch-element.d.ts +11 -0
  170. package/dist/src/cli/watch-element.js +6 -0
  171. package/dist/src/cli/watch-model.d.ts +29 -0
  172. package/dist/src/cli/watch-model.js +261 -0
  173. package/dist/src/cli/watch-navigation.d.ts +9 -0
  174. package/dist/src/cli/watch-navigation.js +40 -0
  175. package/dist/src/cli/watch-page.d.ts +1 -0
  176. package/dist/src/cli/watch-page.js +272 -0
  177. package/dist/src/cli/watch-paths.d.ts +2 -0
  178. package/dist/src/cli/watch-paths.js +52 -0
  179. package/dist/src/cli/watch-phases.d.ts +7 -0
  180. package/dist/src/cli/watch-phases.js +148 -0
  181. package/dist/src/cli/watch-reads.d.ts +28 -0
  182. package/dist/src/cli/watch-reads.js +244 -0
  183. package/dist/src/cli/watch-render.d.ts +139 -0
  184. package/dist/src/cli/watch-render.js +95 -0
  185. package/dist/src/cli/watch-server.d.ts +10 -0
  186. package/dist/src/cli/watch-server.js +176 -0
  187. package/dist/src/cli/watch-stream.d.ts +11 -0
  188. package/dist/src/cli/watch-stream.js +128 -0
  189. package/dist/src/cli/watch-turn.d.ts +29 -0
  190. package/dist/src/cli/watch-turn.js +130 -0
  191. package/dist/src/cli/watch-view.d.ts +39 -0
  192. package/dist/src/cli/watch-view.js +223 -0
  193. package/dist/src/cli.d.ts +2 -0
  194. package/dist/src/cli.js +62 -0
  195. package/dist/src/daemon/claude-turn.d.ts +28 -0
  196. package/dist/src/daemon/claude-turn.js +135 -0
  197. package/dist/src/daemon/claude-worker.d.ts +26 -0
  198. package/dist/src/daemon/claude-worker.js +224 -0
  199. package/dist/src/daemon/codex-stream.d.ts +4 -0
  200. package/dist/src/daemon/codex-stream.js +113 -0
  201. package/dist/src/daemon/daemon.d.ts +46 -0
  202. package/dist/src/daemon/daemon.js +186 -0
  203. package/dist/src/daemon/delivery-router.d.ts +10 -0
  204. package/dist/src/daemon/delivery-router.js +34 -0
  205. package/dist/src/daemon/github-calls.d.ts +29 -0
  206. package/dist/src/daemon/github-calls.js +127 -0
  207. package/dist/src/daemon/github-issue-methods.d.ts +3 -0
  208. package/dist/src/daemon/github-issue-methods.js +99 -0
  209. package/dist/src/daemon/github-issue-privacy.d.ts +6 -0
  210. package/dist/src/daemon/github-issue-privacy.js +131 -0
  211. package/dist/src/daemon/github-merge.d.ts +18 -0
  212. package/dist/src/daemon/github-merge.js +259 -0
  213. package/dist/src/daemon/github-methods.d.ts +5 -0
  214. package/dist/src/daemon/github-methods.js +198 -0
  215. package/dist/src/daemon/github-operation.d.ts +38 -0
  216. package/dist/src/daemon/github-operation.js +57 -0
  217. package/dist/src/daemon/github-worker.d.ts +17 -0
  218. package/dist/src/daemon/github-worker.js +281 -0
  219. package/dist/src/daemon/host-environment.d.ts +8 -0
  220. package/dist/src/daemon/host-environment.js +14 -0
  221. package/dist/src/daemon/issue-queue.d.ts +9 -0
  222. package/dist/src/daemon/issue-queue.js +163 -0
  223. package/dist/src/daemon/notify-message.d.ts +14 -0
  224. package/dist/src/daemon/notify-message.js +48 -0
  225. package/dist/src/daemon/notify.d.ts +12 -0
  226. package/dist/src/daemon/notify.js +161 -0
  227. package/dist/src/daemon/operation-journal.d.ts +42 -0
  228. package/dist/src/daemon/operation-journal.js +53 -0
  229. package/dist/src/daemon/ticket-registration.d.ts +33 -0
  230. package/dist/src/daemon/ticket-registration.js +177 -0
  231. package/dist/src/daemon/ticket-source.d.ts +17 -0
  232. package/dist/src/daemon/ticket-source.js +36 -0
  233. package/dist/src/daemon/work-tree.d.ts +26 -0
  234. package/dist/src/daemon/work-tree.js +206 -0
  235. package/dist/src/effect-authorization.d.ts +21 -0
  236. package/dist/src/effect-authorization.js +14 -0
  237. package/dist/src/execution-pin.d.ts +4 -0
  238. package/dist/src/execution-pin.js +68 -0
  239. package/dist/src/host/start-delivery.d.ts +41 -0
  240. package/dist/src/host/start-delivery.js +68 -0
  241. package/dist/src/host/step-bridge-host.d.ts +79 -0
  242. package/dist/src/host/step-bridge-host.js +205 -0
  243. package/dist/src/host/step-claims.d.ts +31 -0
  244. package/dist/src/host/step-claims.js +85 -0
  245. package/dist/src/host/world-host.d.ts +21 -0
  246. package/dist/src/host/world-host.js +51 -0
  247. package/dist/src/host/world-reconciliation.d.ts +37 -0
  248. package/dist/src/host/world-reconciliation.js +75 -0
  249. package/dist/src/host/world-runs.d.ts +14 -0
  250. package/dist/src/host/world-runs.js +61 -0
  251. package/dist/src/operation-identity.d.ts +7 -0
  252. package/dist/src/operation-identity.js +59 -0
  253. package/dist/src/protocol.d.ts +35 -0
  254. package/dist/src/protocol.js +64 -0
  255. package/dist/src/resource-files.d.ts +1 -0
  256. package/dist/src/resource-files.js +29 -0
  257. package/dist/src/service/changes.d.ts +11 -0
  258. package/dist/src/service/changes.js +32 -0
  259. package/dist/src/service/decision-handler.d.ts +9 -0
  260. package/dist/src/service/decision-handler.js +233 -0
  261. package/dist/src/service/event-handler.d.ts +10 -0
  262. package/dist/src/service/event-handler.js +70 -0
  263. package/dist/src/service/expiry.d.ts +13 -0
  264. package/dist/src/service/expiry.js +53 -0
  265. package/dist/src/service/gateway.d.ts +21 -0
  266. package/dist/src/service/gateway.js +120 -0
  267. package/dist/src/service/registry.d.ts +40 -0
  268. package/dist/src/service/registry.js +13 -0
  269. package/dist/src/service/replies.d.ts +26 -0
  270. package/dist/src/service/replies.js +56 -0
  271. package/dist/src/service/run-handlers.d.ts +4 -0
  272. package/dist/src/service/run-handlers.js +271 -0
  273. package/dist/src/service/service.d.ts +58 -0
  274. package/dist/src/service/service.js +212 -0
  275. package/dist/src/service/submission-handler.d.ts +4 -0
  276. package/dist/src/service/submission-handler.js +206 -0
  277. package/dist/src/service/transport.d.ts +16 -0
  278. package/dist/src/service/transport.js +141 -0
  279. package/dist/src/service/worker-port.d.ts +85 -0
  280. package/dist/src/service/worker-port.js +126 -0
  281. package/dist/src/step-bridge.d.ts +57 -0
  282. package/dist/src/step-bridge.js +4 -0
  283. package/dist/src/steps/decision-gate.d.ts +2 -0
  284. package/dist/src/steps/decision-gate.js +8 -0
  285. package/dist/src/steps/load-cycle.d.ts +10 -0
  286. package/dist/src/steps/load-cycle.js +11 -0
  287. package/dist/src/steps/protected-effect.d.ts +2 -0
  288. package/dist/src/steps/protected-effect.js +8 -0
  289. package/dist/src/storage/decision-rows.d.ts +54 -0
  290. package/dist/src/storage/decision-rows.js +72 -0
  291. package/dist/src/storage/decision-snapshots.d.ts +17 -0
  292. package/dist/src/storage/decision-snapshots.js +25 -0
  293. package/dist/src/storage/domain-changes.d.ts +48 -0
  294. package/dist/src/storage/domain-changes.js +213 -0
  295. package/dist/src/storage/domain-rows.d.ts +85 -0
  296. package/dist/src/storage/domain-rows.js +129 -0
  297. package/dist/src/storage/domain-schema.d.ts +32 -0
  298. package/dist/src/storage/domain-schema.js +193 -0
  299. package/dist/src/storage/effect-changes.d.ts +5 -0
  300. package/dist/src/storage/effect-changes.js +105 -0
  301. package/dist/src/storage/effect-rows.d.ts +67 -0
  302. package/dist/src/storage/effect-rows.js +74 -0
  303. package/dist/src/storage/effect-schema.d.ts +1 -0
  304. package/dist/src/storage/effect-schema.js +59 -0
  305. package/dist/src/storage/statements.d.ts +9 -0
  306. package/dist/src/storage/statements.js +8 -0
  307. package/dist/src/submission.d.ts +42 -0
  308. package/dist/src/submission.js +71 -0
  309. package/dist/src/turn-profile.d.ts +13 -0
  310. package/dist/src/turn-profile.js +100 -0
  311. package/dist/src/workflow-admission.d.ts +45 -0
  312. package/dist/src/workflow-admission.js +151 -0
  313. package/dist/src/workflow-contracts.d.ts +27 -0
  314. package/dist/src/workflow-contracts.js +88 -0
  315. package/dist/src/workflow-declaration.d.ts +11 -0
  316. package/dist/src/workflow-declaration.js +57 -0
  317. package/dist/src/workflow-resources.d.ts +8 -0
  318. package/dist/src/workflow-resources.js +14 -0
  319. package/dist/src/workflows.d.ts +5 -0
  320. package/dist/src/workflows.js +3 -0
  321. package/dist/tools/compile-workflows.d.ts +1 -0
  322. package/dist/tools/compile-workflows.js +33 -0
  323. package/dist/tools/self-host-processes.d.ts +10 -0
  324. package/dist/tools/self-host-processes.js +151 -0
  325. package/dist/tools/self-host-workflows.d.ts +15 -0
  326. package/dist/tools/self-host-workflows.js +78 -0
  327. package/dist/tools/self-host.d.ts +1 -0
  328. package/dist/tools/self-host.js +261 -0
  329. package/dist/tools/self-update-host.d.ts +6 -0
  330. package/dist/tools/self-update-host.js +41 -0
  331. package/dist/tools/self-update.d.ts +10 -0
  332. package/dist/tools/self-update.js +105 -0
  333. package/dist/tools/workflow-manifest.d.ts +3 -0
  334. package/dist/tools/workflow-manifest.js +34 -0
  335. package/dist/workflows/develop-prd.d.ts +7 -0
  336. package/dist/workflows/develop-prd.js +97 -0
  337. package/dist/workflows/develop-ticket.d.ts +15 -0
  338. package/dist/workflows/develop-ticket.js +301 -0
  339. package/dist/workflows/issue-labels.d.ts +14 -0
  340. package/dist/workflows/issue-labels.js +36 -0
  341. package/package.json +82 -75
  342. package/dist/abstract_gpt/index.js +0 -55
  343. package/dist/cloving_gpt/adapters/Adapter.js +0 -2
  344. package/dist/cloving_gpt/adapters/azureopenai.js +0 -69
  345. package/dist/cloving_gpt/adapters/claude.js +0 -128
  346. package/dist/cloving_gpt/adapters/gemini.js +0 -135
  347. package/dist/cloving_gpt/adapters/gpt4all.js +0 -29
  348. package/dist/cloving_gpt/adapters/index.js +0 -2
  349. package/dist/cloving_gpt/adapters/mistral.js +0 -128
  350. package/dist/cloving_gpt/adapters/ollama.js +0 -128
  351. package/dist/cloving_gpt/adapters/openai.js +0 -100
  352. package/dist/cloving_gpt/index.js +0 -192
  353. package/dist/commands/analyze.js +0 -47
  354. package/dist/commands/chat.js +0 -14
  355. package/dist/commands/check.js +0 -7
  356. package/dist/commands/commit.js +0 -44
  357. package/dist/commands/config.js +0 -167
  358. package/dist/commands/describe.js +0 -235
  359. package/dist/commands/generate/code.js +0 -21
  360. package/dist/commands/generate/commit.js +0 -11
  361. package/dist/commands/generate/context.js +0 -82
  362. package/dist/commands/generate/docs.js +0 -11
  363. package/dist/commands/generate/documentation.js +0 -11
  364. package/dist/commands/generate/fizzbuzz.js +0 -35
  365. package/dist/commands/generate/init.js +0 -15
  366. package/dist/commands/generate/review.js +0 -11
  367. package/dist/commands/generate/sh.js +0 -95
  368. package/dist/commands/generate/shell.js +0 -11
  369. package/dist/commands/generate/unit_tests.js +0 -11
  370. package/dist/commands/init.js +0 -13
  371. package/dist/commands/models.js +0 -22
  372. package/dist/commands/project/build.js +0 -88
  373. package/dist/commands/project/complete.js +0 -12
  374. package/dist/commands/project/init.js +0 -82
  375. package/dist/commands/project/plan.js +0 -108
  376. package/dist/commands/proxy.js +0 -11
  377. package/dist/commands/review.js +0 -50
  378. package/dist/commands/tokens.js +0 -75
  379. package/dist/commands/unit_tests.js +0 -150
  380. package/dist/commands/update.js +0 -7
  381. package/dist/file2.js +0 -4
  382. package/dist/index.js +0 -136
  383. package/dist/managers/BlockManager.js +0 -120
  384. package/dist/managers/ChatManager.js +0 -653
  385. package/dist/managers/ChunkManager.js +0 -32
  386. package/dist/managers/CodeManager.js +0 -185
  387. package/dist/managers/CommitManager.js +0 -78
  388. package/dist/managers/DocsManager.js +0 -88
  389. package/dist/managers/DocumentationManager.js +0 -114
  390. package/dist/managers/InitManager.js +0 -230
  391. package/dist/managers/ProxyManager.js +0 -210
  392. package/dist/managers/ReviewManager.js +0 -131
  393. package/dist/managers/ShellManager.js +0 -163
  394. package/dist/managers/StreamManager.js +0 -308
  395. package/dist/managers/UnitTestManager.js +0 -243
  396. package/dist/managers/src/managers/ProxyManager.js +0 -1
  397. package/dist/newfile.js +0 -2
  398. package/dist/package.json +0 -86
  399. package/dist/utils/command_utils.js +0 -384
  400. package/dist/utils/config_utils.js +0 -249
  401. package/dist/utils/gitUtils.js +0 -42
  402. package/dist/utils/git_utils.js +0 -217
  403. package/dist/utils/modelUtils.js +0 -7
  404. package/dist/utils/model_utils.js +0 -7
  405. package/dist/utils/prompt_utils.js +0 -333
  406. package/dist/utils/prompts/CODEGEN_COULDNT_APPLY.md +0 -5
  407. package/dist/utils/prompts/CODEGEN_EXAMPLES.md +0 -82
  408. package/dist/utils/prompts/CODEGEN_INSTRUCTIONS.md +0 -43
  409. package/dist/utils/prompts/DOCS_INSTRUCTIONS.md +0 -9
  410. package/dist/utils/prompts/INIT_INSTRUCTIONS.md +0 -132
  411. package/dist/utils/prompts/REVIEW_INSTRUCTIONS.md +0 -49
  412. package/dist/utils/prompts/SHELL_INSTRUCTIONS.md +0 -15
  413. package/dist/utils/prompts/SPECIAL_FILES.md +0 -66
  414. package/dist/utils/prompts/index.js +0 -27
  415. package/dist/utils/string_utils.js +0 -505
  416. package/dist/utils/types.js +0 -2
@@ -0,0 +1,74 @@
1
+ import { integer, optionalInteger, optionalText, text, } from "./domain-rows.js";
2
+ export const budgetColumns = "run_id, effect_limit, spent, capabilities, exhausted_sequence";
3
+ export const operationColumns = "operation_id, run_id, capability, method, target, payload, input_digest, units, lease_key, recovery_limit, status, reason, attempts, receipt, worker, result, requested_sequence, wait_sequence, settled_sequence";
4
+ export const leaseColumns = "resource_key, operation_id, generation, expires_at, state, granted_sequence";
5
+ export const evidenceColumns = "sequence, run_id, operation_id, disposition, reason";
6
+ export const stopColumns = "operation_id, run_id, sequence";
7
+ export function budgetRow(row) {
8
+ return {
9
+ runId: text(row, "run_id"),
10
+ effectLimit: integer(row, "effect_limit"),
11
+ spent: integer(row, "spent"),
12
+ capabilities: text(row, "capabilities"),
13
+ exhaustedSequence: optionalInteger(row, "exhausted_sequence"),
14
+ };
15
+ }
16
+ export function operationRow(row) {
17
+ return {
18
+ operationId: text(row, "operation_id"),
19
+ runId: text(row, "run_id"),
20
+ capability: text(row, "capability"),
21
+ method: text(row, "method"),
22
+ target: text(row, "target"),
23
+ payload: text(row, "payload"),
24
+ inputDigest: text(row, "input_digest"),
25
+ units: integer(row, "units"),
26
+ leaseKey: text(row, "lease_key"),
27
+ recoveryLimit: integer(row, "recovery_limit"),
28
+ status: text(row, "status"),
29
+ reason: optionalText(row, "reason"),
30
+ attempts: integer(row, "attempts"),
31
+ receipt: optionalText(row, "receipt"),
32
+ worker: optionalText(row, "worker"),
33
+ result: optionalText(row, "result"),
34
+ requestedSequence: integer(row, "requested_sequence"),
35
+ waitSequence: optionalInteger(row, "wait_sequence"),
36
+ settledSequence: optionalInteger(row, "settled_sequence"),
37
+ };
38
+ }
39
+ export function leaseRow(row) {
40
+ return {
41
+ resourceKey: text(row, "resource_key"),
42
+ operationId: text(row, "operation_id"),
43
+ generation: integer(row, "generation"),
44
+ expiresAt: text(row, "expires_at"),
45
+ state: text(row, "state"),
46
+ grantedSequence: integer(row, "granted_sequence"),
47
+ };
48
+ }
49
+ export function evidenceRow(row) {
50
+ return {
51
+ sequence: integer(row, "sequence"),
52
+ runId: text(row, "run_id"),
53
+ operationId: text(row, "operation_id"),
54
+ disposition: text(row, "disposition"),
55
+ reason: optionalText(row, "reason"),
56
+ };
57
+ }
58
+ export function stopRow(row) {
59
+ return {
60
+ operationId: text(row, "operation_id"),
61
+ runId: text(row, "run_id"),
62
+ sequence: integer(row, "sequence"),
63
+ };
64
+ }
65
+ export async function loadEffects(connection) {
66
+ const rows = (sql) => connection.all(sql);
67
+ return {
68
+ budgets: (await rows(`SELECT ${budgetColumns} FROM run_budgets ORDER BY run_id`)).map(budgetRow),
69
+ operations: (await rows(`SELECT ${operationColumns} FROM operations ORDER BY requested_sequence, operation_id`)).map(operationRow),
70
+ leases: (await rows(`SELECT ${leaseColumns} FROM leases ORDER BY resource_key`)).map(leaseRow),
71
+ evidence: (await rows(`SELECT ${evidenceColumns} FROM effect_evidence ORDER BY sequence`)).map(evidenceRow),
72
+ stops: (await rows(`SELECT ${stopColumns} FROM stopped_operations ORDER BY operation_id`)).map(stopRow),
73
+ };
74
+ }
@@ -0,0 +1 @@
1
+ export declare const effectSchema = "\nCREATE TABLE run_budgets (\n run_id TEXT PRIMARY KEY REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,\n effect_limit INTEGER NOT NULL,\n spent INTEGER NOT NULL CHECK (spent <= effect_limit),\n capabilities TEXT NOT NULL,\n exhausted_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED\n) STRICT;\nCREATE TABLE operations (\n operation_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,\n capability TEXT NOT NULL,\n method TEXT NOT NULL,\n target TEXT NOT NULL,\n payload TEXT NOT NULL,\n input_digest TEXT NOT NULL,\n units INTEGER NOT NULL,\n lease_key TEXT NOT NULL,\n recovery_limit INTEGER NOT NULL,\n status TEXT NOT NULL,\n reason TEXT,\n attempts INTEGER NOT NULL,\n receipt TEXT,\n worker TEXT,\n result TEXT,\n requested_sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,\n wait_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,\n settled_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED\n) STRICT;\nCREATE INDEX operations_run ON operations (run_id);\nCREATE INDEX operations_waiting ON operations (wait_sequence) WHERE status = 'waiting';\nCREATE TABLE leases (\n resource_key TEXT PRIMARY KEY,\n operation_id TEXT NOT NULL REFERENCES operations (operation_id) DEFERRABLE INITIALLY DEFERRED,\n generation INTEGER NOT NULL CHECK (generation > 0),\n expires_at TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('held', 'expired', 'released')),\n granted_sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED\n) STRICT;\nCREATE INDEX leases_due ON leases (expires_at) WHERE state = 'held';\nCREATE TABLE effect_evidence (\n sequence INTEGER PRIMARY KEY REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,\n run_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n disposition TEXT NOT NULL,\n reason TEXT\n) STRICT;\nCREATE TABLE stopped_operations (\n operation_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,\n sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED\n) STRICT;\nCREATE TABLE dispatch_attempts (\n effect_id TEXT PRIMARY KEY REFERENCES deliveries (effect_id) DEFERRABLE INITIALLY DEFERRED,\n purpose TEXT NOT NULL,\n lease_generation INTEGER,\n authority_epoch INTEGER NOT NULL\n) STRICT;\n";
@@ -0,0 +1,59 @@
1
+ export const effectSchema = `
2
+ CREATE TABLE run_budgets (
3
+ run_id TEXT PRIMARY KEY REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,
4
+ effect_limit INTEGER NOT NULL,
5
+ spent INTEGER NOT NULL CHECK (spent <= effect_limit),
6
+ capabilities TEXT NOT NULL,
7
+ exhausted_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED
8
+ ) STRICT;
9
+ CREATE TABLE operations (
10
+ operation_id TEXT PRIMARY KEY,
11
+ run_id TEXT NOT NULL REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,
12
+ capability TEXT NOT NULL,
13
+ method TEXT NOT NULL,
14
+ target TEXT NOT NULL,
15
+ payload TEXT NOT NULL,
16
+ input_digest TEXT NOT NULL,
17
+ units INTEGER NOT NULL,
18
+ lease_key TEXT NOT NULL,
19
+ recovery_limit INTEGER NOT NULL,
20
+ status TEXT NOT NULL,
21
+ reason TEXT,
22
+ attempts INTEGER NOT NULL,
23
+ receipt TEXT,
24
+ worker TEXT,
25
+ result TEXT,
26
+ requested_sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,
27
+ wait_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,
28
+ settled_sequence INTEGER REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED
29
+ ) STRICT;
30
+ CREATE INDEX operations_run ON operations (run_id);
31
+ CREATE INDEX operations_waiting ON operations (wait_sequence) WHERE status = 'waiting';
32
+ CREATE TABLE leases (
33
+ resource_key TEXT PRIMARY KEY,
34
+ operation_id TEXT NOT NULL REFERENCES operations (operation_id) DEFERRABLE INITIALLY DEFERRED,
35
+ generation INTEGER NOT NULL CHECK (generation > 0),
36
+ expires_at TEXT NOT NULL,
37
+ state TEXT NOT NULL CHECK (state IN ('held', 'expired', 'released')),
38
+ granted_sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED
39
+ ) STRICT;
40
+ CREATE INDEX leases_due ON leases (expires_at) WHERE state = 'held';
41
+ CREATE TABLE effect_evidence (
42
+ sequence INTEGER PRIMARY KEY REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED,
43
+ run_id TEXT NOT NULL,
44
+ operation_id TEXT NOT NULL,
45
+ disposition TEXT NOT NULL,
46
+ reason TEXT
47
+ ) STRICT;
48
+ CREATE TABLE stopped_operations (
49
+ operation_id TEXT PRIMARY KEY,
50
+ run_id TEXT NOT NULL REFERENCES runs (run_id) DEFERRABLE INITIALLY DEFERRED,
51
+ sequence INTEGER NOT NULL REFERENCES events (sequence) DEFERRABLE INITIALLY DEFERRED
52
+ ) STRICT;
53
+ CREATE TABLE dispatch_attempts (
54
+ effect_id TEXT PRIMARY KEY REFERENCES deliveries (effect_id) DEFERRABLE INITIALLY DEFERRED,
55
+ purpose TEXT NOT NULL,
56
+ lease_generation INTEGER,
57
+ authority_epoch INTEGER NOT NULL
58
+ ) STRICT;
59
+ `;
@@ -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,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,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
+ }
@@ -0,0 +1,27 @@
1
+ export interface DevelopmentInput {
2
+ readonly cycleId: string;
3
+ }
4
+ export type CycleOutcome = {
5
+ readonly kind: "waiting_for_decision";
6
+ readonly cycleId: string;
7
+ readonly decisionId: string;
8
+ } | {
9
+ readonly kind: "blocked";
10
+ readonly cycleId: string;
11
+ readonly reason: string;
12
+ readonly evidenceId: string;
13
+ } | {
14
+ readonly kind: "handoff_requested";
15
+ readonly cycleId: string;
16
+ readonly promotionId: string;
17
+ };
18
+ export type Validation<Value> = {
19
+ readonly kind: "valid";
20
+ readonly value: Value;
21
+ } | {
22
+ readonly kind: "invalid";
23
+ readonly reason: string;
24
+ };
25
+ export declare function isBlockedReason(value: unknown): value is string;
26
+ export declare function validateDevelopmentInput(value: unknown): Validation<DevelopmentInput>;
27
+ export declare function validateCycleOutcome(value: unknown, input: DevelopmentInput): Validation<CycleOutcome>;