@intentius/chant 0.124.26 → 0.124.28

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 (459) hide show
  1. package/README.md +1 -1
  2. package/dist/__golden__/wave-loop/fan-out-gated.json +8 -0
  3. package/dist/__golden__/wave-loop/fan-out-no-members.json +4 -0
  4. package/dist/__golden__/wave-loop/fan-out-only.json +6 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  6. package/dist/__golden__/wave-loop/op-cost-member.json +3 -0
  7. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  8. package/dist/__golden__/wave-loop/op-held-on.json +2 -0
  9. package/dist/__golden__/wave-loop/op-hooks-held.json +2 -0
  10. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  11. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  12. package/dist/__golden__/wave-loop/op-hooks-share.json +3 -0
  13. package/dist/__golden__/wave-loop/op-per-run.json +7 -0
  14. package/dist/__golden__/wave-loop/op-pr-review.json +7 -0
  15. package/dist/__golden__/wave-loop/op-sealed.json +3 -0
  16. package/dist/__golden__/wave-loop/op-spend.json +3 -0
  17. package/dist/__golden__/wave-loop/op-wave-commands.json +7 -0
  18. package/dist/__golden__/wave-loop/op-wide-waiting.json +4 -0
  19. package/dist/change-set-graph.d.ts +56 -0
  20. package/dist/change-set-graph.d.ts.map +1 -0
  21. package/dist/change-set-graph.js +128 -0
  22. package/dist/change-set.d.ts +52 -3
  23. package/dist/change-set.d.ts.map +1 -1
  24. package/dist/change-set.js +35 -4
  25. package/dist/chant-version.d.ts +9 -0
  26. package/dist/chant-version.d.ts.map +1 -0
  27. package/dist/chant-version.js +16 -0
  28. package/dist/cli/commands/build.d.ts +8 -0
  29. package/dist/cli/commands/build.d.ts.map +1 -1
  30. package/dist/cli/commands/build.js +9 -8
  31. package/dist/cli/commands/check-lexicon-docs.d.ts.map +1 -1
  32. package/dist/cli/commands/check-lexicon-docs.js +30 -2
  33. package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
  34. package/dist/cli/commands/check-lexicon.js +13 -2
  35. package/dist/cli/commands/init-lexicon/templates/docs.d.ts +4 -1
  36. package/dist/cli/commands/init-lexicon/templates/docs.d.ts.map +1 -1
  37. package/dist/cli/commands/init-lexicon/templates/docs.js +6 -6
  38. package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
  39. package/dist/cli/commands/init-lexicon.js +17 -8
  40. package/dist/cli/handlers/approve.d.ts.map +1 -1
  41. package/dist/cli/handlers/approve.js +19 -4
  42. package/dist/cli/handlers/build.d.ts.map +1 -1
  43. package/dist/cli/handlers/build.js +28 -0
  44. package/dist/cli/handlers/change-set.d.ts +10 -0
  45. package/dist/cli/handlers/change-set.d.ts.map +1 -1
  46. package/dist/cli/handlers/change-set.js +51 -1
  47. package/dist/cli/handlers/fan-out.d.ts +1 -1
  48. package/dist/cli/handlers/fan-out.d.ts.map +1 -1
  49. package/dist/cli/handlers/fan-out.js +14 -3
  50. package/dist/cli/handlers/pr.d.ts +8 -2
  51. package/dist/cli/handlers/pr.d.ts.map +1 -1
  52. package/dist/cli/handlers/pr.js +148 -24
  53. package/dist/cli/handlers/promote.d.ts.map +1 -1
  54. package/dist/cli/handlers/promote.js +256 -21
  55. package/dist/cli/handlers/release.d.ts +34 -0
  56. package/dist/cli/handlers/release.d.ts.map +1 -0
  57. package/dist/cli/handlers/release.js +203 -0
  58. package/dist/cli/handlers/run.d.ts +28 -2
  59. package/dist/cli/handlers/run.d.ts.map +1 -1
  60. package/dist/cli/handlers/run.js +170 -13
  61. package/dist/cli/main.d.ts.map +1 -1
  62. package/dist/cli/main.js +88 -13
  63. package/dist/cli/mcp/workspace-tools.js +1 -1
  64. package/dist/cli/parse-args.d.ts.map +1 -1
  65. package/dist/cli/parse-args.js +49 -3
  66. package/dist/cli/registry.d.ts +29 -3
  67. package/dist/cli/registry.d.ts.map +1 -1
  68. package/dist/cli/run-events.d.ts +29 -0
  69. package/dist/cli/run-events.d.ts.map +1 -0
  70. package/dist/cli/run-events.js +47 -0
  71. package/dist/cli/version.d.ts +3 -5
  72. package/dist/cli/version.d.ts.map +1 -1
  73. package/dist/cli/version.js +3 -13
  74. package/dist/codegen/docs-in-site.d.ts +71 -0
  75. package/dist/codegen/docs-in-site.d.ts.map +1 -0
  76. package/dist/codegen/docs-in-site.js +177 -0
  77. package/dist/codegen/docs-types.d.ts +14 -1
  78. package/dist/codegen/docs-types.d.ts.map +1 -1
  79. package/dist/codegen/docs.d.ts +18 -1
  80. package/dist/codegen/docs.d.ts.map +1 -1
  81. package/dist/codegen/docs.js +40 -7
  82. package/dist/codegen/rehype-base-url.mjs +15 -9
  83. package/dist/components/auto-release.d.ts +4 -1
  84. package/dist/components/auto-release.d.ts.map +1 -1
  85. package/dist/components/auto-release.js +2 -0
  86. package/dist/components/cli-support.d.ts +6 -0
  87. package/dist/components/cli-support.d.ts.map +1 -1
  88. package/dist/components/cli-support.js +10 -9
  89. package/dist/components/driver.d.ts +42 -9
  90. package/dist/components/driver.d.ts.map +1 -1
  91. package/dist/components/driver.js +81 -54
  92. package/dist/components/fan-out-run.d.ts +7 -0
  93. package/dist/components/fan-out-run.d.ts.map +1 -1
  94. package/dist/components/fan-out-run.js +35 -26
  95. package/dist/components/pr-run.d.ts +11 -0
  96. package/dist/components/pr-run.d.ts.map +1 -1
  97. package/dist/components/pr-run.js +20 -1
  98. package/dist/components/promote-order.d.ts +38 -0
  99. package/dist/components/promote-order.d.ts.map +1 -0
  100. package/dist/components/promote-order.js +62 -0
  101. package/dist/components/promote.d.ts +15 -2
  102. package/dist/components/promote.d.ts.map +1 -1
  103. package/dist/components/promote.js +17 -0
  104. package/dist/components/release-compile.d.ts +133 -0
  105. package/dist/components/release-compile.d.ts.map +1 -0
  106. package/dist/components/release-compile.js +376 -0
  107. package/dist/components/release-gate.d.ts +125 -0
  108. package/dist/components/release-gate.d.ts.map +1 -0
  109. package/dist/components/release-gate.js +282 -0
  110. package/dist/components/release-promote.d.ts +96 -0
  111. package/dist/components/release-promote.d.ts.map +1 -0
  112. package/dist/components/release-promote.js +204 -0
  113. package/dist/components/run-progress.d.ts +7 -0
  114. package/dist/components/run-progress.d.ts.map +1 -1
  115. package/dist/components/wave-plan.d.ts +3 -1
  116. package/dist/components/wave-plan.d.ts.map +1 -1
  117. package/dist/components/wave-plan.js +1 -1
  118. package/dist/config.d.ts +7 -0
  119. package/dist/config.d.ts.map +1 -1
  120. package/dist/config.js +1 -0
  121. package/dist/index.d.ts +1 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +2 -0
  124. package/dist/lifecycle/change-set-store.d.ts +67 -0
  125. package/dist/lifecycle/change-set-store.d.ts.map +1 -0
  126. package/dist/lifecycle/change-set-store.js +96 -0
  127. package/dist/lifecycle/commit-sha.d.ts +13 -0
  128. package/dist/lifecycle/commit-sha.d.ts.map +1 -0
  129. package/dist/lifecycle/commit-sha.js +21 -0
  130. package/dist/lifecycle/gate-change-set.d.ts +69 -0
  131. package/dist/lifecycle/gate-change-set.d.ts.map +1 -0
  132. package/dist/lifecycle/gate-change-set.js +106 -0
  133. package/dist/lifecycle/gate-ledger.d.ts +49 -1
  134. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  135. package/dist/lifecycle/gate-ledger.js +18 -0
  136. package/dist/lifecycle/release-cut.d.ts +107 -0
  137. package/dist/lifecycle/release-cut.d.ts.map +1 -0
  138. package/dist/lifecycle/release-cut.js +273 -0
  139. package/dist/lifecycle/release-ledger.d.ts +54 -0
  140. package/dist/lifecycle/release-ledger.d.ts.map +1 -1
  141. package/dist/lifecycle/release-ledger.js +53 -20
  142. package/dist/lifecycle/release-store.d.ts +190 -0
  143. package/dist/lifecycle/release-store.d.ts.map +1 -0
  144. package/dist/lifecycle/release-store.js +318 -0
  145. package/dist/lifecycle/run-ledger.d.ts +4 -0
  146. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  147. package/dist/lifecycle/run-ledger.js +2 -0
  148. package/dist/op/activities/change-coverage.d.ts.map +1 -1
  149. package/dist/op/activities/change-coverage.js +4 -2
  150. package/dist/op/activities/source-release.d.ts.map +1 -1
  151. package/dist/op/activities/source-release.js +7 -3
  152. package/dist/op/activities/source-rollback.d.ts.map +1 -1
  153. package/dist/op/activities/source-rollback.js +7 -3
  154. package/dist/op/activity-registry.d.ts +6 -3
  155. package/dist/op/activity-registry.d.ts.map +1 -1
  156. package/dist/op/activity-registry.js +7 -5
  157. package/dist/op/discover.d.ts.map +1 -1
  158. package/dist/op/discover.js +14 -7
  159. package/dist/op/gate-name.d.ts +11 -2
  160. package/dist/op/gate-name.d.ts.map +1 -1
  161. package/dist/op/gate-name.js +12 -3
  162. package/dist/op/gate-run-locator.d.ts +22 -0
  163. package/dist/op/gate-run-locator.d.ts.map +1 -1
  164. package/dist/op/gate-run-locator.js +31 -0
  165. package/dist/op/gate.d.ts +27 -3
  166. package/dist/op/gate.d.ts.map +1 -1
  167. package/dist/op/gate.js +57 -3
  168. package/dist/op/local-executor.d.ts +36 -1
  169. package/dist/op/local-executor.d.ts.map +1 -1
  170. package/dist/op/local-executor.js +158 -52
  171. package/dist/op/op-waves-run.d.ts.map +1 -1
  172. package/dist/op/op-waves-run.js +4 -0
  173. package/dist/op/run-live.d.ts +2 -0
  174. package/dist/op/run-live.d.ts.map +1 -1
  175. package/dist/op/run-live.js +1 -1
  176. package/dist/op/runtime.d.ts +46 -0
  177. package/dist/op/runtime.d.ts.map +1 -1
  178. package/dist/op/runtimes/local.d.ts.map +1 -1
  179. package/dist/op/runtimes/local.js +12 -2
  180. package/dist/point-decision.d.ts +2 -0
  181. package/dist/point-decision.d.ts.map +1 -1
  182. package/dist/point-decision.js +9 -2
  183. package/dist/run-event-store.d.ts +77 -0
  184. package/dist/run-event-store.d.ts.map +1 -0
  185. package/dist/run-event-store.js +204 -0
  186. package/dist/run-event-stream.d.ts +132 -0
  187. package/dist/run-event-stream.d.ts.map +1 -0
  188. package/dist/run-event-stream.js +238 -0
  189. package/dist/run-event.d.ts +267 -0
  190. package/dist/run-event.d.ts.map +1 -0
  191. package/dist/run-event.js +207 -0
  192. package/dist/wave-runtime.mjs +225 -242
  193. package/dist/workspace/__fixtures__/run-event-check.d.ts +19 -0
  194. package/dist/workspace/__fixtures__/run-event-check.d.ts.map +1 -0
  195. package/dist/workspace/__fixtures__/run-event-check.js +59 -0
  196. package/dist/workspace/change-set-show.d.ts +56 -0
  197. package/dist/workspace/change-set-show.d.ts.map +1 -0
  198. package/dist/workspace/change-set-show.js +54 -0
  199. package/dist/workspace/change-set-show.schema.json +102 -0
  200. package/dist/workspace/change-set.schema.json +28 -1
  201. package/dist/workspace/changes-cli.d.ts.map +1 -1
  202. package/dist/workspace/changes-cli.js +10 -1
  203. package/dist/workspace/changes.d.ts +37 -0
  204. package/dist/workspace/changes.d.ts.map +1 -1
  205. package/dist/workspace/changes.js +49 -2
  206. package/dist/workspace/changes.schema.json +135 -0
  207. package/dist/workspace/ci-green-cli.d.ts +19 -4
  208. package/dist/workspace/ci-green-cli.d.ts.map +1 -1
  209. package/dist/workspace/ci-green-cli.js +75 -12
  210. package/dist/workspace/ci-green-forge.d.ts +20 -3
  211. package/dist/workspace/ci-green-forge.d.ts.map +1 -1
  212. package/dist/workspace/ci-green-forge.js +6 -4
  213. package/dist/workspace/ci-green-workflow.d.ts +11 -0
  214. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  215. package/dist/workspace/ci-green-workflow.js +6 -0
  216. package/dist/workspace/ci-green.d.ts +273 -13
  217. package/dist/workspace/ci-green.d.ts.map +1 -1
  218. package/dist/workspace/ci-green.js +449 -38
  219. package/dist/workspace/ci-last-green.schema.json +32 -2
  220. package/dist/workspace/ci-list.schema.json +525 -0
  221. package/dist/workspace/commit-links.d.ts +85 -0
  222. package/dist/workspace/commit-links.d.ts.map +1 -0
  223. package/dist/workspace/commit-links.js +163 -0
  224. package/dist/workspace/declaration.d.ts +19 -0
  225. package/dist/workspace/declaration.d.ts.map +1 -1
  226. package/dist/workspace/declaration.js +1 -1
  227. package/dist/workspace/declaration.schema.json +12 -0
  228. package/dist/workspace/identity-gate-rule.d.ts +37 -0
  229. package/dist/workspace/identity-gate-rule.d.ts.map +1 -1
  230. package/dist/workspace/identity-gate-rule.js +72 -7
  231. package/dist/workspace/identity.d.ts +12 -0
  232. package/dist/workspace/identity.d.ts.map +1 -1
  233. package/dist/workspace/identity.js +13 -1
  234. package/dist/workspace/intent.d.ts +6 -1
  235. package/dist/workspace/intent.d.ts.map +1 -1
  236. package/dist/workspace/intent.js +51 -1
  237. package/dist/workspace/ls.d.ts +4 -0
  238. package/dist/workspace/ls.d.ts.map +1 -1
  239. package/dist/workspace/ls.js +2 -0
  240. package/dist/workspace/ls.schema.json +3 -1
  241. package/dist/workspace/member-pipeline.d.ts +6 -0
  242. package/dist/workspace/member-pipeline.d.ts.map +1 -1
  243. package/dist/workspace/member-pipeline.js +6 -0
  244. package/dist/workspace/promotion-order.d.ts +41 -0
  245. package/dist/workspace/promotion-order.d.ts.map +1 -0
  246. package/dist/workspace/promotion-order.js +95 -0
  247. package/dist/workspace/reason-codes.d.ts +2 -0
  248. package/dist/workspace/reason-codes.d.ts.map +1 -1
  249. package/dist/workspace/reason-codes.js +4 -1
  250. package/dist/workspace/releases.d.ts +72 -0
  251. package/dist/workspace/releases.d.ts.map +1 -0
  252. package/dist/workspace/releases.js +94 -0
  253. package/dist/workspace/releases.schema.json +391 -0
  254. package/dist/workspace/run-event.schema.json +288 -0
  255. package/dist/workspace/status-gates.d.ts +26 -1
  256. package/dist/workspace/status-gates.d.ts.map +1 -1
  257. package/dist/workspace/status-gates.js +31 -2
  258. package/dist/workspace/status-stewards.d.ts +4 -0
  259. package/dist/workspace/status-stewards.d.ts.map +1 -1
  260. package/dist/workspace/status-stewards.js +2 -0
  261. package/dist/workspace/status.d.ts +39 -0
  262. package/dist/workspace/status.d.ts.map +1 -1
  263. package/dist/workspace/status.js +48 -1
  264. package/dist/workspace/status.schema.json +70 -1
  265. package/dist/workspace/trust/ci-tag-statement.d.ts +102 -0
  266. package/dist/workspace/trust/ci-tag-statement.d.ts.map +1 -0
  267. package/dist/workspace/trust/ci-tag-statement.js +123 -0
  268. package/dist/workspace/trust/op-run-statement.d.ts +91 -0
  269. package/dist/workspace/trust/op-run-statement.d.ts.map +1 -0
  270. package/dist/workspace/trust/op-run-statement.js +143 -0
  271. package/dist/workspace/trust/rotation.d.ts +18 -2
  272. package/dist/workspace/trust/rotation.d.ts.map +1 -1
  273. package/dist/workspace/trust/rotation.js +65 -16
  274. package/dist/workspace/trust/seal.d.ts +11 -0
  275. package/dist/workspace/trust/seal.d.ts.map +1 -1
  276. package/dist/workspace/trust/seal.js +9 -0
  277. package/dist/workspace/trust/ssh-commit.d.ts.map +1 -1
  278. package/dist/workspace/trust/ssh-commit.js +10 -10
  279. package/package.json +1 -1
  280. package/src/__golden__/wave-loop/fan-out-gated.json +8 -0
  281. package/src/__golden__/wave-loop/fan-out-no-members.json +4 -0
  282. package/src/__golden__/wave-loop/fan-out-only.json +6 -0
  283. package/src/__golden__/wave-loop/op-by-apply-hold.json +2 -0
  284. package/src/__golden__/wave-loop/op-cost-member.json +3 -0
  285. package/src/__golden__/wave-loop/op-held-on-before-apply.json +1 -0
  286. package/src/__golden__/wave-loop/op-held-on.json +2 -0
  287. package/src/__golden__/wave-loop/op-hooks-held.json +2 -0
  288. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +2 -0
  289. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +3 -0
  290. package/src/__golden__/wave-loop/op-hooks-share.json +3 -0
  291. package/src/__golden__/wave-loop/op-per-run.json +7 -0
  292. package/src/__golden__/wave-loop/op-pr-review.json +7 -0
  293. package/src/__golden__/wave-loop/op-sealed.json +3 -0
  294. package/src/__golden__/wave-loop/op-spend.json +3 -0
  295. package/src/__golden__/wave-loop/op-wave-commands.json +7 -0
  296. package/src/__golden__/wave-loop/op-wide-waiting.json +4 -0
  297. package/src/change-set-graph.test.ts +72 -0
  298. package/src/change-set-graph.ts +133 -0
  299. package/src/change-set.ts +76 -6
  300. package/src/chant-version.ts +16 -0
  301. package/src/cli/commands/build.ts +19 -8
  302. package/src/cli/commands/check-lexicon-docs.test.ts +51 -0
  303. package/src/cli/commands/check-lexicon-docs.ts +39 -2
  304. package/src/cli/commands/check-lexicon.ts +14 -2
  305. package/src/cli/commands/init-lexicon/templates/docs.ts +7 -6
  306. package/src/cli/commands/init-lexicon.test.ts +25 -0
  307. package/src/cli/commands/init-lexicon.ts +18 -8
  308. package/src/cli/compiled-cli.e2e.test.ts +31 -6
  309. package/src/cli/handlers/approve-release.test.ts +80 -0
  310. package/src/cli/handlers/approve.ts +18 -2
  311. package/src/cli/handlers/build.test.ts +52 -0
  312. package/src/cli/handlers/build.ts +29 -0
  313. package/src/cli/handlers/change-set.ts +49 -1
  314. package/src/cli/handlers/fan-out.test.ts +48 -0
  315. package/src/cli/handlers/fan-out.ts +15 -3
  316. package/src/cli/handlers/operator.test.ts +37 -0
  317. package/src/cli/handlers/pr.test.ts +194 -0
  318. package/src/cli/handlers/pr.ts +168 -34
  319. package/src/cli/handlers/promote.test.ts +389 -5
  320. package/src/cli/handlers/promote.ts +279 -20
  321. package/src/cli/handlers/release-implicit.e2e.test.ts +153 -0
  322. package/src/cli/handlers/release.e2e.test.ts +85 -0
  323. package/src/cli/handlers/release.ts +206 -0
  324. package/src/cli/handlers/run-auto-release.test.ts +71 -0
  325. package/src/cli/handlers/run-events-cmd.test.ts +92 -0
  326. package/src/cli/handlers/run.test.ts +30 -0
  327. package/src/cli/handlers/run.ts +176 -15
  328. package/src/cli/main.test.ts +7 -0
  329. package/src/cli/main.ts +88 -13
  330. package/src/cli/mcp/never-over-mcp.test.ts +2 -0
  331. package/src/cli/mcp/workspace-tools.ts +1 -1
  332. package/src/cli/parse-args.ts +37 -3
  333. package/src/cli/registry.ts +29 -3
  334. package/src/cli/run-events.ts +54 -0
  335. package/src/cli/version.ts +3 -13
  336. package/src/codegen/docs-in-site.test.ts +166 -0
  337. package/src/codegen/docs-in-site.ts +182 -0
  338. package/src/codegen/docs-site/AgentPrompt.astro +26 -1
  339. package/src/codegen/docs-types.ts +14 -1
  340. package/src/codegen/docs.ts +60 -7
  341. package/src/codegen/rehype-base-url.d.mts +3 -1
  342. package/src/codegen/rehype-base-url.mjs +15 -9
  343. package/src/codegen/rehype-base-url.test.ts +34 -0
  344. package/src/components/auto-release.test.ts +21 -0
  345. package/src/components/auto-release.ts +6 -1
  346. package/src/components/cli-support.test.ts +82 -0
  347. package/src/components/cli-support.ts +16 -9
  348. package/src/components/driver.ts +129 -56
  349. package/src/components/fan-out-run.ts +56 -35
  350. package/src/components/pr-run.ts +30 -1
  351. package/src/components/promote-order.test.ts +90 -0
  352. package/src/components/promote-order.ts +75 -0
  353. package/src/components/promote.test.ts +10 -1
  354. package/src/components/promote.ts +26 -1
  355. package/src/components/release-compile.test.ts +147 -0
  356. package/src/components/release-compile.ts +445 -0
  357. package/src/components/release-gate.test.ts +215 -0
  358. package/src/components/release-gate.ts +341 -0
  359. package/src/components/release-promote.test.ts +159 -0
  360. package/src/components/release-promote.ts +232 -0
  361. package/src/components/run-progress.ts +7 -0
  362. package/src/components/wave-plan.ts +1 -1
  363. package/src/config.ts +7 -1
  364. package/src/index.ts +2 -0
  365. package/src/lifecycle/change-set-store.test.ts +217 -0
  366. package/src/lifecycle/change-set-store.ts +112 -0
  367. package/src/lifecycle/commit-sha.ts +23 -0
  368. package/src/lifecycle/gate-change-set.e2e.test.ts +122 -0
  369. package/src/lifecycle/gate-change-set.ts +133 -0
  370. package/src/lifecycle/gate-ledger.test.ts +33 -0
  371. package/src/lifecycle/gate-ledger.ts +66 -1
  372. package/src/lifecycle/release-cut-signed.test.ts +180 -0
  373. package/src/lifecycle/release-cut.test.ts +411 -0
  374. package/src/lifecycle/release-cut.ts +367 -0
  375. package/src/lifecycle/release-ledger.test.ts +14 -0
  376. package/src/lifecycle/release-ledger.ts +85 -17
  377. package/src/lifecycle/release-store.ts +423 -0
  378. package/src/lifecycle/run-ledger.test.ts +10 -0
  379. package/src/lifecycle/run-ledger.ts +6 -0
  380. package/src/op/activities/change-coverage.ts +4 -1
  381. package/src/op/activities/source-release.ts +8 -3
  382. package/src/op/activities/source-rollback.ts +8 -4
  383. package/src/op/activity-registry.ts +7 -5
  384. package/src/op/commit-run-gate-deploy-join.test.ts +117 -0
  385. package/src/op/discover-root.test.ts +39 -0
  386. package/src/op/discover.ts +15 -8
  387. package/src/op/gate-name.ts +13 -3
  388. package/src/op/gate-release.test.ts +126 -0
  389. package/src/op/gate-run-locator.test.ts +110 -0
  390. package/src/op/gate-run-locator.ts +35 -0
  391. package/src/op/gate.ts +88 -6
  392. package/src/op/local-executor.ts +207 -52
  393. package/src/op/op-waves-run.ts +4 -0
  394. package/src/op/run-events.test.ts +166 -0
  395. package/src/op/run-live.ts +1 -1
  396. package/src/op/runtime.ts +39 -0
  397. package/src/op/runtimes/local.test.ts +16 -0
  398. package/src/op/runtimes/local.ts +13 -2
  399. package/src/point-decision.ts +12 -2
  400. package/src/run-event-store.test.ts +144 -0
  401. package/src/run-event-store.ts +213 -0
  402. package/src/run-event-stream.test.ts +175 -0
  403. package/src/run-event-stream.ts +306 -0
  404. package/src/run-event.test.ts +277 -0
  405. package/src/run-event.ts +451 -0
  406. package/src/wave-loop-golden.test.ts +9 -0
  407. package/src/workspace/__fixtures__/run-event-check.ts +58 -0
  408. package/src/workspace/ancestry-index.test.ts +93 -0
  409. package/src/workspace/change-set-show.schema.json +102 -0
  410. package/src/workspace/change-set-show.ts +72 -0
  411. package/src/workspace/change-set.schema.json +28 -1
  412. package/src/workspace/changes-cli.ts +10 -1
  413. package/src/workspace/changes.schema.json +135 -0
  414. package/src/workspace/changes.test.ts +1 -1
  415. package/src/workspace/changes.ts +84 -2
  416. package/src/workspace/ci-green-cli.ts +75 -13
  417. package/src/workspace/ci-green-forge.ts +24 -4
  418. package/src/workspace/ci-green-runs.test.ts +242 -0
  419. package/src/workspace/ci-green-signed.test.ts +302 -0
  420. package/src/workspace/ci-green-workflow.test.ts +16 -0
  421. package/src/workspace/ci-green-workflow.ts +12 -0
  422. package/src/workspace/ci-green.test.ts +131 -2
  423. package/src/workspace/ci-green.ts +624 -42
  424. package/src/workspace/ci-last-green.schema.json +32 -2
  425. package/src/workspace/ci-list.schema.json +525 -0
  426. package/src/workspace/commit-links.test.ts +279 -0
  427. package/src/workspace/commit-links.ts +183 -0
  428. package/src/workspace/declaration.schema.json +12 -0
  429. package/src/workspace/declaration.ts +22 -2
  430. package/src/workspace/identity-gate-rule.ts +91 -7
  431. package/src/workspace/identity.ts +14 -1
  432. package/src/workspace/intent.ts +48 -1
  433. package/src/workspace/ls.schema.json +3 -1
  434. package/src/workspace/ls.ts +6 -0
  435. package/src/workspace/member-pipeline.test.ts +17 -0
  436. package/src/workspace/member-pipeline.ts +9 -0
  437. package/src/workspace/promotion-order.ts +97 -0
  438. package/src/workspace/read-contract.e2e.test.ts +4 -1
  439. package/src/workspace/reason-codes.test.ts +2 -1
  440. package/src/workspace/reason-codes.ts +4 -1
  441. package/src/workspace/releases.schema.json +391 -0
  442. package/src/workspace/releases.test.ts +108 -0
  443. package/src/workspace/releases.ts +122 -0
  444. package/src/workspace/run-event.schema.json +288 -0
  445. package/src/workspace/status-contract.test.ts +52 -1
  446. package/src/workspace/status-gates.ts +56 -1
  447. package/src/workspace/status-stewards.ts +6 -0
  448. package/src/workspace/status.schema.json +70 -1
  449. package/src/workspace/status.ts +80 -1
  450. package/src/workspace/trust/ci-tag-statement.ts +151 -0
  451. package/src/workspace/trust/op-run-statement.ts +148 -0
  452. package/src/workspace/trust/rotation.ts +61 -14
  453. package/src/workspace/trust/seal.ts +10 -0
  454. package/src/workspace/trust/ssh-commit.ts +10 -9
  455. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/astro.config.mjs +0 -14
  456. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/package.json +0 -16
  457. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content/docs/index.mdx +0 -8
  458. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/src/content.config.ts +0 -15
  459. package/src/cli/commands/__fixtures__/init-lexicon-output/docs/tsconfig.json +0 -10
