@intentius/chant 0.124.31 → 0.124.33
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.
- package/bin/chant +7 -2
- package/dist/ci-jobs.d.ts +4 -0
- package/dist/ci-jobs.d.ts.map +1 -1
- package/dist/ci-jobs.js +9 -2
- package/dist/cli/commands/check-lexicon-plugin.d.ts +7 -4
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +10 -7
- package/dist/cli/commands/check-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon.js +18 -12
- package/dist/cli/commands/import.d.ts +10 -0
- package/dist/cli/commands/import.d.ts.map +1 -1
- package/dist/cli/commands/import.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.js +4 -3
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/commands/onboard.js +8 -4
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +2 -1
- package/dist/cli/dependencies.d.ts +18 -0
- package/dist/cli/dependencies.d.ts.map +1 -0
- package/dist/cli/dependencies.js +120 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.js +38 -4
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +12 -4
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +16 -6
- package/dist/cli/handlers/lifecycle-health.d.ts +16 -0
- package/dist/cli/handlers/lifecycle-health.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-health.js +150 -0
- package/dist/cli/handlers/lifecycle.d.ts +26 -0
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.js +1 -1
- package/dist/cli/handlers/lint.d.ts.map +1 -1
- package/dist/cli/handlers/lint.js +6 -0
- package/dist/cli/handlers/operator.d.ts +2 -2
- package/dist/cli/handlers/operator.js +3 -3
- package/dist/cli/handlers/pr.d.ts +16 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +610 -32
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +19 -2
- package/dist/cli/handlers/release.d.ts +16 -1
- package/dist/cli/handlers/release.d.ts.map +1 -1
- package/dist/cli/handlers/release.js +83 -11
- package/dist/cli/handlers/run.d.ts +13 -1
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +38 -15
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +121 -33
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +37 -0
- package/dist/cli/registry.d.ts +29 -6
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +6 -2
- package/dist/codegen/generate-post-synth-barrel.js +2 -2
- package/dist/codegen/lexicon-regen.d.ts +4 -0
- package/dist/codegen/lexicon-regen.d.ts.map +1 -1
- package/dist/codegen/lexicon-regen.js +1 -1
- package/dist/codegen/pinned-upgrade.js +2 -2
- package/dist/components/capability.d.ts +44 -3
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/capability.js +21 -0
- package/dist/components/changed-files.d.ts +7 -1
- package/dist/components/changed-files.d.ts.map +1 -1
- package/dist/components/changed-files.js +9 -1
- package/dist/components/deploy-inputs.d.ts +91 -0
- package/dist/components/deploy-inputs.d.ts.map +1 -0
- package/dist/components/deploy-inputs.js +184 -0
- package/dist/components/driver.d.ts +38 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +56 -6
- package/dist/components/fan-out-record.d.ts +6 -1
- package/dist/components/fan-out-record.d.ts.map +1 -1
- package/dist/components/fan-out-record.js +24 -0
- package/dist/components/fan-out-run.d.ts +20 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +21 -1
- package/dist/components/gate-plan.d.ts +8 -0
- package/dist/components/gate-plan.d.ts.map +1 -1
- package/dist/components/gate-plan.js +6 -0
- package/dist/components/pr-pipeline.d.ts +98 -12
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +146 -23
- package/dist/components/pr-run.d.ts +128 -30
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +290 -70
- package/dist/components/release-compile.d.ts +37 -2
- package/dist/components/release-compile.d.ts.map +1 -1
- package/dist/components/release-compile.js +64 -8
- package/dist/components/release-promote.d.ts +17 -3
- package/dist/components/release-promote.d.ts.map +1 -1
- package/dist/components/release-promote.js +79 -18
- package/dist/components/verbs/bom-writer.d.ts +1 -1
- package/dist/components/verbs/bom-writer.d.ts.map +1 -1
- package/dist/components/verbs/lockfile-sbom-generator.d.ts +20 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -1
- package/dist/components/verbs/lockfile-sbom-generator.js +41 -4
- package/dist/components/wave-plan.d.ts +15 -2
- package/dist/components/wave-plan.d.ts.map +1 -1
- package/dist/components/wave-plan.js +44 -5
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +16 -6
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.js +6 -0
- package/dist/discovery/specifier-resolve.d.ts.map +1 -1
- package/dist/discovery/specifier-resolve.js +8 -2
- package/dist/fold/fold.d.ts.map +1 -1
- package/dist/fold/fold.js +68 -1
- package/dist/fold/subset.d.ts +37 -0
- package/dist/fold/subset.d.ts.map +1 -1
- package/dist/fold/subset.js +88 -0
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +32 -7
- package/dist/health.d.ts +110 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +105 -0
- package/dist/health.schema.json +191 -0
- package/dist/lexicon-module.d.ts +10 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +53 -8
- package/dist/lexicon-plugin-helpers.d.ts.map +1 -1
- package/dist/lexicon-plugin-helpers.js +6 -4
- package/dist/lexicon.d.ts +29 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/affected.d.ts.map +1 -1
- package/dist/lifecycle/affected.js +7 -1
- package/dist/lifecycle/merge-record.d.ts +104 -0
- package/dist/lifecycle/merge-record.d.ts.map +1 -0
- package/dist/lifecycle/merge-record.js +102 -0
- package/dist/lifecycle/publish-attachments.d.ts +8 -5
- package/dist/lifecycle/publish-attachments.d.ts.map +1 -1
- package/dist/lifecycle/publish-attachments.js +27 -13
- package/dist/lifecycle/publish-npm.d.ts +3 -2
- package/dist/lifecycle/publish-npm.d.ts.map +1 -1
- package/dist/lifecycle/publish-npm.js +4 -3
- package/dist/lifecycle/release-at.d.ts +40 -0
- package/dist/lifecycle/release-at.d.ts.map +1 -0
- package/dist/lifecycle/release-at.js +83 -0
- package/dist/lifecycle/release-cut.d.ts.map +1 -1
- package/dist/lifecycle/release-cut.js +23 -12
- package/dist/lifecycle/release-ledger.d.ts +21 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.js +24 -0
- package/dist/lifecycle/release-publish.d.ts +28 -12
- package/dist/lifecycle/release-publish.d.ts.map +1 -1
- package/dist/lifecycle/release-publish.js +29 -17
- package/dist/lifecycle/release-store.d.ts +25 -2
- package/dist/lifecycle/release-store.d.ts.map +1 -1
- package/dist/lifecycle/release-store.js +40 -13
- package/dist/lifecycle/run-ledger.d.ts.map +1 -1
- package/dist/lifecycle/run-ledger.js +1 -0
- package/dist/lifecycle/work-dir.d.ts +45 -0
- package/dist/lifecycle/work-dir.d.ts.map +1 -0
- package/dist/lifecycle/work-dir.js +78 -0
- package/dist/lint/discover.d.ts +17 -9
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +62 -54
- package/dist/lint/rules/op/index.d.ts +2 -1
- package/dist/lint/rules/op/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.js +4 -2
- package/dist/lint/rules/op/ops018-shell-image-digest.d.ts +10 -0
- package/dist/lint/rules/op/ops018-shell-image-digest.d.ts.map +1 -0
- package/dist/lint/rules/op/ops018-shell-image-digest.js +38 -0
- package/dist/module-source.d.ts +57 -0
- package/dist/module-source.d.ts.map +1 -0
- package/dist/module-source.js +104 -0
- package/dist/op/activities/activity-contracts.d.ts +5 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.js +3 -0
- package/dist/op/activities/factory.js +1 -1
- package/dist/op/activities/shell.d.ts +38 -0
- package/dist/op/activities/shell.d.ts.map +1 -1
- package/dist/op/activities/shell.js +89 -3
- package/dist/op/builders.d.ts +7 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +7 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +13 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +3 -0
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +20 -5
- package/dist/op/operator.d.ts +2 -2
- package/dist/op/operator.js +2 -2
- package/dist/op/runtime.d.ts +2 -0
- package/dist/op/runtime.d.ts.map +1 -1
- package/dist/op/steward.d.ts +6 -4
- package/dist/op/steward.d.ts.map +1 -1
- package/dist/op/steward.js +5 -3
- package/dist/op/work-lease-run.d.ts +20 -7
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/op/work-lease-run.js +56 -12
- package/dist/pr-forge.d.ts +10 -0
- package/dist/pr-forge.d.ts.map +1 -1
- package/dist/pr-forge.js +39 -0
- package/dist/pr-loop.d.ts +155 -7
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +137 -11
- package/dist/pr-report-url.d.ts +4 -4
- package/dist/pr-report-url.d.ts.map +1 -1
- package/dist/pr-report-url.js +5 -5
- package/dist/runner-start.d.ts +179 -0
- package/dist/runner-start.d.ts.map +1 -0
- package/dist/runner-start.js +277 -0
- package/dist/ts-loader.d.ts +38 -4
- package/dist/ts-loader.d.ts.map +1 -1
- package/dist/ts-loader.js +190 -16
- package/dist/wave-runtime.mjs +238 -231
- package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts +34 -0
- package/dist/workspace/chant-migrations/fountain-retired-kinds.d.ts.map +1 -0
- package/dist/workspace/chant-migrations/fountain-retired-kinds.js +176 -0
- package/dist/workspace/chant-migrations.d.ts.map +1 -1
- package/dist/workspace/chant-migrations.js +2 -0
- package/dist/workspace/check.schema.json +70 -2
- package/dist/workspace/checks/boxes.d.ts +6 -6
- package/dist/workspace/checks/boxes.js +9 -9
- package/dist/workspace/checks/security.d.ts +35 -0
- package/dist/workspace/checks/security.d.ts.map +1 -0
- package/dist/workspace/checks/security.js +305 -0
- package/dist/workspace/checks.d.ts +2 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +5 -0
- package/dist/workspace/ci-builds.d.ts +163 -0
- package/dist/workspace/ci-builds.d.ts.map +1 -0
- package/dist/workspace/ci-builds.js +315 -0
- package/dist/workspace/ci-green-cli.d.ts +2 -1
- package/dist/workspace/ci-green-cli.d.ts.map +1 -1
- package/dist/workspace/ci-green-cli.js +25 -5
- package/dist/workspace/ci-green-forge.d.ts +18 -4
- package/dist/workspace/ci-green-forge.d.ts.map +1 -1
- package/dist/workspace/ci-green-forge.js +12 -0
- package/dist/workspace/ci-green-workflow.d.ts +55 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +128 -1
- package/dist/workspace/ci-green.d.ts +117 -16
- package/dist/workspace/ci-green.d.ts.map +1 -1
- package/dist/workspace/ci-green.js +358 -43
- package/dist/workspace/ci-last-green.schema.json +49 -0
- package/dist/workspace/ci-list.schema.json +47 -7
- package/dist/workspace/ci-report-url.d.ts +18 -0
- package/dist/workspace/ci-report-url.d.ts.map +1 -0
- package/dist/workspace/ci-report-url.js +33 -0
- package/dist/workspace/ci-run-index.d.ts +13 -1
- package/dist/workspace/ci-run-index.d.ts.map +1 -1
- package/dist/workspace/ci-run-index.js +6 -4
- package/dist/workspace/ci-run-index.schema.json +6 -4
- package/dist/workspace/ci-run.d.ts +85 -6
- package/dist/workspace/ci-run.d.ts.map +1 -1
- package/dist/workspace/ci-run.js +262 -64
- package/dist/workspace/ci-runner-key.d.ts +16 -3
- package/dist/workspace/ci-runner-key.d.ts.map +1 -1
- package/dist/workspace/ci-runner-key.js +30 -10
- package/dist/workspace/ci-runner-start.d.ts +77 -0
- package/dist/workspace/ci-runner-start.d.ts.map +1 -0
- package/dist/workspace/ci-runner-start.js +185 -0
- package/dist/workspace/ci-serve.d.ts +130 -11
- package/dist/workspace/ci-serve.d.ts.map +1 -1
- package/dist/workspace/ci-serve.js +323 -40
- package/dist/workspace/declaration.d.ts +25 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +14 -2
- package/dist/workspace/declaration.schema.json +30 -2
- package/dist/workspace/export.d.ts +1 -1
- package/dist/workspace/export.d.ts.map +1 -1
- package/dist/workspace/export.js +7 -3
- package/dist/workspace/ls.d.ts +8 -1
- package/dist/workspace/ls.d.ts.map +1 -1
- package/dist/workspace/ls.js +2 -1
- package/dist/workspace/ls.schema.json +9 -2
- package/dist/workspace/member-pipeline.d.ts +1 -0
- package/dist/workspace/member-pipeline.d.ts.map +1 -1
- package/dist/workspace/member-pipeline.js +2 -0
- package/dist/workspace/merge-record.schema.json +49 -0
- package/dist/workspace/pin-integrity.d.ts.map +1 -1
- package/dist/workspace/pin-integrity.js +3 -2
- package/dist/workspace/pr-report.schema.json +75 -8
- package/dist/workspace/reason-codes.d.ts +18 -1
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +20 -2
- package/dist/workspace/release-candidates.d.ts +129 -0
- package/dist/workspace/release-candidates.d.ts.map +1 -0
- package/dist/workspace/release-candidates.js +233 -0
- package/dist/workspace/release-candidates.schema.json +353 -0
- package/dist/workspace/run-event.schema.json +3 -1
- package/dist/workspace/security.d.ts +40 -0
- package/dist/workspace/security.d.ts.map +1 -0
- package/dist/workspace/security.js +99 -0
- package/dist/workspace/status.schema.json +3 -1
- package/dist/workspace/write-scope.d.ts +9 -0
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/workspace/write-scope.js +11 -1
- package/package.json +8 -1
- package/src/__fixtures__/pr-loop/pr-apply-wave-waiting.note.golden.md +48 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +1 -1
- package/src/ci-jobs.ts +11 -2
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +3 -3
- package/src/cli/commands/audit.test.ts +2 -2
- package/src/cli/commands/check-lexicon-plugin.test.ts +9 -0
- package/src/cli/commands/check-lexicon-plugin.ts +11 -8
- package/src/cli/commands/check-lexicon.test.ts +1 -1
- package/src/cli/commands/check-lexicon.ts +16 -11
- package/src/cli/commands/import.ts +40 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +4 -3
- package/src/cli/commands/init-lexicon.test.ts +8 -5
- package/src/cli/commands/onboard.test.ts +45 -0
- package/src/cli/commands/onboard.ts +8 -4
- package/src/cli/commands/update.test.ts +6 -0
- package/src/cli/commands/update.ts +4 -1
- package/src/cli/compiled-cli.e2e.test.ts +76 -11
- package/src/cli/dependencies.e2e.test.ts +101 -0
- package/src/cli/dependencies.test.ts +93 -0
- package/src/cli/dependencies.ts +122 -0
- package/src/cli/handlers/build.test.ts +105 -0
- package/src/cli/handlers/build.ts +35 -4
- package/src/cli/handlers/fan-out.test.ts +73 -0
- package/src/cli/handlers/fan-out.ts +11 -4
- package/src/cli/handlers/graph.test.ts +76 -0
- package/src/cli/handlers/graph.ts +19 -12
- package/src/cli/handlers/lifecycle-health.test.ts +123 -0
- package/src/cli/handlers/lifecycle-health.ts +157 -0
- package/src/cli/handlers/lifecycle.ts +1 -1
- package/src/cli/handlers/lint.test.ts +42 -0
- package/src/cli/handlers/lint.ts +6 -0
- package/src/cli/handlers/operator.ts +3 -3
- package/src/cli/handlers/pr-deploy-inputs.test.ts +209 -0
- package/src/cli/handlers/pr-record.test.ts +201 -0
- package/src/cli/handlers/pr-waves.test.ts +449 -0
- package/src/cli/handlers/pr.test.ts +156 -0
- package/src/cli/handlers/pr.ts +648 -33
- package/src/cli/handlers/promote.test.ts +43 -1
- package/src/cli/handlers/promote.ts +19 -3
- package/src/cli/handlers/release-cut-at.e2e.test.ts +115 -0
- package/src/cli/handlers/release-publish-targets.e2e.test.ts +2 -2
- package/src/cli/handlers/release-verify.e2e.test.ts +12 -10
- package/src/cli/handlers/release.e2e.test.ts +19 -28
- package/src/cli/handlers/release.ts +81 -11
- package/src/cli/handlers/run-components-exit.test.ts +99 -0
- package/src/cli/handlers/run-signer.test.ts +79 -0
- package/src/cli/handlers/run.ts +34 -16
- package/src/cli/main.test.ts +18 -0
- package/src/cli/main.ts +120 -33
- package/src/cli/parse-args.ts +28 -0
- package/src/cli/registry.ts +35 -8
- package/src/codegen/generate-post-synth-barrel.ts +2 -2
- package/src/codegen/lexicon-regen.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -2
- package/src/codegen/post-synth-barrel-guards.test.ts +6 -11
- package/src/components/capability.ts +51 -3
- package/src/components/changed-files.test.ts +16 -1
- package/src/components/changed-files.ts +9 -1
- package/src/components/deploy-inputs.test.ts +108 -0
- package/src/components/deploy-inputs.ts +225 -0
- package/src/components/driver.test.ts +36 -1
- package/src/components/driver.ts +87 -4
- package/src/components/fan-out-record.ts +29 -1
- package/src/components/fan-out-run.test.ts +35 -0
- package/src/components/fan-out-run.ts +40 -1
- package/src/components/gate-plan.ts +9 -0
- package/src/components/pr-pipeline.test.ts +100 -0
- package/src/components/pr-pipeline.ts +184 -28
- package/src/components/pr-run.test.ts +323 -18
- package/src/components/pr-run.ts +355 -76
- package/src/components/release-compile.test.ts +34 -0
- package/src/components/release-compile.ts +89 -8
- package/src/components/release-promote.test.ts +55 -2
- package/src/components/release-promote.ts +93 -23
- package/src/components/verbs/bom-writer.ts +1 -1
- package/src/components/verbs/lockfile-sbom-generator.test.ts +36 -0
- package/src/components/verbs/lockfile-sbom-generator.ts +43 -5
- package/src/components/wave-plan.ts +48 -8
- package/src/discovery/fold-host-method.test.ts +87 -0
- package/src/discovery/fold-import.ts +15 -5
- package/src/discovery/fold-package-composite.test.ts +27 -0
- package/src/discovery/fold-specifiers.test.ts +8 -0
- package/src/discovery/sandbox/bundle.ts +6 -0
- package/src/discovery/specifier-resolve.ts +8 -2
- package/src/fold/fold.test.ts +72 -0
- package/src/fold/fold.ts +71 -0
- package/src/fold/subset.test.ts +31 -0
- package/src/fold/subset.ts +99 -0
- package/src/graph-detail.test.ts +57 -0
- package/src/graph-detail.ts +33 -7
- package/src/health.schema.json +191 -0
- package/src/health.test.ts +62 -0
- package/src/health.ts +178 -0
- package/src/lexicon-dist.e2e.test.ts +254 -0
- package/src/lexicon-module.test.ts +47 -0
- package/src/lexicon-module.ts +49 -7
- package/src/lexicon-plugin-helpers.ts +6 -4
- package/src/lexicon.ts +43 -1
- package/src/lifecycle/affected.test.ts +7 -0
- package/src/lifecycle/affected.ts +6 -1
- package/src/lifecycle/merge-record.test.ts +111 -0
- package/src/lifecycle/merge-record.ts +154 -0
- package/src/lifecycle/publish-attachments.ts +25 -13
- package/src/lifecycle/publish-npm.ts +4 -3
- package/src/lifecycle/publish-targets.test.ts +34 -4
- package/src/lifecycle/release-at.test.ts +48 -0
- package/src/lifecycle/release-at.ts +100 -0
- package/src/lifecycle/release-cut.test.ts +41 -0
- package/src/lifecycle/release-cut.ts +22 -11
- package/src/lifecycle/release-ledger.ts +34 -0
- package/src/lifecycle/release-publish.test.ts +43 -13
- package/src/lifecycle/release-publish.ts +38 -18
- package/src/lifecycle/release-store.ts +57 -13
- package/src/lifecycle/run-ledger.test.ts +13 -0
- package/src/lifecycle/run-ledger.ts +1 -0
- package/src/lifecycle/work-dir.test.ts +77 -0
- package/src/lifecycle/work-dir.ts +82 -0
- package/src/lint/discover.test.ts +46 -2
- package/src/lint/discover.ts +55 -49
- package/src/lint/rules/op/index.ts +4 -2
- package/src/lint/rules/op/ops018-shell-image-digest.test.ts +60 -0
- package/src/lint/rules/op/ops018-shell-image-digest.ts +48 -0
- package/src/module-source.test.ts +85 -0
- package/src/module-source.ts +112 -0
- package/src/op/activities/activity-contracts.ts +3 -0
- package/src/op/activities/factory.ts +1 -1
- package/src/op/activities/shell-container.e2e.test.ts +67 -0
- package/src/op/activities/shell.test.ts +44 -1
- package/src/op/activities/shell.ts +110 -3
- package/src/op/builders.ts +7 -0
- package/src/op/discover-root.test.ts +31 -2
- package/src/op/discover.ts +14 -4
- package/src/op/gate.test.ts +30 -0
- package/src/op/gate.ts +3 -0
- package/src/op/op-waves-run.ts +20 -5
- package/src/op/op-waves.test.ts +49 -0
- package/src/op/operator.ts +2 -2
- package/src/op/runtime.ts +2 -0
- package/src/op/step-console.test.ts +4 -2
- package/src/op/steward.ts +6 -4
- package/src/op/work-lease-run.test.ts +88 -2
- package/src/op/work-lease-run.ts +52 -12
- package/src/pr-forge-bundle.test.ts +2 -2
- package/src/pr-forge.test.ts +42 -0
- package/src/pr-forge.ts +40 -0
- package/src/pr-loop-bundle.test.ts +2 -1
- package/src/pr-loop.test.ts +146 -1
- package/src/pr-loop.ts +278 -17
- package/src/pr-report-url.ts +7 -7
- package/src/runner-start-bundle.test.ts +29 -0
- package/src/runner-start.test.ts +179 -0
- package/src/runner-start.ts +329 -0
- package/src/terraform/__fixtures__/advise.test.ts +21 -2
- package/src/ts-loader.test.ts +89 -1
- package/src/ts-loader.ts +180 -13
- package/src/workspace/changes.test.ts +1 -1
- package/src/workspace/chant-migrations/fountain-retired-kinds.test.ts +33 -0
- package/src/workspace/chant-migrations/fountain-retired-kinds.ts +190 -0
- package/src/workspace/chant-migrations.e2e.test.ts +5 -0
- package/src/workspace/chant-migrations.ts +2 -0
- package/src/workspace/check-contract.test.ts +3 -2
- package/src/workspace/check.schema.json +70 -2
- package/src/workspace/checks/boxes.ts +9 -9
- package/src/workspace/checks/security.test.ts +138 -0
- package/src/workspace/checks/security.ts +305 -0
- package/src/workspace/checks.ts +5 -0
- package/src/workspace/ci-builds.e2e.test.ts +208 -0
- package/src/workspace/ci-builds.test.ts +174 -0
- package/src/workspace/ci-builds.ts +385 -0
- package/src/workspace/ci-green-builds.test.ts +180 -0
- package/src/workspace/ci-green-cli.test.ts +54 -0
- package/src/workspace/ci-green-cli.ts +26 -5
- package/src/workspace/ci-green-forge.ts +30 -4
- package/src/workspace/ci-green-runs.test.ts +53 -11
- package/src/workspace/ci-green-workflow.test.ts +84 -1
- package/src/workspace/ci-green-workflow.ts +139 -2
- package/src/workspace/ci-green.test.ts +6 -3
- package/src/workspace/ci-green.ts +408 -48
- package/src/workspace/ci-last-green.schema.json +49 -0
- package/src/workspace/ci-list.schema.json +47 -7
- package/src/workspace/ci-report-url.test.ts +220 -0
- package/src/workspace/ci-report-url.ts +33 -0
- package/src/workspace/ci-run-index.schema.json +6 -4
- package/src/workspace/ci-run-index.test.ts +42 -3
- package/src/workspace/ci-run-index.ts +19 -5
- package/src/workspace/ci-run.test.ts +203 -8
- package/src/workspace/ci-run.ts +295 -63
- package/src/workspace/ci-runner-key.test.ts +55 -17
- package/src/workspace/ci-runner-key.ts +36 -11
- package/src/workspace/ci-runner-start.test.ts +151 -0
- package/src/workspace/ci-runner-start.ts +193 -0
- package/src/workspace/ci-serve-builds.test.ts +86 -0
- package/src/workspace/ci-serve.test.ts +209 -6
- package/src/workspace/ci-serve.ts +341 -42
- package/src/workspace/declaration.schema.json +30 -2
- package/src/workspace/declaration.test.ts +40 -0
- package/src/workspace/declaration.ts +40 -3
- package/src/workspace/export.ts +6 -3
- package/src/workspace/ls.schema.json +9 -2
- package/src/workspace/ls.ts +10 -4
- package/src/workspace/member-pipeline.ts +2 -1
- package/src/workspace/merge-record.schema.json +49 -0
- package/src/workspace/pin-integrity.test.ts +5 -0
- package/src/workspace/pin-integrity.ts +3 -2
- package/src/workspace/pr-report.schema.json +75 -8
- package/src/workspace/reason-codes.test.ts +2 -0
- package/src/workspace/reason-codes.ts +20 -2
- package/src/workspace/release-candidates.schema.json +353 -0
- package/src/workspace/release-candidates.test.ts +106 -0
- package/src/workspace/release-candidates.ts +315 -0
- package/src/workspace/run-event.schema.json +3 -1
- package/src/workspace/security.test.ts +70 -0
- package/src/workspace/security.ts +118 -0
- package/src/workspace/status.schema.json +3 -1
- package/src/workspace/write-scope.test.ts +29 -1
- package/src/workspace/write-scope.ts +12 -1
|
@@ -51,6 +51,8 @@ import { evaluateGate, gitGateLedgerPort } from "../op/gate.js";
|
|
|
51
51
|
import { gateName } from "../op/gate-name.js";
|
|
52
52
|
import { GateNotRecordableError } from "../lifecycle/no-record.js";
|
|
53
53
|
import { componentPlanDigest } from "./gate-plan.js";
|
|
54
|
+
import { componentDeployInputs } from "./deploy-inputs.js";
|
|
55
|
+
import { isPlanMovedError, PLAN_MOVED_EXIT_CODE } from "./capability.js";
|
|
54
56
|
import { isPromotedArtifact } from "./auto-release.js";
|
|
55
57
|
import { gateEventsOf, joinRunEventSinks, progressSinkOf } from "../run-event-stream.js";
|
|
56
58
|
function isGateStep(step) {
|
|
@@ -194,14 +196,32 @@ export function resolveStepInput(input, phaseOutputs, componentOutputs) {
|
|
|
194
196
|
* `undefined`; a plan uses this to say whose outputs it is waiting on.
|
|
195
197
|
*/
|
|
196
198
|
export function unresolvedWiringSources(input, componentOutputs) {
|
|
197
|
-
|
|
199
|
+
return [...new Set(unresolvedWiringReferences(input, componentOutputs).map((r) => r.source))].sort();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Every cross-component reference in `input` that has no value in
|
|
203
|
+
* `componentOutputs`, sorted by `ref` and each once (#3999). A pull
|
|
204
|
+
* request's plan names these when the output is known only after its
|
|
205
|
+
* upstream applies.
|
|
206
|
+
*/
|
|
207
|
+
export function unresolvedWiringReferences(input, componentOutputs) {
|
|
208
|
+
return wiringReferences(input).filter((r) => r.value(componentOutputs) === undefined).map(({ source, ref, publish }) => ({ source, ref, publish }));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Every cross-component reference in `input`, each once, sorted by `ref`,
|
|
212
|
+
* with the value it resolves to against a given outputs map.
|
|
213
|
+
*/
|
|
214
|
+
function wiringReferences(input) {
|
|
215
|
+
const found = new Map();
|
|
198
216
|
const walk = (value) => {
|
|
199
217
|
if (typeof value === "string") {
|
|
200
218
|
if (PRIOR_STEP_REF.test(value))
|
|
201
219
|
return;
|
|
202
220
|
const ref = value.match(COMPONENT_ARTIFACT_REF);
|
|
203
|
-
if (ref
|
|
204
|
-
|
|
221
|
+
if (ref) {
|
|
222
|
+
const [, source, field] = ref;
|
|
223
|
+
found.set(`${source}.publish.${field}`, { source, ref: `${source}.publish.${field}`, publish: true, value: (o) => resolvePath(o[source]?.publish, field) });
|
|
224
|
+
}
|
|
205
225
|
return;
|
|
206
226
|
}
|
|
207
227
|
if (Array.isArray(value)) {
|
|
@@ -211,15 +231,24 @@ export function unresolvedWiringSources(input, componentOutputs) {
|
|
|
211
231
|
if (value && typeof value === "object") {
|
|
212
232
|
if ("stackOutput" in value) {
|
|
213
233
|
const { stack, name } = value.stackOutput;
|
|
214
|
-
|
|
215
|
-
found.add(stack);
|
|
234
|
+
found.set(`${stack}.${name}`, { source: stack, ref: `${stack}.${name}`, publish: name === "publish" || name.startsWith("publish."), value: (o) => resolvePath(o[stack], name) });
|
|
216
235
|
return;
|
|
217
236
|
}
|
|
218
237
|
Object.values(value).forEach(walk);
|
|
219
238
|
}
|
|
220
239
|
};
|
|
221
240
|
walk(input);
|
|
222
|
-
return [...found].sort();
|
|
241
|
+
return [...found.values()].sort((a, b) => a.ref.localeCompare(b.ref));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The cross-component references in `input` that resolve to another value
|
|
245
|
+
* against `now` than against `read`, sorted (#3999). A pull request's apply
|
|
246
|
+
* holds back a member whose plan read `read` when its upstream applied and
|
|
247
|
+
* left `now`.
|
|
248
|
+
*/
|
|
249
|
+
export function movedWiringReferences(input, read, now) {
|
|
250
|
+
const same = (a, b) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
251
|
+
return wiringReferences(input).filter((r) => !same(r.value(read), r.value(now))).map(({ source, ref, publish }) => ({ source, ref, publish }));
|
|
223
252
|
}
|
|
224
253
|
class StepFailure extends Error {
|
|
225
254
|
constructor(records, executed) {
|
|
@@ -280,6 +309,7 @@ async function runCapabilityStep(step, phaseName, ctx, registry, phaseOutputs, c
|
|
|
280
309
|
status: "fail",
|
|
281
310
|
durationMs: Date.now() - start,
|
|
282
311
|
error: errMessage(err),
|
|
312
|
+
...(isPlanMovedError(err) ? { planMoved: true } : {}),
|
|
283
313
|
},
|
|
284
314
|
resolvedInput,
|
|
285
315
|
};
|
|
@@ -541,6 +571,11 @@ async function rollbackExecuted(executed, ctx, registry) {
|
|
|
541
571
|
return records;
|
|
542
572
|
}
|
|
543
573
|
// ── Per-component deploy ─────────────────────────────────────────────────
|
|
574
|
+
/** Whether a component's composition has a gate step anywhere, nested phases and `rollback` included. */
|
|
575
|
+
function hasGateStep(component) {
|
|
576
|
+
const walk = (steps) => steps.some((step) => isGateStep(step) || (Array.isArray(step.steps) && walk(step.steps)));
|
|
577
|
+
return [...component.deploy, ...(component.rollback ?? [])].some((p) => walk(p.steps));
|
|
578
|
+
}
|
|
544
579
|
/**
|
|
545
580
|
* Run one component's `deploy` composition. On terminal failure: unwind every
|
|
546
581
|
* executed step in reverse via its capability's `rollback` (saga
|
|
@@ -581,6 +616,9 @@ export async function runComponentDeploy(component, ctx, registry, componentOutp
|
|
|
581
616
|
component,
|
|
582
617
|
...(ctx.vars ? { vars: ctx.vars } : {}),
|
|
583
618
|
...(release !== undefined ? { release } : {}),
|
|
619
|
+
// #4155: the files the steps deploy from, read where the steps read
|
|
620
|
+
// them. Only a gate reads the digest, so a run with none skips the hashing.
|
|
621
|
+
...(hasGateStep(component) ? { inputs: componentDeployInputs(component.deploy, process.cwd()).inputs } : {}),
|
|
584
622
|
}),
|
|
585
623
|
};
|
|
586
624
|
const records = [];
|
|
@@ -718,6 +756,18 @@ function findStackOutputs(phaseOutputs) {
|
|
|
718
756
|
}
|
|
719
757
|
return found;
|
|
720
758
|
}
|
|
759
|
+
/** Whether a step in `results` refused a plan that moved since it was approved (#3997). */
|
|
760
|
+
export function planMovedIn(results) {
|
|
761
|
+
return results.some((r) => r.records.some((s) => s.planMoved === true));
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* The exit code of a run that failed: {@link PLAN_MOVED_EXIT_CODE} when a
|
|
765
|
+
* step refused a plan that moved since it was approved, 1 otherwise. Every
|
|
766
|
+
* command that runs capability steps ends a failed run with it.
|
|
767
|
+
*/
|
|
768
|
+
export function failedRunExitCode(results) {
|
|
769
|
+
return planMovedIn(results) ? PLAN_MOVED_EXIT_CODE : 1;
|
|
770
|
+
}
|
|
721
771
|
function errMessage(err) {
|
|
722
772
|
return err instanceof Error ? err.message : String(err);
|
|
723
773
|
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { type WaveRecord } from "../wave-engine.js";
|
|
38
38
|
import type { ChangeSetDocument } from "../change-set.js";
|
|
39
|
-
import type { PrMember } from "../pr-loop.js";
|
|
39
|
+
import type { PrMember, PrWave } from "../pr-loop.js";
|
|
40
40
|
/** What a pull request's apply approved, kept so a re-run can finish it (#3464). */
|
|
41
41
|
export interface PrApplyRecord {
|
|
42
42
|
/** The gate's op and name: `pr-<n>` and `pr-apply` unless the pipeline names another. */
|
|
@@ -56,6 +56,11 @@ export interface PrApplyRecord {
|
|
|
56
56
|
* against them again, so an unchanged member plans to the same digest.
|
|
57
57
|
*/
|
|
58
58
|
planOutputs: Record<string, Record<string, unknown>>;
|
|
59
|
+
/**
|
|
60
|
+
* With `--wave-gate` (#4003): each wave reached so far and the approval it
|
|
61
|
+
* applied or waits under, so the next wave's job reports every wave.
|
|
62
|
+
*/
|
|
63
|
+
waves?: PrWave[];
|
|
59
64
|
}
|
|
60
65
|
export interface FanOutAttempt {
|
|
61
66
|
digest: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fan-out-record.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fan-out-record.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEnD,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oDAAoD;IACpD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,qGAAqG;IACrG,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAsDD,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAwBzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAE7E"}
|
|
@@ -55,6 +55,7 @@ function readPrApplyRecord(value) {
|
|
|
55
55
|
if (isRecord(v))
|
|
56
56
|
outputs[name] = v;
|
|
57
57
|
}
|
|
58
|
+
const waves = Array.isArray(value.waves) ? value.waves.map(readPrWave).filter((w) => w !== undefined) : [];
|
|
58
59
|
return {
|
|
59
60
|
op,
|
|
60
61
|
gate,
|
|
@@ -64,6 +65,29 @@ function readPrApplyRecord(value) {
|
|
|
64
65
|
members: members,
|
|
65
66
|
changeSet: changeSet,
|
|
66
67
|
planOutputs: outputs,
|
|
68
|
+
...(waves.length > 0 ? { waves } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const WAVE_STATUSES = new Set(["applied", "failed", "plan-failed", "waiting"]);
|
|
72
|
+
/** One `prApply.waves` entry, or `undefined` when it is malformed. */
|
|
73
|
+
function readPrWave(value) {
|
|
74
|
+
if (!isRecord(value))
|
|
75
|
+
return undefined;
|
|
76
|
+
const { wave, components, status, approval, gate, digest } = value;
|
|
77
|
+
if (typeof wave !== "number" || !isStringArray(components) || typeof status !== "string" || !WAVE_STATUSES.has(status))
|
|
78
|
+
return undefined;
|
|
79
|
+
if ((approval !== "pull-request" && approval !== "wave") || typeof gate !== "string" || typeof digest !== "string")
|
|
80
|
+
return undefined;
|
|
81
|
+
return {
|
|
82
|
+
wave,
|
|
83
|
+
components,
|
|
84
|
+
status: status,
|
|
85
|
+
approval,
|
|
86
|
+
gate,
|
|
87
|
+
digest,
|
|
88
|
+
...(isStringArray(value.approvedBy) ? { approvedBy: value.approvedBy } : {}),
|
|
89
|
+
...(typeof value.approved === "string" ? { approved: value.approved } : {}),
|
|
90
|
+
...(isStringArray(value.moved) ? { moved: value.moved } : {}),
|
|
67
91
|
};
|
|
68
92
|
}
|
|
69
93
|
/** Read an attempt record, or `undefined` when there is none yet. Throws on a file that is not JSON. */
|
|
@@ -138,6 +138,24 @@ export interface FanOutRunOptions {
|
|
|
138
138
|
* the returned result cannot do.
|
|
139
139
|
*/
|
|
140
140
|
onComponentSettled?: (result: DriverComponentResult, outputs: Record<string, unknown> | undefined) => void;
|
|
141
|
+
/**
|
|
142
|
+
* Asked as each component's wave starts, with the outputs standing then
|
|
143
|
+
* (#3999). A reason holds the component back: it does not run, and nothing
|
|
144
|
+
* downstream of it runs either; each is listed in `held` and settles
|
|
145
|
+
* `waiting`. A pull request's apply holds a member whose plan read an
|
|
146
|
+
* upstream output that applied as another value, or that was known only
|
|
147
|
+
* after apply. Not with `waveGate`, which plans each wave after the one
|
|
148
|
+
* before it applied.
|
|
149
|
+
*/
|
|
150
|
+
hold?: (component: string, componentOutputs: Record<string, Record<string, unknown>>) => string | undefined;
|
|
151
|
+
}
|
|
152
|
+
/** A component {@link FanOutRunOptions.hold} held back, or one downstream of it. */
|
|
153
|
+
export interface FanOutHeld {
|
|
154
|
+
component: string;
|
|
155
|
+
/** Why the hook held it, or, downstream, why it held the component named in `heldBy`. */
|
|
156
|
+
reason: string;
|
|
157
|
+
/** Downstream of a held component: that component. */
|
|
158
|
+
heldBy?: string;
|
|
141
159
|
}
|
|
142
160
|
export interface FanOutRunResult {
|
|
143
161
|
/** The plan actually dispatched — `plan` narrowed by `options.progress`. */
|
|
@@ -155,6 +173,8 @@ export interface FanOutRunResult {
|
|
|
155
173
|
gate?: PendingGateRecord;
|
|
156
174
|
/** With `waveGate`: each wave this attempt planned, in order, the one it stopped at included. */
|
|
157
175
|
waves?: WaveRecord[];
|
|
176
|
+
/** What {@link FanOutRunOptions.hold} held back, in plan order. Absent when nothing was. */
|
|
177
|
+
held?: FanOutHeld[];
|
|
158
178
|
}
|
|
159
179
|
/**
|
|
160
180
|
* Dispatch a fan-out plan.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fan-out-run.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-run.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fan-out-run.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -159,8 +159,21 @@ export async function runFanOut(plan, components, registry, options) {
|
|
|
159
159
|
const completed = [];
|
|
160
160
|
const failed = [];
|
|
161
161
|
const blockedBy = new Map();
|
|
162
|
+
const held = new Map();
|
|
162
163
|
let gatedFact;
|
|
163
164
|
const inPlan = new Set(active.order);
|
|
165
|
+
const waveOf = waveNumbers(active.waves);
|
|
166
|
+
/** Hold `root` and everything downstream of it that has not settled otherwise. */
|
|
167
|
+
const markHeld = (root, reason) => {
|
|
168
|
+
held.set(root, { component: root, reason });
|
|
169
|
+
emit?.({ type: "component-settle", wave: waveOf.get(root), component: root, status: "waiting" });
|
|
170
|
+
for (const [component] of downstreamWithin(components, inPlan, [root])) {
|
|
171
|
+
if (held.has(component) || blockedBy.has(component) || failed.includes(component))
|
|
172
|
+
continue;
|
|
173
|
+
held.set(component, { component, reason, heldBy: root });
|
|
174
|
+
emit?.({ type: "component-settle", wave: waveOf.get(component), component, status: "waiting" });
|
|
175
|
+
}
|
|
176
|
+
};
|
|
164
177
|
/** Skip everything downstream of `root`, blaming `root` rather than the nearest edge. */
|
|
165
178
|
const markBlocked = (root) => {
|
|
166
179
|
for (const [component, by] of downstreamWithin(components, inPlan, [root])) {
|
|
@@ -172,7 +185,13 @@ export async function runFanOut(plan, components, registry, options) {
|
|
|
172
185
|
for (const [waveIndex, wave] of active.waves.entries()) {
|
|
173
186
|
const waveNum = waveIndex + 1;
|
|
174
187
|
// A component whose upstream failed in an earlier wave is not dispatched.
|
|
175
|
-
const
|
|
188
|
+
const candidates = wave.filter((name) => inPlan.has(name) && !blockedBy.has(name) && !held.has(name));
|
|
189
|
+
for (const name of candidates) {
|
|
190
|
+
const reason = options.hold?.(name, componentOutputs);
|
|
191
|
+
if (reason !== undefined)
|
|
192
|
+
markHeld(name, reason);
|
|
193
|
+
}
|
|
194
|
+
const runnable = candidates.filter((name) => !held.has(name));
|
|
176
195
|
if (runnable.length === 0)
|
|
177
196
|
continue;
|
|
178
197
|
emit?.({ type: "wave-start", wave: waveNum, components: runnable });
|
|
@@ -231,6 +250,7 @@ export async function runFanOut(plan, components, registry, options) {
|
|
|
231
250
|
blocked,
|
|
232
251
|
componentOutputs,
|
|
233
252
|
...(gatedFact ? { gate: gatedFact } : {}),
|
|
253
|
+
...(held.size > 0 ? { held: active.order.filter((name) => held.has(name)).map((name) => held.get(name)) } : {}),
|
|
234
254
|
};
|
|
235
255
|
}
|
|
236
256
|
/** The run's `deployContext`, with the carried state and the carry callback (#3459) when the caller gave them. */
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* its publish output against a recorded digest that is not in the
|
|
18
18
|
* composition, so it passes that digest here.
|
|
19
19
|
* - `vars`, the environment config the caller resolved ahead of the run.
|
|
20
|
+
* - The content digests of the local files the steps deploy from (#4155,
|
|
21
|
+
* ./deploy-inputs.ts): a chart, a manifest, a site's tree, a build step's
|
|
22
|
+
* sources. A file changed after review moves the digest. The key is left
|
|
23
|
+
* out when no step names an existing file, so a composition that deploys
|
|
24
|
+
* none keeps the digest it had before #4155.
|
|
20
25
|
*
|
|
21
26
|
* ## What it leaves out
|
|
22
27
|
*
|
|
@@ -26,6 +31,7 @@
|
|
|
26
31
|
* upstream components. The run id and the time are left out for the reasons
|
|
27
32
|
* `../lifecycle/plan-digest.ts` gives.
|
|
28
33
|
*/
|
|
34
|
+
import type { DeployInputDigest } from "./deploy-inputs.js";
|
|
29
35
|
import type { DriverComponent } from "./driver.js";
|
|
30
36
|
/** What a component gate's plan digest is taken over. */
|
|
31
37
|
export interface ComponentGatePlan {
|
|
@@ -34,6 +40,8 @@ export interface ComponentGatePlan {
|
|
|
34
40
|
vars?: Record<string, unknown>;
|
|
35
41
|
/** The recorded digest a promote or rollback deploys, when the caller has one. */
|
|
36
42
|
release?: string;
|
|
43
|
+
/** What the steps deploy from (`componentDeployInputs`), when the caller read it. */
|
|
44
|
+
inputs?: readonly DeployInputDigest[];
|
|
37
45
|
}
|
|
38
46
|
/** The plan digest a component gate records and approves. */
|
|
39
47
|
export declare function componentPlanDigest(plan: ComponentGatePlan): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-plan.d.ts","sourceRoot":"","sources":["../../src/components/gate-plan.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gate-plan.d.ts","sourceRoot":"","sources":["../../src/components/gate-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,MAAM,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACvC;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAWnE"}
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* its publish output against a recorded digest that is not in the
|
|
18
18
|
* composition, so it passes that digest here.
|
|
19
19
|
* - `vars`, the environment config the caller resolved ahead of the run.
|
|
20
|
+
* - The content digests of the local files the steps deploy from (#4155,
|
|
21
|
+
* ./deploy-inputs.ts): a chart, a manifest, a site's tree, a build step's
|
|
22
|
+
* sources. A file changed after review moves the digest. The key is left
|
|
23
|
+
* out when no step names an existing file, so a composition that deploys
|
|
24
|
+
* none keeps the digest it had before #4155.
|
|
20
25
|
*
|
|
21
26
|
* ## What it leaves out
|
|
22
27
|
*
|
|
@@ -37,5 +42,6 @@ export function componentPlanDigest(plan) {
|
|
|
37
42
|
rollback: component.rollback ?? null,
|
|
38
43
|
vars: plan.vars ?? null,
|
|
39
44
|
release: plan.release ?? null,
|
|
45
|
+
...(plan.inputs && plan.inputs.length > 0 ? { inputs: plan.inputs } : {}),
|
|
40
46
|
});
|
|
41
47
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The jobs of a generated pull-request pipeline (#3183): a plan job on every
|
|
3
|
-
* pull request and
|
|
3
|
+
* pull request and, on every push to the target branch, a record job, or an
|
|
4
|
+
* apply job when the pipeline opts into apply on merge (#4168).
|
|
4
5
|
*
|
|
5
6
|
* Each forge's generator (the github, gitlab and forgejo lexicons) adds its
|
|
6
7
|
* own triggers, permissions and artifact handling; the commands and the
|
|
@@ -9,11 +10,19 @@
|
|
|
9
10
|
* - The plan job runs `chant components pr-plan` against the pull request's
|
|
10
11
|
* target commit. It posts the note and the `chant/plan` status and writes
|
|
11
12
|
* nothing to `chant/lifecycle`, since it runs the pull request's code.
|
|
12
|
-
* - The
|
|
13
|
+
* - The record job (#4168 step 1, the default) runs `chant components
|
|
14
|
+
* pr-record` against the commit the push replaced. It plans the same
|
|
15
|
+
* members on the merged commit, stores the change set and writes the merge
|
|
16
|
+
* record, `_merges/<commit>.json` on `chant/lifecycle`. It applies nothing:
|
|
17
|
+
* a release that carries the commit deploys it. It needs write access to
|
|
18
|
+
* `chant/lifecycle`. One record runs at a time per environment.
|
|
19
|
+
* - With `applyOnMerge` the apply job takes the record job's place. It runs
|
|
20
|
+
* `chant components pr-apply` against the commit the
|
|
13
21
|
* push replaced, finds the pull request that merged the pushed commit
|
|
14
22
|
* through the forge, and applies only when an approval stands for the
|
|
15
|
-
* digest it plans. With `requireReview` (
|
|
16
|
-
*
|
|
23
|
+
* digest it plans. With `requireReview` (off by default since #4168, on
|
|
24
|
+
* under the `review-rules` security group) the approver must also have
|
|
25
|
+
* approved the pull request on the forge. It needs write access
|
|
17
26
|
* to `chant/lifecycle`, to record the pending fact when the gate stops it.
|
|
18
27
|
* One apply runs at a time per environment.
|
|
19
28
|
*
|
|
@@ -35,6 +44,7 @@
|
|
|
35
44
|
* it too. With `reportUrl` both pass `--report-url`, which copies the report,
|
|
36
45
|
* the change set and the events where a reader outside CI can fetch them;
|
|
37
46
|
* the job's own environment brings the credentials an `s3://` URL needs.
|
|
47
|
+
* The record job passes the same flags as the apply.
|
|
38
48
|
*
|
|
39
49
|
* With `build` (#4088) both jobs run the project's build and `chant lint`
|
|
40
50
|
* before their command, and fail on an error. A `cfn-deploy` member's plan
|
|
@@ -42,6 +52,25 @@
|
|
|
42
52
|
* build is `chant build --env <env>`, or `buildCommand` when the templates
|
|
43
53
|
* come from several builds (`npm run build`).
|
|
44
54
|
*
|
|
55
|
+
* With `waveGate` (#4003) the apply runs a wave at a time: `pr-apply
|
|
56
|
+
* --wave-gate <gate>`, each wave planned after the one before it applied. A
|
|
57
|
+
* generator writes one apply job per wave of the component graph
|
|
58
|
+
* (`prLoopWaveJobs`), job `apply-wave-<k>` passing `--wave <k>` and needing
|
|
59
|
+
* the job before it, and the attempt record carries the approved set from
|
|
60
|
+
* one job to the next. A wave whose plan the approved change set covers
|
|
61
|
+
* applies under the pull request's approval; one whose plan moved stops at
|
|
62
|
+
* `<gate>-wave-<k>` (exit 3), and re-running its job after the approval
|
|
63
|
+
* carries on. `chant ci serve` runs the one apply job, which runs the waves
|
|
64
|
+
* in order until one stops.
|
|
65
|
+
*
|
|
66
|
+
* Each generated job runs its command through `chant ci run plan|apply
|
|
67
|
+
* --in-place` (#4156, `PrLoopJob.run`), so a forge job writes the same run
|
|
68
|
+
* record the chant runner does: Op `pr-plan` or `pr-apply`, signed with
|
|
69
|
+
* the runner key a forge secret puts in `CHANT_RUNNER_KEY`, and naming the
|
|
70
|
+
* forge's run as its `runOrigin`. `ci run` runs `command` in the job's own
|
|
71
|
+
* checkout with the job's environment, less the key. The plan passes
|
|
72
|
+
* `--no-push`, so it still writes nothing to the remote `chant/lifecycle`.
|
|
73
|
+
*
|
|
45
74
|
* In a workspace member (#3465) both commands run in the member's directory
|
|
46
75
|
* and pass `--member <name>`, so the member's gate (`pr-<number>-<member>`),
|
|
47
76
|
* note and statuses stay apart from every other member's on the same pull
|
|
@@ -49,6 +78,8 @@
|
|
|
49
78
|
* that one of its units reaches selects that unit.
|
|
50
79
|
*/
|
|
51
80
|
import type { ForgeKind } from "../pr-forge.js";
|
|
81
|
+
import type { DriverComponent } from "./driver.js";
|
|
82
|
+
import type { GatedWavePipelineOptions } from "./gated-wave-pipeline.js";
|
|
52
83
|
/** Where both jobs write their reports, kept as a CI artifact. */
|
|
53
84
|
export declare const PR_LOOP_REPORT_DIR = ".chant/pr";
|
|
54
85
|
/**
|
|
@@ -83,8 +114,16 @@ export interface PrLoopPipelineOptions {
|
|
|
83
114
|
* GitHub and Forgejo; on GitLab, the project's default branch.
|
|
84
115
|
*/
|
|
85
116
|
branch?: string;
|
|
86
|
-
/** Count an approval only from someone who approved the pull request on the forge. Default
|
|
117
|
+
/** Count an approval only from someone who approved the pull request on the forge. Default false (#4168): review rules are opt-in. */
|
|
87
118
|
requireReview?: boolean;
|
|
119
|
+
/** The job on merge (apply, or record since #4168) has `chant ci run` refuse to start without a runner-start statement for it (`--require-runner-start`, #4147), as under the `isolated-runners` security group (#4168). Default false. */
|
|
120
|
+
requireRunnerStart?: boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Apply the approved plan on merge (#4168), as every pull-request pipeline
|
|
123
|
+
* did before #4168: the apply job in place of the record job. Default
|
|
124
|
+
* false, so a merge deploys nothing. `waveGate` needs it.
|
|
125
|
+
*/
|
|
126
|
+
applyOnMerge?: boolean;
|
|
88
127
|
/**
|
|
89
128
|
* Stream each job's run events (#4007): `--events-json` on both commands,
|
|
90
129
|
* and `CHANT_RUN_EVENTS_DIR` set to {@link PR_LOOP_EVENTS_DIR}. Default false.
|
|
@@ -111,6 +150,12 @@ export interface PrLoopPipelineOptions {
|
|
|
111
150
|
* `npm run build`. Setting it turns `build` on.
|
|
112
151
|
*/
|
|
113
152
|
buildCommand?: string;
|
|
153
|
+
/**
|
|
154
|
+
* A gate per wave on merge (#4003): the apply runs `pr-apply --wave-gate
|
|
155
|
+
* <waveGate>`, a wave at a time, and a generator writes one apply job per
|
|
156
|
+
* wave. Set from `--wave-gate` beside `--pr-loop` ({@link prLoopWithWaves}).
|
|
157
|
+
*/
|
|
158
|
+
waveGate?: string;
|
|
114
159
|
/**
|
|
115
160
|
* Which GitHub-shaped forge the workflow is for. Set by the forgejo
|
|
116
161
|
* generator, which reuses the github one; a caller never needs to.
|
|
@@ -119,8 +164,8 @@ export interface PrLoopPipelineOptions {
|
|
|
119
164
|
}
|
|
120
165
|
/** One job's command and the forge values it reads, as environment variables for its step. */
|
|
121
166
|
export interface PrLoopJob {
|
|
122
|
-
/** `plan` or `
|
|
123
|
-
jobName: "plan" | "apply";
|
|
167
|
+
/** `plan`, `apply` or `record` (#4168). */
|
|
168
|
+
jobName: "plan" | "apply" | "record";
|
|
124
169
|
/** The command line. Reads `$BASE_SHA` and, for the plan, `$PR_NUMBER`. */
|
|
125
170
|
command: string;
|
|
126
171
|
/**
|
|
@@ -133,15 +178,48 @@ export interface PrLoopJob {
|
|
|
133
178
|
setup?: string[];
|
|
134
179
|
/** With `build` (#4088): the build line and the lint line, run in this order before the command. */
|
|
135
180
|
build?: string[];
|
|
181
|
+
/** With `waveGate` (#4003): the wave a generated apply job runs, 1-based. */
|
|
182
|
+
wave?: number;
|
|
183
|
+
/**
|
|
184
|
+
* What the generated job runs in place of `command` (#4156): `chant ci run
|
|
185
|
+
* <job> --in-place` with the same environment, gate, forge, events and
|
|
186
|
+
* report URL, which runs `command` and records the run. `env` is the
|
|
187
|
+
* job's `env` and, on GitHub and Forgejo, `CHANT_RUNNER_KEY` from the
|
|
188
|
+
* repository secret of that name. GitLab hands its CI/CD variables to a
|
|
189
|
+
* job itself.
|
|
190
|
+
*/
|
|
191
|
+
run: {
|
|
192
|
+
command: string;
|
|
193
|
+
env: Record<string, string>;
|
|
194
|
+
};
|
|
136
195
|
}
|
|
137
196
|
/** The lines `build` (#4088) runs before a job's command: the build, then the lint. Empty without the option. */
|
|
138
197
|
export declare function prLoopBuildLines(env: string, options?: PrLoopPipelineOptions): string[];
|
|
139
198
|
/**
|
|
140
|
-
* The
|
|
141
|
-
*
|
|
142
|
-
*
|
|
199
|
+
* The jobs for `forge`: plan, apply and record, in that order. A generator
|
|
200
|
+
* writes the plan and, on merge, {@link prLoopMergeJob}'s choice of the
|
|
201
|
+
* other two. `member` is the workspace member the pipeline is generated for;
|
|
202
|
+
* the commands then run in its directory, so `--output` is relative to it.
|
|
143
203
|
*/
|
|
144
204
|
export declare function prLoopJobs(forge: ForgeKind, env: string, options?: PrLoopPipelineOptions, member?: string): PrLoopJob[];
|
|
205
|
+
/** The job a push to the target branch runs (#4168): `record`, or `apply` when the pipeline opts into apply on merge. */
|
|
206
|
+
export declare function prLoopMergeJob(jobs: readonly PrLoopJob[], options?: PrLoopPipelineOptions): PrLoopJob;
|
|
207
|
+
/**
|
|
208
|
+
* The pull-request options with `--wave-gate` beside `--pr-loop` (#4003):
|
|
209
|
+
* the apply gets a gate per wave. A canary or a fixed base is refused, since
|
|
210
|
+
* the pull request's waves are its derivation's and each push is measured
|
|
211
|
+
* from the commit before it.
|
|
212
|
+
*/
|
|
213
|
+
export declare function prLoopWithWaves(prLoop: PrLoopPipelineOptions, gatedWaves?: GatedWavePipelineOptions): PrLoopPipelineOptions;
|
|
214
|
+
/** The name of the apply job for wave `wave` (#4003). */
|
|
215
|
+
export declare function prApplyWaveJobName(wave: number): string;
|
|
216
|
+
/**
|
|
217
|
+
* One apply job per wave of the component graph (#4003), each `apply`'s
|
|
218
|
+
* command with `--wave <k>`. A change selects a subset, which never layers
|
|
219
|
+
* deeper than the graph, so a job past the change's last wave finds nothing
|
|
220
|
+
* left and exits 0.
|
|
221
|
+
*/
|
|
222
|
+
export declare function prLoopWaveJobs(components: DriverComponent[], apply: PrLoopJob): PrLoopJob[];
|
|
145
223
|
/**
|
|
146
224
|
* The concurrency group (GitHub, Forgejo) or resource group (GitLab) that
|
|
147
225
|
* keeps one apply at a time per environment, and per member in a workspace.
|
|
@@ -154,6 +232,8 @@ export declare function prLoopJobs(forge: ForgeKind, env: string, options?: PrLo
|
|
|
154
232
|
* apart from a single project's `chant-apply-<env>`.
|
|
155
233
|
*/
|
|
156
234
|
export declare function prApplyGroup(env: string, member?: string): string;
|
|
235
|
+
/** The group that keeps one record job at a time per environment and member (#4168), named as {@link prApplyGroup} names the apply's. */
|
|
236
|
+
export declare function prRecordGroup(env: string, member?: string): string;
|
|
157
237
|
/**
|
|
158
238
|
* The cache key the apply job keeps its attempt record under (#3543), with
|
|
159
239
|
* `commit` the forge's expression for the pushed commit. A push of another
|
|
@@ -166,8 +246,14 @@ export declare function prApplyRecordKey(env: string, commit: string, member?: s
|
|
|
166
246
|
/**
|
|
167
247
|
* GitLab sets `CI_COMMIT_BEFORE_SHA` to forty zeros on a branch's first push.
|
|
168
248
|
* The line replaces it with the merge request's diff base when the pipeline
|
|
169
|
-
* has one, and otherwise
|
|
170
|
-
* pushed commit, or the pushed commit's parent when that is the commit itself.
|
|
249
|
+
* has one, and otherwise as {@link pushBaseFallback} does.
|
|
171
250
|
*/
|
|
172
251
|
export declare function gitlabBaseFallback(branch?: string): string;
|
|
252
|
+
/**
|
|
253
|
+
* GitHub and Forgejo set `github.event.before` to forty zeros on a branch's
|
|
254
|
+
* first push (#4004). The line replaces it as {@link pushBaseFallback} does,
|
|
255
|
+
* with the target branch `main` unless the pipeline names another, the
|
|
256
|
+
* generators' default.
|
|
257
|
+
*/
|
|
258
|
+
export declare function githubBaseFallback(branch?: string): string;
|
|
173
259
|
//# sourceMappingURL=pr-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-pipeline.d.ts","sourceRoot":"","sources":["../../src/components/pr-pipeline.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pr-pipeline.d.ts","sourceRoot":"","sources":["../../src/components/pr-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAKtE,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,eAAe,mCAAmC,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,YAAW,CAAC;AAEtC,8CAA8C;AAC9C,eAAO,MAAM,aAAa,UAEzB,CAAC;AAEF,mHAAmH;AACnH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,yBAAqC,CAAC;AAErE,yEAAyE;AACzE,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sIAAsI;IACtI,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2OAA2O;IAC3O,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED,8FAA8F;AAC9F,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrC,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,oGAAoG;IACpG,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACvD;AAED,iHAAiH;AACjH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,MAAM,EAAE,CAG3F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CA+D3H;AAED,yHAAyH;AACzH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,EAAE,OAAO,GAAE,qBAA0B,GAAG,SAAS,CAEzG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,EAAE,UAAU,CAAC,EAAE,wBAAwB,GAAG,qBAAqB,CAQ3H;AAED,yDAAyD;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,CAS3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,yIAAyI;AACzI,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAErF;AAoBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|