@intentius/chant 0.124.52 → 0.124.54
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/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/discover.js +3 -1
- package/dist/behaviour.d.ts +1 -1
- package/dist/behaviour.d.ts.map +1 -1
- package/dist/capabilities/templates.d.ts +65 -0
- package/dist/capabilities/templates.d.ts.map +1 -0
- package/dist/capabilities/templates.js +193 -0
- package/dist/capabilities/templates.json +145 -0
- package/dist/change-set-graph.d.ts +35 -3
- package/dist/change-set-graph.d.ts.map +1 -1
- package/dist/change-set-graph.js +60 -9
- package/dist/change-set.d.ts +65 -7
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +23 -12
- package/dist/ci-identity.d.ts +7 -2
- package/dist/ci-identity.d.ts.map +1 -1
- package/dist/ci-identity.js +4 -1
- package/dist/cli/commands/import-index.d.ts +52 -0
- package/dist/cli/commands/import-index.d.ts.map +1 -0
- package/dist/cli/commands/import-index.js +226 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +4 -2
- package/dist/cli/handlers/components.d.ts.map +1 -1
- package/dist/cli/handlers/components.js +11 -2
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/fan-out.js +16 -3
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +22 -4
- package/dist/cli/handlers/index-cloud.d.ts +14 -0
- package/dist/cli/handlers/index-cloud.d.ts.map +1 -0
- package/dist/cli/handlers/index-cloud.js +22 -0
- package/dist/cli/handlers/index-diff.d.ts +18 -0
- package/dist/cli/handlers/index-diff.d.ts.map +1 -0
- package/dist/cli/handlers/index-diff.js +142 -0
- package/dist/cli/handlers/lifecycle-drift.d.ts +25 -0
- package/dist/cli/handlers/lifecycle-drift.d.ts.map +1 -0
- package/dist/cli/handlers/lifecycle-drift.js +64 -0
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.js +188 -28
- package/dist/cli/handlers/misc.d.ts +9 -0
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/misc.js +77 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +15 -2
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +89 -15
- package/dist/cli/handlers/query.d.ts.map +1 -1
- package/dist/cli/handlers/query.js +28 -4
- package/dist/cli/handlers/scenario.d.ts.map +1 -1
- package/dist/cli/handlers/scenario.js +8 -7
- package/dist/cli/handlers/search.d.ts +34 -4
- package/dist/cli/handlers/search.d.ts.map +1 -1
- package/dist/cli/handlers/search.js +216 -36
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +55 -1
- package/dist/cli/mcp/lifecycle-tools.d.ts.map +1 -1
- package/dist/cli/mcp/lifecycle-tools.js +3 -2
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.js +4 -3
- package/dist/cli/mcp/workspace-tools.js +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +55 -2
- package/dist/cli/registry.d.ts +19 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cloud-lister/aws.d.ts +35 -0
- package/dist/cloud-lister/aws.d.ts.map +1 -0
- package/dist/cloud-lister/aws.js +203 -0
- package/dist/cloud-lister/azure.d.ts +34 -0
- package/dist/cloud-lister/azure.d.ts.map +1 -0
- package/dist/cloud-lister/azure.js +129 -0
- package/dist/cloud-lister/common.d.ts +40 -0
- package/dist/cloud-lister/common.d.ts.map +1 -0
- package/dist/cloud-lister/common.js +83 -0
- package/dist/cloud-lister/credentials.d.ts +50 -0
- package/dist/cloud-lister/credentials.d.ts.map +1 -0
- package/dist/cloud-lister/credentials.js +86 -0
- package/dist/cloud-lister/fakes.d.ts +27 -0
- package/dist/cloud-lister/fakes.d.ts.map +1 -0
- package/dist/cloud-lister/fakes.js +50 -0
- package/dist/cloud-lister/gcp.d.ts +42 -0
- package/dist/cloud-lister/gcp.d.ts.map +1 -0
- package/dist/cloud-lister/gcp.js +143 -0
- package/dist/cloud-lister/guard.d.ts +49 -0
- package/dist/cloud-lister/guard.d.ts.map +1 -0
- package/dist/cloud-lister/guard.js +103 -0
- package/dist/cloud-lister/ids.d.ts +23 -0
- package/dist/cloud-lister/ids.d.ts.map +1 -0
- package/dist/cloud-lister/ids.js +42 -0
- package/dist/cloud-lister/index.d.ts +67 -0
- package/dist/cloud-lister/index.d.ts.map +1 -0
- package/dist/cloud-lister/index.js +102 -0
- package/dist/cloud-lister/kubernetes.d.ts +64 -0
- package/dist/cloud-lister/kubernetes.d.ts.map +1 -0
- package/dist/cloud-lister/kubernetes.js +276 -0
- package/dist/cloud-lister/markers.d.ts +31 -0
- package/dist/cloud-lister/markers.d.ts.map +1 -0
- package/dist/cloud-lister/markers.js +73 -0
- package/dist/cloud-lister/mask.d.ts +31 -0
- package/dist/cloud-lister/mask.d.ts.map +1 -0
- package/dist/cloud-lister/mask.js +74 -0
- package/dist/cloud-lister/sigv4.d.ts +29 -0
- package/dist/cloud-lister/sigv4.d.ts.map +1 -0
- package/dist/cloud-lister/sigv4.js +54 -0
- package/dist/cloud-lister/transport.d.ts +55 -0
- package/dist/cloud-lister/transport.d.ts.map +1 -0
- package/dist/cloud-lister/transport.js +86 -0
- package/dist/cloud-lister/types.d.ts +121 -0
- package/dist/cloud-lister/types.d.ts.map +1 -0
- package/dist/cloud-lister/types.js +24 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -1
- package/dist/components/capability-plugin-loader.js +6 -0
- package/dist/components/capability-plugin.d.ts +9 -0
- package/dist/components/capability-plugin.d.ts.map +1 -1
- package/dist/components/capability.d.ts +215 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +21 -0
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +58 -14
- package/dist/components/declared-reads.d.ts +38 -0
- package/dist/components/declared-reads.d.ts.map +1 -0
- package/dist/components/declared-reads.js +131 -0
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/deploy-units.js +4 -0
- package/dist/components/driver.d.ts +34 -1
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +66 -3
- package/dist/components/fan-out-run.d.ts +23 -1
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-run.js +82 -14
- package/dist/components/fan-out-support.d.ts +6 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out-support.js +4 -1
- package/dist/components/fan-out.d.ts +28 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/groups.d.ts +229 -0
- package/dist/components/groups.d.ts.map +1 -0
- package/dist/components/groups.js +760 -0
- package/dist/components/index.d.ts +6 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -0
- package/dist/components/plan-shape-conformance.d.ts +48 -0
- package/dist/components/plan-shape-conformance.d.ts.map +1 -0
- package/dist/components/plan-shape-conformance.js +122 -0
- package/dist/components/pr-run.d.ts +41 -4
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +209 -39
- package/dist/components/promote-rounds.d.ts +9 -0
- package/dist/components/promote-rounds.d.ts.map +1 -1
- package/dist/components/promote-rounds.js +23 -2
- package/dist/components/promote.d.ts +17 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/promote.js +36 -6
- package/dist/components/release-gate.d.ts +23 -1
- package/dist/components/release-gate.d.ts.map +1 -1
- package/dist/components/release-gate.js +97 -33
- package/dist/components/run-groups.d.ts +58 -0
- package/dist/components/run-groups.d.ts.map +1 -0
- package/dist/components/run-groups.js +78 -0
- package/dist/components/starter-plugin.d.ts +1 -0
- package/dist/components/starter-plugin.d.ts.map +1 -1
- package/dist/components/starter-plugin.js +6 -1
- package/dist/components/verbs/index.d.ts +1 -0
- package/dist/components/verbs/index.d.ts.map +1 -1
- package/dist/components/verbs/index.js +1 -0
- package/dist/components/verbs/member-outputs.d.ts +187 -0
- package/dist/components/verbs/member-outputs.d.ts.map +1 -0
- package/dist/components/verbs/member-outputs.js +218 -0
- package/dist/config.d.ts +60 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -0
- package/dist/deep-observation.d.ts +1 -13
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/deep-observation.js +5 -22
- package/dist/drift-record.d.ts +542 -0
- package/dist/drift-record.d.ts.map +1 -0
- package/dist/drift-record.js +886 -0
- package/dist/engine-facts.d.ts +144 -0
- package/dist/engine-facts.d.ts.map +1 -0
- package/dist/engine-facts.js +14 -0
- package/dist/graph-ir.d.ts +153 -2
- package/dist/graph-ir.d.ts.map +1 -1
- package/dist/graph-ir.js +224 -6
- package/dist/graph-refs.d.ts +145 -0
- package/dist/graph-refs.d.ts.map +1 -1
- package/dist/graph-refs.js +305 -0
- package/dist/graph-schema/fixtures/adopt.json +15 -0
- package/dist/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
- package/dist/graph-schema/fixtures/index.json +68 -0
- package/dist/graph-schema/fixtures/plunge.engine-graph.json +158 -0
- package/dist/graph-schema/fixtures.d.ts +23 -0
- package/dist/graph-schema/fixtures.d.ts.map +1 -0
- package/dist/graph-schema/fixtures.js +246 -0
- package/dist/graph-schema/generate.d.ts +15 -0
- package/dist/graph-schema/generate.d.ts.map +1 -0
- package/dist/graph-schema/generate.js +267 -0
- package/dist/graph-schema/graph.schema.json +1387 -0
- package/dist/health.schema.json +2 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/instance-nodes.d.ts +159 -0
- package/dist/instance-nodes.d.ts.map +1 -0
- package/dist/instance-nodes.js +231 -0
- package/dist/lexicon.d.ts +72 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/adoption-file.d.ts +56 -0
- package/dist/lifecycle/adoption-file.d.ts.map +1 -0
- package/dist/lifecycle/adoption-file.js +123 -0
- package/dist/lifecycle/cloud-index.d.ts +186 -0
- package/dist/lifecycle/cloud-index.d.ts.map +1 -0
- package/dist/lifecycle/cloud-index.js +618 -0
- package/dist/lifecycle/derive-edges.d.ts +59 -0
- package/dist/lifecycle/derive-edges.d.ts.map +1 -0
- package/dist/lifecycle/derive-edges.js +126 -0
- package/dist/lifecycle/git.d.ts +10 -9
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +7 -1
- package/dist/lifecycle/identity-match.d.ts +133 -0
- package/dist/lifecycle/identity-match.d.ts.map +1 -0
- package/dist/lifecycle/identity-match.js +147 -0
- package/dist/lifecycle/index-diff.d.ts +224 -0
- package/dist/lifecycle/index-diff.d.ts.map +1 -0
- package/dist/lifecycle/index-diff.js +327 -0
- package/dist/lifecycle/index-document.d.ts +130 -0
- package/dist/lifecycle/index-document.d.ts.map +1 -0
- package/dist/lifecycle/index-document.js +189 -0
- package/dist/lifecycle/index-drift.d.ts +121 -0
- package/dist/lifecycle/index-drift.d.ts.map +1 -0
- package/dist/lifecycle/index-drift.js +178 -0
- package/dist/lifecycle/index-import.d.ts +168 -0
- package/dist/lifecycle/index-import.d.ts.map +1 -0
- package/dist/lifecycle/index-import.js +515 -0
- package/dist/lifecycle/index-join.d.ts +129 -0
- package/dist/lifecycle/index-join.d.ts.map +1 -0
- package/dist/lifecycle/index-join.js +248 -0
- package/dist/lifecycle/index.d.ts +4 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +4 -0
- package/dist/lifecycle/observation-baseline.d.ts +61 -21
- package/dist/lifecycle/observation-baseline.d.ts.map +1 -1
- package/dist/lifecycle/observation-baseline.js +144 -19
- package/dist/lifecycle/observe.d.ts.map +1 -1
- package/dist/lifecycle/observe.js +6 -1
- package/dist/lifecycle/query.d.ts +45 -4
- package/dist/lifecycle/query.d.ts.map +1 -1
- package/dist/lifecycle/query.js +89 -7
- package/dist/lifecycle/replay.d.ts +10 -3
- package/dist/lifecycle/replay.d.ts.map +1 -1
- package/dist/lifecycle/replay.js +10 -6
- package/dist/lifecycle/scenario.d.ts +4 -3
- package/dist/lifecycle/scenario.d.ts.map +1 -1
- package/dist/lifecycle/snapshot-store-fake.d.ts +9 -0
- package/dist/lifecycle/snapshot-store-fake.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store-fake.js +21 -0
- package/dist/lifecycle/snapshot-store-s3.d.ts +102 -0
- package/dist/lifecycle/snapshot-store-s3.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store-s3.js +254 -0
- package/dist/lifecycle/snapshot-store.d.ts +170 -0
- package/dist/lifecycle/snapshot-store.d.ts.map +1 -0
- package/dist/lifecycle/snapshot-store.js +832 -0
- package/dist/lifecycle/snapshot.d.ts +11 -0
- package/dist/lifecycle/snapshot.d.ts.map +1 -1
- package/dist/lifecycle/snapshot.js +18 -5
- package/dist/lifecycle/type-listing.d.ts +148 -0
- package/dist/lifecycle/type-listing.d.ts.map +1 -0
- package/dist/lifecycle/type-listing.js +166 -0
- package/dist/lint/component-checks.d.ts +15 -1
- package/dist/lint/component-checks.d.ts.map +1 -1
- package/dist/lint/component-checks.js +1 -0
- package/dist/lint/presets/relaxed.json +2 -1
- package/dist/lint/presets/strict.json +2 -1
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/fail/dns.component.js +13 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp008/pass/dns.component.js +8 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts +33 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp008-applies-signal-only-root.js +123 -0
- package/dist/lint/rules/comp/index.d.ts +2 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/comp/index.js +4 -1
- package/dist/observation.d.ts +19 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +18 -1
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +1 -1
- package/dist/op/activities/change-set.d.ts +6 -4
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +4 -2
- package/dist/op/activity-failure.d.ts +27 -0
- package/dist/op/activity-failure.d.ts.map +1 -1
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/index.d.ts +2 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +5 -1
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +22 -8
- package/dist/pr-loop.d.ts +56 -1
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +51 -1
- package/dist/pulumi-urn.d.ts +101 -0
- package/dist/pulumi-urn.d.ts.map +1 -0
- package/dist/pulumi-urn.js +131 -0
- package/dist/release-floors.d.ts +23 -0
- package/dist/release-floors.d.ts.map +1 -0
- package/dist/release-floors.js +22 -0
- package/dist/sensitive-key.d.ts +23 -0
- package/dist/sensitive-key.d.ts.map +1 -0
- package/dist/sensitive-key.js +31 -0
- package/dist/wave-runtime.mjs +234 -234
- package/dist/workspace/adoption-report.d.ts +53 -0
- package/dist/workspace/adoption-report.d.ts.map +1 -0
- package/dist/workspace/adoption-report.js +76 -0
- package/dist/workspace/capabilities-contract.d.ts +7 -0
- package/dist/workspace/capabilities-contract.d.ts.map +1 -1
- package/dist/workspace/capabilities-contract.js +2 -1
- package/dist/workspace/capabilities.schema.json +98 -0
- package/dist/workspace/change-set.schema.json +42 -3
- package/dist/workspace/ci-cloud-identity.d.ts +13 -1
- package/dist/workspace/ci-cloud-identity.d.ts.map +1 -1
- package/dist/workspace/ci-cloud-identity.js +30 -1
- package/dist/workspace/compose-graph.d.ts +10 -1
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +6 -1
- package/dist/workspace/conformance/index.d.ts +1 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/index.js +6 -1
- package/dist/workspace/drift-cli.d.ts +81 -0
- package/dist/workspace/drift-cli.d.ts.map +1 -0
- package/dist/workspace/drift-cli.js +317 -0
- package/dist/workspace/drift.schema.json +672 -0
- package/dist/workspace/graph-cli.d.ts +2 -0
- package/dist/workspace/graph-cli.d.ts.map +1 -1
- package/dist/workspace/graph-cli.js +3 -0
- package/dist/workspace/graph.schema.json +72 -0
- package/dist/workspace/init.d.ts +5 -1
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/init.js +55 -9
- package/dist/workspace/ledger.schema.json +1 -1
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +2 -0
- package/dist/workspace/pr-report.schema.json +51 -2
- package/dist/workspace/promote-waves.d.ts +112 -0
- package/dist/workspace/promote-waves.d.ts.map +1 -0
- package/dist/workspace/promote-waves.js +290 -0
- package/dist/workspace/promote.d.ts +84 -2
- package/dist/workspace/promote.d.ts.map +1 -1
- package/dist/workspace/promote.js +347 -61
- package/dist/workspace/reason-codes.d.ts +12 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +14 -0
- package/dist/workspace/search-contract.d.ts +3 -3
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/search-contract.js +2 -0
- package/dist/workspace/search.schema.json +103 -5
- package/package.json +14 -1
- package/src/__fixtures__/drift-record/README.md +58 -0
- package/src/__fixtures__/drift-record/choudoufu-cone.ndjson +4 -0
- package/src/__fixtures__/drift-record/choudoufu-resource.ndjson +3 -0
- package/src/__fixtures__/drift-record/component-status-ledger.json +65 -0
- package/src/__fixtures__/drift-record/component-status.json +91 -0
- package/src/__fixtures__/drift-record/deep-diff.json +259 -0
- package/src/__fixtures__/drift-record/lifecycle-diff-live.json +825 -0
- package/src/__fixtures__/drift-record/live-diff.json +125 -0
- package/src/audit/discover.e2e.test.ts +14 -0
- package/src/audit/discover.ts +3 -1
- package/src/behaviour.ts +1 -1
- package/src/capabilities/templates.json +145 -0
- package/src/capabilities/templates.test.ts +212 -0
- package/src/capabilities/templates.ts +204 -0
- package/src/change-set-bundle.test.ts +83 -0
- package/src/change-set-graph.ts +80 -9
- package/src/change-set.test.ts +24 -0
- package/src/change-set.ts +77 -14
- package/src/ci-identity-targets.test.ts +23 -0
- package/src/ci-identity.ts +10 -4
- package/src/cli/commands/import-index.test.ts +117 -0
- package/src/cli/commands/import-index.ts +265 -0
- package/src/cli/commands/lint.ts +4 -2
- package/src/cli/handlers/components.test.ts +9 -0
- package/src/cli/handlers/components.ts +12 -2
- package/src/cli/handlers/fan-out.ts +17 -3
- package/src/cli/handlers/graph.test.ts +42 -0
- package/src/cli/handlers/graph.ts +26 -4
- package/src/cli/handlers/index-cloud.ts +32 -0
- package/src/cli/handlers/index-diff.test.ts +68 -0
- package/src/cli/handlers/index-diff.ts +146 -0
- package/src/cli/handlers/ledger-root-member.test.ts +161 -0
- package/src/cli/handlers/lifecycle-drift.ts +68 -0
- package/src/cli/handlers/lifecycle.test.ts +33 -11
- package/src/cli/handlers/lifecycle.ts +205 -30
- package/src/cli/handlers/misc.ts +73 -0
- package/src/cli/handlers/pr-waves-blocked.test.ts +37 -2
- package/src/cli/handlers/pr.ts +14 -2
- package/src/cli/handlers/promote.test.ts +64 -0
- package/src/cli/handlers/promote.ts +81 -6
- package/src/cli/handlers/query.ts +27 -4
- package/src/cli/handlers/run-declared-reads-cli.test.ts +187 -0
- package/src/cli/handlers/run-groups-cli.test.ts +229 -0
- package/src/cli/handlers/scenario.test.ts +13 -0
- package/src/cli/handlers/scenario.ts +8 -7
- package/src/cli/handlers/search-index.test.ts +255 -0
- package/src/cli/handlers/search-json.test.ts +1 -1
- package/src/cli/handlers/search-ownership.test.ts +194 -0
- package/src/cli/handlers/search.ts +271 -38
- package/src/cli/main.test.ts +7 -0
- package/src/cli/main.ts +56 -1
- package/src/cli/mcp/lifecycle-tools.ts +3 -2
- package/src/cli/mcp/resource-handlers.ts +4 -3
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/cli/parse-args.ts +40 -2
- package/src/cli/registry.ts +19 -1
- package/src/cloud-lister/aws.test.ts +202 -0
- package/src/cloud-lister/aws.ts +226 -0
- package/src/cloud-lister/azure.test.ts +132 -0
- package/src/cloud-lister/azure.ts +142 -0
- package/src/cloud-lister/common.ts +115 -0
- package/src/cloud-lister/credentials.ts +110 -0
- package/src/cloud-lister/fakes.ts +66 -0
- package/src/cloud-lister/gcp.test.ts +121 -0
- package/src/cloud-lister/gcp.ts +159 -0
- package/src/cloud-lister/guard.test.ts +198 -0
- package/src/cloud-lister/guard.ts +111 -0
- package/src/cloud-lister/ids.ts +54 -0
- package/src/cloud-lister/index.ts +134 -0
- package/src/cloud-lister/kubernetes.test.ts +160 -0
- package/src/cloud-lister/kubernetes.ts +284 -0
- package/src/cloud-lister/markers.ts +74 -0
- package/src/cloud-lister/mask.ts +77 -0
- package/src/cloud-lister/shape.test.ts +81 -0
- package/src/cloud-lister/sigv4.ts +70 -0
- package/src/cloud-lister/transport.ts +118 -0
- package/src/cloud-lister/types.ts +135 -0
- package/src/components/capability-plugin-loader.ts +4 -0
- package/src/components/capability-plugin.ts +10 -0
- package/src/components/capability.ts +229 -0
- package/src/components/cli-support.ts +70 -14
- package/src/components/declared-reads.test.ts +103 -0
- package/src/components/declared-reads.ts +134 -0
- package/src/components/deploy-units.ts +4 -0
- package/src/components/driver.ts +89 -4
- package/src/components/fan-out-run.ts +95 -15
- package/src/components/fan-out-support.ts +10 -1
- package/src/components/fan-out.ts +30 -0
- package/src/components/groups.test.ts +320 -0
- package/src/components/groups.ts +880 -0
- package/src/components/index.ts +42 -0
- package/src/components/plan-shape-conformance.ts +130 -0
- package/src/components/pr-env-run-bundle.test.ts +2 -0
- package/src/components/pr-run.test.ts +516 -3
- package/src/components/pr-run.ts +231 -41
- package/src/components/promote-rounds.ts +25 -2
- package/src/components/promote.ts +55 -5
- package/src/components/registry.test.ts +1 -1
- package/src/components/release-gate.ts +115 -30
- package/src/components/release-groups.test.ts +362 -0
- package/src/components/run-groups.ts +113 -0
- package/src/components/starter-plugin.ts +6 -0
- package/src/components/verbs/index.ts +1 -0
- package/src/components/verbs/member-outputs.test.ts +205 -0
- package/src/components/verbs/member-outputs.ts +308 -0
- package/src/config.ts +44 -0
- package/src/deep-observation.ts +5 -23
- package/src/drift-record.test.ts +596 -0
- package/src/drift-record.ts +1206 -0
- package/src/engine-facts.guard.test.ts +111 -0
- package/src/engine-facts.test.ts +178 -0
- package/src/engine-facts.ts +154 -0
- package/src/gated-waves-bundle.test.ts +2 -0
- package/src/graph-ir-live.test.ts +92 -0
- package/src/graph-ir.ts +317 -7
- package/src/graph-refs.ts +416 -0
- package/src/graph-schema/fixtures/adopt.json +15 -0
- package/src/graph-schema/fixtures/choudoufu.engine-graph.json +169 -0
- package/src/graph-schema/fixtures/index.json +68 -0
- package/src/graph-schema/fixtures/plunge.engine-graph.json +158 -0
- package/src/graph-schema/fixtures.ts +267 -0
- package/src/graph-schema/generate.ts +263 -0
- package/src/graph-schema/graph-schema.test.ts +153 -0
- package/src/graph-schema/graph.schema.json +1387 -0
- package/src/health.schema.json +2 -1
- package/src/identity.ts +2 -0
- package/src/index.ts +2 -0
- package/src/instance-nodes.ts +288 -0
- package/src/lexicon.ts +76 -0
- package/src/lifecycle/__fixtures__/index-diff/20261026T120000Z-aaaaaaaaaaaa.json +149 -0
- package/src/lifecycle/__fixtures__/index-diff/20261026T130000Z-bbbbbbbbbbbb.json +127 -0
- package/src/lifecycle/adoption-file.test.ts +100 -0
- package/src/lifecycle/adoption-file.ts +154 -0
- package/src/lifecycle/cloud-index.test.ts +517 -0
- package/src/lifecycle/cloud-index.ts +736 -0
- package/src/lifecycle/derive-edges.test.ts +193 -0
- package/src/lifecycle/derive-edges.ts +182 -0
- package/src/lifecycle/git.ts +10 -4
- package/src/lifecycle/identity-match.test.ts +308 -0
- package/src/lifecycle/identity-match.ts +257 -0
- package/src/lifecycle/index-diff.test.ts +198 -0
- package/src/lifecycle/index-diff.ts +476 -0
- package/src/lifecycle/index-document.test.ts +64 -0
- package/src/lifecycle/index-document.ts +299 -0
- package/src/lifecycle/index-drift.test.ts +191 -0
- package/src/lifecycle/index-drift.ts +304 -0
- package/src/lifecycle/index-import.test.ts +255 -0
- package/src/lifecycle/index-import.ts +634 -0
- package/src/lifecycle/index-join.test.ts +250 -0
- package/src/lifecycle/index-join.ts +304 -0
- package/src/lifecycle/index-store-load-bearing.test.ts +187 -0
- package/src/lifecycle/index.ts +4 -0
- package/src/lifecycle/member-ledger.test.ts +25 -7
- package/src/lifecycle/observation-baseline.test.ts +72 -1
- package/src/lifecycle/observation-baseline.ts +190 -27
- package/src/lifecycle/observe.ts +6 -1
- package/src/lifecycle/query.test.ts +69 -1
- package/src/lifecycle/query.ts +103 -10
- package/src/lifecycle/replay.test.ts +9 -5
- package/src/lifecycle/replay.ts +9 -5
- package/src/lifecycle/scenario.ts +4 -3
- package/src/lifecycle/snapshot-store-fake.ts +29 -0
- package/src/lifecycle/snapshot-store-s3.ts +316 -0
- package/src/lifecycle/snapshot-store.test.ts +385 -0
- package/src/lifecycle/snapshot-store.ts +981 -0
- package/src/lifecycle/snapshot.test.ts +13 -0
- package/src/lifecycle/snapshot.ts +23 -6
- package/src/lifecycle/type-listing.test.ts +166 -0
- package/src/lifecycle/type-listing.ts +309 -0
- package/src/lint/component-checks.ts +17 -1
- package/src/lint/config.test.ts +3 -0
- package/src/lint/presets/relaxed.json +2 -1
- package/src/lint/presets/strict.json +2 -1
- package/src/lint/rules/__fixtures__/comp/comp008/fail/dns.component.ts +15 -0
- package/src/lint/rules/__fixtures__/comp/comp008/pass/dns.component.ts +10 -0
- package/src/lint/rules/comp/comp.test.ts +2 -1
- package/src/lint/rules/comp/comp008-applies-signal-only-root.ts +121 -0
- package/src/lint/rules/comp/comp008.test.ts +77 -0
- package/src/lint/rules/comp/index.ts +4 -1
- package/src/observation-edges.test.ts +33 -0
- package/src/observation.ts +36 -1
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +8 -5
- package/src/op/activity-failure.ts +36 -0
- package/src/op/index.ts +2 -1
- package/src/op/local-executor.test.ts +80 -0
- package/src/op/local-executor.ts +27 -9
- package/src/pr-loop-bundle.test.ts +5 -2
- package/src/pr-loop.test.ts +43 -0
- package/src/pr-loop.ts +111 -2
- package/src/pulumi-urn.ts +151 -0
- package/src/release-floors.ts +22 -0
- package/src/sensitive-key.ts +34 -0
- package/src/workspace/adoption-report.test.ts +61 -0
- package/src/workspace/adoption-report.ts +103 -0
- package/src/workspace/capabilities-contract.test.ts +4 -0
- package/src/workspace/capabilities-contract.ts +9 -1
- package/src/workspace/capabilities.schema.json +98 -0
- package/src/workspace/change-set.schema.json +42 -3
- package/src/workspace/ci-cloud-identity.ts +31 -1
- package/src/workspace/compose-graph.test.ts +12 -0
- package/src/workspace/compose-graph.ts +12 -1
- package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
- package/src/workspace/conformance/index.ts +6 -1
- package/src/workspace/drift-cli.test.ts +65 -0
- package/src/workspace/drift-cli.ts +365 -0
- package/src/workspace/drift.schema.json +672 -0
- package/src/workspace/graph-cli.ts +5 -0
- package/src/workspace/graph.schema.json +72 -0
- package/src/workspace/init.test.ts +38 -1
- package/src/workspace/init.ts +50 -8
- package/src/workspace/intent-gaps.test.ts +18 -2
- package/src/workspace/ledger.schema.json +1 -1
- package/src/workspace/nested-graph.ts +1 -0
- package/src/workspace/pr-report.schema.json +51 -2
- package/src/workspace/promote-waves.test.ts +296 -0
- package/src/workspace/promote-waves.ts +340 -0
- package/src/workspace/promote.test.ts +158 -4
- package/src/workspace/promote.ts +398 -57
- package/src/workspace/reason-codes.test.ts +4 -1
- package/src/workspace/reason-codes.ts +14 -0
- package/src/workspace/search-contract.ts +2 -0
- package/src/workspace/search.schema.json +103 -5
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `s3` medium of the index store (#4519): objects in a bucket under a
|
|
3
|
+
* prefix of their own, never a record store's prefix.
|
|
4
|
+
*
|
|
5
|
+
* Transport is `fetch` with a SigV4 header signature, hand-written as the aws
|
|
6
|
+
* lexicon's read client is (lexicons/aws/src/api/sigv4.ts), so core takes no
|
|
7
|
+
* `@aws-sdk/*` dependency. `fetch` is injectable: the conformance test runs
|
|
8
|
+
* against an in-process fake and nothing leaves the process.
|
|
9
|
+
*
|
|
10
|
+
* ## Credentials
|
|
11
|
+
*
|
|
12
|
+
* The rule is the one round 2 of the engine work set for every emulator run:
|
|
13
|
+
* a store pointed at an endpoint never reaches for the default AWS credential
|
|
14
|
+
* chain.
|
|
15
|
+
*
|
|
16
|
+
* - Explicit credentials (`credentials` in chant.config.ts, or
|
|
17
|
+
* `CHANT_SNAPSHOT_S3_ACCESS_KEY_ID` / `_SECRET_ACCESS_KEY` /
|
|
18
|
+
* `_SESSION_TOKEN`) are used as given.
|
|
19
|
+
* - With an `endpoint` and no explicit credentials the store refuses. It does
|
|
20
|
+
* not read `AWS_ACCESS_KEY_ID`, a profile file, or an instance role, so an
|
|
21
|
+
* emulator run can never sign with, or leak, a real account's keys.
|
|
22
|
+
* - With no endpoint (real S3), `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`
|
|
23
|
+
* / `AWS_SESSION_TOKEN` answer. Profiles and instance roles are not read.
|
|
24
|
+
*
|
|
25
|
+
* ## History
|
|
26
|
+
*
|
|
27
|
+
* A snapshot keeps one key, so its history is the bucket's object versions:
|
|
28
|
+
* turn versioning on. An index version is a new key per read, so it needs no
|
|
29
|
+
* versioning. A write of an index version sends `If-None-Match: *`, and a 412
|
|
30
|
+
* means the version already exists.
|
|
31
|
+
*/
|
|
32
|
+
import { createHash, createHmac } from "node:crypto";
|
|
33
|
+
export class S3StoreError extends Error {
|
|
34
|
+
constructor(message, status) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.status = status;
|
|
37
|
+
this.name = "S3StoreError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the credentials the medium signs with, by the rule in the module
|
|
42
|
+
* header. Exported for the test that pins it.
|
|
43
|
+
*/
|
|
44
|
+
export function resolveS3Credentials(settings, env = process.env) {
|
|
45
|
+
if (settings.credentials)
|
|
46
|
+
return settings.credentials;
|
|
47
|
+
const explicitId = env.CHANT_SNAPSHOT_S3_ACCESS_KEY_ID;
|
|
48
|
+
const explicitSecret = env.CHANT_SNAPSHOT_S3_SECRET_ACCESS_KEY;
|
|
49
|
+
if (explicitId && explicitSecret) {
|
|
50
|
+
return {
|
|
51
|
+
accessKeyId: explicitId,
|
|
52
|
+
secretAccessKey: explicitSecret,
|
|
53
|
+
...(env.CHANT_SNAPSHOT_S3_SESSION_TOKEN ? { sessionToken: env.CHANT_SNAPSHOT_S3_SESSION_TOKEN } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (settings.endpoint) {
|
|
57
|
+
throw new S3StoreError(`the s3 store at ${settings.endpoint} needs explicit credentials (snapshots.credentials in chant.config.ts, or CHANT_SNAPSHOT_S3_ACCESS_KEY_ID and CHANT_SNAPSHOT_S3_SECRET_ACCESS_KEY); against an endpoint it never reads the default AWS credential chain`);
|
|
58
|
+
}
|
|
59
|
+
const id = env.AWS_ACCESS_KEY_ID;
|
|
60
|
+
const secret = env.AWS_SECRET_ACCESS_KEY;
|
|
61
|
+
if (!id || !secret) {
|
|
62
|
+
throw new S3StoreError("the s3 store has no credentials: set snapshots.credentials, CHANT_SNAPSHOT_S3_ACCESS_KEY_ID and CHANT_SNAPSHOT_S3_SECRET_ACCESS_KEY, or AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY (profiles and instance roles are not read)");
|
|
63
|
+
}
|
|
64
|
+
return { accessKeyId: id, secretAccessKey: secret, ...(env.AWS_SESSION_TOKEN ? { sessionToken: env.AWS_SESSION_TOKEN } : {}) };
|
|
65
|
+
}
|
|
66
|
+
const EMPTY_SHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
|
|
67
|
+
const sha256Hex = (s) => createHash("sha256").update(s, "utf8").digest("hex");
|
|
68
|
+
const hmac = (key, data) => createHmac("sha256", key).update(data, "utf8").digest();
|
|
69
|
+
/** RFC 3986 percent-encoding, as S3 signs it. */
|
|
70
|
+
export function encodeRfc3986(value) {
|
|
71
|
+
return encodeURIComponent(value).replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* SigV4 headers for one S3 request. S3 signs the path encoded once, which is
|
|
75
|
+
* how {@link S3Medium} builds it, so the URL's pathname is the canonical URI
|
|
76
|
+
* as it stands.
|
|
77
|
+
*/
|
|
78
|
+
export function signS3Request(req) {
|
|
79
|
+
const url = new URL(req.url);
|
|
80
|
+
const timestamp = (req.now ?? new Date()).toISOString().replace(/[:-]|\.\d{3}/g, "");
|
|
81
|
+
const day = timestamp.slice(0, 8);
|
|
82
|
+
const payloadHash = req.body.length === 0 ? EMPTY_SHA256 : sha256Hex(req.body);
|
|
83
|
+
const signable = {
|
|
84
|
+
...Object.fromEntries(Object.entries(req.headers).map(([k, v]) => [k.toLowerCase(), v.trim()])),
|
|
85
|
+
host: url.host,
|
|
86
|
+
"x-amz-date": timestamp,
|
|
87
|
+
"x-amz-content-sha256": payloadHash,
|
|
88
|
+
...(req.credentials.sessionToken ? { "x-amz-security-token": req.credentials.sessionToken } : {}),
|
|
89
|
+
};
|
|
90
|
+
const names = Object.keys(signable).sort();
|
|
91
|
+
const pairs = [];
|
|
92
|
+
url.searchParams.forEach((v, k) => pairs.push([encodeRfc3986(k), encodeRfc3986(v)]));
|
|
93
|
+
pairs.sort((a, b) => (a[0] === b[0] ? (a[1] < b[1] ? -1 : 1) : a[0] < b[0] ? -1 : 1));
|
|
94
|
+
const canonical = [
|
|
95
|
+
req.method.toUpperCase(),
|
|
96
|
+
url.pathname || "/",
|
|
97
|
+
pairs.map(([k, v]) => `${k}=${v}`).join("&"),
|
|
98
|
+
names.map((n) => `${n}:${signable[n].replace(/\s+/g, " ")}\n`).join(""),
|
|
99
|
+
names.join(";"),
|
|
100
|
+
payloadHash,
|
|
101
|
+
].join("\n");
|
|
102
|
+
const scope = `${day}/${req.region}/s3/aws4_request`;
|
|
103
|
+
const toSign = ["AWS4-HMAC-SHA256", timestamp, scope, sha256Hex(canonical)].join("\n");
|
|
104
|
+
const key = hmac(hmac(hmac(hmac(`AWS4${req.credentials.secretAccessKey}`, day), req.region), "s3"), "aws4_request");
|
|
105
|
+
const signature = hmac(key, toSign).toString("hex");
|
|
106
|
+
const { host: _host, ...emitted } = signable;
|
|
107
|
+
return {
|
|
108
|
+
...emitted,
|
|
109
|
+
authorization: `AWS4-HMAC-SHA256 Credential=${req.credentials.accessKeyId}/${scope}, SignedHeaders=${names.join(";")}, Signature=${signature}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const XML_ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
|
|
113
|
+
const decodeXml = (s) => s.replace(/&(#x[0-9a-fA-F]+|#\d+|amp|lt|gt|quot|apos);/g, (_m, e) => e.startsWith("#x") ? String.fromCodePoint(parseInt(e.slice(2), 16)) : e.startsWith("#") ? String.fromCodePoint(parseInt(e.slice(1), 10)) : XML_ENTITIES[e]);
|
|
114
|
+
const tagAll = (xml, tag) => [...xml.matchAll(new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`, "g"))].map((m) => m[1]);
|
|
115
|
+
const tagOne = (xml, tag) => {
|
|
116
|
+
const v = tagAll(xml, tag)[0];
|
|
117
|
+
return v === undefined ? undefined : decodeXml(v);
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Get, put and list over one bucket. Keys passed in are relative to the
|
|
121
|
+
* store's prefix.
|
|
122
|
+
*/
|
|
123
|
+
export class S3Medium {
|
|
124
|
+
constructor(settings, opts) {
|
|
125
|
+
this.settings = settings;
|
|
126
|
+
if (!settings.bucket)
|
|
127
|
+
throw new S3StoreError("the s3 store needs a bucket");
|
|
128
|
+
this.prefix = (settings.prefix ?? "chant").replace(/^\/+|\/+$/g, "");
|
|
129
|
+
this.region = settings.region ?? "us-east-1";
|
|
130
|
+
this.fetchImpl = opts?.fetch ?? ((url, init) => fetch(url, init));
|
|
131
|
+
// Resolved at once, so a missing credential is an error before any request.
|
|
132
|
+
this.credentials = resolveS3Credentials(settings, opts?.env);
|
|
133
|
+
}
|
|
134
|
+
/** `s3://bucket/prefix`, for messages. */
|
|
135
|
+
get where() {
|
|
136
|
+
return `s3://${this.settings.bucket}/${this.prefix}`;
|
|
137
|
+
}
|
|
138
|
+
fullKey(key) {
|
|
139
|
+
return this.prefix === "" ? key : `${this.prefix}/${key}`;
|
|
140
|
+
}
|
|
141
|
+
stripPrefix(key) {
|
|
142
|
+
return this.prefix === "" ? key : key.slice(this.prefix.length + 1);
|
|
143
|
+
}
|
|
144
|
+
url(key, query) {
|
|
145
|
+
const pathStyle = this.settings.forcePathStyle ?? this.settings.endpoint !== undefined;
|
|
146
|
+
const base = this.settings.endpoint
|
|
147
|
+
? this.settings.endpoint.replace(/\/+$/, "")
|
|
148
|
+
: pathStyle
|
|
149
|
+
? `https://s3.${this.region}.amazonaws.com`
|
|
150
|
+
: `https://${this.settings.bucket}.s3.${this.region}.amazonaws.com`;
|
|
151
|
+
const encodedKey = key === null ? "" : key.split("/").map(encodeRfc3986).join("/");
|
|
152
|
+
const path = pathStyle ? `/${encodeRfc3986(this.settings.bucket)}${key === null ? "" : `/${encodedKey}`}` : `/${encodedKey}`;
|
|
153
|
+
const qs = Object.entries(query)
|
|
154
|
+
.map(([k, v]) => `${encodeRfc3986(k)}=${encodeRfc3986(v)}`)
|
|
155
|
+
.join("&");
|
|
156
|
+
return `${base}${path}${qs ? `?${qs}` : ""}`;
|
|
157
|
+
}
|
|
158
|
+
async request(method, key, query, body = "", headers = {}) {
|
|
159
|
+
const url = this.url(key, query);
|
|
160
|
+
const signed = signS3Request({ method, url, headers, body, region: this.region, credentials: this.credentials });
|
|
161
|
+
return this.fetchImpl(url, { method, headers: signed, ...(body !== "" || method === "PUT" ? { body } : {}) });
|
|
162
|
+
}
|
|
163
|
+
/** The object's content, or null when absent. `versionId` reads an older version. */
|
|
164
|
+
async get(key, versionId) {
|
|
165
|
+
const res = await this.request("GET", this.fullKey(key), versionId ? { versionId } : {});
|
|
166
|
+
if (res.status === 404)
|
|
167
|
+
return null;
|
|
168
|
+
if (res.status === 400 && versionId)
|
|
169
|
+
return null;
|
|
170
|
+
if (res.status !== 200)
|
|
171
|
+
throw new S3StoreError(`s3 GET ${key} returned ${res.status}: ${(await res.text()).slice(0, 200)}`, res.status);
|
|
172
|
+
return res.text();
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Put an object. With `ifAbsent`, an existing key is not overwritten and
|
|
176
|
+
* the result says `exists`. Returns the version id when the bucket keeps
|
|
177
|
+
* versions.
|
|
178
|
+
*/
|
|
179
|
+
async put(key, content, opts) {
|
|
180
|
+
const headers = { "content-type": "application/json" };
|
|
181
|
+
if (opts?.ifAbsent)
|
|
182
|
+
headers["if-none-match"] = "*";
|
|
183
|
+
const res = await this.request("PUT", this.fullKey(key), {}, content, headers);
|
|
184
|
+
if (res.status === 412 || res.status === 409)
|
|
185
|
+
return { exists: true };
|
|
186
|
+
if (res.status !== 200)
|
|
187
|
+
throw new S3StoreError(`s3 PUT ${key} returned ${res.status}: ${(await res.text()).slice(0, 200)}`, res.status);
|
|
188
|
+
const versionId = res.headers.get("x-amz-version-id");
|
|
189
|
+
return { exists: false, ...(versionId && versionId !== "null" ? { versionId } : {}) };
|
|
190
|
+
}
|
|
191
|
+
/** The names directly under `dir/`: files, and directories with a trailing `/`. */
|
|
192
|
+
async list(dir) {
|
|
193
|
+
const prefix = `${this.fullKey(dir)}/`;
|
|
194
|
+
const names = [];
|
|
195
|
+
let token;
|
|
196
|
+
do {
|
|
197
|
+
const res = await this.request("GET", null, {
|
|
198
|
+
"list-type": "2",
|
|
199
|
+
prefix,
|
|
200
|
+
delimiter: "/",
|
|
201
|
+
...(token ? { "continuation-token": token } : {}),
|
|
202
|
+
});
|
|
203
|
+
if (res.status === 404)
|
|
204
|
+
return [];
|
|
205
|
+
if (res.status !== 200)
|
|
206
|
+
throw new S3StoreError(`s3 list ${dir} returned ${res.status}`, res.status);
|
|
207
|
+
const xml = await res.text();
|
|
208
|
+
for (const c of tagAll(xml, "Contents")) {
|
|
209
|
+
const k = tagOne(c, "Key");
|
|
210
|
+
if (k !== undefined && k.length > prefix.length)
|
|
211
|
+
names.push(k.slice(prefix.length));
|
|
212
|
+
}
|
|
213
|
+
for (const p of tagAll(xml, "CommonPrefixes")) {
|
|
214
|
+
const k = tagOne(p, "Prefix");
|
|
215
|
+
if (k !== undefined && k.length > prefix.length)
|
|
216
|
+
names.push(k.slice(prefix.length));
|
|
217
|
+
}
|
|
218
|
+
token = tagOne(xml, "IsTruncated") === "true" ? tagOne(xml, "NextContinuationToken") : undefined;
|
|
219
|
+
} while (token);
|
|
220
|
+
return [...new Set(names)].sort();
|
|
221
|
+
}
|
|
222
|
+
/** Every version of every key under `dir/` (recursively), newest first. */
|
|
223
|
+
async versions(dir) {
|
|
224
|
+
const prefix = `${this.fullKey(dir)}/`;
|
|
225
|
+
const out = [];
|
|
226
|
+
let keyMarker;
|
|
227
|
+
let versionMarker;
|
|
228
|
+
do {
|
|
229
|
+
const res = await this.request("GET", null, {
|
|
230
|
+
versions: "",
|
|
231
|
+
prefix,
|
|
232
|
+
...(keyMarker ? { "key-marker": keyMarker } : {}),
|
|
233
|
+
...(versionMarker ? { "version-id-marker": versionMarker } : {}),
|
|
234
|
+
});
|
|
235
|
+
if (res.status === 404)
|
|
236
|
+
return [];
|
|
237
|
+
if (res.status !== 200)
|
|
238
|
+
throw new S3StoreError(`s3 list versions ${dir} returned ${res.status}`, res.status);
|
|
239
|
+
const xml = await res.text();
|
|
240
|
+
for (const v of tagAll(xml, "Version")) {
|
|
241
|
+
const key = tagOne(v, "Key");
|
|
242
|
+
const versionId = tagOne(v, "VersionId");
|
|
243
|
+
const lastModified = tagOne(v, "LastModified");
|
|
244
|
+
if (key === undefined || versionId === undefined || lastModified === undefined)
|
|
245
|
+
continue;
|
|
246
|
+
out.push({ key: this.stripPrefix(key), versionId, lastModified, isLatest: tagOne(v, "IsLatest") === "true" });
|
|
247
|
+
}
|
|
248
|
+
const truncated = tagOne(xml, "IsTruncated") === "true";
|
|
249
|
+
keyMarker = truncated ? tagOne(xml, "NextKeyMarker") : undefined;
|
|
250
|
+
versionMarker = truncated ? tagOne(xml, "NextVersionIdMarker") : undefined;
|
|
251
|
+
} while (keyMarker);
|
|
252
|
+
return out.sort((a, b) => (a.lastModified < b.lastModified ? 1 : a.lastModified > b.lastModified ? -1 : 0));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { type LedgerLocation } from "./git.js";
|
|
2
|
+
import { type IndexDocument, type IndexScope } from "./index-document.js";
|
|
3
|
+
import { type S3Fetch, type S3StoreSettings } from "./snapshot-store-s3.js";
|
|
4
|
+
/** The first chant that writes snapshots through the store, to `refs/chant/snapshots` by default. */
|
|
5
|
+
export declare const SNAPSHOT_STORE_FLOOR = "0.124.54";
|
|
6
|
+
/** The ref the default store writes. */
|
|
7
|
+
export declare const SNAPSHOT_REF = "refs/chant/snapshots";
|
|
8
|
+
/** Where index versions sit on a git ref. The underscore keeps it clear of every environment name, as `_gates` and `_members` are. */
|
|
9
|
+
export declare const GIT_INDEX_DIR = "_index";
|
|
10
|
+
export type SnapshotStoreKind = "git-ref" | "orphan-branch" | "local" | "s3" | "none";
|
|
11
|
+
/** One entry of a snapshot history, newest first. */
|
|
12
|
+
export interface SnapshotVersion {
|
|
13
|
+
/** What {@link SnapshotStore.readAt} takes: a commit on a git store, an object version id on s3, a modification time on local. */
|
|
14
|
+
version: string;
|
|
15
|
+
/** ISO time of the write. */
|
|
16
|
+
date: string;
|
|
17
|
+
message: string;
|
|
18
|
+
/** The snapshot key the entry is for, when the store keeps history per key (s3, local). */
|
|
19
|
+
key?: string;
|
|
20
|
+
}
|
|
21
|
+
/** What a write did. A store that keeps nothing, or a run that records nothing, says so instead of throwing. */
|
|
22
|
+
export interface StoreWrite {
|
|
23
|
+
written: boolean;
|
|
24
|
+
/** The commit, object version or file time the write made. */
|
|
25
|
+
version?: string;
|
|
26
|
+
/** The store path written, relative to its family root. */
|
|
27
|
+
path?: string;
|
|
28
|
+
/** Why nothing was written. */
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
/** What publishing a store's writes did: pushed to a remote, kept local, or refused. */
|
|
32
|
+
export interface StorePublish {
|
|
33
|
+
status: "pushed" | "local" | "nothing" | "stale" | "failed";
|
|
34
|
+
detail?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The index store. Snapshot methods take the snapshot's environment and key
|
|
38
|
+
* (`snapshotStorageKey(lexicon, stack)`), and a {@link LedgerLocation} for a
|
|
39
|
+
* workspace member; index methods take a scope key (`stamp.scopeKey`).
|
|
40
|
+
*/
|
|
41
|
+
export interface SnapshotStore {
|
|
42
|
+
readonly kind: SnapshotStoreKind;
|
|
43
|
+
/** `refs/chant/snapshots`, a directory, `s3://bucket/prefix`, `nowhere`: for messages. */
|
|
44
|
+
readonly where: string;
|
|
45
|
+
/** False for `none` and the read-only orphan-branch store. */
|
|
46
|
+
readonly writable: boolean;
|
|
47
|
+
write(environment: string, key: string, json: string, at?: LedgerLocation): Promise<StoreWrite>;
|
|
48
|
+
readLatest(environment: string, key: string, at?: LedgerLocation): Promise<string | null>;
|
|
49
|
+
readAt(environment: string, key: string, version: string, at?: LedgerLocation): Promise<string | null>;
|
|
50
|
+
/** Snapshot history, newest first; with `environment`, only that environment's. */
|
|
51
|
+
list(opts?: LedgerLocation & {
|
|
52
|
+
environment?: string;
|
|
53
|
+
}): Promise<SnapshotVersion[]>;
|
|
54
|
+
/** The snapshot keys an environment holds now. */
|
|
55
|
+
keys(environment: string, at?: LedgerLocation): Promise<string[]>;
|
|
56
|
+
/** The environments that hold a snapshot now. */
|
|
57
|
+
environments(at?: LedgerLocation): Promise<string[]>;
|
|
58
|
+
/** Write one index version. Refuses a stamp that disagrees with itself; never overwrites. */
|
|
59
|
+
writeIndex(doc: IndexDocument): Promise<StoreWrite>;
|
|
60
|
+
/** Version names under a scope key, oldest first (name order is time order). */
|
|
61
|
+
listIndex(scopeKey: string): Promise<string[]>;
|
|
62
|
+
readIndexAt(scopeKey: string, version: string): Promise<IndexDocument | null>;
|
|
63
|
+
readIndexLatest(scopeKey: string): Promise<IndexDocument | null>;
|
|
64
|
+
/** The scope a scope key's digest stands for, from its `scope.json`. */
|
|
65
|
+
readIndexScope(scopeKey: string): Promise<IndexScope | null>;
|
|
66
|
+
/** Bring remote history in, when the store has a remote. Never rewinds local writes. Never throws. */
|
|
67
|
+
fetch(at?: LedgerLocation): Promise<void>;
|
|
68
|
+
/** Send this process's writes to the remote, when the store has one. Never throws. */
|
|
69
|
+
publish(at?: LedgerLocation): Promise<StorePublish>;
|
|
70
|
+
}
|
|
71
|
+
/** Every snapshot an environment holds, by key. The old `readEnvironmentSnapshots`, through a store. */
|
|
72
|
+
export declare function readEnvironmentSnapshotsFrom(store: SnapshotStore, environment: string, at?: LedgerLocation): Promise<Map<string, string>>;
|
|
73
|
+
/** One file written to a ref. */
|
|
74
|
+
export interface RefFileWrite {
|
|
75
|
+
path: string;
|
|
76
|
+
content: string;
|
|
77
|
+
/** Leave an existing file alone and report it. */
|
|
78
|
+
ifAbsent?: boolean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Commit files onto `ref`, keeping every other path the ref holds, with a
|
|
82
|
+
* compare-and-swap on the ref. Builds the tree in a scratch index, so the
|
|
83
|
+
* working tree, the real index and HEAD are never touched. A conflict with
|
|
84
|
+
* another writer is retried against the new tip: every caller writes a
|
|
85
|
+
* self-contained replacement or a new path, so a retry is always correct.
|
|
86
|
+
*
|
|
87
|
+
* Returns the new commit, or null when every `ifAbsent` file existed.
|
|
88
|
+
*/
|
|
89
|
+
export declare function commitFilesToRef(ref: string, files: RefFileWrite[], message: string, opts?: {
|
|
90
|
+
cwd?: string;
|
|
91
|
+
/** Build on this commit instead of the ref's tip (`null`: a root commit). The ref is still swapped from its current value. */
|
|
92
|
+
parent?: string | null;
|
|
93
|
+
}): Promise<{
|
|
94
|
+
commit: string | null;
|
|
95
|
+
existed: string[];
|
|
96
|
+
}>;
|
|
97
|
+
/**
|
|
98
|
+
* Fetch `ref` and fast-forward the local ref when it is behind. A local ref
|
|
99
|
+
* ahead of or diverged from the remote is kept as it is: its writes go out
|
|
100
|
+
* on the next {@link publishRef}, which rebases them.
|
|
101
|
+
*/
|
|
102
|
+
export declare function fetchRefFastForward(ref: string, opts?: {
|
|
103
|
+
cwd?: string;
|
|
104
|
+
}): Promise<"fetched" | "no-remote" | "missing" | "kept" | "failed">;
|
|
105
|
+
/**
|
|
106
|
+
* Push `ref` under a lease on the remote tip last fetched. A refused push
|
|
107
|
+
* (another machine pushed first) fetches, commits `pending` again on the
|
|
108
|
+
* remote tip, and pushes once more, up to three times.
|
|
109
|
+
*/
|
|
110
|
+
export declare function publishRef(ref: string, pending: ReadonlyMap<string, string>, message: string, opts?: {
|
|
111
|
+
cwd?: string;
|
|
112
|
+
}): Promise<StorePublish>;
|
|
113
|
+
/** `snapshots` in chant.config.ts. */
|
|
114
|
+
export type SnapshotStoreConfig = {
|
|
115
|
+
store: "git-ref";
|
|
116
|
+
ref?: string; /** Read `chant/lifecycle` when the ref has no answer. Default true. */
|
|
117
|
+
readOrphanBranch?: boolean;
|
|
118
|
+
} | {
|
|
119
|
+
store: "orphan-branch";
|
|
120
|
+
} | {
|
|
121
|
+
store: "local"; /** Relative to the project. Default `.chant/store`. */
|
|
122
|
+
dir?: string;
|
|
123
|
+
} | ({
|
|
124
|
+
store: "s3";
|
|
125
|
+
} & S3StoreSettings) | {
|
|
126
|
+
store: "none";
|
|
127
|
+
};
|
|
128
|
+
export declare const SNAPSHOT_STORE_KINDS: readonly SnapshotStoreKind[];
|
|
129
|
+
/** Default directory of a `local` store, relative to the project. */
|
|
130
|
+
export declare const DEFAULT_LOCAL_STORE_DIR = ".chant/store";
|
|
131
|
+
/**
|
|
132
|
+
* The store configuration in effect: `CHANT_SNAPSHOT_STORE` and its
|
|
133
|
+
* companions over `snapshots` in chant.config.ts over the default `git-ref`.
|
|
134
|
+
*/
|
|
135
|
+
export declare function snapshotStoreConfig(configured?: unknown, env?: Record<string, string | undefined>): SnapshotStoreConfig;
|
|
136
|
+
/** Seams for tests: the s3 transport and the environment its credentials come from. */
|
|
137
|
+
export interface SnapshotStoreDeps {
|
|
138
|
+
fetch?: S3Fetch;
|
|
139
|
+
env?: Record<string, string | undefined>;
|
|
140
|
+
}
|
|
141
|
+
/** Build a store from its configuration. `cwd` is the project directory. */
|
|
142
|
+
export declare function createSnapshotStore(config: SnapshotStoreConfig, opts?: {
|
|
143
|
+
cwd?: string;
|
|
144
|
+
} & SnapshotStoreDeps): SnapshotStore;
|
|
145
|
+
/**
|
|
146
|
+
* The project's store, built once per directory and configuration so a
|
|
147
|
+
* write and the publish after it share one instance. `config` is the
|
|
148
|
+
* project's loaded chant.config; without it the config is loaded from `cwd`
|
|
149
|
+
* upward, and a directory with none uses the default.
|
|
150
|
+
*/
|
|
151
|
+
export declare function resolveSnapshotStore(opts?: {
|
|
152
|
+
cwd?: string;
|
|
153
|
+
config?: {
|
|
154
|
+
snapshots?: unknown;
|
|
155
|
+
};
|
|
156
|
+
}): Promise<SnapshotStore>;
|
|
157
|
+
/** Forget every resolved store. For tests. */
|
|
158
|
+
export declare function resetResolvedSnapshotStores(): void;
|
|
159
|
+
/**
|
|
160
|
+
* The snapshot family as a {@link import("./ledger-port.js").LedgerReadPort}:
|
|
161
|
+
* `trees` are the environments, `list(env)` the snapshot files, `read` a file.
|
|
162
|
+
* `chant query` reads its `resources` and `snapshots` tables through this, so
|
|
163
|
+
* the tables are the same whichever store holds them.
|
|
164
|
+
*/
|
|
165
|
+
export declare function snapshotReadPort(store: SnapshotStore, at?: LedgerLocation): {
|
|
166
|
+
read: (dir: string, file: string) => Promise<string | null>;
|
|
167
|
+
list: (dir: string) => Promise<string[]>;
|
|
168
|
+
trees: () => Promise<string[]>;
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=snapshot-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../../src/lifecycle/snapshot-store.ts"],"names":[],"mappings":"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"}
|