@@ -1,8 +1,9 @@
1
1
  import { type OpConfig } from "../../op/types.js";
2
2
  import { type StepRecord } from "../../op/local-executor.js";
3
3
  import type { CommandContext } from "../registry.js";
4
+ import type { RunEvent } from "../../run-event.js";
4
5
  import type { DriverComponentResult } from "../../components/driver.js";
5
- import type { ReleaseRecord } from "../../lifecycle/release-ledger.js";
6
+ import { type ReleaseRecord, type RunOrigin } from "../../lifecycle/release-ledger.js";
6
7
  /**
7
8
  * The exit code a run that stopped at an unapproved gate uses (#2119).
8
9
  * Deliberately not 1: a gate is a standing fact waiting on a human, and a CI
@@ -26,6 +27,21 @@ export declare function completedRunExitCode(opName: string, config: Pick<OpConf
26
27
  export declare function runOpList(ctx: CommandContext): Promise<number>;
27
28
  export declare function runOpStatus(ctx: CommandContext): Promise<number>;
28
29
  export declare function runOpLog(ctx: CommandContext): Promise<number>;
30
+ /** One event as a line for a person: its time, its type, where it is and how it ended. */
31
+ export declare function humanRunEventLine(e: RunEvent): string;
32
+ /**
33
+ * `chant run events <run> [--json] [--follow]` (#4042): the events a run on
34
+ * this host kept, replayed. `<run>` is a run id, or the name of an Op or a
35
+ * component selection, for which the newest stored run stands. A settled run
36
+ * and a run in progress both replay what is in the file; `--follow` goes on
37
+ * from there until the run settles. `--json` prints the stored lines as they
38
+ * were written; without it each event is one line for a person.
39
+ *
40
+ * The exit code is the replayed run's verdict (0, 1, or 3 for a run waiting
41
+ * on a person). A replay of a run still going, and a follow cut short by
42
+ * Ctrl-C, exit 0.
43
+ */
44
+ export declare function runOpEvents(ctx: CommandContext): Promise<number>;
29
45
  /**
30
46
  * `chant run approve <op> <gate> [--approver] [--url] [--note]` (#2121) — the
31
47
  * rename of `chant run signal`, and a different act.
@@ -48,6 +64,16 @@ export declare function runOpSignalRenamed(ctx: CommandContext): Promise<number>
48
64
  /** `chant run cancel <name>` — asks the resolved runtime (#2121) to stop the Op's active run. */
