@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,277 +0,0 @@
|
|
|
1
|
-
// The edition protocol this library speaks, and the check that a kernel speaks
|
|
2
|
-
// it too.
|
|
3
|
-
//
|
|
4
|
-
// The kernel (`@xemahq/contracts/edition-protocol`) exports the identity of the
|
|
5
|
-
// code this library executes as DATA: `{contentDigest, provisional, version}` in
|
|
6
|
-
// `dist/edition-protocol/edition-protocol.json`, and the edition contract in
|
|
7
|
-
// `dist/edition-protocol/edition-contract.schema.json` (the identity, the
|
|
8
|
-
// hashing convention, the entry subpaths this library may load, and every
|
|
9
|
-
// kernel source file those subpaths load at runtime). `contentDigest` is the
|
|
10
|
-
// kernel contract authority digest over the exact bytes of those files.
|
|
11
|
-
//
|
|
12
|
-
// The digest is a CONSERVATIVE, deterministic stand-in for protocol semantics.
|
|
13
|
-
// Any change to accepted or refused edition semantics MUST change it; a
|
|
14
|
-
// behaviour-preserving refactor MAY change it too, and the cost is a repin,
|
|
15
|
-
// which is accepted. Semantic equivalence isn't computable, so it is never
|
|
16
|
-
// detected.
|
|
17
|
-
//
|
|
18
|
-
// This library declares the versions it supports, each pinned to one digest,
|
|
19
|
-
// and vendors a copy of each supported contract (`vendored/`, held to its pin
|
|
20
|
-
// by `edition-protocol.test.mjs`). A kernel is accepted only when its identity
|
|
21
|
-
// names a supported version, its digest is the one this library pins for that
|
|
22
|
-
// version, and its contract file states that same identity. Nothing else about
|
|
23
|
-
// the kernel is compared: a kernel change outside the protocol's source closure
|
|
24
|
-
// needs no CLI release; a change inside it needs the CLI to add support.
|
|
25
|
-
// Checking a kernel reads two files and executes nothing from it.
|
|
26
|
-
|
|
27
|
-
import { realpathSync } from 'node:fs';
|
|
28
|
-
|
|
29
|
-
import { RefusalError } from './collected-refusals.mjs';
|
|
30
|
-
import { readBoundedNoFollowFile } from './no-follow-file.mjs';
|
|
31
|
-
|
|
32
|
-
/** The edition protocols this library interprets: version -> content digest. A protocol is listed only
|
|
33
|
-
* while every kernel published under it exports what this library imports (`kernel-export-coverage.test.mjs`).
|
|
34
|
-
* Only v45 is listed (contracts 0.119.0: image-lock v5, build record `members`, and an idempotent
|
|
35
|
-
* `carryForwardComposedArtifacts`). A v44 kernel's carry-forward bumps the generation on every call, so dist-check could never
|
|
36
|
-
* be green on its seals; v43 cannot carry build record members; v42 and older lack `DEFAULT_COMPOSED_IMAGE_CLASS` and
|
|
37
|
-
* `dedicatedServiceImageSubjects`. No legacy row is kept. */
|
|
38
|
-
export const SUPPORTED_EDITION_PROTOCOLS = Object.freeze([
|
|
39
|
-
Object.freeze({ version: 45, contentDigest: '54eb2f7d40e966e6efd5bc2ef0f4751b1121786300f4c50066e8add10c3ecb6a' }),
|
|
40
|
-
]);
|
|
41
|
-
|
|
42
|
-
/** Where a kernel package publishes its identity and its contract, package-relative. */
|
|
43
|
-
export const KERNEL_EDITION_PROTOCOL_FILE = 'dist/edition-protocol/edition-protocol.json';
|
|
44
|
-
export const KERNEL_EDITION_CONTRACT_FILE = 'dist/edition-protocol/edition-contract.schema.json';
|
|
45
|
-
|
|
46
|
-
/** This package's vendored copy of a supported contract, package-relative. */
|
|
47
|
-
export const vendoredEditionContractFile = (version) =>
|
|
48
|
-
`edition/vendored/edition-contract-v${version}.schema.json`;
|
|
49
|
-
|
|
50
|
-
const MAX_IDENTITY_BYTES = 4 * 1024;
|
|
51
|
-
const MAX_CONTRACT_BYTES = 8 * 1024 * 1024;
|
|
52
|
-
const SHA256_HEX = /^[a-f0-9]{64}$/;
|
|
53
|
-
|
|
54
|
-
/** Why a kernel's edition protocol was refused. A closed set. */
|
|
55
|
-
export const EditionProtocolMismatchReason = Object.freeze({
|
|
56
|
-
/** The kernel publishes no edition protocol identity. */
|
|
57
|
-
Undeclared: 'undeclared',
|
|
58
|
-
/** The identity file is not exactly `{contentDigest, provisional, version}`. */
|
|
59
|
-
Malformed: 'malformed',
|
|
60
|
-
/** The identity states `provisional: true`: a branch-local working identity, never pinned. */
|
|
61
|
-
Provisional: 'provisional',
|
|
62
|
-
/** This library supports no protocol of that version. */
|
|
63
|
-
UnsupportedVersion: 'unsupported-version',
|
|
64
|
-
/** The version is supported, but pinned to a different digest. */
|
|
65
|
-
DigestMismatch: 'digest-mismatch',
|
|
66
|
-
/** The kernel's contract file does not state its own identity. */
|
|
67
|
-
ContractMismatch: 'contract-mismatch',
|
|
68
|
-
/** The kernel's protocol is not the one compiled into the running verifier. */
|
|
69
|
-
BundleMismatch: 'bundle-mismatch',
|
|
70
|
-
/** No commit on the kernel checkout's first-parent history declares a protocol this library supports. */
|
|
71
|
-
NoSupportedCommit: 'no-supported-commit',
|
|
72
|
-
/** A kernel commit's protocol declaration source exists but does not parse; refused, never skipped. */
|
|
73
|
-
Unparseable: 'unparseable',
|
|
74
|
-
/** An explicit kernel commit is not on the first-parent history of the checkout's develop head. */
|
|
75
|
-
NotOnDevelop: 'not-on-develop',
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
export class EditionProtocolMismatchError extends RefusalError {
|
|
79
|
-
constructor(reason, message) {
|
|
80
|
-
super(message);
|
|
81
|
-
this.name = 'EditionProtocolMismatchError';
|
|
82
|
-
this.reason = reason;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const describe = ({ version, contentDigest }) => `edition protocol v${version} (${contentDigest})`;
|
|
87
|
-
|
|
88
|
-
/** `v<N>, v<M>`: the versions this library supports, as every refusal names them. */
|
|
89
|
-
export const supportedList = () =>
|
|
90
|
-
SUPPORTED_EDITION_PROTOCOLS.map((protocol) => `v${protocol.version}`).join(', ');
|
|
91
|
-
|
|
92
|
-
/** Refuse an identity that states `provisional: true`; nothing provisional is ever read as a protocol. */
|
|
93
|
-
function assertFinalIdentity(identity, label) {
|
|
94
|
-
if (identity.provisional !== false) {
|
|
95
|
-
throw new EditionProtocolMismatchError(
|
|
96
|
-
EditionProtocolMismatchReason.Provisional,
|
|
97
|
-
`${label} declares ${describe(identity)} as provisional (a branch-local working identity); a provisional edition protocol is never pinned`,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Parse identity bytes strictly: exactly `{contentDigest, provisional, version}`, a positive integer version, a
|
|
104
|
-
* lowercase SHA-256 hex digest and a boolean `provisional`. An identity stating `provisional: true` is refused.
|
|
105
|
-
*/
|
|
106
|
-
export function parseEditionProtocolIdentity(bytes, label) {
|
|
107
|
-
let identity;
|
|
108
|
-
try {
|
|
109
|
-
identity = JSON.parse(bytes.toString('utf8'));
|
|
110
|
-
} catch (error) {
|
|
111
|
-
throw new EditionProtocolMismatchError(
|
|
112
|
-
EditionProtocolMismatchReason.Malformed,
|
|
113
|
-
`${label} is not JSON: ${error.message}`,
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
if (
|
|
117
|
-
identity === null ||
|
|
118
|
-
typeof identity !== 'object' ||
|
|
119
|
-
Array.isArray(identity) ||
|
|
120
|
-
Object.keys(identity).sort().join() !== 'contentDigest,provisional,version' ||
|
|
121
|
-
typeof identity.provisional !== 'boolean' ||
|
|
122
|
-
!Number.isSafeInteger(identity.version) ||
|
|
123
|
-
identity.version < 1 ||
|
|
124
|
-
typeof identity.contentDigest !== 'string' ||
|
|
125
|
-
!SHA256_HEX.test(identity.contentDigest)
|
|
126
|
-
) {
|
|
127
|
-
throw new EditionProtocolMismatchError(
|
|
128
|
-
EditionProtocolMismatchReason.Malformed,
|
|
129
|
-
`${label} must be exactly {"contentDigest":"<64 lowercase hex>","provisional":<boolean>,"version":<positive integer>}`,
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
assertFinalIdentity(identity, label);
|
|
133
|
-
return Object.freeze({
|
|
134
|
-
contentDigest: identity.contentDigest,
|
|
135
|
-
provisional: identity.provisional,
|
|
136
|
-
version: identity.version,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** The `{version, contentDigest}` a contract file states, or undefined. */
|
|
141
|
-
function contractIdentity(contractBytes) {
|
|
142
|
-
let contract;
|
|
143
|
-
try {
|
|
144
|
-
contract = JSON.parse(contractBytes.toString('utf8'));
|
|
145
|
-
} catch {
|
|
146
|
-
return undefined;
|
|
147
|
-
}
|
|
148
|
-
if (
|
|
149
|
-
contract === null ||
|
|
150
|
-
typeof contract !== 'object' ||
|
|
151
|
-
!Number.isSafeInteger(contract.version) ||
|
|
152
|
-
typeof contract.contentDigest !== 'string'
|
|
153
|
-
) {
|
|
154
|
-
return undefined;
|
|
155
|
-
}
|
|
156
|
-
return { version: contract.version, contentDigest: contract.contentDigest };
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Refuse an identity this library does not support: a provisional one, an
|
|
161
|
-
* unsupported version, or a supported version at another digest. Returns it.
|
|
162
|
-
*/
|
|
163
|
-
export function assertSupportedEditionIdentity(identity, source) {
|
|
164
|
-
assertFinalIdentity(identity, source);
|
|
165
|
-
const supported = SUPPORTED_EDITION_PROTOCOLS.find(
|
|
166
|
-
(protocol) => protocol.version === identity.version,
|
|
167
|
-
);
|
|
168
|
-
if (supported === undefined) {
|
|
169
|
-
throw new EditionProtocolMismatchError(
|
|
170
|
-
EditionProtocolMismatchReason.UnsupportedVersion,
|
|
171
|
-
`${source} declares ${describe(identity)}; this CLI supports ${supportedList()}. ` +
|
|
172
|
-
'Use a CLI release that supports it, or pin a kernel that speaks a supported protocol.',
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
if (supported.contentDigest !== identity.contentDigest) {
|
|
176
|
-
throw new EditionProtocolMismatchError(
|
|
177
|
-
EditionProtocolMismatchReason.DigestMismatch,
|
|
178
|
-
`${source} declares ${describe(identity)}; this CLI pins v${supported.version} to ` +
|
|
179
|
-
`${supported.contentDigest} (this CLI supports ${supportedList()}). The kernel changed the edition ` +
|
|
180
|
-
'contract without a new protocol version.',
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
return identity;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** True when `identity` is final and is a row of the supported table (version and digest). */
|
|
187
|
-
export const isSupportedEditionIdentity = (identity) =>
|
|
188
|
-
identity?.provisional === false &&
|
|
189
|
-
SUPPORTED_EDITION_PROTOCOLS.some(
|
|
190
|
-
(protocol) => protocol.version === identity.version && protocol.contentDigest === identity.contentDigest,
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Refuse an identity this library does not support, and a contract file that
|
|
195
|
-
* does not state that identity. Returns the identity.
|
|
196
|
-
*/
|
|
197
|
-
export function assertSupportedEditionProtocol({ identity, contractBytes, source }) {
|
|
198
|
-
assertSupportedEditionIdentity(identity, source);
|
|
199
|
-
const stated = contractIdentity(contractBytes);
|
|
200
|
-
if (stated?.version !== identity.version || stated?.contentDigest !== identity.contentDigest) {
|
|
201
|
-
throw new EditionProtocolMismatchError(
|
|
202
|
-
EditionProtocolMismatchReason.ContractMismatch,
|
|
203
|
-
`${source} declares ${describe(identity)}, but its edition contract file states ` +
|
|
204
|
-
`${stated === undefined ? 'no identity' : describe(stated)}`,
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
return identity;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Read and check the edition protocol of the built kernel package at
|
|
212
|
-
* `kernelPackageDir`. Reads two files, no-follow and bounded; executes nothing.
|
|
213
|
-
*/
|
|
214
|
-
export function readKernelEditionProtocol(kernelPackageDir) {
|
|
215
|
-
const source = `the kernel at ${kernelPackageDir}`;
|
|
216
|
-
let identityBytes;
|
|
217
|
-
try {
|
|
218
|
-
({ bytes: identityBytes } = readBoundedNoFollowFile(
|
|
219
|
-
kernelPackageDir,
|
|
220
|
-
KERNEL_EDITION_PROTOCOL_FILE,
|
|
221
|
-
`${source}: ${KERNEL_EDITION_PROTOCOL_FILE}`,
|
|
222
|
-
MAX_IDENTITY_BYTES,
|
|
223
|
-
));
|
|
224
|
-
} catch (error) {
|
|
225
|
-
if (error?.code !== 'ENOENT') {throw error;}
|
|
226
|
-
throw new EditionProtocolMismatchError(
|
|
227
|
-
EditionProtocolMismatchReason.Undeclared,
|
|
228
|
-
`${source} publishes no edition protocol (${KERNEL_EDITION_PROTOCOL_FILE} is absent); ` +
|
|
229
|
-
`this CLI supports ${supportedList()}. Pin a kernel that publishes its edition protocol identity.`,
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
const identity = parseEditionProtocolIdentity(
|
|
233
|
-
identityBytes,
|
|
234
|
-
`${source}: ${KERNEL_EDITION_PROTOCOL_FILE}`,
|
|
235
|
-
);
|
|
236
|
-
const { bytes: contractBytes } = readBoundedNoFollowFile(
|
|
237
|
-
kernelPackageDir,
|
|
238
|
-
KERNEL_EDITION_CONTRACT_FILE,
|
|
239
|
-
`${source}: ${KERNEL_EDITION_CONTRACT_FILE}`,
|
|
240
|
-
MAX_CONTRACT_BYTES,
|
|
241
|
-
);
|
|
242
|
-
return assertSupportedEditionProtocol({ identity, contractBytes, source });
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const checkedKernels = new Map();
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* {@link readKernelEditionProtocol}, once per kernel directory. Every loader
|
|
249
|
-
* that executes kernel code calls it first, so no code path interprets a
|
|
250
|
-
* kernel whose protocol this library does not support.
|
|
251
|
-
*/
|
|
252
|
-
export function assertKernelEditionProtocol(kernelPackageDir) {
|
|
253
|
-
const key = realpathSync(kernelPackageDir);
|
|
254
|
-
let identity = checkedKernels.get(key);
|
|
255
|
-
if (identity === undefined) {
|
|
256
|
-
identity = readKernelEditionProtocol(key);
|
|
257
|
-
checkedKernels.set(key, identity);
|
|
258
|
-
}
|
|
259
|
-
return identity;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* The running verifier interprets evidence with the contracts compiled into
|
|
264
|
-
* it, so the kernel the workspace states must speak exactly that protocol.
|
|
265
|
-
*/
|
|
266
|
-
export function assertKernelSpeaksBundledProtocol({ kernelPackageDir, bundled }) {
|
|
267
|
-
assertFinalIdentity(bundled, 'the edition protocol compiled into this verifier');
|
|
268
|
-
const stated = readKernelEditionProtocol(kernelPackageDir);
|
|
269
|
-
if (stated.version !== bundled.version || stated.contentDigest !== bundled.contentDigest) {
|
|
270
|
-
throw new EditionProtocolMismatchError(
|
|
271
|
-
EditionProtocolMismatchReason.BundleMismatch,
|
|
272
|
-
`the kernel at ${kernelPackageDir} declares ${describe(stated)}, but this verifier was built ` +
|
|
273
|
-
`with ${describe(bundled)}`,
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
return stated;
|
|
277
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// edition-publisher — the grammar of an edition publisher: the exact GitHub Actions workflow whose keyless
|
|
2
|
-
// signature admits an edition. `{repository, workflow, ref}`, each held to edition-contract.json
|
|
3
|
-
// signers.publishers.shape; its certificate identity is `https://github.com/<repository>/<workflow>@<ref>`
|
|
4
|
-
// (signers.identity), never a wildcard. The issuer is the contract's (edition-constants.mjs); the publisher
|
|
5
|
-
// VALUES are the data root's (edition-workspace.json editionPublishers, edition-config.mjs).
|
|
6
|
-
|
|
7
|
-
import { EDITION_CONTRACT } from './edition-constants.mjs';
|
|
8
|
-
|
|
9
|
-
const SHAPE = Object.freeze(Object.fromEntries(Object.entries(EDITION_CONTRACT.signers.publishers.shape).map(([field, source]) => [field, new RegExp(source)])));
|
|
10
|
-
|
|
11
|
-
/** Hold `publisher` to exactly `{repository, workflow, ref}`, each in the contract's shape; returns it. */
|
|
12
|
-
export function assertPublisher(publisher, where) {
|
|
13
|
-
const keys = publisher !== null && typeof publisher === 'object' && !Array.isArray(publisher) ? Object.keys(publisher).sort().join() : '';
|
|
14
|
-
if (keys !== 'ref,repository,workflow' || !Object.entries(SHAPE).every(([field, pattern]) => typeof publisher[field] === 'string' && pattern.test(publisher[field]))) {
|
|
15
|
-
throw new Error(`${where} must be exactly {repository: <owner>/<name>, workflow: .github/workflows/<file>.yaml, ref: refs/heads/<branch>} (edition-contract.json signers.publishers.shape; got ${JSON.stringify(publisher)})`);
|
|
16
|
-
}
|
|
17
|
-
return publisher;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** The exact keyless certificate identity of a publisher. */
|
|
21
|
-
export const publisherIdentity = ({ repository, workflow, ref }) => `https://github.com/${repository}/${workflow}@${ref}`;
|
package/edition/edition-seal.mjs
DELETED
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// edition-seal — seal ONE exact resolved edition.
|
|
3
|
-
//
|
|
4
|
-
// xema edition seal --resolved <registry root>/<channel segment>/xema-edition-<id>@sha256:<64 hex>
|
|
5
|
-
// --manifest <file> --artifact <dir> --out <dir>
|
|
6
|
-
// --cosign <absolute path> --resolve-workflow-sha <40 hex>
|
|
7
|
-
// [--local]
|
|
8
|
-
// --data-root <dir> --editions-root <dir> --kernel <dir>
|
|
9
|
-
//
|
|
10
|
-
// FIRST, the seal verifies its input and fails closed: `cosign verify` of --resolved (the manifest digest),
|
|
11
|
-
// through the one pinned-cosign path (pinned-cosign.mjs: the caller's cosign held to the digest the data root's
|
|
12
|
-
// pinned policy names, `--offline` against the policy's pinned trusted root), with every certificate constraint
|
|
13
|
-
// (cosign-certificate-constraints.mjs): the identity of the RESOLVE publisher, the contract's issuer (never
|
|
14
|
-
// overridden), its workflow repository and ref, and --resolve-workflow-sha, the commit the resolve workflow ran
|
|
15
|
-
// at (it only narrows the constraint: a wrong value fails the verify). The publisher is the data root's resolved
|
|
16
|
-
// publisher of the --resolved repository's channel (edition-workspace.json editionPublishers.resolved.<channel>,
|
|
17
|
-
// refused by name when undeclared: no default, and no flag names another). Its repository must be the
|
|
18
|
-
// repository the resolved descriptor records as its workflow (provenance.workflow.repository), checked before
|
|
19
|
-
// cosign runs. A refused or unrunnable verify writes nothing.
|
|
20
|
-
//
|
|
21
|
-
// The caller pulls the resolved edition BY DIGEST (`oras manifest fetch` into --manifest, `oras pull`
|
|
22
|
-
// into --artifact). A seal is RELEASE-ONLY (edition-contract.json sealOf.channel, D99): a --resolved edition of any
|
|
23
|
-
// other channel is refused by name, and the sealed edition records provenance.channel release and goes to the
|
|
24
|
-
// release repository. Nothing pulled is trusted until it is proven to be the edition --resolved names:
|
|
25
|
-
//
|
|
26
|
-
// * the manifest bytes hash to the --resolved digest, it is an edition artifact (artifactType), and
|
|
27
|
-
// every layer is titled with a file an edition may hold, once;
|
|
28
|
-
// * every pulled file hashes to the digest of its layer, and the artifact holds no other file;
|
|
29
|
-
// * the descriptor parses (xema.edition/v2) and is `kind: resolved`, of the distribution and the
|
|
30
|
-
// channel the --resolved repository names.
|
|
31
|
-
//
|
|
32
|
-
// The sealed edition (written to --out, outside the committed trees) holds every layer of the resolved
|
|
33
|
-
// edition but its descriptor BYTE FOR BYTE, plus a `kind: sealed` descriptor naming --resolved as `sealOf`,
|
|
34
|
-
// with the resolved edition's channel (release), pins and engine image and the seal run as provenance.workflow.
|
|
35
|
-
// A seal must be ARMED (edition-contract.json evidenceTrust.statesByKind): the data root's evidence trust
|
|
36
|
-
// policy is judged on the resolved edition's channel, and anything but armed is refused by name
|
|
37
|
-
// (EvidenceTrustRequiredError, EVIDENCE_TRUST_REQUIRED_UNARMED). The sealed repository is printed:
|
|
38
|
-
// the same registry root, the release namespace segment. The workflow pushes --out there and signs the
|
|
39
|
-
// manifest digest with the SEAL identity; who may seal is the signer's, not this command's.
|
|
40
|
-
|
|
41
|
-
import { readFileSync, readdirSync } from 'node:fs';
|
|
42
|
-
import { join, resolve } from 'node:path';
|
|
43
|
-
|
|
44
|
-
import { certificateConstraintArgs } from './cosign-certificate-constraints.mjs';
|
|
45
|
-
import { LOCAL_WORKFLOW, editionRepository, parseEditionDescriptor, parseSealOf, workflowFromEnv, writeSealedEditionArtifact } from './edition-artifact.mjs';
|
|
46
|
-
import { editionPublisher } from './edition-config.mjs';
|
|
47
|
-
import {
|
|
48
|
-
CATALOGUE_PIN_KEY,
|
|
49
|
-
EDITION_ARTIFACT_TYPE,
|
|
50
|
-
EDITION_DESCRIPTOR_FILE,
|
|
51
|
-
EDITION_FILES,
|
|
52
|
-
EDITION_SIGNER_OIDC_ISSUER,
|
|
53
|
-
EDITION_OFFERING_LAYERS,
|
|
54
|
-
EditionKind,
|
|
55
|
-
SEALED_EDITION_CHANNEL,
|
|
56
|
-
} from './edition-constants.mjs';
|
|
57
|
-
import { publisherIdentity } from './edition-publisher.mjs';
|
|
58
|
-
import { WorkspaceRoot, configureEditionWorkspaceFromProcess, isEntryModule } from './edition-workspace.mjs';
|
|
59
|
-
import { descriptorEvidenceTrust } from './evidence-trust-policy.mjs';
|
|
60
|
-
import { sha256Hex } from './lib.mjs';
|
|
61
|
-
import { cosignEnvironment, withPinnedCosign } from './pinned-cosign.mjs';
|
|
62
|
-
import { splitImageRef } from './registry-credentials.mjs';
|
|
63
|
-
import { parseStrictJson } from './strict-json.mjs';
|
|
64
|
-
|
|
65
|
-
if (isEntryModule(import.meta.url)) {
|
|
66
|
-
configureEditionWorkspaceFromProcess([WorkspaceRoot.Data, WorkspaceRoot.Editions, WorkspaceRoot.Kernel]);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const REQUIRED_FLAGS = Object.freeze(['--resolved', '--manifest', '--artifact', '--out', '--cosign', '--resolve-workflow-sha']);
|
|
70
|
-
const VALUE_FLAGS = REQUIRED_FLAGS;
|
|
71
|
-
const USAGE =
|
|
72
|
-
'usage: seal --resolved <repository>@sha256:<digest> --manifest <file> --artifact <dir> --out <dir> --cosign <absolute path> ' +
|
|
73
|
-
'--resolve-workflow-sha <40 hex> [--local]';
|
|
74
|
-
const WORKFLOW_SHA = /^[0-9a-f]{40}$/;
|
|
75
|
-
const TITLE = 'org.opencontainers.image.title';
|
|
76
|
-
/** Every file an edition artifact may hold: the descriptor, the locks, the offering layers. */
|
|
77
|
-
const ADMITTED_FILES = Object.freeze([...EDITION_FILES, ...Object.values(EDITION_OFFERING_LAYERS)]);
|
|
78
|
-
|
|
79
|
-
/** Parse the argv after the `seal` verb: every value flag exactly once, `--local` optional, nothing else. */
|
|
80
|
-
export function parseSealArgs(argv) {
|
|
81
|
-
const options = {};
|
|
82
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
83
|
-
const arg = argv[i];
|
|
84
|
-
if (arg === '--local') {
|
|
85
|
-
options[arg] = true;
|
|
86
|
-
} else if (VALUE_FLAGS.includes(arg)) {
|
|
87
|
-
const value = argv[i + 1];
|
|
88
|
-
if (value === undefined || value.startsWith('--')) {throw new Error(`${arg} requires a value`);}
|
|
89
|
-
if (arg in options) {throw new Error(`${arg} is given twice`);}
|
|
90
|
-
options[arg] = value;
|
|
91
|
-
i += 1;
|
|
92
|
-
} else {
|
|
93
|
-
throw new Error(`unknown argument ${arg} for seal (${USAGE})`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const missing = REQUIRED_FLAGS.filter((flag) => !(flag in options));
|
|
97
|
-
if (missing.length > 0) {throw new Error(`seal requires ${missing.join(', ')} (${USAGE})`);}
|
|
98
|
-
if (!WORKFLOW_SHA.test(options['--resolve-workflow-sha'])) {
|
|
99
|
-
throw new Error(`--resolve-workflow-sha ${JSON.stringify(options['--resolve-workflow-sha'])} is not the 40-hex commit the resolve workflow ran at`);
|
|
100
|
-
}
|
|
101
|
-
return options;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Prove the pulled manifest and files are the resolved edition `sealOf` names, and return
|
|
106
|
-
* `{ resolved, layers }`: its parsed descriptor and every other layer's bytes by title.
|
|
107
|
-
*
|
|
108
|
-
* @param {{ sealOf: string, manifestBytes: Buffer, artifactDir: string }} input
|
|
109
|
-
*/
|
|
110
|
-
export function readResolvedEdition({ sealOf, manifestBytes, artifactDir }) {
|
|
111
|
-
const ref = parseSealOf(sealOf);
|
|
112
|
-
if (ref.channel !== SEALED_EDITION_CHANNEL) {
|
|
113
|
-
throw new Error(
|
|
114
|
-
`${sealOf} is a ${ref.channel} edition: a seal is ${SEALED_EDITION_CHANNEL}-only (edition-contract.json sealOf.channel); ` +
|
|
115
|
-
`seal the resolved ${SEALED_EDITION_CHANNEL} edition of "${ref.distributionId}" instead`,
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
if (`sha256:${sha256Hex(manifestBytes)}` !== ref.digest) {
|
|
119
|
-
throw new Error(`the manifest given hashes to sha256:${sha256Hex(manifestBytes)}, not to ${ref.digest}: it is not the manifest of ${sealOf}`);
|
|
120
|
-
}
|
|
121
|
-
const manifest = parseStrictJson(manifestBytes.toString('utf8'), 'the manifest');
|
|
122
|
-
if (manifest?.artifactType !== EDITION_ARTIFACT_TYPE || !Array.isArray(manifest.layers)) {
|
|
123
|
-
throw new Error(`${sealOf} is not an edition artifact (artifactType ${JSON.stringify(manifest?.artifactType)}, expected ${EDITION_ARTIFACT_TYPE})`);
|
|
124
|
-
}
|
|
125
|
-
const digestByTitle = new Map();
|
|
126
|
-
for (const layer of manifest.layers) {
|
|
127
|
-
const title = layer?.annotations?.[TITLE];
|
|
128
|
-
if (!ADMITTED_FILES.includes(title)) {
|
|
129
|
-
throw new Error(`${sealOf} carries a layer titled ${JSON.stringify(title)}, which is not a file an edition holds (${ADMITTED_FILES.join(', ')})`);
|
|
130
|
-
}
|
|
131
|
-
if (digestByTitle.has(title)) {throw new Error(`${sealOf} carries two layers titled ${title}`);}
|
|
132
|
-
digestByTitle.set(title, layer.digest);
|
|
133
|
-
}
|
|
134
|
-
const pulled = readdirSync(artifactDir).sort();
|
|
135
|
-
const expected = [...digestByTitle.keys()].sort();
|
|
136
|
-
if (pulled.join('\0') !== expected.join('\0')) {
|
|
137
|
-
throw new Error(`${artifactDir} holds ${pulled.join(', ') || 'nothing'}, but ${sealOf} has the layers ${expected.join(', ')}; pull exactly that artifact`);
|
|
138
|
-
}
|
|
139
|
-
const layers = new Map();
|
|
140
|
-
let descriptorBytes;
|
|
141
|
-
for (const [title, digest] of digestByTitle) {
|
|
142
|
-
const bytes = readFileSync(join(artifactDir, title));
|
|
143
|
-
if (`sha256:${sha256Hex(bytes)}` !== digest) {
|
|
144
|
-
throw new Error(`${join(artifactDir, title)} hashes to sha256:${sha256Hex(bytes)}, not to its layer digest ${digest} in ${sealOf}`);
|
|
145
|
-
}
|
|
146
|
-
if (title === EDITION_DESCRIPTOR_FILE) {descriptorBytes = bytes;} else {layers.set(title, bytes);}
|
|
147
|
-
}
|
|
148
|
-
if (descriptorBytes === undefined) {throw new Error(`${sealOf} carries no ${EDITION_DESCRIPTOR_FILE}`);}
|
|
149
|
-
const resolved = parseEditionDescriptor(parseStrictJson(descriptorBytes.toString('utf8'), `${sealOf} ${EDITION_DESCRIPTOR_FILE}`));
|
|
150
|
-
if (resolved.kind !== EditionKind.Resolved) {
|
|
151
|
-
throw new Error(`${sealOf} is a ${resolved.kind} edition; a seal seals exactly one resolved edition`);
|
|
152
|
-
}
|
|
153
|
-
if (resolved.distributionId !== ref.distributionId || resolved.provenance.channel !== ref.channel) {
|
|
154
|
-
throw new Error(
|
|
155
|
-
`${sealOf} is the ${ref.channel} repository of "${ref.distributionId}", but its descriptor records the ${resolved.provenance.channel} edition "${resolved.distributionId}"`,
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
return { resolved, layers };
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* The resolve publisher a seal verifies against: ONLY the data root's edition-workspace.json
|
|
163
|
-
* editionPublishers.resolved.<channel> (refused by name when undeclared; no flag or default names another), and only
|
|
164
|
-
* when its repository is the one the resolved descriptor records as its workflow: a seal never verifies an edition
|
|
165
|
-
* against a publisher its own provenance does not name. Checked before cosign runs.
|
|
166
|
-
*/
|
|
167
|
-
export function resolvePublisher(resolved, sealOf) {
|
|
168
|
-
const channel = resolved.provenance.channel;
|
|
169
|
-
const publisher = editionPublisher(EditionKind.Resolved, channel);
|
|
170
|
-
const recorded = resolved.provenance.workflow?.repository;
|
|
171
|
-
if (publisher.repository !== recorded) {
|
|
172
|
-
throw new Error(
|
|
173
|
-
`${sealOf} records its resolve workflow in ${JSON.stringify(recorded)}, but the data root's resolved ${channel} publisher ` +
|
|
174
|
-
`(edition-workspace.json editionPublishers.resolved.${channel}) is in "${publisher.repository}": a seal verifies an edition only ` +
|
|
175
|
-
'against the publisher its provenance names; nothing is sealed',
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
return publisher;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* `cosign verify` of `sealOf` against the exact resolve publisher, through the one pinned-cosign path. Throws, naming
|
|
183
|
-
* the publisher, when cosign refuses (unsigned, another identity, another commit) or cannot run; returns nothing.
|
|
184
|
-
*
|
|
185
|
-
* @param {{ sealOf: string, publisher: {repository: string, workflow: string, ref: string}, workflowSha: string, cosignBinary: string, env: object, pinned?: object }} input
|
|
186
|
-
* `pinned` are withPinnedCosign's injections (tests)
|
|
187
|
-
*/
|
|
188
|
-
export async function verifyResolvedSignature({ sealOf, publisher, workflowSha, cosignBinary, env, pinned = {} }) {
|
|
189
|
-
const signer = {
|
|
190
|
-
certificateIdentity: publisherIdentity(publisher),
|
|
191
|
-
oidcIssuer: EDITION_SIGNER_OIDC_ISSUER,
|
|
192
|
-
githubWorkflow: { repository: publisher.repository, ref: publisher.ref },
|
|
193
|
-
};
|
|
194
|
-
const constraints = certificateConstraintArgs(signer, workflowSha);
|
|
195
|
-
const { authority } = splitImageRef(parseSealOf(sealOf).repository);
|
|
196
|
-
await withPinnedCosign({ cosignBinary, env, ...pinned }, async ({ runCosign, cosignEnvFor, trustedRootPath }) => {
|
|
197
|
-
let result;
|
|
198
|
-
try {
|
|
199
|
-
result = await runCosign(['verify', '--offline', '--trusted-root', trustedRootPath, ...constraints, sealOf], cosignEnvironment(cosignEnvFor, authority));
|
|
200
|
-
} catch (error) {
|
|
201
|
-
throw new Error(`cosign could not run for ${sealOf}: ${error.message}; nothing is sealed`);
|
|
202
|
-
}
|
|
203
|
-
if (result.code !== 0) {
|
|
204
|
-
throw new Error(
|
|
205
|
-
`cosign refused ${sealOf} as signed by the resolve publisher ${signer.certificateIdentity} (issuer ${EDITION_SIGNER_OIDC_ISSUER}, ` +
|
|
206
|
-
`workflow commit ${workflowSha}) (exit ${result.code}): ${String(result.stderr).trim()}; nothing is sealed`,
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Seal: prove the pulled edition by digest, verify the resolve publisher's signature over it, require an ARMED policy
|
|
214
|
-
* on its channel, write the sealed edition. Returns `{ descriptor, repository }`; the repository is where the sealed edition goes.
|
|
215
|
-
*/
|
|
216
|
-
export async function sealEdition({ options, env, evidenceTrust = descriptorEvidenceTrust, pinned = {} }) {
|
|
217
|
-
const sealOf = options['--resolved'];
|
|
218
|
-
const { resolved, layers } = readResolvedEdition({
|
|
219
|
-
sealOf,
|
|
220
|
-
manifestBytes: readFileSync(options['--manifest']),
|
|
221
|
-
artifactDir: resolve(options['--artifact']),
|
|
222
|
-
});
|
|
223
|
-
const channel = resolved.provenance.channel;
|
|
224
|
-
await verifyResolvedSignature({
|
|
225
|
-
sealOf,
|
|
226
|
-
publisher: resolvePublisher(resolved, sealOf),
|
|
227
|
-
workflowSha: options['--resolve-workflow-sha'],
|
|
228
|
-
cosignBinary: options['--cosign'],
|
|
229
|
-
env,
|
|
230
|
-
pinned,
|
|
231
|
-
});
|
|
232
|
-
const evidenceTrustPolicy = await evidenceTrust({
|
|
233
|
-
kind: EditionKind.Sealed,
|
|
234
|
-
channel,
|
|
235
|
-
consumesCatalogue: CATALOGUE_PIN_KEY in resolved.provenance.pins,
|
|
236
|
-
});
|
|
237
|
-
const descriptor = writeSealedEditionArtifact({
|
|
238
|
-
outDir: resolve(options['--out']),
|
|
239
|
-
resolved,
|
|
240
|
-
sealOf,
|
|
241
|
-
layers,
|
|
242
|
-
workflow: options['--local'] ? LOCAL_WORKFLOW : workflowFromEnv(env),
|
|
243
|
-
evidenceTrustPolicy,
|
|
244
|
-
});
|
|
245
|
-
const repository = editionRepository(resolved.distributionId, parseSealOf(sealOf).registryRoot, SEALED_EDITION_CHANNEL);
|
|
246
|
-
return { descriptor, repository };
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (isEntryModule(import.meta.url)) {
|
|
250
|
-
Promise.resolve()
|
|
251
|
-
.then(() => sealEdition({ options: parseSealArgs(process.argv.slice(2)), env: process.env }))
|
|
252
|
-
.then(({ repository }) => console.log(repository))
|
|
253
|
-
.catch((error) => {
|
|
254
|
-
console.error(`[edition-seal] ${error.message}`);
|
|
255
|
-
process.exit(1);
|
|
256
|
-
});
|
|
257
|
-
}
|