@xemahq/xema 0.59.0 → 0.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/appliance-owner.d.ts.map +1 -1
- package/dist/appliance-owner.js +6 -6
- package/dist/appliance-owner.js.map +1 -1
- package/dist/assets/appliance-base/authorization.lock.json +5186 -0
- package/dist/assets/appliance-base/distribution.lock.json +760 -279
- package/dist/assets/appliance-base/images.lock.json +576 -513
- package/dist/assets/appliance-lean/authorization.lock.json +4648 -0
- package/dist/assets/appliance-lean/distribution.lock.json +641 -186
- package/dist/assets/appliance-lean/images.lock.json +574 -512
- package/dist/assets/boot-graph.json +33 -14
- package/dist/assets/distribution-assets.manifest.json +23 -20
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/biome-dev.d.ts.map +1 -1
- package/dist/commands/biome-dev.js +41 -137
- package/dist/commands/biome-dev.js.map +1 -1
- package/dist/commands/biome-lifecycle.d.ts +24 -0
- package/dist/commands/biome-lifecycle.d.ts.map +1 -0
- package/dist/commands/biome-lifecycle.js +253 -0
- package/dist/commands/biome-lifecycle.js.map +1 -0
- package/dist/commands/biome.d.ts +2 -4
- package/dist/commands/biome.d.ts.map +1 -1
- package/dist/commands/biome.js +61 -46
- package/dist/commands/biome.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +96 -8
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +13 -20
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +14 -21
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/installation-tenancy.d.ts +11 -0
- package/dist/commands/installation-tenancy.d.ts.map +1 -0
- package/dist/commands/installation-tenancy.js +308 -0
- package/dist/commands/installation-tenancy.js.map +1 -0
- package/dist/commands/installation.d.ts.map +1 -1
- package/dist/commands/installation.js +19 -5
- package/dist/commands/installation.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +41 -8
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/{dev.d.ts → mirror.d.ts} +1 -1
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +132 -0
- package/dist/commands/mirror.js.map +1 -0
- package/dist/commands/source.d.ts.map +1 -1
- package/dist/commands/source.js +3 -2
- package/dist/commands/source.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +40 -21
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +36 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/dev/infra-preflight.d.ts.map +1 -1
- package/dist/dev/infra-preflight.js +0 -4
- package/dist/dev/infra-preflight.js.map +1 -1
- package/dist/lib/confirm.d.ts +3 -0
- package/dist/lib/confirm.d.ts.map +1 -0
- package/dist/lib/confirm.js +19 -0
- package/dist/lib/confirm.js.map +1 -0
- package/dist/lib/output-format.d.ts +6 -0
- package/dist/lib/output-format.d.ts.map +1 -0
- package/dist/lib/output-format.js +20 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/mirror/config/mirror-config-document.d.ts +18 -0
- package/dist/mirror/config/mirror-config-document.d.ts.map +1 -0
- package/dist/mirror/config/mirror-config-document.js +57 -0
- package/dist/mirror/config/mirror-config-document.js.map +1 -0
- package/dist/mirror/config/mirror-config-schema.d.ts +54 -0
- package/dist/mirror/config/mirror-config-schema.d.ts.map +1 -0
- package/dist/mirror/config/mirror-config-schema.js +80 -0
- package/dist/mirror/config/mirror-config-schema.js.map +1 -0
- package/dist/mirror/kit/delta.d.ts +4 -0
- package/dist/mirror/kit/delta.d.ts.map +1 -0
- package/dist/mirror/kit/delta.js +41 -0
- package/dist/mirror/kit/delta.js.map +1 -0
- package/dist/mirror/kit/export-kit.d.ts +16 -0
- package/dist/mirror/kit/export-kit.d.ts.map +1 -0
- package/dist/mirror/kit/export-kit.js +112 -0
- package/dist/mirror/kit/export-kit.js.map +1 -0
- package/dist/mirror/kit/import-kit.d.ts +9 -0
- package/dist/mirror/kit/import-kit.d.ts.map +1 -0
- package/dist/mirror/kit/import-kit.js +166 -0
- package/dist/mirror/kit/import-kit.js.map +1 -0
- package/dist/mirror/kit/kit-archive.d.ts +4 -0
- package/dist/mirror/kit/kit-archive.d.ts.map +1 -0
- package/dist/mirror/kit/kit-archive.js +38 -0
- package/dist/mirror/kit/kit-archive.js.map +1 -0
- package/dist/mirror/kit/kit-layout.d.ts +10 -0
- package/dist/mirror/kit/kit-layout.d.ts.map +1 -0
- package/dist/mirror/kit/kit-layout.js +19 -0
- package/dist/mirror/kit/kit-layout.js.map +1 -0
- package/dist/mirror/kit/kit-sums.d.ts +5 -0
- package/dist/mirror/kit/kit-sums.d.ts.map +1 -0
- package/dist/mirror/kit/kit-sums.js +63 -0
- package/dist/mirror/kit/kit-sums.js.map +1 -0
- package/dist/mirror/kit/layout-sync.d.ts +8 -0
- package/dist/mirror/kit/layout-sync.d.ts.map +1 -0
- package/dist/mirror/kit/layout-sync.js +58 -0
- package/dist/mirror/kit/layout-sync.js.map +1 -0
- package/dist/mirror/plan/bundle-content.d.ts +10 -0
- package/dist/mirror/plan/bundle-content.d.ts.map +1 -0
- package/dist/mirror/plan/bundle-content.js +61 -0
- package/dist/mirror/plan/bundle-content.js.map +1 -0
- package/dist/mirror/plan/declaration-file.d.ts +9 -0
- package/dist/mirror/plan/declaration-file.d.ts.map +1 -0
- package/dist/mirror/plan/declaration-file.js +27 -0
- package/dist/mirror/plan/declaration-file.js.map +1 -0
- package/dist/mirror/plan/edition-inputs.d.ts +57 -0
- package/dist/mirror/plan/edition-inputs.d.ts.map +1 -0
- package/dist/mirror/plan/edition-inputs.js +44 -0
- package/dist/mirror/plan/edition-inputs.js.map +1 -0
- package/dist/mirror/plan/edition-reader.d.ts +9 -0
- package/dist/mirror/plan/edition-reader.d.ts.map +1 -0
- package/dist/mirror/plan/edition-reader.js +47 -0
- package/dist/mirror/plan/edition-reader.js.map +1 -0
- package/dist/mirror/plan/image-content.d.ts +30 -0
- package/dist/mirror/plan/image-content.d.ts.map +1 -0
- package/dist/mirror/plan/image-content.js +120 -0
- package/dist/mirror/plan/image-content.js.map +1 -0
- package/dist/mirror/plan/npm-lockfile.d.ts +12 -0
- package/dist/mirror/plan/npm-lockfile.d.ts.map +1 -0
- package/dist/mirror/plan/npm-lockfile.js +106 -0
- package/dist/mirror/plan/npm-lockfile.js.map +1 -0
- package/dist/mirror/plan/oci-reads.d.ts +22 -0
- package/dist/mirror/plan/oci-reads.d.ts.map +1 -0
- package/dist/mirror/plan/oci-reads.js +43 -0
- package/dist/mirror/plan/oci-reads.js.map +1 -0
- package/dist/mirror/plan/plan-command.d.ts +22 -0
- package/dist/mirror/plan/plan-command.d.ts.map +1 -0
- package/dist/mirror/plan/plan-command.js +81 -0
- package/dist/mirror/plan/plan-command.js.map +1 -0
- package/dist/mirror/plan/plan-file.d.ts +13 -0
- package/dist/mirror/plan/plan-file.d.ts.map +1 -0
- package/dist/mirror/plan/plan-file.js +63 -0
- package/dist/mirror/plan/plan-file.js.map +1 -0
- package/dist/mirror/plan/resolve-content-set.d.ts +16 -0
- package/dist/mirror/plan/resolve-content-set.d.ts.map +1 -0
- package/dist/mirror/plan/resolve-content-set.js +90 -0
- package/dist/mirror/plan/resolve-content-set.js.map +1 -0
- package/dist/mirror/preflight/glob.d.ts +2 -0
- package/dist/mirror/preflight/glob.d.ts.map +1 -0
- package/dist/mirror/preflight/glob.js +59 -0
- package/dist/mirror/preflight/glob.js.map +1 -0
- package/dist/mirror/preflight/harbor-api.d.ts +27 -0
- package/dist/mirror/preflight/harbor-api.d.ts.map +1 -0
- package/dist/mirror/preflight/harbor-api.js +39 -0
- package/dist/mirror/preflight/harbor-api.js.map +1 -0
- package/dist/mirror/preflight/preflight.d.ts +18 -0
- package/dist/mirror/preflight/preflight.d.ts.map +1 -0
- package/dist/mirror/preflight/preflight.js +41 -0
- package/dist/mirror/preflight/preflight.js.map +1 -0
- package/dist/mirror/preflight/tag-moves.d.ts +16 -0
- package/dist/mirror/preflight/tag-moves.d.ts.map +1 -0
- package/dist/mirror/preflight/tag-moves.js +28 -0
- package/dist/mirror/preflight/tag-moves.js.map +1 -0
- package/dist/mirror/preflight/write-probe.d.ts +10 -0
- package/dist/mirror/preflight/write-probe.d.ts.map +1 -0
- package/dist/mirror/preflight/write-probe.js +36 -0
- package/dist/mirror/preflight/write-probe.js.map +1 -0
- package/dist/mirror/target/extras.d.ts +16 -0
- package/dist/mirror/target/extras.d.ts.map +1 -0
- package/dist/mirror/target/extras.js +47 -0
- package/dist/mirror/target/extras.js.map +1 -0
- package/dist/mirror/target/npm-registry.d.ts +20 -0
- package/dist/mirror/target/npm-registry.d.ts.map +1 -0
- package/dist/mirror/target/npm-registry.js +67 -0
- package/dist/mirror/target/npm-registry.js.map +1 -0
- package/dist/mirror/target/npm-sync.d.ts +15 -0
- package/dist/mirror/target/npm-sync.d.ts.map +1 -0
- package/dist/mirror/target/npm-sync.js +44 -0
- package/dist/mirror/target/npm-sync.js.map +1 -0
- package/dist/mirror/target/oci-items.d.ts +27 -0
- package/dist/mirror/target/oci-items.d.ts.map +1 -0
- package/dist/mirror/target/oci-items.js +79 -0
- package/dist/mirror/target/oci-items.js.map +1 -0
- package/dist/mirror/target/oci-sync.d.ts +20 -0
- package/dist/mirror/target/oci-sync.d.ts.map +1 -0
- package/dist/mirror/target/oci-sync.js +93 -0
- package/dist/mirror/target/oci-sync.js.map +1 -0
- package/dist/mirror/target/receipt-store.d.ts +13 -0
- package/dist/mirror/target/receipt-store.d.ts.map +1 -0
- package/dist/mirror/target/receipt-store.js +61 -0
- package/dist/mirror/target/receipt-store.js.map +1 -0
- package/dist/mirror/target/receipt.d.ts +13 -0
- package/dist/mirror/target/receipt.d.ts.map +1 -0
- package/dist/mirror/target/receipt.js +25 -0
- package/dist/mirror/target/receipt.js.map +1 -0
- package/dist/mirror/target/seed-push.d.ts +15 -0
- package/dist/mirror/target/seed-push.d.ts.map +1 -0
- package/dist/mirror/target/seed-push.js +20 -0
- package/dist/mirror/target/seed-push.js.map +1 -0
- package/dist/mirror/target/target-access.d.ts +7 -0
- package/dist/mirror/target/target-access.d.ts.map +1 -0
- package/dist/mirror/target/target-access.js +17 -0
- package/dist/mirror/target/target-access.js.map +1 -0
- package/dist/mirror/target/target-commands.d.ts +21 -0
- package/dist/mirror/target/target-commands.d.ts.map +1 -0
- package/dist/mirror/target/target-commands.js +134 -0
- package/dist/mirror/target/target-commands.js.map +1 -0
- package/dist/mirror/target/target-context.d.ts +11 -0
- package/dist/mirror/target/target-context.d.ts.map +1 -0
- package/dist/mirror/target/target-context.js +31 -0
- package/dist/mirror/target/target-context.js.map +1 -0
- package/dist/mirror/target/target-ports.d.ts +18 -0
- package/dist/mirror/target/target-ports.d.ts.map +1 -0
- package/dist/mirror/target/target-ports.js +49 -0
- package/dist/mirror/target/target-ports.js.map +1 -0
- package/dist/mirror/target/target-state.d.ts +22 -0
- package/dist/mirror/target/target-state.d.ts.map +1 -0
- package/dist/mirror/target/target-state.js +41 -0
- package/dist/mirror/target/target-state.js.map +1 -0
- package/dist/runtime/biome-dev.d.ts +0 -16
- package/dist/runtime/biome-dev.d.ts.map +1 -1
- package/dist/runtime/biome-dev.js +0 -53
- package/dist/runtime/biome-dev.js.map +1 -1
- package/dist/runtime/biome-host/biome-directory-packer.d.ts +3 -0
- package/dist/runtime/biome-host/biome-directory-packer.d.ts.map +1 -0
- package/dist/runtime/biome-host/biome-directory-packer.js +12 -0
- package/dist/runtime/biome-host/biome-directory-packer.js.map +1 -0
- package/dist/runtime/biome-host/bundle-packer.d.ts +8 -0
- package/dist/runtime/biome-host/bundle-packer.d.ts.map +1 -0
- package/dist/runtime/biome-host/bundle-packer.js +3 -0
- package/dist/runtime/biome-host/bundle-packer.js.map +1 -0
- package/dist/runtime/biome-host/from-spec.d.ts +33 -0
- package/dist/runtime/biome-host/from-spec.d.ts.map +1 -0
- package/dist/runtime/biome-host/from-spec.js +70 -0
- package/dist/runtime/biome-host/from-spec.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-client.d.ts +20 -0
- package/dist/runtime/biome-host/lifecycle-client.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-client.js +197 -0
- package/dist/runtime/biome-host/lifecycle-client.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-contract.d.ts +95 -0
- package/dist/runtime/biome-host/lifecycle-contract.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-contract.js +61 -0
- package/dist/runtime/biome-host/lifecycle-contract.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-flow.d.ts +29 -0
- package/dist/runtime/biome-host/lifecycle-flow.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-flow.js +106 -0
- package/dist/runtime/biome-host/lifecycle-flow.js.map +1 -0
- package/dist/runtime/biome-host/plan-sources.d.ts +4 -0
- package/dist/runtime/biome-host/plan-sources.d.ts.map +1 -0
- package/dist/runtime/biome-host/plan-sources.js +26 -0
- package/dist/runtime/biome-host/plan-sources.js.map +1 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.d.ts +12 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.js +76 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.js.map +1 -0
- package/dist/runtime/biome-host/relay/declared-scheme.d.ts +3 -0
- package/dist/runtime/biome-host/relay/declared-scheme.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/declared-scheme.js +14 -0
- package/dist/runtime/biome-host/relay/declared-scheme.js.map +1 -0
- package/dist/runtime/biome-host/relay/npm-token.d.ts +4 -0
- package/dist/runtime/biome-host/relay/npm-token.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/npm-token.js +16 -0
- package/dist/runtime/biome-host/relay/npm-token.js.map +1 -0
- package/dist/runtime/biome-host/relay/relay-flow.d.ts +16 -0
- package/dist/runtime/biome-host/relay/relay-flow.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/relay-flow.js +48 -0
- package/dist/runtime/biome-host/relay/relay-flow.js.map +1 -0
- package/dist/runtime/biome-host/source-staging.d.ts +17 -0
- package/dist/runtime/biome-host/source-staging.d.ts.map +1 -0
- package/dist/runtime/biome-host/source-staging.js +80 -0
- package/dist/runtime/biome-host/source-staging.js.map +1 -0
- package/dist/runtime/biome-host/sse.d.ts +2 -0
- package/dist/runtime/biome-host/sse.d.ts.map +1 -0
- package/dist/runtime/biome-host/sse.js +33 -0
- package/dist/runtime/biome-host/sse.js.map +1 -0
- package/dist/runtime/biome-local-install.js +1 -1
- package/dist/runtime/biome-local-install.js.map +1 -1
- package/dist/runtime/browser-origins.d.ts +9 -0
- package/dist/runtime/browser-origins.d.ts.map +1 -1
- package/dist/runtime/browser-origins.js +10 -0
- package/dist/runtime/browser-origins.js.map +1 -1
- package/dist/runtime/config/config-document.d.ts +10 -0
- package/dist/runtime/config/config-document.d.ts.map +1 -0
- package/dist/runtime/config/config-document.js +56 -0
- package/dist/runtime/config/config-document.js.map +1 -0
- package/dist/runtime/config/config-migrations.d.ts +21 -0
- package/dist/runtime/config/config-migrations.d.ts.map +1 -0
- package/dist/runtime/config/config-migrations.js +102 -0
- package/dist/runtime/config/config-migrations.js.map +1 -0
- package/dist/runtime/config/config-paths.d.ts +3 -0
- package/dist/runtime/config/config-paths.d.ts.map +1 -0
- package/dist/runtime/config/config-paths.js +9 -0
- package/dist/runtime/config/config-paths.js.map +1 -0
- package/dist/runtime/config/dev-mode.d.ts +0 -1
- package/dist/runtime/config/dev-mode.d.ts.map +1 -1
- package/dist/runtime/config/dev-mode.js +11 -27
- package/dist/runtime/config/dev-mode.js.map +1 -1
- package/dist/runtime/config/init-presets.js +5 -9
- package/dist/runtime/config/init-presets.js.map +1 -1
- package/dist/runtime/config/launch-config-help.d.ts +4 -0
- package/dist/runtime/config/launch-config-help.d.ts.map +1 -0
- package/dist/runtime/config/launch-config-help.js +42 -0
- package/dist/runtime/config/launch-config-help.js.map +1 -0
- package/dist/runtime/config/launch-config.d.ts +60 -0
- package/dist/runtime/config/launch-config.d.ts.map +1 -0
- package/dist/runtime/config/launch-config.js +123 -0
- package/dist/runtime/config/launch-config.js.map +1 -0
- package/dist/runtime/config/launch-schema.d.ts +18 -0
- package/dist/runtime/config/launch-schema.d.ts.map +1 -0
- package/dist/runtime/config/launch-schema.js +31 -0
- package/dist/runtime/config/launch-schema.js.map +1 -0
- package/dist/runtime/config/loader.d.ts.map +1 -1
- package/dist/runtime/config/loader.js +4 -14
- package/dist/runtime/config/loader.js.map +1 -1
- package/dist/runtime/config/schema.d.ts +43 -38
- package/dist/runtime/config/schema.d.ts.map +1 -1
- package/dist/runtime/config/schema.js +17 -46
- package/dist/runtime/config/schema.js.map +1 -1
- package/dist/runtime/config/sources-config.d.ts +0 -2
- package/dist/runtime/config/sources-config.d.ts.map +1 -1
- package/dist/runtime/config/sources-config.js +10 -29
- package/dist/runtime/config/sources-config.js.map +1 -1
- package/dist/runtime/config/versioned-document.d.ts +26 -0
- package/dist/runtime/config/versioned-document.d.ts.map +1 -0
- package/dist/runtime/config/versioned-document.js +87 -0
- package/dist/runtime/config/versioned-document.js.map +1 -0
- package/dist/runtime/directory-changes.d.ts +12 -0
- package/dist/runtime/directory-changes.d.ts.map +1 -0
- package/dist/runtime/directory-changes.js +62 -0
- package/dist/runtime/directory-changes.js.map +1 -0
- package/dist/runtime/foreground.d.ts +2 -0
- package/dist/runtime/foreground.d.ts.map +1 -1
- package/dist/runtime/foreground.js +5 -20
- package/dist/runtime/foreground.js.map +1 -1
- package/dist/runtime/infra/infra-runner.js +5 -5
- package/dist/runtime/infra/infra-runner.js.map +1 -1
- package/dist/runtime/infra/keycloak-realm.d.ts +3 -19
- package/dist/runtime/infra/keycloak-realm.d.ts.map +1 -1
- package/dist/runtime/infra/keycloak-realm.js +12 -133
- package/dist/runtime/infra/keycloak-realm.js.map +1 -1
- package/dist/runtime/installation/current-launcher-renderer.js.map +1 -1
- package/dist/runtime/installation/from-current-config.d.ts.map +1 -1
- package/dist/runtime/installation/from-current-config.js +24 -47
- package/dist/runtime/installation/from-current-config.js.map +1 -1
- package/dist/runtime/installation/index.d.ts +1 -0
- package/dist/runtime/installation/index.d.ts.map +1 -1
- package/dist/runtime/installation/index.js +1 -0
- package/dist/runtime/installation/index.js.map +1 -1
- package/dist/runtime/installation/installation-file.d.ts +3 -0
- package/dist/runtime/installation/installation-file.d.ts.map +1 -0
- package/dist/runtime/installation/installation-file.js +9 -0
- package/dist/runtime/installation/installation-file.js.map +1 -0
- package/dist/runtime/installation/readiness.d.ts +6 -7
- package/dist/runtime/installation/readiness.d.ts.map +1 -1
- package/dist/runtime/installation/readiness.js +82 -132
- package/dist/runtime/installation/readiness.js.map +1 -1
- package/dist/runtime/installation/state-store.d.ts +4 -0
- package/dist/runtime/installation/state-store.d.ts.map +1 -1
- package/dist/runtime/installation/state-store.js +22 -1
- package/dist/runtime/installation/state-store.js.map +1 -1
- package/dist/runtime/installation/to-current-config.d.ts +4 -1
- package/dist/runtime/installation/to-current-config.d.ts.map +1 -1
- package/dist/runtime/installation/to-current-config.js +10 -36
- package/dist/runtime/installation/to-current-config.js.map +1 -1
- package/dist/runtime/launch-plan-format.d.ts.map +1 -1
- package/dist/runtime/launch-plan-format.js +31 -6
- package/dist/runtime/launch-plan-format.js.map +1 -1
- package/dist/runtime/launch-result.d.ts +15 -0
- package/dist/runtime/launch-result.d.ts.map +1 -0
- package/dist/runtime/launch-result.js +3 -0
- package/dist/runtime/launch-result.js.map +1 -0
- package/dist/runtime/launch.d.ts +16 -5
- package/dist/runtime/launch.d.ts.map +1 -1
- package/dist/runtime/launch.js +151 -315
- package/dist/runtime/launch.js.map +1 -1
- package/dist/runtime/license/helm-pull-secret.d.ts +1 -1
- package/dist/runtime/license/helm-pull-secret.d.ts.map +1 -1
- package/dist/runtime/license/helm-pull-secret.js +2 -2
- package/dist/runtime/license/helm-pull-secret.js.map +1 -1
- package/dist/runtime/lifecycle-progress/index.d.ts +9 -0
- package/dist/runtime/lifecycle-progress/index.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/index.js +30 -0
- package/dist/runtime/lifecycle-progress/index.js.map +1 -0
- package/dist/runtime/lifecycle-progress/json-renderer.d.ts +3 -0
- package/dist/runtime/lifecycle-progress/json-renderer.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/json-renderer.js +27 -0
- package/dist/runtime/lifecycle-progress/json-renderer.js.map +1 -0
- package/dist/runtime/lifecycle-progress/text-renderer.d.ts +5 -0
- package/dist/runtime/lifecycle-progress/text-renderer.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/text-renderer.js +83 -0
- package/dist/runtime/lifecycle-progress/text-renderer.js.map +1 -0
- package/dist/runtime/lifecycle-progress/types.d.ts +79 -0
- package/dist/runtime/lifecycle-progress/types.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/types.js +32 -0
- package/dist/runtime/lifecycle-progress/types.js.map +1 -0
- package/dist/runtime/lock-loader.d.ts +13 -3
- package/dist/runtime/lock-loader.d.ts.map +1 -1
- package/dist/runtime/lock-loader.js +28 -8
- package/dist/runtime/lock-loader.js.map +1 -1
- package/dist/runtime/paths.d.ts +2 -0
- package/dist/runtime/paths.d.ts.map +1 -1
- package/dist/runtime/paths.js +17 -4
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/roster.d.ts +6 -5
- package/dist/runtime/roster.d.ts.map +1 -1
- package/dist/runtime/roster.js +0 -21
- package/dist/runtime/roster.js.map +1 -1
- package/dist/runtime/runner/container-preflight.d.ts +3 -2
- package/dist/runtime/runner/container-preflight.d.ts.map +1 -1
- package/dist/runtime/runner/container-preflight.js +5 -5
- package/dist/runtime/runner/container-preflight.js.map +1 -1
- package/dist/runtime/runner/container-runner.d.ts +0 -22
- package/dist/runtime/runner/container-runner.d.ts.map +1 -1
- package/dist/runtime/runner/container-runner.js +0 -112
- package/dist/runtime/runner/container-runner.js.map +1 -1
- package/dist/runtime/runner/docker-cli.d.ts +1 -0
- package/dist/runtime/runner/docker-cli.d.ts.map +1 -1
- package/dist/runtime/runner/docker-cli.js +19 -0
- package/dist/runtime/runner/docker-cli.js.map +1 -1
- package/dist/runtime/runner/helm-cli.d.ts +1 -0
- package/dist/runtime/runner/helm-cli.d.ts.map +1 -1
- package/dist/runtime/runner/helm-cli.js +5 -1
- package/dist/runtime/runner/helm-cli.js.map +1 -1
- package/dist/runtime/runner/helm-pre-install.d.ts +3 -2
- package/dist/runtime/runner/helm-pre-install.d.ts.map +1 -1
- package/dist/runtime/runner/helm-pre-install.js +3 -3
- package/dist/runtime/runner/helm-pre-install.js.map +1 -1
- package/dist/runtime/runner/helm-runner.d.ts +29 -4
- package/dist/runtime/runner/helm-runner.d.ts.map +1 -1
- package/dist/runtime/runner/helm-runner.js +44 -14
- package/dist/runtime/runner/helm-runner.js.map +1 -1
- package/dist/runtime/runner/kube-cli.d.ts +1 -0
- package/dist/runtime/runner/kube-cli.d.ts.map +1 -1
- package/dist/runtime/runner/kube-cli.js +24 -2
- package/dist/runtime/runner/kube-cli.js.map +1 -1
- package/dist/runtime/secrets/managed-local-key-provider.d.ts +2 -0
- package/dist/runtime/secrets/managed-local-key-provider.d.ts.map +1 -1
- package/dist/runtime/secrets/managed-local-key-provider.js +17 -8
- package/dist/runtime/secrets/managed-local-key-provider.js.map +1 -1
- package/dist/runtime/seed/closure-container.d.ts +8 -0
- package/dist/runtime/seed/closure-container.d.ts.map +1 -0
- package/dist/runtime/seed/closure-container.js +23 -0
- package/dist/runtime/seed/closure-container.js.map +1 -0
- package/dist/runtime/seed/closure-helm.d.ts +9 -0
- package/dist/runtime/seed/closure-helm.d.ts.map +1 -0
- package/dist/runtime/seed/closure-helm.js +16 -0
- package/dist/runtime/seed/closure-helm.js.map +1 -0
- package/dist/runtime/seed/closure-names.d.ts +4 -0
- package/dist/runtime/seed/closure-names.d.ts.map +1 -0
- package/dist/runtime/seed/closure-names.js +29 -0
- package/dist/runtime/seed/closure-names.js.map +1 -0
- package/dist/runtime/seed/closure-native.d.ts +3 -0
- package/dist/runtime/seed/closure-native.d.ts.map +1 -0
- package/dist/runtime/seed/closure-native.js +18 -0
- package/dist/runtime/seed/closure-native.js.map +1 -0
- package/dist/runtime/seed/installation-tar.d.ts +5 -0
- package/dist/runtime/seed/installation-tar.d.ts.map +1 -0
- package/dist/runtime/seed/installation-tar.js +30 -0
- package/dist/runtime/seed/installation-tar.js.map +1 -0
- package/dist/runtime/seed/launch-env.d.ts +42 -0
- package/dist/runtime/seed/launch-env.d.ts.map +1 -0
- package/dist/runtime/seed/launch-env.js +150 -0
- package/dist/runtime/seed/launch-env.js.map +1 -0
- package/dist/runtime/seed/seed-container.d.ts +13 -0
- package/dist/runtime/seed/seed-container.d.ts.map +1 -0
- package/dist/runtime/seed/seed-container.js +175 -0
- package/dist/runtime/seed/seed-container.js.map +1 -0
- package/dist/runtime/seed/seed-delivery-env.d.ts +39 -0
- package/dist/runtime/seed/seed-delivery-env.d.ts.map +1 -0
- package/dist/runtime/seed/seed-delivery-env.js +47 -0
- package/dist/runtime/seed/seed-delivery-env.js.map +1 -0
- package/dist/runtime/seed/seed-down.d.ts +2 -0
- package/dist/runtime/seed/seed-down.d.ts.map +1 -0
- package/dist/runtime/seed/seed-down.js +52 -0
- package/dist/runtime/seed/seed-down.js.map +1 -0
- package/dist/runtime/seed/seed-env-file.d.ts +3 -0
- package/dist/runtime/seed/seed-env-file.d.ts.map +1 -0
- package/dist/runtime/seed/seed-env-file.js +24 -0
- package/dist/runtime/seed/seed-env-file.js.map +1 -0
- package/dist/runtime/seed/seed-env-secret.d.ts +18 -0
- package/dist/runtime/seed/seed-env-secret.d.ts.map +1 -0
- package/dist/runtime/seed/seed-env-secret.js +62 -0
- package/dist/runtime/seed/seed-env-secret.js.map +1 -0
- package/dist/runtime/seed/seed-environment.d.ts +12 -0
- package/dist/runtime/seed/seed-environment.d.ts.map +1 -0
- package/dist/runtime/seed/seed-environment.js +66 -0
- package/dist/runtime/seed/seed-environment.js.map +1 -0
- package/dist/runtime/seed/seed-facts.d.ts +22 -0
- package/dist/runtime/seed/seed-facts.d.ts.map +1 -0
- package/dist/runtime/seed/seed-facts.js +40 -0
- package/dist/runtime/seed/seed-facts.js.map +1 -0
- package/dist/runtime/seed/seed-helm.d.ts +10 -0
- package/dist/runtime/seed/seed-helm.d.ts.map +1 -0
- package/dist/runtime/seed/seed-helm.js +74 -0
- package/dist/runtime/seed/seed-helm.js.map +1 -0
- package/dist/runtime/seed/seed-image-user.d.ts +6 -0
- package/dist/runtime/seed/seed-image-user.d.ts.map +1 -0
- package/dist/runtime/seed/seed-image-user.js +14 -0
- package/dist/runtime/seed/seed-image-user.js.map +1 -0
- package/dist/runtime/seed/seed-installation-files.d.ts +23 -0
- package/dist/runtime/seed/seed-installation-files.d.ts.map +1 -0
- package/dist/runtime/seed/seed-installation-files.js +51 -0
- package/dist/runtime/seed/seed-installation-files.js.map +1 -0
- package/dist/runtime/seed/seed-installation.d.ts +20 -0
- package/dist/runtime/seed/seed-installation.d.ts.map +1 -0
- package/dist/runtime/seed/seed-installation.js +36 -0
- package/dist/runtime/seed/seed-installation.js.map +1 -0
- package/dist/runtime/seed/seed-launcher.d.ts +14 -0
- package/dist/runtime/seed/seed-launcher.d.ts.map +1 -0
- package/dist/runtime/seed/seed-launcher.js +155 -0
- package/dist/runtime/seed/seed-launcher.js.map +1 -0
- package/dist/runtime/seed/seed-options.d.ts +22 -0
- package/dist/runtime/seed/seed-options.d.ts.map +1 -0
- package/dist/runtime/seed/seed-options.js +57 -0
- package/dist/runtime/seed/seed-options.js.map +1 -0
- package/dist/runtime/seed/seed-platform-endpoints.d.ts +8 -0
- package/dist/runtime/seed/seed-platform-endpoints.d.ts.map +1 -0
- package/dist/runtime/seed/seed-platform-endpoints.js +55 -0
- package/dist/runtime/seed/seed-platform-endpoints.js.map +1 -0
- package/dist/runtime/seed/seed-process.d.ts +22 -0
- package/dist/runtime/seed/seed-process.d.ts.map +1 -0
- package/dist/runtime/seed/seed-process.js +79 -0
- package/dist/runtime/seed/seed-process.js.map +1 -0
- package/dist/runtime/seed/seed-record.d.ts +101 -0
- package/dist/runtime/seed/seed-record.d.ts.map +1 -0
- package/dist/runtime/seed/seed-record.js +141 -0
- package/dist/runtime/seed/seed-record.js.map +1 -0
- package/dist/runtime/seed/seed-resolved-deployment.d.ts +14 -0
- package/dist/runtime/seed/seed-resolved-deployment.d.ts.map +1 -0
- package/dist/runtime/seed/seed-resolved-deployment.js +52 -0
- package/dist/runtime/seed/seed-resolved-deployment.js.map +1 -0
- package/dist/runtime/seed/substrate-facts.d.ts +52 -0
- package/dist/runtime/seed/substrate-facts.d.ts.map +1 -0
- package/dist/runtime/seed/substrate-facts.js +92 -0
- package/dist/runtime/seed/substrate-facts.js.map +1 -0
- package/dist/runtime/seed/supervisor-contract.d.ts +9 -0
- package/dist/runtime/seed/supervisor-contract.d.ts.map +1 -0
- package/dist/runtime/seed/supervisor-contract.js +68 -0
- package/dist/runtime/seed/supervisor-contract.js.map +1 -0
- package/dist/runtime/seed/workload-identity-facts.d.ts +17 -0
- package/dist/runtime/seed/workload-identity-facts.d.ts.map +1 -0
- package/dist/runtime/seed/workload-identity-facts.js +53 -0
- package/dist/runtime/seed/workload-identity-facts.js.map +1 -0
- package/dist/runtime/sources/schema.d.ts +2 -0
- package/dist/runtime/sources/schema.d.ts.map +1 -1
- package/dist/runtime/sources/schema.js +10 -9
- package/dist/runtime/sources/schema.js.map +1 -1
- package/dist/runtime/store-client.d.ts +0 -10
- package/dist/runtime/store-client.d.ts.map +1 -1
- package/dist/runtime/store-client.js +0 -5
- package/dist/runtime/store-client.js.map +1 -1
- package/dist/runtime/tenancy/identity-installer.d.ts +11 -0
- package/dist/runtime/tenancy/identity-installer.d.ts.map +1 -0
- package/dist/runtime/tenancy/identity-installer.js +39 -0
- package/dist/runtime/tenancy/identity-installer.js.map +1 -0
- package/dist/runtime/tenancy/import-cache.d.ts +5 -0
- package/dist/runtime/tenancy/import-cache.d.ts.map +1 -0
- package/dist/runtime/tenancy/import-cache.js +27 -0
- package/dist/runtime/tenancy/import-cache.js.map +1 -0
- package/dist/runtime/tenancy/openfga.d.ts +4 -0
- package/dist/runtime/tenancy/openfga.d.ts.map +1 -0
- package/dist/runtime/tenancy/openfga.js +29 -0
- package/dist/runtime/tenancy/openfga.js.map +1 -0
- package/dist/runtime/tenancy/servers.d.ts +18 -0
- package/dist/runtime/tenancy/servers.d.ts.map +1 -0
- package/dist/runtime/tenancy/servers.js +102 -0
- package/dist/runtime/tenancy/servers.js.map +1 -0
- package/dist/runtime/tenancy/session.d.ts +19 -0
- package/dist/runtime/tenancy/session.d.ts.map +1 -0
- package/dist/runtime/tenancy/session.js +79 -0
- package/dist/runtime/tenancy/session.js.map +1 -0
- package/dist/runtime/tenancy/specs.d.ts +27 -0
- package/dist/runtime/tenancy/specs.d.ts.map +1 -0
- package/dist/runtime/tenancy/specs.js +129 -0
- package/dist/runtime/tenancy/specs.js.map +1 -0
- package/examples/01-local-native.yaml +1 -3
- package/examples/02-local-container-full.yaml +0 -2
- package/examples/03-byo-infra.yaml +1 -5
- package/examples/06-biome-sources.yaml +1 -3
- package/package.json +32 -37
- package/xema.config.example.yaml +1 -10
- package/dist/assets/keycloak/realm-xema.json +0 -397
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -196
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/edition.d.ts +0 -3
- package/dist/commands/edition.d.ts.map +0 -1
- package/dist/commands/edition.js +0 -54
- package/dist/commands/edition.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -3
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -114
- package/dist/commands/serve.js.map +0 -1
- package/dist/dev/carved-installs.d.ts +0 -3
- package/dist/dev/carved-installs.d.ts.map +0 -1
- package/dist/dev/carved-installs.js +0 -63
- package/dist/dev/carved-installs.js.map +0 -1
- package/dist/dev/env-defaults.d.ts +0 -15
- package/dist/dev/env-defaults.d.ts.map +0 -1
- package/dist/dev/env-defaults.js +0 -178
- package/dist/dev/env-defaults.js.map +0 -1
- package/dist/dev/forked-worker-bootstrap-protocol.d.ts +0 -17
- package/dist/dev/forked-worker-bootstrap-protocol.d.ts.map +0 -1
- package/dist/dev/forked-worker-bootstrap-protocol.js +0 -35
- package/dist/dev/forked-worker-bootstrap-protocol.js.map +0 -1
- package/dist/dev/forked-worker-bootstrap.d.ts +0 -18
- package/dist/dev/forked-worker-bootstrap.d.ts.map +0 -1
- package/dist/dev/forked-worker-bootstrap.js +0 -84
- package/dist/dev/forked-worker-bootstrap.js.map +0 -1
- package/dist/dev/forked-worker.d.ts +0 -43
- package/dist/dev/forked-worker.d.ts.map +0 -1
- package/dist/dev/forked-worker.js +0 -358
- package/dist/dev/forked-worker.js.map +0 -1
- package/dist/edition/verify-image-evidence.bundle.mjs +0 -70456
- package/dist/edition/verify-image-evidence.bundle.provenance.json +0 -3957
- package/dist/runtime/backing-registration.d.ts +0 -11
- package/dist/runtime/backing-registration.d.ts.map +0 -1
- package/dist/runtime/backing-registration.js +0 -94
- package/dist/runtime/backing-registration.js.map +0 -1
- package/dist/runtime/edition/run-entry.d.ts +0 -9
- package/dist/runtime/edition/run-entry.d.ts.map +0 -1
- package/dist/runtime/edition/run-entry.js +0 -36
- package/dist/runtime/edition/run-entry.js.map +0 -1
- package/dist/runtime/edition/verb-map.d.ts +0 -70
- package/dist/runtime/edition/verb-map.d.ts.map +0 -1
- package/dist/runtime/edition/verb-map.js +0 -166
- package/dist/runtime/edition/verb-map.js.map +0 -1
- package/dist/runtime/env-seeder.d.ts +0 -26
- package/dist/runtime/env-seeder.d.ts.map +0 -1
- package/dist/runtime/env-seeder.js +0 -340
- package/dist/runtime/env-seeder.js.map +0 -1
- package/dist/runtime/port-map.d.ts +0 -3
- package/dist/runtime/port-map.d.ts.map +0 -1
- package/dist/runtime/port-map.js +0 -25
- package/dist/runtime/port-map.js.map +0 -1
- package/dist/runtime/run-manifest.d.ts +0 -52
- package/dist/runtime/run-manifest.d.ts.map +0 -1
- package/dist/runtime/run-manifest.js +0 -585
- package/dist/runtime/run-manifest.js.map +0 -1
- package/dist/runtime/runner/native-runner.d.ts +0 -13
- package/dist/runtime/runner/native-runner.d.ts.map +0 -1
- package/dist/runtime/runner/native-runner.js +0 -94
- package/dist/runtime/runner/native-runner.js.map +0 -1
- package/dist/runtime/runner/service-runner.d.ts +0 -28
- package/dist/runtime/runner/service-runner.d.ts.map +0 -1
- package/dist/runtime/runner/service-runner.js +0 -10
- package/dist/runtime/runner/service-runner.js.map +0 -1
- package/dist/runtime/secrets/generated-platform-secrets.d.ts +0 -16
- package/dist/runtime/secrets/generated-platform-secrets.d.ts.map +0 -1
- package/dist/runtime/secrets/generated-platform-secrets.js +0 -115
- package/dist/runtime/secrets/generated-platform-secrets.js.map +0 -1
- package/dist/runtime/secrets/resolver.d.ts +0 -23
- package/dist/runtime/secrets/resolver.d.ts.map +0 -1
- package/dist/runtime/secrets/resolver.js +0 -266
- package/dist/runtime/secrets/resolver.js.map +0 -1
- package/dist/runtime/supervisor.d.ts +0 -67
- package/dist/runtime/supervisor.d.ts.map +0 -1
- package/dist/runtime/supervisor.js +0 -227
- package/dist/runtime/supervisor.js.map +0 -1
- package/edition/README.md +0 -293
- package/edition/adapter-bundled-versions.mjs +0 -108
- package/edition/adapter-host-versions.mjs +0 -41
- package/edition/assemble-producer-input.mjs +0 -1414
- package/edition/assemble-third-party-input.mjs +0 -336
- package/edition/authored-source-check.mjs +0 -135
- package/edition/authorization-base.mjs +0 -357
- package/edition/biome-content.mjs +0 -327
- package/edition/build-biome-index.mjs +0 -180
- package/edition/build-ledger-completeness.mjs +0 -67
- package/edition/build-ledger.mjs +0 -107
- package/edition/build-platform-service-index.mjs +0 -292
- package/edition/build-runtime-image-source-index.mjs +0 -1187
- package/edition/built-verifier.mjs +0 -55
- package/edition/candidate-edition.mjs +0 -697
- package/edition/canonical-evidence-json.mjs +0 -82
- package/edition/canonical-repository-url.mjs +0 -47
- package/edition/catalogue-edition.mjs +0 -49
- package/edition/catalogue-evidence.mjs +0 -228
- package/edition/catalogue-fetch.mjs +0 -124
- package/edition/catalogue-lock-field.mjs +0 -41
- package/edition/catalogue-pin.mjs +0 -71
- package/edition/catalogue.mjs +0 -223
- package/edition/chart-set-source-commit.mjs +0 -97
- package/edition/check-committed-image-evidence.mjs +0 -412
- package/edition/checkout-indexed-source-repositories.mjs +0 -283
- package/edition/collected-refusals.mjs +0 -59
- package/edition/comment-blanker.mjs +0 -75
- package/edition/connector-source-authority.mjs +0 -60
- package/edition/contract-authority.mjs +0 -122
- package/edition/cosign-certificate-constraints.mjs +0 -50
- package/edition/cross-repo-build-inputs.mjs +0 -158
- package/edition/customer-definition.mjs +0 -174
- package/edition/customer-edition-verbs.mjs +0 -617
- package/edition/customer-flags.mjs +0 -15
- package/edition/develop-catalogue-free-resolve.mjs +0 -280
- package/edition/develop-chart-roster.mjs +0 -96
- package/edition/develop-chart-set.mjs +0 -147
- package/edition/develop-coverage-readers.mjs +0 -217
- package/edition/develop-coverage-run.mjs +0 -50
- package/edition/develop-coverage-verdict.mjs +0 -153
- package/edition/develop-coverage.mjs +0 -131
- package/edition/develop-current-resolution.mjs +0 -29
- package/edition/develop-edition-invariants.mjs +0 -142
- package/edition/develop-edition-resolve.mjs +0 -211
- package/edition/develop-edition.mjs +0 -379
- package/edition/develop-engine-image.mjs +0 -95
- package/edition/develop-follow.mjs +0 -491
- package/edition/develop-freeze.mjs +0 -289
- package/edition/develop-git-bundles.mjs +0 -255
- package/edition/develop-graph.mjs +0 -28
- package/edition/develop-image-coordinate.mjs +0 -54
- package/edition/develop-image-probe.mjs +0 -120
- package/edition/develop-image-record.mjs +0 -194
- package/edition/develop-record-ancestry.mjs +0 -144
- package/edition/develop-record-verify.mjs +0 -216
- package/edition/develop-resolve-report.mjs +0 -159
- package/edition/develop-select-records.mjs +0 -172
- package/edition/develop-selection-line.mjs +0 -30
- package/edition/develop-selection-pins.mjs +0 -36
- package/edition/develop-snapshot-inputs.mjs +0 -93
- package/edition/develop-verify-image-record.mjs +0 -109
- package/edition/dispatched-runtime-components.mjs +0 -172
- package/edition/dist-check.mjs +0 -1137
- package/edition/distribution-evidence-set.mjs +0 -1064
- package/edition/distribution-paths.mjs +0 -191
- package/edition/edition-artifact.mjs +0 -529
- package/edition/edition-biome-manifests.mjs +0 -85
- package/edition/edition-ceiling.mjs +0 -180
- package/edition/edition-channel.mjs +0 -20
- package/edition/edition-chart-set.mjs +0 -104
- package/edition/edition-config.mjs +0 -374
- package/edition/edition-constants.mjs +0 -110
- package/edition/edition-contract-parse.mjs +0 -179
- package/edition/edition-contract.json +0 -100
- package/edition/edition-image-seal.mjs +0 -110
- package/edition/edition-kind.mjs +0 -10
- package/edition/edition-list.mjs +0 -35
- package/edition/edition-locks.mjs +0 -79
- package/edition/edition-pin-verbs.mjs +0 -183
- package/edition/edition-pin.mjs +0 -17
- package/edition/edition-pinned-inputs.mjs +0 -116
- package/edition/edition-protocol.mjs +0 -277
- package/edition/edition-publisher.mjs +0 -21
- package/edition/edition-seal.mjs +0 -257
- package/edition/edition-source-pins.mjs +0 -211
- package/edition/edition-unpin.mjs +0 -16
- package/edition/edition-workspace.mjs +0 -204
- package/edition/evidence-checkout.mjs +0 -439
- package/edition/evidence-grammars.mjs +0 -18
- package/edition/evidence-input-mode.mjs +0 -136
- package/edition/evidence-trust-pin.mjs +0 -380
- package/edition/evidence-trust-policy.mjs +0 -374
- package/edition/external-source-walk.mjs +0 -485
- package/edition/first-party-source-ids.mjs +0 -62
- package/edition/fleet-coordinate-finality.mjs +0 -363
- package/edition/fulcio-certificate-extensions.mjs +0 -231
- package/edition/git-json.mjs +0 -54
- package/edition/git-source-auth.mjs +0 -131
- package/edition/image-delivery-entitlement-descriptor.mjs +0 -106
- package/edition/image-evidence-replay-state.mjs +0 -242
- package/edition/image-evidence.mjs +0 -1404
- package/edition/image-lock-service-rows.mjs +0 -26
- package/edition/image-subject-identity.mjs +0 -24
- package/edition/images-from-record.mjs +0 -298
- package/edition/indexes-at-pins.mjs +0 -13
- package/edition/kernel-capability-domain.mjs +0 -30
- package/edition/kernel-contract-authority.mjs +0 -517
- package/edition/kernel-contract-source-path-set.mjs +0 -94
- package/edition/kernel-package.mjs +0 -206
- package/edition/kernel-protocol-choice.mjs +0 -239
- package/edition/kernel-signer-kind.mjs +0 -23
- package/edition/lib.mjs +0 -3303
- package/edition/locked-bundle-signer.mjs +0 -297
- package/edition/map-with-concurrency.mjs +0 -19
- package/edition/no-follow-file.mjs +0 -94
- package/edition/oci-evidence-verbs.mjs +0 -419
- package/edition/oci-image-source-evidence.mjs +0 -364
- package/edition/operation-grant-admission.mjs +0 -285
- package/edition/operation-requirements.mjs +0 -282
- package/edition/oras-process.mjs +0 -35
- package/edition/oras.mjs +0 -742
- package/edition/pin-source.mjs +0 -242
- package/edition/pinned-cosign.mjs +0 -70
- package/edition/plan-image-evidence-refresh.mjs +0 -427
- package/edition/platform-lock-readability.mjs +0 -901
- package/edition/platform-service-class.mjs +0 -85
- package/edition/platform-service-ownership.mjs +0 -88
- package/edition/platform-service-source-authority.mjs +0 -105
- package/edition/positive-closure.mjs +0 -162
- package/edition/previous-seal-registry.mjs +0 -149
- package/edition/produce-distribution-completeness-evidence.mjs +0 -318
- package/edition/produce-edition-catalogue-evidence.mjs +0 -252
- package/edition/produce-image-delivery-entitlement-evidence.mjs +0 -304
- package/edition/produce-image-source-evidence.mjs +0 -788
- package/edition/producer-evidence-bundle.mjs +0 -201
- package/edition/producer-evidence-index-file.mjs +0 -4
- package/edition/record-refused.mjs +0 -12
- package/edition/registry-credentials.mjs +0 -225
- package/edition/release-catalogue.mjs +0 -47
- package/edition/release-channel-guard.mjs +0 -108
- package/edition/release-edition-artifact.mjs +0 -152
- package/edition/release-edition.mjs +0 -54
- package/edition/remedy-command.mjs +0 -89
- package/edition/repin-evidence-trust.mjs +0 -109
- package/edition/required-resource-provider.mjs +0 -58
- package/edition/resolve-chart-set.mjs +0 -376
- package/edition/resolve-customer-edition.mjs +0 -374
- package/edition/resolve-distribution.mjs +0 -2639
- package/edition/resolve-edition.mjs +0 -192
- package/edition/resolve-images.mjs +0 -2294
- package/edition/seal-image-digests.mjs +0 -954
- package/edition/sealed-distribution-lock.mjs +0 -22
- package/edition/sealed-evidence-accept.mjs +0 -82
- package/edition/shallow-checkout.mjs +0 -18
- package/edition/sigstore-bundle-media-type.mjs +0 -4
- package/edition/source-authority.mjs +0 -713
- package/edition/source-closure.mjs +0 -115
- package/edition/store-publisher-trust.mjs +0 -40
- package/edition/strict-json.mjs +0 -121
- package/edition/string-order.mjs +0 -5
- package/edition/third-party-admission.mjs +0 -91
- package/edition/third-party-bundle-registry.mjs +0 -242
- package/edition/third-party-certificate-extensions.mjs +0 -21
- package/edition/third-party-image-pins.mjs +0 -41
- package/edition/third-party-pins-trusted.mjs +0 -24
- package/edition/third-party-producer-evidence.mjs +0 -76
- package/edition/third-party-source-check.mjs +0 -28
- package/edition/third-party-source-context.mjs +0 -41
- package/edition/third-party-source-evidence.mjs +0 -287
- package/edition/third-party-source-flags.mjs +0 -134
- package/edition/third-party-source-pins.mjs +0 -259
- package/edition/third-party-source-uniqueness.mjs +0 -54
- package/edition/third-party-source-walk.mjs +0 -115
- package/edition/third-party-source-writer.mjs +0 -213
- package/edition/third-party-subjects.mjs +0 -128
- package/edition/trust-policy-arming-verb.mjs +0 -60
- package/edition/trust-policy-arming.mjs +0 -144
- package/edition/trust-policy-image-ownership.mjs +0 -85
- package/edition/trusted-executable.mjs +0 -166
- package/edition/verifier-binding.mjs +0 -45
- package/edition/verifier-files.mjs +0 -8
- package/edition/verifier-kernel-schemas.mjs +0 -22
- package/edition/verifier-provenance.mjs +0 -64
- package/edition/verify-catalogue-evidence.mjs +0 -247
- package/edition/verify-image-evidence.mjs +0 -475
- package/edition/verify-image-platforms.mjs +0 -523
- package/edition/why.mjs +0 -56
- package/edition/workspace-sections.mjs +0 -276
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// `xema edition source-closure`: the source tree hash of one directory of a
|
|
3
|
-
// source repository at an exact commit, with its workspace-package closure.
|
|
4
|
-
//
|
|
5
|
-
// usage: xema edition source-closure --repo <repo> --path <dir> --commit <40 hex> --sources-root <dir> --kernel <dir>
|
|
6
|
-
//
|
|
7
|
-
// These are the facts a content coordinate is derived from. A consumer frames
|
|
8
|
-
// them into its own coordinate; it never reads a git tree, a workspace graph
|
|
9
|
-
// or a lockfile itself. `--path` is relative to the repository (`.` for its
|
|
10
|
-
// root). The hashes are the ones the image content hash is built from, so a
|
|
11
|
-
// coordinate derived from them moves exactly when the built bytes can move.
|
|
12
|
-
|
|
13
|
-
import { join } from 'node:path';
|
|
14
|
-
|
|
15
|
-
import { parseEvidenceCliFlags } from './distribution-evidence-set.mjs';
|
|
16
|
-
import {
|
|
17
|
-
WorkspaceRoot,
|
|
18
|
-
configureEditionWorkspaceFromArgv,
|
|
19
|
-
isEntryModule,
|
|
20
|
-
sourcesRoot,
|
|
21
|
-
} from './edition-workspace.mjs';
|
|
22
|
-
import { COMMIT_PATTERN } from './evidence-grammars.mjs';
|
|
23
|
-
import {
|
|
24
|
-
compareStrings,
|
|
25
|
-
gitCommitTreeIndex,
|
|
26
|
-
hashGitSourceTree,
|
|
27
|
-
serializeJson,
|
|
28
|
-
workspaceClosure,
|
|
29
|
-
workspacePackagesAtCommit,
|
|
30
|
-
} from './lib.mjs';
|
|
31
|
-
|
|
32
|
-
/** The tree hash algorithm of every hash this verb prints. */
|
|
33
|
-
export const SOURCE_CLOSURE_TREE_ALGORITHM = 'xema-source-tree-sha256-v2';
|
|
34
|
-
const LOCKFILE_PATH = 'pnpm-lock.yaml';
|
|
35
|
-
|
|
36
|
-
function assertContainedDirectory(directory) {
|
|
37
|
-
if (
|
|
38
|
-
typeof directory !== 'string' ||
|
|
39
|
-
directory.length === 0 ||
|
|
40
|
-
directory.startsWith('/') ||
|
|
41
|
-
(directory !== '.' && directory.split('/').some((part) => part === '' || part === '.' || part === '..'))
|
|
42
|
-
) {
|
|
43
|
-
throw new Error(`--path "${String(directory)}" is not a directory inside the repository`);
|
|
44
|
-
}
|
|
45
|
-
return directory;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* The closure of `directory` in `repoDir` at `commit`. `lockfileBlobId` is the
|
|
50
|
-
* repository lockfile's blob when the directory is buildable (it has a
|
|
51
|
-
* `package.json`), and `null` when it is not; a buildable directory in a
|
|
52
|
-
* repository with no lockfile is refused, because its build would resolve
|
|
53
|
-
* dependencies unpinned.
|
|
54
|
-
*/
|
|
55
|
-
export function readSourceClosure({ repoDir, repo, directory, commit }) {
|
|
56
|
-
if (!COMMIT_PATTERN.test(commit ?? '')) {
|
|
57
|
-
throw new Error(`--commit must be an exact 40-hex commit (got ${JSON.stringify(commit ?? null)})`);
|
|
58
|
-
}
|
|
59
|
-
assertContainedDirectory(directory);
|
|
60
|
-
const tree = gitCommitTreeIndex(repoDir, commit);
|
|
61
|
-
const graph = workspacePackagesAtCommit(repoDir, commit, tree);
|
|
62
|
-
const buildable = tree.isFile(directory === '.' ? 'package.json' : `${directory}/package.json`);
|
|
63
|
-
const lockfileBlobId = buildable ? tree.blobId(LOCKFILE_PATH) : undefined;
|
|
64
|
-
if (buildable && lockfileBlobId === undefined) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
`${repo}:${directory} has a package.json but ${repo} has no ${LOCKFILE_PATH} at ${commit.slice(0, 12)}`,
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
return {
|
|
70
|
-
schemaVersion: 1,
|
|
71
|
-
repo,
|
|
72
|
-
directory,
|
|
73
|
-
commit,
|
|
74
|
-
treeAlgorithm: SOURCE_CLOSURE_TREE_ALGORITHM,
|
|
75
|
-
treeHash: hashGitSourceTree(repoDir, directory, commit, SOURCE_CLOSURE_TREE_ALGORITHM),
|
|
76
|
-
buildable,
|
|
77
|
-
lockfileBlobId: lockfileBlobId ?? null,
|
|
78
|
-
closure: [...workspaceClosure(directory, graph, commit)].sort(compareStrings).map((member) => ({
|
|
79
|
-
directory: member,
|
|
80
|
-
treeHash: hashGitSourceTree(repoDir, member, commit, SOURCE_CLOSURE_TREE_ALGORITHM),
|
|
81
|
-
})),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function main() {
|
|
86
|
-
const rest = configureEditionWorkspaceFromArgv(process.argv.slice(2), [
|
|
87
|
-
WorkspaceRoot.Sources,
|
|
88
|
-
// The hash implementation is held to the kernel it was built for.
|
|
89
|
-
WorkspaceRoot.Kernel,
|
|
90
|
-
]);
|
|
91
|
-
const flags = parseEvidenceCliFlags(rest, { single: ['repo', 'path', 'commit'] });
|
|
92
|
-
const repo = flags.require('repo');
|
|
93
|
-
if (repo.startsWith('/') || repo.split('/').some((part) => part === '' || part === '.' || part === '..')) {
|
|
94
|
-
throw new Error(`--repo "${repo}" is not a repository under the sources root`);
|
|
95
|
-
}
|
|
96
|
-
process.stdout.write(
|
|
97
|
-
serializeJson(
|
|
98
|
-
readSourceClosure({
|
|
99
|
-
repoDir: join(sourcesRoot(), repo),
|
|
100
|
-
repo,
|
|
101
|
-
directory: flags.require('path'),
|
|
102
|
-
commit: flags.require('commit'),
|
|
103
|
-
}),
|
|
104
|
-
),
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (isEntryModule(import.meta.url)) {
|
|
109
|
-
try {
|
|
110
|
-
main();
|
|
111
|
-
} catch (error) {
|
|
112
|
-
console.error(`[source-closure] ${error.message}`);
|
|
113
|
-
process.exitCode = 1;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
// The Store publishers a vendor edition's data root trusts: read from
|
|
2
|
-
// `store-publisher-identities.json` and written to the lock as
|
|
3
|
-
// `storePublisherTrust`. The kernel lock schema is the ONE validator (non-empty,
|
|
4
|
-
// sorted by anchorKey, unique, https issuer, no refs/pull/); it runs at the
|
|
5
|
-
// resolver's `parseUnsealedDistributionLock` step, so nothing here re-checks it.
|
|
6
|
-
|
|
7
|
-
import { existsSync } from 'node:fs';
|
|
8
|
-
|
|
9
|
-
import { storePublisherIdentitiesPath } from './edition-workspace.mjs';
|
|
10
|
-
import { readStrictJsonFile } from './strict-json.mjs';
|
|
11
|
-
|
|
12
|
-
/** The data root's trusted Store publishers, or `undefined` when it holds no such file. */
|
|
13
|
-
export function readStorePublisherTrust() {
|
|
14
|
-
const path = storePublisherIdentitiesPath();
|
|
15
|
-
if (!existsSync(path)) {return undefined;}
|
|
16
|
-
const document = readStrictJsonFile(path);
|
|
17
|
-
if (document === null || typeof document !== 'object' || Array.isArray(document)) {
|
|
18
|
-
throw new Error(`${path}: must be a JSON object`);
|
|
19
|
-
}
|
|
20
|
-
const unknown = Object.keys(document).filter((key) => key !== 'schemaVersion' && key !== 'publishers');
|
|
21
|
-
if (unknown.length > 0) {
|
|
22
|
-
throw new Error(`${path}: unknown top-level key ${unknown.map((key) => JSON.stringify(key)).join(', ')}`);
|
|
23
|
-
}
|
|
24
|
-
if (document.schemaVersion === 1) {
|
|
25
|
-
throw new Error(
|
|
26
|
-
`${path}: schemaVersion 1 states no signer; move the file to schemaVersion 2 (\`oidcIssuer\` and \`identity\` per anchor)`,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
if (document.schemaVersion !== 2) {
|
|
30
|
-
throw new Error(`${path}: schemaVersion must be 2, got ${JSON.stringify(document.schemaVersion)}`);
|
|
31
|
-
}
|
|
32
|
-
const { publishers } = document;
|
|
33
|
-
if (!Array.isArray(publishers) || publishers.some((row) => row === null || typeof row !== 'object' || Array.isArray(row))) {
|
|
34
|
-
throw new Error(`${path}: publishers must be an array of objects`);
|
|
35
|
-
}
|
|
36
|
-
// Only `sourceRepositories` (vendor-ops' key) is dropped; every other key reaches the kernel's
|
|
37
|
-
// strict schema unchanged, so a stray or misspelt key is refused there, never dropped here.
|
|
38
|
-
return publishers.map(({ sourceRepositories: _vendorOps, ...row }) => row);
|
|
39
|
-
}
|
|
40
|
-
|
package/edition/strict-json.mjs
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The ONE strict JSON reader for authored inputs of the distribution plane.
|
|
3
|
-
*
|
|
4
|
-
* `JSON.parse` resolves a duplicated object key by silently keeping the LAST
|
|
5
|
-
* occurrence. For an authored manifest that is a declaration being deleted
|
|
6
|
-
* with no signal: `xema-biome.json` once carried two `resources` keys inside
|
|
7
|
-
* one component, every reader dropped the first, the sealed lock never
|
|
8
|
-
* admitted the Redis namespace it declared, and the service crashlooped in a
|
|
9
|
-
* deployment on `redis-namespace-not-declared`. Nothing between the author and
|
|
10
|
-
* the cluster could say so, because every reader agreed on the wrong answer.
|
|
11
|
-
*
|
|
12
|
-
* So a duplicate key is REFUSED here, naming the file, the JSON pointer of the
|
|
13
|
-
* object and the key. There is deliberately no lenient mode and no "last wins"
|
|
14
|
-
* option: two values for one key is an authoring error with no correct reading.
|
|
15
|
-
*
|
|
16
|
-
* Node builtins only, so it runs from a bare checkout. The sibling
|
|
17
|
-
* implementation for the biome authoring toolchain is `strict-json.ts` in
|
|
18
|
-
* `@xemahq/biome-sdk` (xema-biome-sdk, `packages/sdks/biome-sdk/src/builder/lib/`);
|
|
19
|
-
* the two repositories share no package this could live in without a publish,
|
|
20
|
-
* so each holds one copy. Change both together.
|
|
21
|
-
*/
|
|
22
|
-
import { readFileSync } from 'node:fs';
|
|
23
|
-
|
|
24
|
-
/** A JSON object declared the same key more than once. */
|
|
25
|
-
export class DuplicateJsonKeyError extends Error {
|
|
26
|
-
/**
|
|
27
|
-
* @param {string} source file path (or other handle) of the document
|
|
28
|
-
* @param {string} pointer RFC 6901 pointer of the OBJECT holding the key ("" = root)
|
|
29
|
-
* @param {string} key the duplicated key, after escape decoding
|
|
30
|
-
*/
|
|
31
|
-
constructor(source, pointer, key) {
|
|
32
|
-
super(
|
|
33
|
-
`${source}: duplicate key ${JSON.stringify(key)} in the object at JSON pointer ` +
|
|
34
|
-
`${JSON.stringify(pointer)}${pointer === '' ? ' (the document root)' : ''}. ` +
|
|
35
|
-
`JSON.parse would silently keep the last occurrence and drop the other; ` +
|
|
36
|
-
`merge the two declarations into one key.`,
|
|
37
|
-
);
|
|
38
|
-
this.name = 'DuplicateJsonKeyError';
|
|
39
|
-
this.code = 'DUPLICATE_JSON_KEY';
|
|
40
|
-
this.source = source;
|
|
41
|
-
this.pointer = pointer;
|
|
42
|
-
this.key = key;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function pointerSegment(segment) {
|
|
47
|
-
return String(segment).replaceAll('~', '~0').replaceAll('/', '~1');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Scan a document `JSON.parse` has ALREADY accepted for duplicated keys.
|
|
52
|
-
*
|
|
53
|
-
* Because the grammar is known to be valid, the scan only has to tell a string
|
|
54
|
-
* from structure: a `{`, `[`, `,` or `"` inside a string is never structural,
|
|
55
|
-
* and a string is left only at an unescaped `"`. Keys are compared after
|
|
56
|
-
* escape decoding (`"a"` and `"a"` are the same key to every reader).
|
|
57
|
-
*/
|
|
58
|
-
function assertNoDuplicateKeys(text, source) {
|
|
59
|
-
/** @type {Array<{object: boolean, pointer: string, keys: Set<string>, expectKey: boolean, key: string, index: number}>} */
|
|
60
|
-
const stack = [];
|
|
61
|
-
const childPointer = () => {
|
|
62
|
-
const top = stack.at(-1);
|
|
63
|
-
if (!top) {return '';}
|
|
64
|
-
return `${top.pointer}/${pointerSegment(top.object ? top.key : top.index)}`;
|
|
65
|
-
};
|
|
66
|
-
for (let i = 0; i < text.length; i += 1) {
|
|
67
|
-
const char = text[i];
|
|
68
|
-
if (char === '"') {
|
|
69
|
-
const start = i;
|
|
70
|
-
i += 1;
|
|
71
|
-
while (text[i] !== '"') {i += text[i] === '\\' ? 2 : 1;}
|
|
72
|
-
const top = stack.at(-1);
|
|
73
|
-
if (top?.object && top.expectKey) {
|
|
74
|
-
const key = JSON.parse(text.slice(start, i + 1));
|
|
75
|
-
if (top.keys.has(key)) {
|
|
76
|
-
throw new DuplicateJsonKeyError(source, top.pointer, key);
|
|
77
|
-
}
|
|
78
|
-
top.keys.add(key);
|
|
79
|
-
top.key = key;
|
|
80
|
-
top.expectKey = false;
|
|
81
|
-
}
|
|
82
|
-
} else if (char === '{' || char === '[') {
|
|
83
|
-
stack.push({
|
|
84
|
-
object: char === '{',
|
|
85
|
-
pointer: childPointer(),
|
|
86
|
-
keys: new Set(),
|
|
87
|
-
expectKey: char === '{',
|
|
88
|
-
key: '',
|
|
89
|
-
index: 0,
|
|
90
|
-
});
|
|
91
|
-
} else if (char === '}' || char === ']') {
|
|
92
|
-
stack.pop();
|
|
93
|
-
} else if (char === ',') {
|
|
94
|
-
const top = stack.at(-1);
|
|
95
|
-
if (top.object) {top.expectKey = true;}
|
|
96
|
-
else {top.index += 1;}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Parse JSON text, refusing a duplicated object key anywhere in the document.
|
|
103
|
-
* `source` names the document in every error.
|
|
104
|
-
*/
|
|
105
|
-
export function parseStrictJson(text, source) {
|
|
106
|
-
let value;
|
|
107
|
-
try {
|
|
108
|
-
value = JSON.parse(text);
|
|
109
|
-
} catch (error) {
|
|
110
|
-
throw new Error(`${source}: invalid JSON: ${error.message}`, {
|
|
111
|
-
cause: error,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
assertNoDuplicateKeys(text, source);
|
|
115
|
-
return value;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** Read and strictly parse a JSON file from the working tree. */
|
|
119
|
-
export function readStrictJsonFile(path) {
|
|
120
|
-
return parseStrictJson(readFileSync(path, 'utf8'), path);
|
|
121
|
-
}
|
package/edition/string-order.mjs
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// Admission of third-party image subjects (XEMA-1611 design section 4), beside `externalSourceRepositoryPins` and
|
|
2
|
-
// `verifyDistributionImageEvidenceSet` of `image-evidence.mjs`. Pure over data: the pins come from the data root's
|
|
3
|
-
// `third-party-source-pins.json` (held to the evidence trust pin by the entry), the statement and bundle from a
|
|
4
|
-
// descriptor `verifySigstoreEvidenceDescriptor` has just verified.
|
|
5
|
-
|
|
6
|
-
import { assertCertificateExtensions } from './third-party-certificate-extensions.mjs';
|
|
7
|
-
|
|
8
|
-
/** The declared source kind that names a third-party pin. */
|
|
9
|
-
const OCI_SOURCE_KIND = 'oci';
|
|
10
|
-
const FIRST_PARTY_LAYOUT_PREFIX = /^(?:repos|submodules)\//u;
|
|
11
|
-
|
|
12
|
-
const repositoryPathOf = (repositoryUrl) => new URL(repositoryUrl).pathname.replace(/^\//u, '').replace(/\.git$/u, '');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* The repository pins of the edition's declared OCI sources, derived from their third-party source pins:
|
|
16
|
-
* `repo` (the pinned `owner/name`), `repositoryUrl` and `sourceCommit`. Every declared OCI source must be pinned (a
|
|
17
|
-
* missing or empty pin file refuses, with the loader's reason), and the pin must not collide with an index pin or a git
|
|
18
|
-
* source, nor sit under the first-party layout (`repos/`, `submodules/`). A declared source that ships no image yields no
|
|
19
|
-
* pin; every subject of a source must agree on the pinned commit.
|
|
20
|
-
*
|
|
21
|
-
* @returns {Map<string, {repo: string, repositoryUrl: string, sourceCommit: string}>}
|
|
22
|
-
*/
|
|
23
|
-
export function thirdPartySourceRepositoryPins({ distribution, imageLock, repositoryPins, thirdPartyPins }) {
|
|
24
|
-
const sources = distribution.sources ?? [];
|
|
25
|
-
const derived = new Map();
|
|
26
|
-
for (const source of sources) {
|
|
27
|
-
if (source.kind !== OCI_SOURCE_KIND) {continue;}
|
|
28
|
-
const pin = thirdPartyPins.byName(source.name);
|
|
29
|
-
if (pin === undefined) {
|
|
30
|
-
throw new Error(
|
|
31
|
-
`edition source "${source.name}" is kind "${OCI_SOURCE_KIND}", but ${thirdPartyPins.reason ?? `the data root's third-party source pins hold no pin named "${source.name}"`}`,
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
if (FIRST_PARTY_LAYOUT_PREFIX.test(pin.repository)) {
|
|
35
|
-
throw new Error(`third-party source "${pin.name}" pins repository "${pin.repository}", which is under the first-party layout (repos/ or submodules/)`);
|
|
36
|
-
}
|
|
37
|
-
if (repositoryPins.has(pin.repository)) {
|
|
38
|
-
throw new Error(`third-party source "${pin.name}" repository "${pin.repository}" shadows a repository pin the runtime image source index already commits`);
|
|
39
|
-
}
|
|
40
|
-
const shadowed = sources.find((candidate) => candidate.kind === 'git' && (candidate.name === pin.repository || candidate.name === pin.name));
|
|
41
|
-
if (shadowed !== undefined) {
|
|
42
|
-
throw new Error(`third-party source "${pin.name}" (${pin.repository}) collides with the git source "${shadowed.name}" of the same edition`);
|
|
43
|
-
}
|
|
44
|
-
const subjects = imageLock.subjects.filter((subject) => subject.repo === pin.repository);
|
|
45
|
-
if (subjects.length === 0) {continue;}
|
|
46
|
-
const wrong = subjects.filter((subject) => subject.sourceCommit !== pin.sourceCommit);
|
|
47
|
-
if (wrong.length > 0) {
|
|
48
|
-
throw new Error(
|
|
49
|
-
`third-party source "${pin.name}" is pinned at ${pin.sourceCommit}, but images.lock.json builds ${wrong.map((subject) => `${subject.kind}:${subject.id}`).join(', ')} at ${[...new Set(wrong.map((subject) => subject.sourceCommit))].join(', ')}`,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
derived.set(pin.repository, { repo: pin.repository, repositoryUrl: pin.repositoryUrl, sourceCommit: pin.sourceCommit });
|
|
53
|
-
}
|
|
54
|
-
return derived;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The pins behind `thirdPartySourceRepositoryPins`, by repository. */
|
|
58
|
-
export const thirdPartySourcesByRepository = (derived, thirdPartyPins) =>
|
|
59
|
-
new Map([...derived.keys()].map((repo) => [repo, thirdPartyPins.byRepository(repo)]));
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* What a third-party subject must satisfy beyond a first-party one, after its evidence has verified:
|
|
63
|
-
* * [d9-1] the signing row's workflow repository, the subject's `repo` and the path of the predicate's
|
|
64
|
-
* `source.repositoryUrl` are one repository;
|
|
65
|
-
* * the subject is the pinned image (reference, content hash, sealed digest when sealed);
|
|
66
|
-
* * (d) the leaf certificate states the pinned repository id, owner id and a GitHub-hosted runner.
|
|
67
|
-
*/
|
|
68
|
-
export function assertThirdPartySubjectAdmission({ subject, source, statement, identityPolicy, bundle }) {
|
|
69
|
-
const label = `third-party subject "${subject.kind}:${subject.id}" (source "${source.name}")`;
|
|
70
|
-
const claimedRepository = repositoryPathOf(statement.predicate.source.repositoryUrl);
|
|
71
|
-
const signerRepository = identityPolicy.githubWorkflow.repository;
|
|
72
|
-
if (signerRepository !== subject.repo || claimedRepository !== subject.repo) {
|
|
73
|
-
throw new Error(
|
|
74
|
-
`${label}: the signing row's workflow repository (${signerRepository}), the subject repo (${subject.repo}) and the predicate source.repositoryUrl repository (${claimedRepository}) must be one repository`,
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
const image = source.images.find((candidate) => candidate.subjectKind === subject.kind && candidate.subjectId === subject.id);
|
|
78
|
-
if (image === undefined) {
|
|
79
|
-
throw new Error(`${label}: the pin pins no image for it`);
|
|
80
|
-
}
|
|
81
|
-
if (subject.imageRef !== image.imageRef) {
|
|
82
|
-
throw new Error(`${label}: images.lock.json names ${subject.imageRef}, but the pin pins ${image.imageRef}`);
|
|
83
|
-
}
|
|
84
|
-
if (subject.contentHash !== image.sourceTreeHash) {
|
|
85
|
-
throw new Error(`${label}: images.lock.json has contentHash ${subject.contentHash}, but the pin records sourceTreeHash ${image.sourceTreeHash}`);
|
|
86
|
-
}
|
|
87
|
-
if (subject.imageDigest !== undefined && subject.imageDigest !== image.manifestDigest) {
|
|
88
|
-
throw new Error(`${label}: images.lock.json seals ${subject.imageDigest}, but the pin records manifestDigest ${image.manifestDigest}`);
|
|
89
|
-
}
|
|
90
|
-
assertCertificateExtensions({ bundle, source, label });
|
|
91
|
-
}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
// The registry side of the third-party writer (XEMA-1611 design section 3 (a)): the biome bundle, by digest, and the
|
|
2
|
-
// sigstore bundle of its SLSA provenance, read as an OCI referrer. Nothing here is trusted: every byte it returns is
|
|
3
|
-
// verified by cosign (`third-party-source-evidence.mjs`) before it is committed.
|
|
4
|
-
|
|
5
|
-
import { execFileSync } from 'node:child_process';
|
|
6
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
7
|
-
import { tmpdir } from 'node:os';
|
|
8
|
-
import { join } from 'node:path';
|
|
9
|
-
|
|
10
|
-
import { certificateConstraintArgs, certificateIdentityArgs } from './cosign-certificate-constraints.mjs';
|
|
11
|
-
import { COSIGN_ENV, classicCosignTrustMaterial, decodeExactUtf8, sha256Digest, validatePinnedTrustedRoot } from './image-evidence.mjs';
|
|
12
|
-
import { splitImageRef } from './registry-credentials.mjs';
|
|
13
|
-
import { BUNDLE_MEDIA_TYPE } from './sigstore-bundle-media-type.mjs';
|
|
14
|
-
import { SLSA_PROVENANCE_V1, decodeJsonStatement, digestOfOciRef } from './third-party-source-evidence.mjs';
|
|
15
|
-
import { assertPreparedExecutable } from './trusted-executable.mjs';
|
|
16
|
-
|
|
17
|
-
const BIOME_MANIFEST_FILE = 'xema-biome.json';
|
|
18
|
-
const BIOME_GENERATED_INDEX_FILE = 'xema-biome.index.json';
|
|
19
|
-
const OCI_TITLE_ANNOTATION = 'org.opencontainers.image.title';
|
|
20
|
-
const MAX_BIOME_MANIFEST_BYTES = 4 * 1024 * 1024;
|
|
21
|
-
const MAX_BUNDLE_BYTES = 16 * 1024 * 1024;
|
|
22
|
-
const REGISTRY_COSIGN_TIMEOUT_MS = 120_000;
|
|
23
|
-
/** What `cosign verify-attestation --type` calls the SLSA v1 provenance predicate. */
|
|
24
|
-
const COSIGN_SLSA_PROVENANCE_ALIAS = 'slsaprovenance1';
|
|
25
|
-
|
|
26
|
-
const repositoryOf = (ociRef) => splitImageRef(ociRef.slice(0, ociRef.indexOf('@')));
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The biome bundle manifest JSON (`xema-biome.json`) of an OCI artifact, fetched by digest.
|
|
30
|
-
*
|
|
31
|
-
* @returns {Promise<{manifest: object, bytes: Buffer}>}
|
|
32
|
-
*/
|
|
33
|
-
export async function fetchBundleManifest({ clientFor, ociRef }) {
|
|
34
|
-
const bytes = await fetchTitledLayer({ clientFor, ociRef, title: BIOME_MANIFEST_FILE });
|
|
35
|
-
return { manifest: decodeJsonStatement(bytes, `${ociRef} ${BIOME_MANIFEST_FILE}`), bytes };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The committed generated index (`xema-biome.index.json`) of an OCI biome bundle, fetched by digest: the authority for
|
|
40
|
-
* the biomes the bundle requires, read from the same bundle bytes as its manifest, so it cannot describe another revision.
|
|
41
|
-
*/
|
|
42
|
-
export async function fetchBundleGeneratedIndex({ clientFor, ociRef }) {
|
|
43
|
-
const bytes = await fetchTitledLayer({ clientFor, ociRef, title: BIOME_GENERATED_INDEX_FILE });
|
|
44
|
-
return decodeJsonStatement(bytes, `${ociRef} ${BIOME_GENERATED_INDEX_FILE}`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** The one layer of the bundle manifest at `ociRef` (by digest) annotated with `title`. */
|
|
48
|
-
async function fetchTitledLayer({ clientFor, ociRef, title }) {
|
|
49
|
-
const { authority, repository } = repositoryOf(ociRef);
|
|
50
|
-
const client = clientFor(authority);
|
|
51
|
-
const { document } = await client.getManifestByDigest(repository, digestOfOciRef(ociRef));
|
|
52
|
-
const layers = (document.layers ?? []).filter((layer) => layer.annotations?.[OCI_TITLE_ANNOTATION] === title);
|
|
53
|
-
if (layers.length !== 1) {
|
|
54
|
-
throw new Error(`${ociRef} has ${layers.length} layers titled ${title}; a biome bundle has exactly one`);
|
|
55
|
-
}
|
|
56
|
-
const bytes = await client.getBlob(repository, layers[0].digest, MAX_BIOME_MANIFEST_BYTES);
|
|
57
|
-
if (sha256Digest(bytes) !== layers[0].digest) {
|
|
58
|
-
throw new Error(`${ociRef} layer titled ${title} does not match its descriptor`);
|
|
59
|
-
}
|
|
60
|
-
return bytes;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* The image names a biome manifest ships: its service and worker components with an `oci-image` artifact, named the way
|
|
65
|
-
* the index builder names them (a service by `protocol.serviceName`, a worker by its component `key`).
|
|
66
|
-
*/
|
|
67
|
-
export function bundleImageNames(manifest) {
|
|
68
|
-
const components = Array.isArray(manifest?.xema?.components) ? manifest.xema.components : [];
|
|
69
|
-
return new Set(
|
|
70
|
-
components
|
|
71
|
-
.filter((component) => (component?.kind === 'service' || component?.kind === 'worker') && component.artifact?.kind === 'oci-image')
|
|
72
|
-
.map((component) => (component.kind === 'service' ? component.protocol?.serviceName : component.key)),
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function provenanceOf(bundleBytes, bundleDigest) {
|
|
77
|
-
const bundle = JSON.parse(decodeExactUtf8(bundleBytes, 'sigstore bundle'));
|
|
78
|
-
if (bundle?.dsseEnvelope === undefined) {
|
|
79
|
-
return null; // a message-signature bundle (the artifact signature): not an attestation
|
|
80
|
-
}
|
|
81
|
-
const payload = Buffer.from(bundle.dsseEnvelope.payload, 'base64');
|
|
82
|
-
const statement = decodeJsonStatement(payload, 'DSSE payload');
|
|
83
|
-
if (statement.predicateType !== SLSA_PROVENANCE_V1) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
if (`sha256:${statement.subject?.[0]?.digest?.sha256}` !== bundleDigest) {
|
|
87
|
-
throw new Error(`a SLSA provenance referrer attests ${statement.subject?.[0]?.digest?.sha256}, not ${bundleDigest}`);
|
|
88
|
-
}
|
|
89
|
-
return { statementBytes: payload, bundleBytes };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* The SLSA provenance attestation of the bundle: the one sigstore-bundle referrer of `ociRef` whose DSSE statement is a
|
|
94
|
-
* `https://slsa.dev/provenance/v1` attestation over exactly this digest. None, or more than one, is refused.
|
|
95
|
-
*
|
|
96
|
-
* @returns {Promise<{statementBytes: Buffer, bundleBytes: Buffer}>}
|
|
97
|
-
*/
|
|
98
|
-
export async function fetchBundleProvenance({ clientFor, ociRef }) {
|
|
99
|
-
const { authority, repository } = repositoryOf(ociRef);
|
|
100
|
-
const client = clientFor(authority);
|
|
101
|
-
const subjectDigest = digestOfOciRef(ociRef);
|
|
102
|
-
const referrers = await client.listReferrers(repository, subjectDigest, BUNDLE_MEDIA_TYPE);
|
|
103
|
-
const found = [];
|
|
104
|
-
for (const referrer of referrers) {
|
|
105
|
-
const { document } = await client.getManifestByDigest(repository, referrer.digest);
|
|
106
|
-
for (const layer of document.layers ?? []) {
|
|
107
|
-
if (layer.mediaType !== BUNDLE_MEDIA_TYPE) {continue;}
|
|
108
|
-
const bytes = await client.getBlob(repository, layer.digest, MAX_BUNDLE_BYTES);
|
|
109
|
-
if (sha256Digest(bytes) !== layer.digest) {
|
|
110
|
-
throw new Error(`${ociRef} referrer ${referrer.digest} layer does not match its descriptor`);
|
|
111
|
-
}
|
|
112
|
-
const provenance = provenanceOf(bytes, subjectDigest);
|
|
113
|
-
if (provenance !== null) {found.push(provenance);}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (found.length === 0) {
|
|
117
|
-
throw new Error(`${ociRef} has no SLSA provenance attestation (${SLSA_PROVENANCE_V1}) among its ${referrers.length} sigstore-bundle referrers; the bundle must be published with provenance`);
|
|
118
|
-
}
|
|
119
|
-
if (found.length > 1) {
|
|
120
|
-
throw new Error(`${ociRef} has ${found.length} SLSA provenance attestations; exactly one is required, so the evidence is unambiguous`);
|
|
121
|
-
}
|
|
122
|
-
return found[0];
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* The `<repository>@sha256:<hex>` a bundle reference names: a digest reference as it is, a tag reference resolved at
|
|
127
|
-
* the registry (the manifest the tag serves, its bytes verified against the digest the registry described).
|
|
128
|
-
*/
|
|
129
|
-
export async function bundleDigestRef({ clientFor, ociRef }) {
|
|
130
|
-
if (ociRef.includes('@')) {return ociRef;}
|
|
131
|
-
const colon = ociRef.lastIndexOf(':');
|
|
132
|
-
if (colon <= ociRef.lastIndexOf('/')) {
|
|
133
|
-
throw new Error(`bundle reference ${JSON.stringify(ociRef)} names neither a tag nor a digest`);
|
|
134
|
-
}
|
|
135
|
-
const name = ociRef.slice(0, colon);
|
|
136
|
-
const { authority, repository } = splitImageRef(name);
|
|
137
|
-
const { digest } = await clientFor(authority).getManifestByTag(repository, ociRef.slice(colon + 1));
|
|
138
|
-
return `${name}@${digest}`;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const tail = (error) => String(error?.stderr ?? error?.message ?? error).trim().split('\n').slice(-4).join(' | ').slice(0, 1024);
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* The cosign run of a registry verification: the trusted binary under a CLEAN environment (`COSIGN_ENV` and the
|
|
145
|
-
* operator's registry credential, HOME / DOCKER_CONFIG; no `SIGSTORE_*`, `COSIGN_*` or `TUF_*` of the operator is ever
|
|
146
|
-
* inherited). `run` takes `--offline --trusted-root <pinned>`; `runClassic` instead pins cosign's classic trust inputs
|
|
147
|
-
* to the keys derived from the same pinned root (`classicCosignTrustMaterial`), in a private directory removed after the
|
|
148
|
-
* run, with an empty private TUF_ROOT so no live TUF material is ever read.
|
|
149
|
-
*/
|
|
150
|
-
function registryCosign({ trustedCosign, policy, policyRoot, row, ociRef, env }) {
|
|
151
|
-
const root = validatePinnedTrustedRoot(policyRoot, policy);
|
|
152
|
-
const environment = {
|
|
153
|
-
...COSIGN_ENV,
|
|
154
|
-
...(env.HOME === undefined ? {} : { HOME: env.HOME }),
|
|
155
|
-
...(env.DOCKER_CONFIG === undefined ? {} : { DOCKER_CONFIG: env.DOCKER_CONFIG }),
|
|
156
|
-
};
|
|
157
|
-
const exec = (command, args, runEnv) => {
|
|
158
|
-
try {
|
|
159
|
-
return execFileSync(assertPreparedExecutable(trustedCosign, 'cosign'), [command, ...args], {
|
|
160
|
-
env: runEnv,
|
|
161
|
-
encoding: 'utf8',
|
|
162
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
163
|
-
timeout: REGISTRY_COSIGN_TIMEOUT_MS,
|
|
164
|
-
});
|
|
165
|
-
} catch (error) {
|
|
166
|
-
throw new Error(`cosign ${command} refused ${ociRef} under row "${row.policyId}": ${tail(error)}`);
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
return {
|
|
170
|
-
trustArgs: ['--offline', '--trusted-root', root.path],
|
|
171
|
-
run: (command, args) => exec(command, args, environment),
|
|
172
|
-
runClassic(command, args) {
|
|
173
|
-
const material = classicCosignTrustMaterial(root.bytes);
|
|
174
|
-
const dir = mkdtempSync(join(tmpdir(), 'xema-cosign-trust-'));
|
|
175
|
-
try {
|
|
176
|
-
const file = (name, content) => {
|
|
177
|
-
const path = join(dir, name);
|
|
178
|
-
writeFileSync(path, content, { mode: 0o600, flag: 'wx' });
|
|
179
|
-
return path;
|
|
180
|
-
};
|
|
181
|
-
const tufRoot = join(dir, 'tuf');
|
|
182
|
-
mkdirSync(tufRoot, { mode: 0o700 });
|
|
183
|
-
return exec(command, ['--offline', ...args], {
|
|
184
|
-
...environment,
|
|
185
|
-
SIGSTORE_ROOT_FILE: file('fulcio.pem', material.fulcioPem),
|
|
186
|
-
SIGSTORE_REKOR_PUBLIC_KEY: file('rekor.pub', material.rekorPem),
|
|
187
|
-
SIGSTORE_CT_LOG_PUBLIC_KEY_FILE: file('ctlog.pub', material.ctLogPem),
|
|
188
|
-
TUF_ROOT: tufRoot,
|
|
189
|
-
});
|
|
190
|
-
} finally {
|
|
191
|
-
rmSync(dir, { recursive: true, force: true });
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* (a) against the registry: keyless `cosign verify` and `cosign verify-attestation --type slsaprovenance1` of the bundle
|
|
199
|
-
* artifact under EXACTLY the signer row's identity and issuer, the row's workflow repository, ref and the stated
|
|
200
|
-
* commit, and the trusted cosign binary, both `--offline`: the tlog entry carried with the signature is verified, the
|
|
201
|
-
* tlog is never ignored. The registry credential is the operator's (HOME / DOCKER_CONFIG).
|
|
202
|
-
*
|
|
203
|
-
* Publishers write the CLASSIC cosign format (`sha256-<d>.sig` / `.att` tags; `cosign sign` / `cosign attest`), not
|
|
204
|
-
* referrer Sigstore bundles. `verify` takes the pinned trusted root as is (`--trusted-root`, classic or bundle form).
|
|
205
|
-
* cosign 2.6 `verify-attestation` takes `--trusted-root` only with `--new-bundle-format`, which finds no classic
|
|
206
|
-
* attestation, so it runs without either, against the Fulcio, Rekor v1 and CT keys derived from the SAME pinned root
|
|
207
|
-
* and passed in cosign's classic trust variables (`registryCosign().runClassic`). A publisher switching to referrer
|
|
208
|
-
* bundles is refused loudly (cosign then requires a trusted root), never verified against anything unpinned.
|
|
209
|
-
*/
|
|
210
|
-
export function verifyBundleOnRegistry({ trustedCosign, policy, policyRoot, row, workflowSha, ociRef, env = process.env }) {
|
|
211
|
-
const cosign = registryCosign({ trustedCosign, policy, policyRoot, row, ociRef, env });
|
|
212
|
-
const claims = certificateConstraintArgs(row, workflowSha);
|
|
213
|
-
cosign.run('verify', [...cosign.trustArgs, ...claims, ociRef]);
|
|
214
|
-
cosign.runClassic('verify-attestation', ['--type', COSIGN_SLSA_PROVENANCE_ALIAS, ...claims, ociRef]);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const WORKFLOW_SHA = /^[0-9a-f]{40}$/u;
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* The commit the row's workflow signed the bundle artifact at, as cosign states it: `cosign verify` under the row's
|
|
221
|
-
* identity, issuer, workflow repository and ref (no commit: it is what is asked), and the `githubWorkflowSha` claim of
|
|
222
|
-
* every signature cosign verified. Exactly one commit is required; none, or two, is refused. The caller then holds the
|
|
223
|
-
* signature AND the provenance to that commit with `verifyBundleOnRegistry`.
|
|
224
|
-
*/
|
|
225
|
-
export function verifiedBundleSignerCommit({ trustedCosign, policy, policyRoot, row, ociRef, env = process.env }) {
|
|
226
|
-
const cosign = registryCosign({ trustedCosign, policy, policyRoot, row, ociRef, env });
|
|
227
|
-
const output = cosign.run('verify', [...cosign.trustArgs, ...certificateIdentityArgs(row), '--output', 'json', ociRef]);
|
|
228
|
-
let verified;
|
|
229
|
-
try {
|
|
230
|
-
verified = JSON.parse(output);
|
|
231
|
-
} catch {
|
|
232
|
-
throw new Error(`cosign verify of ${ociRef} under row "${row.policyId}" printed no JSON list of verified signatures`);
|
|
233
|
-
}
|
|
234
|
-
const commits = [...new Set((Array.isArray(verified) ? verified : []).map((signature) => signature?.optional?.githubWorkflowSha))];
|
|
235
|
-
if (commits.length !== 1 || !WORKFLOW_SHA.test(String(commits[0]))) {
|
|
236
|
-
throw new Error(
|
|
237
|
-
`${ociRef} carries signatures by row "${row.policyId}" (${row.certificateIdentity}) stating ${commits.length} workflow commits ` +
|
|
238
|
-
`(${commits.map(String).join(', ')}); exactly one 40-hex commit is required`,
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
return commits[0];
|
|
242
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// (d) of the third-party checks: the Fulcio extensions of a bundle's leaf certificate, held to a source pin. Its own module
|
|
2
|
-
// (it imports no evidence module) because admission in `image-evidence.mjs` and the pin verifier both use it.
|
|
3
|
-
|
|
4
|
-
import { FulcioExtensionOid, GITHUB_HOSTED_RUNNER_ENVIRONMENT, readFulcioExtensionsFromBundle } from './fulcio-certificate-extensions.mjs';
|
|
5
|
-
|
|
6
|
-
/** The leaf certificate of a parsed Sigstore `bundle` states the pinned repository id, owner id and a GitHub-hosted runner. */
|
|
7
|
-
export function assertCertificateExtensions({ bundle, source, label }) {
|
|
8
|
-
const read = readFulcioExtensionsFromBundle(bundle);
|
|
9
|
-
const expectations = [
|
|
10
|
-
[FulcioExtensionOid.SourceRepositoryIdentifier, 'Source Repository Identifier', read.sourceRepositoryIdentifier, source.repositoryId, 'repositoryId'],
|
|
11
|
-
[FulcioExtensionOid.SourceRepositoryOwnerIdentifier, 'Source Repository Owner Identifier', read.sourceRepositoryOwnerIdentifier, source.repositoryOwnerId, 'repositoryOwnerId'],
|
|
12
|
-
[FulcioExtensionOid.RunnerEnvironment, 'Runner Environment', read.runnerEnvironment, GITHUB_HOSTED_RUNNER_ENVIRONMENT, GITHUB_HOSTED_RUNNER_ENVIRONMENT],
|
|
13
|
-
];
|
|
14
|
-
for (const [oid, name, actual, expected, pinned] of expectations) {
|
|
15
|
-
if (actual !== expected) {
|
|
16
|
-
throw new Error(
|
|
17
|
-
`${label} certificate ${name} (${oid}) is ${JSON.stringify(actual)}, but the pin requires ${JSON.stringify(expected)} (${pinned})`,
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|