49
65
  export declare function runOpCancel(ctx: CommandContext): Promise<number>;
50
66
  export declare function runOp(ctx: CommandContext): Promise<number>;
67
+ /**
68
+ * The run id and origin an auto-recorded release names (#4020): the CI run
69
+ * when the process is in CI, so the release and the gate it passed (which
70
+ * records the CI run id) name the same run, else `localId` with the `local`
71
+ * origin.
72
+ */
73
+ export declare function autoReleaseRun(localId: string): {
74
+ runId: string;
75
+ runOrigin: RunOrigin;
76
+ };
51
77
  /**
52
78
  * After a successful `chant run --components` (local executor), auto-emit
53
79
  * one release record per successfully deployed component that published a
@@ -83,7 +109,7 @@ export declare function runOp(ctx: CommandContext): Promise<number>;
83
109
  *
84
110
  * Returns the records it wrote, for `--digest-file` (#2602).
85
111
  */
86
- export declare function recordAutoReleasesForRun(results: DriverComponentResult[], env: string, runId: string, disabled: boolean): Promise<ReleaseRecord[]>;
112
+ export declare function recordAutoReleasesForRun(results: DriverComponentResult[], env: string, runId: string, disabled: boolean, runOrigin?: RunOrigin): Promise<ReleaseRecord[]>;
87
113
  /**
88
114
  * `chant run --components <name|all|a,b,c> [--env <env>]` (#585) — the
89
115
  * interpret driver's CLI entrypoint, and since #2116 the only component run
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAkD,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAU1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYlD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AA+BjC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GAAG,OAAO,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAChC,eAAe,EAAE,OAAO,GAAG,SAAS,EACpC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GACzC,MAAM,CAQR;AAuLD,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAuED,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAetE;AA8BD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAenE;AA2CD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQvE;AAID,iGAAiG;AACjG,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBtE;AAsMD,wBAAsB,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BhE;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,EAAE,EAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC,CA0C1B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAmMD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AA4OD,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAkD,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAU1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAIlG;;;;;GAKG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AA+BjC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GAAG,OAAO,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAChC,eAAe,EAAE,OAAO,GAAG,SAAS,EACpC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GACzC,MAAM,CAQR;AAuLD,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAuED,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAetE;AA8BD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAenE;AA2CD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAKrD;AAOD;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CtE;AAOD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAQvE;AAID,iGAAiG;AACjG,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBtE;AAsMD,wBAAsB,KAAK,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BhE;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAEvF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,EAAE,EAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EACjB,SAAS,GAAE,SAA8B,GACxC,OAAO,CAAC,aAAa,EAAE,CAAC,CA6C1B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;AAkND;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAyPD,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAMjE"}
@@ -23,9 +23,13 @@ import { LIFECYCLE_LOCAL_NOTE, isLifecycleLocalNote } from "../../lifecycle/loca
23
23
  import { ledgerRecordingOff, noRecordEndNote, noRecordStartNote, resetNoRecordLedger, NO_RECORD_ENV } from "../../lifecycle/no-record.js";
24
24
  import { renderDriverHuman, renderDriverJson } from "../../components/driver-output.js";
25
25
  import { ndjsonProgressSink } from "../../components/run-progress.js";
26
+ import { findStoredRun, readRunEvents } from "../../run-event-store.js";
27
+ import { openCliRunEvents, refusesBothStreams, stdoutLine } from "../run-events.js";
26
28
  import { maybeRecordAutoRelease } from "../../components/auto-release.js";
27
29
  import { maybePersistBuildManifest } from "../../components/manifest-persistence.js";
28
30
  import { isComponentList } from "../../components/cli-support.js";
31
+ import { resolveCiRun } from "../../lifecycle/release-ledger.js";
32
+ import { gateAdmission, gateApprover } from "../../components/promote.js";
29
33
  import { runOpGenerate } from "./run-generate.js";
30
34
  /**
31
35
  * The exit code a run that stopped at an unapproved gate uses (#2119).
@@ -396,6 +400,78 @@ async function runOpLogOnRuntime(ctx, name) {
396
400
  }
397
401
  return 0;
398
402
  }
403
+ // ── chant run events <run> ───────────────────────────────────────────────────
404
+ /** One event as a line for a person: its time, its type, where it is and how it ended. */
405
+ export function humanRunEventLine(e) {
406
+ const x = e;
407
+ const where = [x.component, x.phase, x.step].filter((v) => typeof v === "string").join("/");
408
+ const detail = [where, typeof x.status === "string" ? x.status : "", typeof x.error === "string" ? x.error : ""].filter(Boolean).join(" ");
409
+ return `${String(x.at ?? "")} ${String(x.type).padEnd(16)}${detail}`.trimEnd();
410
+ }
411
+ /** The exit code a run's verdict maps to: `chant run`'s own (0 ok, 1 failed, 3 waiting on a person). */
412
+ function exitOfSettle(status) {
413
+ return status === "ok" ? 0 : status === "gated" || status === "waiting" ? 3 : 1;
414
+ }
415
+ /**
416
+ * `chant run events <run> [--json] [--follow]` (#4042): the events a run on
417
+ * this host kept, replayed. `<run>` is a run id, or the name of an Op or a
418
+ * component selection, for which the newest stored run stands. A settled run
419
+ * and a run in progress both replay what is in the file; `--follow` goes on
420
+ * from there until the run settles. `--json` prints the stored lines as they
421
+ * were written; without it each event is one line for a person.
422
+ *
423
+ * The exit code is the replayed run's verdict (0, 1, or 3 for a run waiting
424
+ * on a person). A replay of a run still going, and a follow cut short by
425
+ * Ctrl-C, exit 0.
426
+ */
427
+ export async function runOpEvents(ctx) {
428
+ const ref = ctx.args.extraPositional;
429
+ if (!ref) {
430
+ console.error(formatError({ message: "A run id or an Op name is required: chant run events <run>" }));
431
+ return 1;
432
+ }
433
+ if (ctx.args.on !== undefined && ctx.args.on !== "local") {
434
+ console.error(formatError({
435
+ message: `run events reads the events kept on this host, so --on ${ctx.args.on} has none to read`,
436
+ hint: "A run hosted off this host is read once its in-flight state is off-host (#3990).",
437
+ }));
438
+ return 1;
439
+ }
440
+ const cwd = resolve(".");
441
+ let stored = await findStoredRun(cwd, ref);
442
+ if (!stored && ctx.args.follow) {
443
+ // The run may be starting: give it a moment to open its file.
444
+ const deadline = Date.now() + RUN_EVENTS_WAIT_MS;
445
+ while (!stored && Date.now() < deadline) {
446
+ await new Promise((r) => setTimeout(r, 100));
447
+ stored = await findStoredRun(cwd, ref);
448
+ }
449
+ }
450
+ if (!stored) {
451
+ console.error(formatError({
452
+ message: `No events are kept for "${ref}" on this host`,
453
+ hint: "A run keeps its events when it records to the ledger (not under --no-record), and a command other than `chant run <op>` keeps them under --events-json. Chant 0.124.28 and newer write them.",
454
+ }));
455
+ return 1;
456
+ }
457
+ const controller = new AbortController();
458
+ const onSigint = () => controller.abort();
459
+ process.on("SIGINT", onSigint);
460
+ try {
461
+ const settle = await readRunEvents(stored.file, (event, line) => {
462
+ if (ctx.args.json)
463
+ process.stdout.write(line);
464
+ else
465
+ console.log(humanRunEventLine(event));
466
+ }, { follow: ctx.args.follow === true, signal: controller.signal });
467
+ return settle ? exitOfSettle(settle.status) : 0;
468
+ }
469
+ finally {
470
+ process.removeListener("SIGINT", onSigint);
471
+ }
472
+ }
473
+ /** How long `--follow` waits for a run's file to appear. */
474
+ const RUN_EVENTS_WAIT_MS = 5000;
399
475
  // ── chant run approve <op> <gate> ────────────────────────────────────────────
400
476
  /**
401
477
  * `chant run approve <op> <gate> [--approver] [--url] [--note]` (#2121) — the
@@ -688,6 +764,8 @@ export async function runOp(ctx) {
688
764
  }));
689
765
  return 1;
690
766
  }
767
+ if (refusesBothStreams(ctx.args))
768
+ return 1;
691
769
  if (ctx.args.components)
692
770
  return runOpComponents(ctx);
693
771
  if (ctx.args.report) {
@@ -700,6 +778,15 @@ export async function runOp(ctx) {
700
778
  return runOpOnRuntime(ctx);
701
779
  }
702
780
  // ── Auto-release recording post-run (#597) ──────────────────────────────────
781
+ /**
782
+ * The run id and origin an auto-recorded release names (#4020): the CI run
783
+ * when the process is in CI, so the release and the gate it passed (which
784
+ * records the CI run id) name the same run, else `localId` with the `local`
785
+ * origin.
786
+ */
787
+ export function autoReleaseRun(localId) {
788
+ return resolveCiRun() ?? { runId: localId, runOrigin: { forge: "local" } };
789
+ }
703
790
  /**
704
791
  * After a successful `chant run --components` (local executor), auto-emit
705
792
  * one release record per successfully deployed component that published a
@@ -735,7 +822,7 @@ export async function runOp(ctx) {
735
822
  *
736
823
  * Returns the records it wrote, for `--digest-file` (#2602).
737
824
  */
738
- export async function recordAutoReleasesForRun(results, env, runId, disabled) {
825
+ export async function recordAutoReleasesForRun(results, env, runId, disabled, runOrigin = { forge: "local" }) {
739
826
  const recorded = [];
740
827
  for (const componentResult of results) {
741
828
  if (!componentResult.ok)
@@ -746,8 +833,11 @@ export async function recordAutoReleasesForRun(results, env, runId, disabled) {
746
833
  success: true,
747
834
  records: componentResult.records,
748
835
  runId,
749
- // A local-executor id resolves nowhere — say so in a field (#2045).
750
- runOrigin: { forge: "local" },
836
+ // A local-executor id resolves nowhere, and says so in a field (#2045). A run in CI names the CI run.
837
+ runOrigin,
838
+ // #1035, #4020: who approved at the gate and which resolution admitted the deploy.
839
+ ...(gateApprover(componentResult) ? { approver: gateApprover(componentResult) } : {}),
840
+ ...(gateAdmission(componentResult) ? { admission: gateAdmission(componentResult) } : {}),
751
841
  }, { disabled });
752
842
  if (!outcome.recorded && outcome.reason === "error") {
753
843
  console.error(formatWarning({
@@ -909,6 +999,10 @@ async function runComponentSelection(ctx) {
909
999
  // `undefined` and every `onProgress?.(...)` call in the driver is a no-op —
910
1000
  // behavior is byte-for-byte unchanged from before this flag existed.
911
1001
  const onProgress = ctx.args.progressJson ? ndjsonProgressSink() : undefined;
1002
+ // `--events-json` (#4041): the run-event stream instead. The run is named by
1003
+ // the id its release records carry, so the two join.
1004
+ const release = autoReleaseRun(`local-${Date.now()}`);
1005
+ const events = await openCliRunEvents(ctx.args, { kind: "component", name: selector, runId: release.runId, cwd: projectPath });
912
1006
  // A list (#3950) pulls in what its components depend on; say which ones and
913
1007
  // in what order before the first one runs. stderr, so --json and
914
1008
  // --progress-json keep stdout to themselves.
@@ -919,14 +1013,29 @@ async function runComponentSelection(ctx) {
919
1013
  console.error(formatInfo(`added as dependencies: ${plan.added.join(", ")}`));
920
1014
  }
921
1015
  : undefined;
922
- const result = await runtime.runComponents(projectPath, selector, {
923
- env: ctx.args.env,
924
- componentOutputs: seededOutputs,
925
- onProgress,
926
- sandbox: ctx.args.sandbox,
927
- buildParams: paramsResolution.provenance,
928
- ...(onPlan ? { onPlan } : {}),
929
- });
1016
+ let result;
1017
+ try {
1018
+ result = await runtime.runComponents(projectPath, selector, {
1019
+ env: ctx.args.env,
1020
+ componentOutputs: seededOutputs,
1021
+ onProgress,
1022
+ ...(events ? { onRunEvent: events.emit } : {}),
1023
+ sandbox: ctx.args.sandbox,
1024
+ buildParams: paramsResolution.provenance,
1025
+ ...(onPlan ? { onPlan } : {}),
1026
+ });
1027
+ }
1028
+ catch (err) {
1029
+ events?.settle("failed", err instanceof Error ? err.message : String(err));
1030
+ throw err;
1031
+ }
1032
+ // A run that never reached its components (a bad selector, a cycle) still ends its stream.
1033
+ if (result.success)
1034
+ events?.settle("ok");
1035
+ else if (result.gated)
1036
+ events?.settle("gated");
1037
+ else
1038
+ events?.settle("failed", result.error);
930
1039
  // Dump the accumulated outputs for a downstream job to seed from. Written
931
1040
  // even on failure (partial outputs) so a resumed run still has what completed.
932
1041
  if (ctx.args.dumpOutputs && result.run) {
@@ -990,7 +1099,7 @@ async function runComponentSelection(ctx) {
990
1099
  if (result.success && result.run) {
991
1100
  // #3955: a run that records nothing has no release to report either.
992
1101
  const disabled = resolveAutoReleaseDisabled(config, ctx.args.noReleaseRecord) || ledgerRecordingOff();
993
- const recorded = await recordAutoReleasesForRun(result.run.results, env, `local-${Date.now()}`, disabled);
1102
+ const recorded = await recordAutoReleasesForRun(result.run.results, env, release.runId, disabled, release.runOrigin);
994
1103
  // `--digest-file` (#2602): the releases this run recorded, one
995
1104
  // `<component>=<digest>` line each, the form `chant components promote
996
1105
  // --digest` takes. A generated promote job reads it to promote exactly
@@ -1069,6 +1178,14 @@ async function runOpOnResolvedRuntime(ctx) {
1069
1178
  await stewardGate?.release?.();
1070
1179
  return 1;
1071
1180
  }
1181
+ // #4044: a runner key signs the run's record as it settles, so `ci tick`
1182
+ // can count the run. `--key` must be a runner key; the PEM in
1183
+ // CHANT_RUNNER_KEY that is not one leaves the run unsigned, with a warning.
1184
+ const signRecord = await runSignerFor(ctx);
1185
+ if (signRecord === null) {
1186
+ await stewardGate?.release?.();
1187
+ return 1;
1188
+ }
1072
1189
  // `--progress-json` streams one NDJSON StepRecord per settled step, fed by
1073
1190
  // whatever the runtime reports through `progress`.
1074
1191
  const progress = ctx.args.progressJson ? ndjsonProgressSink() : undefined;
@@ -1103,6 +1220,10 @@ async function runOpOnResolvedRuntime(ctx) {
1103
1220
  ...(params ? { params } : {}),
1104
1221
  ...(ctx.args.profile !== undefined ? { profile: ctx.args.profile } : {}),
1105
1222
  progress,
1223
+ // `--events-json` (#4041): the runtime writes the run's events itself,
1224
+ // since it is the one that knows the run's id and where it ran.
1225
+ ...(ctx.args.eventsJson ? { runEvents: stdoutLine } : {}),
1226
+ ...(signRecord ? { signRecord } : {}),
1106
1227
  signal: controller.signal,
1107
1228
  ...(work ? { work } : {}),
1108
1229
  });
@@ -1249,7 +1370,43 @@ async function resolveRunWork(ctx, config, provider) {
1249
1370
  export function runOpUnknown(ctx) {
1250
1371
  console.error(formatError({
1251
1372
  message: `Unknown run subcommand: ${ctx.args.extraPositional ?? ctx.args.path}`,
1252
- hint: "Available: chant run <name>, run list, run status, run approve, run cancel, run log",
1373
+ hint: "Available: chant run <name>, run list, run status, run approve, run cancel, run log, run events",
1253
1374
  }));
1254
1375
  return Promise.resolve(1);
1255
1376
  }
1377
+ /** The variable a runner key is read from, as PEM, as `chant ci tick` reads it (`RUNNER_KEY_ENV` in ../../workspace/ci-green.ts). */
1378
+ const RUNNER_KEY_ENV = "CHANT_RUNNER_KEY";
1379
+ /**
1380
+ * What signs the run's record (#4044): the runner key `--key` names, or the
1381
+ * PEM in `CHANT_RUNNER_KEY`, checked against `.chant/trust.json` at `HEAD`.
1382
+ * Undefined when neither is given. Null, after printing why, when `--key`
1383
+ * is not a runner key; an unusable `CHANT_RUNNER_KEY` only warns, since the
1384
+ * variable may be set for `ci tick` in a job that also runs Ops.
1385
+ */
1386
+ async function runSignerFor(ctx) {
1387
+ const fromFlag = ctx.args.key !== undefined;
1388
+ let pem;
1389
+ try {
1390
+ pem = fromFlag ? readFileSync(resolve(ctx.args.key), "utf-8") : process.env[RUNNER_KEY_ENV] || undefined;
1391
+ }
1392
+ catch (err) {
1393
+ console.error(formatError({ message: `--key ${ctx.args.key}: ${err instanceof Error ? err.message : String(err)}` }));
1394
+ return null;
1395
+ }
1396
+ if (pem === undefined)
1397
+ return undefined;
1398
+ try {
1399
+ // Loaded only when a key is given, so a run without one loads no workspace code (level 0, #2525).
1400
+ const { opRunSigner } = await import("../../workspace/ci-green.js");
1401
+ return opRunSigner(process.cwd(), pem);
1402
+ }
1403
+ catch (err) {
1404
+ const message = err instanceof Error ? err.message : String(err);
1405
+ if (fromFlag) {
1406
+ console.error(formatError({ message: `the run would not be signed: ${message}` }));
1407
+ return null;
1408
+ }
1409
+ console.error(formatWarning({ message: `${RUNNER_KEY_ENV} is set, and the run will not be signed: ${message}` }));
1410
+ return undefined;
1411
+ }
1412
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAKA,OAAO,EAAkB,KAAK,UAAU,EAAmB,MAAM,YAAY,CAAC;AAa9E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAwkCzC;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBzE;AAID;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,UAAU,EA6KvC,CAAC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAKA,OAAO,EAAkB,KAAK,UAAU,EAAmB,MAAM,YAAY,CAAC;AAa9E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAyoCzC;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBzE;AAID;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,UAAU,EAuLvC,CAAC"}
package/dist/cli/main.js CHANGED
@@ -104,6 +104,7 @@ const runOpApprove = lazyHandler(runHandlers, (m) => m.runOpApprove);
104
104
  const runOpSignalRenamed = lazyHandler(runHandlers, (m) => m.runOpSignalRenamed);
105
105
  const runOpCancel = lazyHandler(runHandlers, (m) => m.runOpCancel);
106
106
  const runOpLog = lazyHandler(runHandlers, (m) => m.runOpLog);
107
+ const runOpEvents = lazyHandler(runHandlers, (m) => m.runOpEvents);
107
108
  const runWaveHandlers = () => import("./handlers/run-wave.js");
108
109
  const runOpWaveCommand = lazyHandler(runWaveHandlers, (m) => m.runOpWaveCommand);
109
110
  const operatorHandlers = () => import("./handlers/operator.js");
@@ -214,22 +215,61 @@ Commands:
214
215
  applied) and path. Read-only.
215
216
 
216
217
  CI:
217
- ci last-green [--json] The newest first-parent commit of ci.green's branch
218
- with a ci/green tag and no ci/revoked tag. Reads local
219
- tags only; fetch them first.
220
- ci tick [--dry-run] [--forge github] Tag each commit within ci.green's
221
- window whose required phases all passed ci/green/<sha>,
222
- and revoke a green one that now fails ci/revoked/<sha>.
223
- Reads check runs from the forge, pushes the tags.
218
+ ci last-green [--json] [--from <rev>] The newest first-parent commit of
219
+ ci.green's branch, or of --from, with a ci/green tag
220
+ and no ci/revoked tag. Reads local tags only; fetch
221
+ them first. With ci.green.signedSince, a tag without a
222
+ valid runner statement is ignored and reported.
223
+ ci list [--json] [--limit <n>] [--since <rev>] [--forge github] [--source checks|runs]
224
+ The first-parent commits of ci.green's branch within
225
+ its window, newest first, each green, revoked or
226
+ undecided with its required phases' results. Reads
227
+ local tags; --forge reads check runs for undecided
228
+ commits, and source runs reads the signed Op runs on
229
+ the local chant/lifecycle. --since replaces the window.
230
+ ci tick [--dry-run] [--forge github] [--source checks|runs] [--key <runner key.pem>]
231
+ Tag each commit within ci.green's window whose
232
+ required phases all passed ci/green/<sha>, and revoke
233
+ a green one that now fails ci/revoked/<sha>. Reads
234
+ check runs from the forge, or with source runs
235
+ (ci.green.source or --source) the Op runs on
236
+ chant/lifecycle that a runner key signed. Pushes the
237
+ tags. --key, or the PEM in CHANT_RUNNER_KEY, signs
238
+ each tag with a runner key.
224
239
  ci workflow [--workflow <name>]... [--output <file>] Write
225
240
  [--chant <command>] [--install <command>]
226
241
  [--token-secret <NAME> | --app-id-var <VAR> --app-key-secret <NAME>]
242
+ [--runner-key-secret <NAME>]
227
243
  .github/workflows/chant-ci-green.yml, which runs the
228
244
  tick when a required workflow completes and every 15m.
229
245
  --chant replaces the npx @intentius/chant pin the tick
230
246
  runs; --install adds a step before it. --token-secret,
231
247
  or a GitHub App's id and key, pushes the tags with a
232
248
  token that may tag commits changing workflow files.
249
+ --runner-key-secret hands the tick the runner key it
250
+ signs its tags with.
251
+
252
+ Releases:
253
+ release cut [<label>] [--build <command>] [--param <k=v>] [--params-file <file>]
254
+ [--src <dir>] [-o <file>] [--lexicon <name>] [--sign [<key file>]]
255
+ Cut a release of this member from HEAD, which must
256
+ carry a ci/green tag: compile every environment in
257
+ the config's environments, build the artifacts once,
258
+ and store it on chant/lifecycle under its digest.
259
+ --build runs before each environment's templates are
260
+ read, with CHANT_ENV set; {env} in --params-file is
261
+ replaced by the environment. --sign signs the cut with
262
+ the actor's ssh key; an identity.gates release entry
263
+ requires it. A project with no components releases
264
+ what chant build --env <env> writes: --src <dir> is
265
+ the build root, -o <file> the output (dist/build.yaml),
266
+ --lexicon narrows it.
267
+ release list [--json] Every release of this member with its targets, its
268
+ cuts and the environments that run it.
269
+ release export <label|digest> --env <env> [-o <dir>] [--json]
270
+ Write the files the release recorded for <env>, each
271
+ checked against its digest, at their recorded paths
272
+ under <dir> (default: here), for a deploy to read.
233
273
 
234
274
  Change sets:
235
275
  change-set summary <file> The grouped plan summary of a change-set
@@ -238,6 +278,10 @@ Change sets:
238
278
  replacement, failure and hole named.
239
279
  markdown fits an MR/PR note of --limit
240
280
  characters (default 65536). Read-only.
281
+ change-set show <digest> The change set a pull-request or release gate
282
+ [--member <name>] [--json] bound, stored on
283
+ chant/lifecycle under its digest, each
284
+ entry with its graph node. Read-only.
241
285
 
242
286
  Ops:
243
287
  run <name> Run an Op on the resolved runtime (--on; local by default)
@@ -247,11 +291,18 @@ Ops:
247
291
  its Drift outcome is true (WatchOp failOn: "drift")
248
292
  --no-record: a test run that records nothing on
249
293
  chant/lifecycle and pushes nothing (local runtime)
294
+ --key <runner key.pem>, or the PEM in
295
+ CHANT_RUNNER_KEY: sign the run's record with a runner
296
+ key, so ci tick from runs counts it (#4044)
250
297
  run list List all Ops with the runtime's state for each
251
298
  run status <name> Show the runtime's state for one Op's latest run
252
299
  run approve <op> <gate> Record a gate's resolution and wake the runtime
253
300
  run cancel <name> Cancel the active run (requires --force)
254
301
  run log <name> Show run history for an Op
302
+ run events <run> Replay a run's events kept on this host (a run id, or
303
+ an Op or component name for its newest run). --json
304
+ prints the run-event lines; --follow streams a run in
305
+ progress until run-settle (#4042)
255
306
  run wave --spec <file> --wave <k> Plan, gate and apply wave k of an Op
256
307
  waves spec (#3679): the job a generated waves
257
308
  pipeline runs. --decide plans and decides only;
@@ -286,6 +337,11 @@ Ops:
286
337
  consumer to render live wave/component/phase/step
287
338
  progress instead of tailing raw logs (additive; run
288
339
  semantics/exit code unchanged)
340
+ --events-json: stream the run's events instead, one
341
+ run-event.schema.json line each, with the run id,
342
+ commit and runtime on every line (#4041). Also on
343
+ run <op>, components promote|rollback|redeploy,
344
+ fan-out, pr-plan and pr-apply
289
345
  operator Run scheduled ticks for discovered ConvergeOps
290
346
  locally (#1485): acquire/renew a per-op
291
347
  lease (git ref CAS), tick on --interval, record every
@@ -651,7 +707,13 @@ Workspace (level 1, #2524):
651
707
  the severity (warn by default) and ignore globs. When
652
708
  the declaration at base has writeScope or agents, each
653
709
  commit that writes outside its writer's scope fails
654
- the check (write-scope-member, write-scope-kind)
710
+ the check (write-scope-member, write-scope-kind). Each
711
+ first-parent commit of the range should name its work
712
+ item in a Chant-Record: <work kind>:<id> or a
713
+ Chant-Lease trailer. commit-unlinked is a commit that
714
+ names none, commit-wrongly-linked one whose trailers
715
+ name no work item that exists; both follow the
716
+ severity
655
717
  workspace patch <base>..<head>|<base>...<head>|<commit> [--path <p>...] [--max-bytes <n>] [--json]
656
718
  workspace patch [<commit>] --worktree [--path <p>...] [--max-bytes <n>] [--json]
657
719
  The hunks of a diff, file by file: a range, a work
@@ -774,9 +836,12 @@ Component release ledger + status:
774
836
  byte-for-byte plus a self-describing manifest.json
775
837
  components promote Deploy the digests one environment's release
776
838
  ledger records to another, without a build
777
- (--from <env> --to <env> [--component <name>
778
- [--digest <sha256:...>]]; --dry-run prints the
779
- plan; the target's gates still apply)
839
+ (--to <env> [--from <env>] [--allow-skip]
840
+ [--release <label|digest>]
841
+ [--component <name> [--digest <sha256:...>]];
842
+ --from defaults to the environment before --to
843
+ in the config's environments; --dry-run prints
844
+ the plan; the target's gates still apply)
780
845
  components rollback <env> Redeploy an earlier release of an environment
781
846
  from its recorded digest (--component <name>
782
847
  [--digest <sha256:...>]; defaults to the release
@@ -921,7 +986,7 @@ Options:
921
986
  chant.config.ts's build.sandbox: true; #1045)
922
987
  --param <name=value> (build, graph, run --components, components fan-out,
923
988
  components promote, components rollback,
924
- components redeploy) Bind a
989
+ components redeploy, release cut) Bind a
925
990
  declared build-time parameter (chant.config.ts's buildParams)
926
991
  to a value, for source to read as params.<name>
927
992
  (#1064) instead of process.env — repeatable.
@@ -933,7 +998,7 @@ Options:
933
998
  chant.template.json declares instead (#2627).
934
999
  --params-file <path> (build, graph, run --components, components fan-out,
935
1000
  components promote, components rollback,
936
- components redeploy) JSON file
1001
+ components redeploy, release cut) JSON file
937
1002
  of { "name": value } build-time parameter values
938
1003
  (#1064). Second precedence, after --param.
939
1004
  init --from refuses it: pass --param instead.
@@ -1178,10 +1243,18 @@ export const commandRegistry = [
1178
1243
  { name: "carve status", handler: runCarveStatus },
1179
1244
  // #3573 — which commits passed CI, kept as ci/green and ci/revoked tags (ws-103). Imported on first use.
1180
1245
  { name: "ci last-green", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli.js")).runCiLastGreen(ctx) },
1246
+ { name: "ci list", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli.js")).runCiList(ctx) },
1181
1247
  { name: "ci tick", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli.js")).runCiTick(ctx) },
1182
1248
  { name: "ci workflow", runsNoConfig: true, handler: async (ctx) => (await import("../workspace/ci-green-cli.js")).runCiWorkflow(ctx) },
1249
+ // #4026: the release cut from a green commit (ws-104). Imported on first use.
1250
+ { name: "release cut", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release.js")).runReleaseCut(ctx) },
1251
+ { name: "release list", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release.js")).runReleaseList(ctx) },
1252
+ { name: "release export", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release.js")).runReleaseExport(ctx) },
1253
+ { name: "release compile", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release.js")).runReleaseCompile(ctx) },
1183
1254
  // #3188 — the grouped plan summary of a change-set document. Reads one file; imported on first use.
1184
1255
  { name: "change-set summary", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/change-set.js")).runChangeSetSummary(ctx) },
1256
+ // #4022: the change set a gate bound, read from chant/lifecycle by its digest.
1257
+ { name: "change-set show", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/change-set.js")).runChangeSetShow(ctx) },
1185
1258
  { name: "init", handler: runInit, runsNoConfig: true },
1186
1259
  { name: "init lexicon", handler: runInitLexicon },
1187
1260
  { name: "update", handler: runUpdate },
@@ -1201,6 +1274,7 @@ export const commandRegistry = [
1201
1274
  { name: "run signal", handler: runOpSignalRenamed },
1202
1275
  { name: "run cancel", handler: runOpCancel },
1203
1276
  { name: "run log", handler: runOpLog },
1277
+ { name: "run events", handler: runOpEvents },
1204
1278
  { name: "run wave", handler: runOpWaveCommand },
1205
1279
  // #3683 — start the CI jobs that wait at gates whose approval arrived. Imported on first use.
1206
1280
  { name: "run resume", handler: async (ctx) => (await import("./handlers/gate-resume.js")).runResumeCommand(ctx) },
@@ -1307,6 +1381,7 @@ export const commandRegistry = [
1307
1381
  { name: "dev", handler: runDevUnknown },
1308
1382
  { name: "serve", handler: runServeUnknown },
1309
1383
  { name: "components", handler: runComponentsUnknown },
1384
+ { name: "release", runsNoConfig: true, handler: async (ctx) => (await import("./handlers/release.js")).runReleaseUnknown(ctx) },
1310
1385
  { name: "workspace", handler: async (ctx) => (await import("../workspace/records-cli.js")).runWorkspaceUnknown(ctx) },
1311
1386
  ];
1312
1387
  /**
@@ -100,7 +100,7 @@ export const workspaceReadTools = [
100
100
  },
101
101
  {
102
102
  name: "workspace-changes",
103
- description: "The forward coverage check over a diff: chant workspace check --changes <range> --json (changes.schema.json, #2773). Each changed path with the current records whose constrains cover it, and a change-uncovered or change-out-of-scope finding for each gap, at the severity the declaration's changes block sets. Returns the document unchanged.",
103
+ description: "The forward coverage check over a diff: chant workspace check --changes <range> --json (changes.schema.json, #2773). Each changed path with the current records whose constrains cover it, and a change-uncovered or change-out-of-scope finding for each gap, at the severity the declaration's changes block sets. links says whether each trunk commit of the range names its work item, with commit-unlinked and commit-wrongly-linked findings at the same severity. Returns the document unchanged.",
104
104
  inputSchema: {
105
105
  type: "object",
106
106
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/cli/parse-args.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0E7C;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAitBpD"}
1
+ {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/cli/parse-args.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8E7C;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA+uBpD"}