@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,217 +0,0 @@
|
|
|
1
|
-
// develop-coverage-readers — the READ-ONLY registry, attestation and signature readers behind
|
|
2
|
-
// `xema edition develop coverage`. Nothing here signs, attests, pushes or writes a lock.
|
|
3
|
-
//
|
|
4
|
-
// Every reader takes the develop coordinate of ONE subject and returns plain data; the verdict is
|
|
5
|
-
// decided elsewhere (develop-coverage-verdict.mjs), so the decision is tested without a registry.
|
|
6
|
-
|
|
7
|
-
import { execFile } from 'node:child_process';
|
|
8
|
-
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
9
|
-
import { tmpdir } from 'node:os';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { promisify } from 'node:util';
|
|
12
|
-
|
|
13
|
-
import { AttestationStatus, DEVELOP_EVIDENCE_CHANNEL } from './develop-coverage-verdict.mjs';
|
|
14
|
-
import { COSIGN_ENV, policyCandidates, sha256Digest, validatePinnedTrustedRoot, verifySigstoreEvidenceDescriptor } from './image-evidence.mjs';
|
|
15
|
-
import { resolveImageSourceEvidenceReferrer, writeInvalidReferrerReport } from './oci-image-source-evidence.mjs';
|
|
16
|
-
import { BUNDLE_MEDIA_TYPE } from './produce-image-source-evidence.mjs';
|
|
17
|
-
import { loadRegistryCredentialDeclarations, resolveRegistryCredential, splitImageRef } from './registry-credentials.mjs';
|
|
18
|
-
import { isNotPublishedYet } from './seal-image-digests.mjs';
|
|
19
|
-
import { assertPreparedExecutable } from './trusted-executable.mjs';
|
|
20
|
-
import { registryClientsFor } from './verify-image-platforms.mjs';
|
|
21
|
-
|
|
22
|
-
const execFileAsync = promisify(execFile);
|
|
23
|
-
// One external call to cosign; it reads a registry. A run that exceeds it fails naming the subject, never a verdict.
|
|
24
|
-
const COSIGN_CALL_TIMEOUT_MS = 60_000;
|
|
25
|
-
const COSIGN_MAX_OUTPUT_BYTES = 8 * 1024 * 1024;
|
|
26
|
-
/** cosign's exact refusal when a digest carries no signature at all. */
|
|
27
|
-
const NO_SIGNATURES_MESSAGE = 'no signatures found';
|
|
28
|
-
const ANY = '.*';
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The signatures cosign verified, as data. `cosign verify --output json` prints one object per signature whose
|
|
32
|
-
* `optional` holds the signed annotations next to the certificate's claims.
|
|
33
|
-
*
|
|
34
|
-
* @param {string} stdout
|
|
35
|
-
* @param {string} digest the digest that was verified; a signature over another digest is refused
|
|
36
|
-
* @returns {{ signer: object, annotations: Record<string, string> }[]}
|
|
37
|
-
*/
|
|
38
|
-
export function parseCosignVerifyOutput(stdout, digest) {
|
|
39
|
-
const payloads = JSON.parse(stdout);
|
|
40
|
-
if (!Array.isArray(payloads)) {throw new Error('cosign verify output is not a JSON array');}
|
|
41
|
-
return payloads.map((payload) => {
|
|
42
|
-
if (payload?.critical?.image?.['docker-manifest-digest'] !== digest) {
|
|
43
|
-
throw new Error(`cosign verified a signature over ${String(payload?.critical?.image?.['docker-manifest-digest'])}, not ${digest}`);
|
|
44
|
-
}
|
|
45
|
-
const optional = payload.optional ?? {};
|
|
46
|
-
const { Subject, Issuer, githubWorkflowTrigger, githubWorkflowSha, githubWorkflowRepository, githubWorkflowRef, ...rest } = optional;
|
|
47
|
-
const annotations = Object.fromEntries(Object.entries(rest).filter(([, value]) => typeof value === 'string'));
|
|
48
|
-
return {
|
|
49
|
-
signer: {
|
|
50
|
-
certificateIdentity: Subject ?? '',
|
|
51
|
-
issuer: Issuer ?? '',
|
|
52
|
-
trigger: githubWorkflowTrigger ?? '',
|
|
53
|
-
workflowSha: githubWorkflowSha ?? '',
|
|
54
|
-
workflowRepository: githubWorkflowRepository ?? '',
|
|
55
|
-
workflowRef: githubWorkflowRef ?? '',
|
|
56
|
-
},
|
|
57
|
-
annotations,
|
|
58
|
-
};
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/** Run cosign once; resolves `{code, stdout, stderr}` for a cosign exit, throws when cosign could not run at all. */
|
|
63
|
-
export function defaultRunCosign(cosignPath, args, env) {
|
|
64
|
-
return execFileAsync(cosignPath, args, { env, timeout: COSIGN_CALL_TIMEOUT_MS, maxBuffer: COSIGN_MAX_OUTPUT_BYTES }).then(
|
|
65
|
-
({ stdout }) => ({ code: 0, stdout, stderr: '' }),
|
|
66
|
-
(error) => {
|
|
67
|
-
if (typeof error.code === 'number') {return { code: error.code, stdout: error.stdout ?? '', stderr: error.stderr ?? '' };}
|
|
68
|
-
throw error;
|
|
69
|
-
},
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** The username and password of a resolved basic-auth registry credential. */
|
|
74
|
-
export function basicAuthParts(credential) {
|
|
75
|
-
const decoded = Buffer.from(credential.basicAuth, 'base64').toString('utf8');
|
|
76
|
-
const colon = decoded.indexOf(':');
|
|
77
|
-
return { username: decoded.slice(0, colon), password: decoded.slice(colon + 1) };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @param {object} request
|
|
82
|
-
* @param {object} request.policy the pinned trust policy (kernel-parsed)
|
|
83
|
-
* @param {string} request.policyRoot the directory the policy's trusted root is read from (the data root)
|
|
84
|
-
* @param {object} request.trustedCosign the digest-pinned cosign handle (prepareTrustedCosignBinary)
|
|
85
|
-
* @param {object} request.schemas kernel distribution schemas
|
|
86
|
-
* @param {object} request.expectedContractAuthority the kernel contract authority the data root pins
|
|
87
|
-
* @param {string} request.dataRoot declares how each registry is read
|
|
88
|
-
* @param {object} request.env environment the registry credentials are named in
|
|
89
|
-
* @param {Function} [request.runCosign] (path, args, env) => { code, stdout, stderr }; replaced by tests
|
|
90
|
-
* @param {Function} [request.fetchImpl] @param {Function} [request.run] oras runner, replaced by tests
|
|
91
|
-
* @param {Function} [request.clientFor] (authority) => registry client, replaced by tests
|
|
92
|
-
*/
|
|
93
|
-
export function createCoverageReaders({ policy, policyRoot, trustedCosign, schemas, expectedContractAuthority, dataRoot, env, runCosign = defaultRunCosign, fetchImpl, run, clientFor: injectedClientFor }) {
|
|
94
|
-
const cosignPath = assertPreparedExecutable(trustedCosign, 'cosign');
|
|
95
|
-
const declarations = injectedClientFor === undefined ? loadRegistryCredentialDeclarations(dataRoot) : null;
|
|
96
|
-
const scratch = mkdtempSync(join(tmpdir(), 'xema-coverage-'));
|
|
97
|
-
const trustedRootPath = join(scratch, 'trusted-root.json');
|
|
98
|
-
writeFileSync(trustedRootPath, validatePinnedTrustedRoot(policyRoot, policy).bytes, { flag: 'wx', mode: 0o600 });
|
|
99
|
-
const clients = new Map();
|
|
100
|
-
const credentials = new Map();
|
|
101
|
-
|
|
102
|
-
function clientFor(subject) {
|
|
103
|
-
const { authority } = splitImageRef(subject.imageRef);
|
|
104
|
-
if (injectedClientFor !== undefined) {return injectedClientFor(authority);}
|
|
105
|
-
if (!clients.has(authority)) {
|
|
106
|
-
const made = registryClientsFor([subject], { declarations, env, fetchImpl, run });
|
|
107
|
-
clients.set(authority, made.get(authority));
|
|
108
|
-
}
|
|
109
|
-
return clients.get(authority);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// cosign is handed the SAME declared credential oras uses, through its environment (never argv), and only after
|
|
113
|
-
// the oras client of that authority has made its first call: that call is the token-realm check.
|
|
114
|
-
function cosignRegistryEnv(subject) {
|
|
115
|
-
if (injectedClientFor !== undefined) {return {};}
|
|
116
|
-
const { authority } = splitImageRef(subject.imageRef);
|
|
117
|
-
if (!credentials.has(authority)) {
|
|
118
|
-
const credential = resolveRegistryCredential({ authority, declarations, env });
|
|
119
|
-
if (credential.access === 'anonymous') {
|
|
120
|
-
credentials.set(authority, {});
|
|
121
|
-
} else {
|
|
122
|
-
const { username, password } = basicAuthParts(credential);
|
|
123
|
-
credentials.set(authority, { COSIGN_REGISTRY_USERNAME: username, COSIGN_REGISTRY_PASSWORD: password });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return credentials.get(authority);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async function developDigest(subject) {
|
|
130
|
-
const { repository } = splitImageRef(subject.imageRef);
|
|
131
|
-
try {
|
|
132
|
-
const served = await clientFor(subject).getManifestByTag(repository, subject.contentHash);
|
|
133
|
-
return served.digest;
|
|
134
|
-
} catch (error) {
|
|
135
|
-
if (isNotPublishedYet(error)) {return null;}
|
|
136
|
-
throw error;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async function readAttestation(subject, digest) {
|
|
141
|
-
const rows = policyCandidates(policy, schemas.IMAGE_PRODUCER_PREDICATE_TYPE, DEVELOP_EVIDENCE_CHANNEL, subject.imageRef);
|
|
142
|
-
const evidence = await resolveImageSourceEvidenceReferrer({
|
|
143
|
-
client: clientFor(subject),
|
|
144
|
-
imageRepository: subject.imageRef,
|
|
145
|
-
subjectDigest: digest,
|
|
146
|
-
schemas,
|
|
147
|
-
expectedContractAuthority,
|
|
148
|
-
onInvalidReferrer: writeInvalidReferrerReport,
|
|
149
|
-
});
|
|
150
|
-
if (evidence === null) {return { status: AttestationStatus.None };}
|
|
151
|
-
if (rows.length === 0) {return { status: AttestationStatus.NoRow };}
|
|
152
|
-
const bound = evidence.records.filter(({ statement }) => {
|
|
153
|
-
const { artifact, source } = statement.predicate;
|
|
154
|
-
return (
|
|
155
|
-
artifact.manifestDigest === digest &&
|
|
156
|
-
artifact.imageRepository === subject.imageRef &&
|
|
157
|
-
source.kind === subject.kind &&
|
|
158
|
-
source.id === subject.id &&
|
|
159
|
-
source.sourceTreeHash === subject.contentHash
|
|
160
|
-
);
|
|
161
|
-
});
|
|
162
|
-
if (bound.length === 0) {
|
|
163
|
-
return { status: AttestationStatus.Refused, detail: `no record binds ${subject.kind}:${subject.id} at ${digest} for source tree ${subject.contentHash}` };
|
|
164
|
-
}
|
|
165
|
-
const failures = [];
|
|
166
|
-
for (const record of bound) {
|
|
167
|
-
const evidenceRoot = mkdtempSync(join(scratch, 'record-'));
|
|
168
|
-
try {
|
|
169
|
-
writeFileSync(join(evidenceRoot, 'statement.json'), record.statementBytes, { flag: 'wx', mode: 0o600 });
|
|
170
|
-
writeFileSync(join(evidenceRoot, 'bundle.sigstore.json'), record.bundleBytes, { flag: 'wx', mode: 0o600 });
|
|
171
|
-
const { identityPolicy } = verifySigstoreEvidenceDescriptor({
|
|
172
|
-
evidenceRoot,
|
|
173
|
-
descriptor: {
|
|
174
|
-
statementPath: 'statement.json',
|
|
175
|
-
statementDigest: sha256Digest(record.statementBytes),
|
|
176
|
-
bundlePath: 'bundle.sigstore.json',
|
|
177
|
-
bundleDigest: sha256Digest(record.bundleBytes),
|
|
178
|
-
bundleMediaType: BUNDLE_MEDIA_TYPE,
|
|
179
|
-
},
|
|
180
|
-
policy,
|
|
181
|
-
predicateType: schemas.IMAGE_PRODUCER_PREDICATE_TYPE,
|
|
182
|
-
channel: DEVELOP_EVIDENCE_CHANNEL,
|
|
183
|
-
imageRepository: subject.imageRef,
|
|
184
|
-
parseStatement: schemas.parseImageProducerStatement,
|
|
185
|
-
policyRoot,
|
|
186
|
-
trustedCosign,
|
|
187
|
-
});
|
|
188
|
-
return { status: AttestationStatus.Verified, detail: identityPolicy.policyId };
|
|
189
|
-
} catch (error) {
|
|
190
|
-
failures.push(error instanceof Error ? error.message : String(error));
|
|
191
|
-
} finally {
|
|
192
|
-
rmSync(evidenceRoot, { recursive: true, force: true });
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return { status: AttestationStatus.Refused, detail: failures.join('; ') };
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
async function readSignatures(subject, digest) {
|
|
199
|
-
const ref = `${subject.imageRef}@${digest}`;
|
|
200
|
-
const args = ['verify', '--offline', '--trusted-root', trustedRootPath, '--certificate-identity-regexp', ANY, '--certificate-oidc-issuer-regexp', ANY, '--output', 'json', ref];
|
|
201
|
-
const result = await runCosign(cosignPath, args, { ...COSIGN_ENV, ...cosignRegistryEnv(subject) });
|
|
202
|
-
if (result.code !== 0) {
|
|
203
|
-
if (result.stderr.includes(NO_SIGNATURES_MESSAGE)) {return [];}
|
|
204
|
-
throw new Error(`cosign verify ${ref} failed (exit ${result.code}): ${result.stderr.trim()}`);
|
|
205
|
-
}
|
|
206
|
-
return parseCosignVerifyOutput(result.stdout, digest);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
developDigest,
|
|
211
|
-
readAttestation,
|
|
212
|
-
readSignatures,
|
|
213
|
-
dispose() {
|
|
214
|
-
rmSync(scratch, { recursive: true, force: true });
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
// develop-coverage-run — the body of `xema edition develop coverage <id> --pins <file> --cosign <path> [--json]`.
|
|
2
|
-
//
|
|
3
|
-
// The snapshot half is `develop resolve`'s own (resolveDevelopSnapshot, then resolveImages), so F is computed
|
|
4
|
-
// exactly as resolve computes it. What follows is read-only: registry digests, referrers and signatures.
|
|
5
|
-
|
|
6
|
-
import { createCoverageReaders } from './develop-coverage-readers.mjs';
|
|
7
|
-
import { collectCoverage, coverageExitCode, renderCoverageTable } from './develop-coverage.mjs';
|
|
8
|
-
import { DEVELOP_EDITION_STEPS, resolveDevelopSnapshot } from './develop-edition-resolve.mjs';
|
|
9
|
-
import { loadDeclaredPinnedPolicy } from './evidence-trust-policy.mjs';
|
|
10
|
-
import { prepareTrustedCosignBinary } from './image-evidence.mjs';
|
|
11
|
-
import { readPinnedContractAuthority } from './produce-image-source-evidence.mjs';
|
|
12
|
-
import { loadThirdPartySourcePins } from './third-party-source-pins.mjs';
|
|
13
|
-
|
|
14
|
-
const stderrProgress = (line) => process.stderr.write(`${line}\n`);
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @returns {Promise<number>} the exit code: 0 covered, 1 not covered
|
|
18
|
-
* @throws on an operational error (unreadable pins, registry, cosign): the entry exits 2
|
|
19
|
-
*/
|
|
20
|
-
export async function runDevelopCoverage({
|
|
21
|
-
id,
|
|
22
|
-
pins,
|
|
23
|
-
cosignBinary,
|
|
24
|
-
json = false,
|
|
25
|
-
env = process.env,
|
|
26
|
-
steps = DEVELOP_EDITION_STEPS,
|
|
27
|
-
loadPolicy = loadDeclaredPinnedPolicy,
|
|
28
|
-
prepareCosign = prepareTrustedCosignBinary,
|
|
29
|
-
readerOptions = {},
|
|
30
|
-
progress = stderrProgress,
|
|
31
|
-
write = (text) => process.stdout.write(text),
|
|
32
|
-
}) {
|
|
33
|
-
const { policy, dataRoot } = await loadPolicy();
|
|
34
|
-
const trustedCosign = prepareCosign({ cosignBinary, policy });
|
|
35
|
-
try {
|
|
36
|
-
const { schemas, inputs, lock } = await resolveDevelopSnapshot({ id, pins, steps, phase: (name) => progress(`[coverage] ${name}`) });
|
|
37
|
-
const { imageLock } = await steps.resolveImages(id, { inputs, lock });
|
|
38
|
-
progress(`[coverage] image content hashes computed (${imageLock.subjects.length} subjects)`);
|
|
39
|
-
const readers = createCoverageReaders({ policy, policyRoot: dataRoot, trustedCosign, schemas, expectedContractAuthority: readPinnedContractAuthority({ dataRoot, schemas }), dataRoot, env, ...readerOptions });
|
|
40
|
-
try {
|
|
41
|
-
const report = await collectCoverage({ distributionId: id, subjects: imageLock.subjects, policy, readers, thirdPartyPins: loadThirdPartySourcePins(dataRoot), progress });
|
|
42
|
-
write(json ? `${JSON.stringify(report, null, 2)}\n` : renderCoverageTable(report));
|
|
43
|
-
return coverageExitCode(report);
|
|
44
|
-
} finally {
|
|
45
|
-
readers.dispose();
|
|
46
|
-
}
|
|
47
|
-
} finally {
|
|
48
|
-
trustedCosign.dispose();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
// develop-coverage-verdict — the closed verdict vocabulary of `xema edition develop coverage`
|
|
2
|
-
// and the pure decision that turns what was READ about one develop image into a verdict.
|
|
3
|
-
//
|
|
4
|
-
// A verdict is `attested` (case A: a V4 attestation verifies under a pinned develop row) or
|
|
5
|
-
// `signature-verified` (case B: the producer's signature over the digest, with the signed claim
|
|
6
|
-
// annotations, verifies under a pinned develop row and every check passes). Everything else names
|
|
7
|
-
// what is missing; nothing is skipped and nothing defaults.
|
|
8
|
-
|
|
9
|
-
/** The closed set of verdicts. */
|
|
10
|
-
export const CoverageVerdict = Object.freeze({
|
|
11
|
-
Attested: 'attested',
|
|
12
|
-
SignatureVerified: 'signature-verified',
|
|
13
|
-
NoRow: 'no-row',
|
|
14
|
-
Unsigned: 'unsigned',
|
|
15
|
-
AnnotationsMissing: 'annotations-missing',
|
|
16
|
-
AnnotationMismatch: 'annotation-mismatch',
|
|
17
|
-
NotBuilt: 'not-built',
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
/** The verdicts that count toward `covered N/M` (the P2b gate). */
|
|
21
|
-
export const COVERED_VERDICTS = Object.freeze([CoverageVerdict.Attested, CoverageVerdict.SignatureVerified]);
|
|
22
|
-
|
|
23
|
-
/** The CLI-local predicate a case-B develop policy row carries (T72 design, section 2). */
|
|
24
|
-
export const DEVELOP_IMAGE_SIGNATURE_PREDICATE = 'https://xema.dev/develop-image-signature/v1';
|
|
25
|
-
|
|
26
|
-
/** The evidence channel the coverage verb reads rows of. */
|
|
27
|
-
export const DEVELOP_EVIDENCE_CHANNEL = 'develop';
|
|
28
|
-
|
|
29
|
-
/** The workflow triggers a develop signer's certificate may carry (T72 design, section 3). */
|
|
30
|
-
export const DEVELOP_SIGNER_TRIGGERS = Object.freeze(['push', 'workflow_dispatch']);
|
|
31
|
-
|
|
32
|
-
/** The one ref a develop signer's certificate may carry. */
|
|
33
|
-
export const DEVELOP_SIGNER_REF = 'refs/heads/develop';
|
|
34
|
-
|
|
35
|
-
/** The signed claim a develop lane puts on its signature (T72 design, section 3, case-B binding). */
|
|
36
|
-
export const DevelopSignatureAnnotation = Object.freeze({
|
|
37
|
-
ContentHash: 'dev.xema.content-hash',
|
|
38
|
-
Service: 'dev.xema.service',
|
|
39
|
-
SourceCommit: 'dev.xema.source.commit',
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
/** What reading a V4 attestation of one digest concluded. */
|
|
43
|
-
export const AttestationStatus = Object.freeze({
|
|
44
|
-
/** No evidence referrer is attached to the digest. */
|
|
45
|
-
None: 'none',
|
|
46
|
-
/** A referrer exists, but the pinned policy has no develop producer row for this repository. */
|
|
47
|
-
NoRow: 'no-row',
|
|
48
|
-
/** A row exists and the record does not verify or does not bind this subject. */
|
|
49
|
-
Refused: 'refused',
|
|
50
|
-
/** A record verifies under a pinned develop row and binds this subject. */
|
|
51
|
-
Verified: 'verified',
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// Worst to best: a subject with several signatures takes the best one, because resolve accepts the digest on any.
|
|
55
|
-
const SIGNATURE_RANK = Object.freeze([
|
|
56
|
-
CoverageVerdict.AnnotationsMissing,
|
|
57
|
-
CoverageVerdict.AnnotationMismatch,
|
|
58
|
-
CoverageVerdict.NoRow,
|
|
59
|
-
CoverageVerdict.SignatureVerified,
|
|
60
|
-
]);
|
|
61
|
-
|
|
62
|
-
/** Whether a pinned develop row names exactly the identity a certificate carries. */
|
|
63
|
-
export function rowMatchesSigner(row, signer) {
|
|
64
|
-
return (
|
|
65
|
-
row.certificateIdentity === signer.certificateIdentity &&
|
|
66
|
-
row.oidcIssuer === signer.issuer &&
|
|
67
|
-
row.githubWorkflow.repository === signer.workflowRepository &&
|
|
68
|
-
row.githubWorkflow.ref === signer.workflowRef &&
|
|
69
|
-
DEVELOP_SIGNER_TRIGGERS.includes(signer.trigger)
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* The verdict of ONE signature.
|
|
75
|
-
*
|
|
76
|
-
* @param {object} request
|
|
77
|
-
* @param {{ contentHash: string, service: string }} request.expected the in-run hash F and service S
|
|
78
|
-
* @param {{ certificateIdentity: string, issuer: string, workflowRepository: string, workflowRef: string, trigger: string, workflowSha: string }} request.signer
|
|
79
|
-
* @param {Record<string, string>} request.annotations the signed annotations
|
|
80
|
-
* @param {object[]} request.rows pinned develop signature rows of this producer (may be empty)
|
|
81
|
-
*/
|
|
82
|
-
export function classifySignature({ expected, signer, annotations, rows }) {
|
|
83
|
-
const claimed = {
|
|
84
|
-
contentHash: annotations[DevelopSignatureAnnotation.ContentHash],
|
|
85
|
-
service: annotations[DevelopSignatureAnnotation.Service],
|
|
86
|
-
sourceCommit: annotations[DevelopSignatureAnnotation.SourceCommit],
|
|
87
|
-
};
|
|
88
|
-
const missing = Object.entries(DevelopSignatureAnnotation)
|
|
89
|
-
.filter(([, key]) => typeof annotations[key] !== 'string' || annotations[key] === '')
|
|
90
|
-
.map(([, key]) => key);
|
|
91
|
-
if (missing.length > 0) {
|
|
92
|
-
return { verdict: CoverageVerdict.AnnotationsMissing, detail: `missing ${missing.join(', ')}` };
|
|
93
|
-
}
|
|
94
|
-
const mismatches = [];
|
|
95
|
-
if (claimed.contentHash !== expected.contentHash) {
|
|
96
|
-
mismatches.push(`content-hash ${claimed.contentHash} != ${expected.contentHash}`);
|
|
97
|
-
}
|
|
98
|
-
if (claimed.service !== expected.service) {
|
|
99
|
-
mismatches.push(`service ${claimed.service} != ${expected.service}`);
|
|
100
|
-
}
|
|
101
|
-
if (!DEVELOP_SIGNER_TRIGGERS.includes(signer.trigger)) {
|
|
102
|
-
mismatches.push(`certificate trigger ${signer.trigger} is not ${DEVELOP_SIGNER_TRIGGERS.join(' or ')}`);
|
|
103
|
-
}
|
|
104
|
-
if (signer.workflowRef !== DEVELOP_SIGNER_REF) {
|
|
105
|
-
mismatches.push(`certificate ref ${signer.workflowRef} is not ${DEVELOP_SIGNER_REF}`);
|
|
106
|
-
}
|
|
107
|
-
if (claimed.sourceCommit !== signer.workflowSha) {
|
|
108
|
-
mismatches.push(`annotated source commit ${claimed.sourceCommit} != certificate commit ${signer.workflowSha}`);
|
|
109
|
-
}
|
|
110
|
-
if (mismatches.length > 0) {
|
|
111
|
-
return { verdict: CoverageVerdict.AnnotationMismatch, detail: mismatches.join('; ') };
|
|
112
|
-
}
|
|
113
|
-
if (!rows.some((row) => rowMatchesSigner(row, signer))) {
|
|
114
|
-
return {
|
|
115
|
-
verdict: CoverageVerdict.NoRow,
|
|
116
|
-
detail: rows.length === 0 ? 'no pinned develop row for this producer' : 'no pinned develop row names this signer',
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
return { verdict: CoverageVerdict.SignatureVerified, detail: '' };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* The verdict of one subject from everything read about it. Case A wins; otherwise the best signature.
|
|
124
|
-
*
|
|
125
|
-
* @param {object} request
|
|
126
|
-
* @param {string|null} request.digest the registry digest served for `<developRef>:<F>`, null when absent
|
|
127
|
-
* @param {{ status: string, detail?: string }} request.attestation
|
|
128
|
-
* @param {{ signer: object, annotations: object }[]} request.signatures every signature read from the digest
|
|
129
|
-
* @param {object[]} request.rows pinned develop signature rows of this producer
|
|
130
|
-
* @param {{ contentHash: string, service: string }} request.expected
|
|
131
|
-
* @returns {{ verdict: string, detail: string, signer: object|null }}
|
|
132
|
-
*/
|
|
133
|
-
export function classifySubject({ digest, attestation, signatures, rows, expected }) {
|
|
134
|
-
if (digest === null) {
|
|
135
|
-
return { verdict: CoverageVerdict.NotBuilt, detail: 'no manifest at the content-hash tag', signer: null };
|
|
136
|
-
}
|
|
137
|
-
if (attestation.status === AttestationStatus.Verified) {
|
|
138
|
-
return { verdict: CoverageVerdict.Attested, detail: attestation.detail ?? '', signer: null };
|
|
139
|
-
}
|
|
140
|
-
if (signatures.length === 0) {
|
|
141
|
-
if (attestation.status === AttestationStatus.NoRow) {
|
|
142
|
-
return { verdict: CoverageVerdict.NoRow, detail: 'an attestation exists and the policy has no develop producer row', signer: null };
|
|
143
|
-
}
|
|
144
|
-
const refused = attestation.status === AttestationStatus.Refused ? `attestation refused: ${attestation.detail}` : 'no signature and no attestation';
|
|
145
|
-
return { verdict: CoverageVerdict.Unsigned, detail: refused, signer: null };
|
|
146
|
-
}
|
|
147
|
-
const judged = signatures.map((signature) => ({
|
|
148
|
-
...classifySignature({ expected, signer: signature.signer, annotations: signature.annotations, rows }),
|
|
149
|
-
signer: signature.signer,
|
|
150
|
-
}));
|
|
151
|
-
judged.sort((left, right) => SIGNATURE_RANK.indexOf(right.verdict) - SIGNATURE_RANK.indexOf(left.verdict));
|
|
152
|
-
return judged[0];
|
|
153
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
// develop-coverage — `xema edition develop coverage <id>`: for every image subject an edition selects,
|
|
2
|
-
// is its DEVELOP image producer-signed in the form T72 resolve is expected to accept? A forecast, not a guarantee: the
|
|
3
|
-
// policy is held to its pin, but this CLI's own unpinned verifier code runs, so resolve can still refuse. Read-only: it writes no lock,
|
|
4
|
-
// signature or tag. It is the P2b gate (exit 0 only at 100%).
|
|
5
|
-
//
|
|
6
|
-
// The subjects, their develop refs and content hashes F are the ones `develop resolve` computes (the
|
|
7
|
-
// caller passes the images lock that resolve's own first half produced); the registry digest D is the
|
|
8
|
-
// one served for `<developRef>:<F>`; the verdict is decided by develop-coverage-verdict.mjs.
|
|
9
|
-
|
|
10
|
-
import { AttestationStatus, COVERED_VERDICTS, DEVELOP_EVIDENCE_CHANNEL, DEVELOP_IMAGE_SIGNATURE_PREDICATE, classifySubject } from './develop-coverage-verdict.mjs';
|
|
11
|
-
import { developImageRef } from './develop-image-coordinate.mjs';
|
|
12
|
-
import { policyCandidates } from './image-evidence.mjs';
|
|
13
|
-
import { mapWithConcurrency } from './map-with-concurrency.mjs';
|
|
14
|
-
import { imageSubjectKey, thirdPartyImagePins } from './third-party-image-pins.mjs';
|
|
15
|
-
import { attestedContentHash } from './third-party-subjects.mjs';
|
|
16
|
-
|
|
17
|
-
/** In flight at once, as `develop resolve` probes. */
|
|
18
|
-
export const COVERAGE_CONCURRENCY = 6;
|
|
19
|
-
|
|
20
|
-
export const COVERAGE_JSON_SCHEMA = 'xema.develop-coverage/v1';
|
|
21
|
-
|
|
22
|
-
/** Exit codes of the verb; 2 is an operational error and is decided by the entry. */
|
|
23
|
-
export const CoverageExit = Object.freeze({ Covered: 0, NotCovered: 1, Operational: 2 });
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The service name a develop lane signs for a subject (`dev.xema.service`): the subject's id in the lock.
|
|
27
|
-
* One definition; the signing lanes (T72 P1) must sign this.
|
|
28
|
-
*/
|
|
29
|
-
export const expectedService = (subject) => subject.id;
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @param {object} request
|
|
33
|
-
* @param {string} request.distributionId
|
|
34
|
-
* @param {object[]} request.subjects the images lock subjects (release refs, unsealed), contentHash = F
|
|
35
|
-
* @param {object} request.policy the pinned trust policy (rows are filtered per develop repository)
|
|
36
|
-
* @param {{ developDigest: Function, readAttestation: Function, readSignatures: Function }} request.readers
|
|
37
|
-
* @param {{byRepository: (repository: string) => object|undefined}} [request.thirdPartyPins] the data root's third-party
|
|
38
|
-
* source pins: a subject of a pinned repository is not built by the develop lane, so it is no coverage subject
|
|
39
|
-
* @param {(line: string) => void} [request.progress]
|
|
40
|
-
*/
|
|
41
|
-
export async function collectCoverage({ distributionId, subjects: lockSubjects, policy, readers, thirdPartyPins = undefined, concurrency = COVERAGE_CONCURRENCY, progress = () => {} }) {
|
|
42
|
-
const pinnedImages = thirdPartyPins === undefined ? new Map() : thirdPartyImagePins({ pins: thirdPartyPins, subjects: lockSubjects });
|
|
43
|
-
const subjects = lockSubjects.filter((subject) => !pinnedImages.has(imageSubjectKey(subject)));
|
|
44
|
-
for (const subject of lockSubjects.filter((candidate) => pinnedImages.has(imageSubjectKey(candidate)))) {
|
|
45
|
-
progress(
|
|
46
|
-
`[coverage] third-party ${imageSubjectKey(subject)} ${subject.imageRef}@${pinnedImages.get(imageSubjectKey(subject)).manifestDigest} ${attestedContentHash(subject)}, not a develop coverage subject`,
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
const rows = await mapWithConcurrency(subjects, concurrency, async (subject) => {
|
|
50
|
-
const developSubject = { ...subject, imageRef: developImageRef(subject.imageRef) };
|
|
51
|
-
const digest = await readers.developDigest(developSubject);
|
|
52
|
-
let attestation = { status: AttestationStatus.None };
|
|
53
|
-
let signatures = [];
|
|
54
|
-
if (digest !== null) {
|
|
55
|
-
attestation = await readers.readAttestation(developSubject, digest);
|
|
56
|
-
if (attestation.status !== AttestationStatus.Verified) {signatures = await readers.readSignatures(developSubject, digest);}
|
|
57
|
-
}
|
|
58
|
-
const signatureRows = policyCandidates(policy, DEVELOP_IMAGE_SIGNATURE_PREDICATE, DEVELOP_EVIDENCE_CHANNEL, developSubject.imageRef);
|
|
59
|
-
const decided = classifySubject({
|
|
60
|
-
digest,
|
|
61
|
-
attestation,
|
|
62
|
-
signatures,
|
|
63
|
-
rows: signatureRows,
|
|
64
|
-
expected: { contentHash: subject.contentHash, service: expectedService(subject) },
|
|
65
|
-
});
|
|
66
|
-
progress(`[coverage] ${subject.kind}:${subject.id} ${decided.verdict}`);
|
|
67
|
-
return {
|
|
68
|
-
kind: subject.kind,
|
|
69
|
-
id: subject.id,
|
|
70
|
-
producer: subject.repo,
|
|
71
|
-
developRef: developSubject.imageRef,
|
|
72
|
-
contentHash: subject.contentHash,
|
|
73
|
-
digest,
|
|
74
|
-
verdict: decided.verdict,
|
|
75
|
-
detail: decided.detail,
|
|
76
|
-
signer: decided.signer,
|
|
77
|
-
};
|
|
78
|
-
});
|
|
79
|
-
return summarize(distributionId, rows);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function summarize(distributionId, subjects) {
|
|
83
|
-
const byProducer = new Map();
|
|
84
|
-
for (const subject of subjects) {
|
|
85
|
-
const entry = byProducer.get(subject.producer) ?? { producer: subject.producer, total: 0, covered: 0, subjects: [] };
|
|
86
|
-
entry.total += 1;
|
|
87
|
-
if (COVERED_VERDICTS.includes(subject.verdict)) {entry.covered += 1;}
|
|
88
|
-
entry.subjects.push(subject);
|
|
89
|
-
byProducer.set(subject.producer, entry);
|
|
90
|
-
}
|
|
91
|
-
const producers = [...byProducer.values()].sort((left, right) => (left.producer < right.producer ? -1 : left.producer > right.producer ? 1 : 0));
|
|
92
|
-
for (const producer of producers) {
|
|
93
|
-
producer.subjects.sort((left, right) => (`${left.kind}:${left.id}` < `${right.kind}:${right.id}` ? -1 : 1));
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
schema: COVERAGE_JSON_SCHEMA,
|
|
97
|
-
distributionId,
|
|
98
|
-
covered: producers.reduce((sum, producer) => sum + producer.covered, 0),
|
|
99
|
-
total: subjects.length,
|
|
100
|
-
producers,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/** Exit 0 only when every subject is covered; an edition with no subjects covers nothing. */
|
|
105
|
-
export function coverageExitCode(report) {
|
|
106
|
-
return report.total > 0 && report.covered === report.total ? CoverageExit.Covered : CoverageExit.NotCovered;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function summaryLine(report) {
|
|
110
|
-
return `covered ${report.covered}/${report.total}`;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function signerText(signer) {
|
|
114
|
-
if (signer === null) {return '';}
|
|
115
|
-
return `${signer.certificateIdentity} (${signer.issuer}, ${signer.trigger}, ${signer.workflowSha})`;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** The table, grouped by producer repo, ending in the summary line. */
|
|
119
|
-
export function renderCoverageTable(report) {
|
|
120
|
-
const lines = [];
|
|
121
|
-
for (const producer of report.producers) {
|
|
122
|
-
lines.push(`${producer.producer} covered ${producer.covered}/${producer.total}`);
|
|
123
|
-
for (const subject of producer.subjects) {
|
|
124
|
-
const parts = [` ${subject.kind}:${subject.id}`, subject.verdict, subject.digest ?? '-'];
|
|
125
|
-
const tail = [subject.detail, signerText(subject.signer)].filter((text) => text !== '').join(' | ');
|
|
126
|
-
lines.push(tail === '' ? parts.join(' ') : `${parts.join(' ')} ${tail}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
lines.push(summaryLine(report));
|
|
130
|
-
return `${lines.join('\n')}\n`;
|
|
131
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// develop-current-resolution — the members that keep the CURRENT develop resolution instead of a signed build record.
|
|
2
|
-
//
|
|
3
|
-
// A member keeps its current resolution (develop HEAD freeze plus the registry probe) only when the data root declares
|
|
4
|
-
// it: `currentResolution: "<ticket>"` on its `firstPartySources` entry in edition-workspace.json, the ticket that
|
|
5
|
-
// removes the exception (today xema-docs, whose develop lane is unsigned by owner decision and which leaves the
|
|
6
|
-
// edition). It is a declared exception, not a fallback: absent means none, and every other member without a record
|
|
7
|
-
// still refuses.
|
|
8
|
-
|
|
9
|
-
import { compareStrings } from './lib.mjs';
|
|
10
|
-
|
|
11
|
-
/** Whether a member (or its `firstPartySources` entry) keeps its current resolution. */
|
|
12
|
-
export const keepsCurrentResolution = (member) => Object.hasOwn(member, 'currentResolution');
|
|
13
|
-
|
|
14
|
-
/** The graph `members` that declare a current resolution, repo -> ticket, keys sorted: what a selection records. */
|
|
15
|
-
export function currentResolutionOf(members) {
|
|
16
|
-
return Object.fromEntries(
|
|
17
|
-
members
|
|
18
|
-
.filter(keepsCurrentResolution)
|
|
19
|
-
.map(({ repo, currentResolution }) => [repo, currentResolution])
|
|
20
|
-
.sort(([a], [b]) => compareStrings(a, b)),
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Why a selection's `currentResolution` (absent = none) is not exactly the one the graph `members` declare; null when it is. */
|
|
25
|
-
export function currentResolutionProblem(declared, members) {
|
|
26
|
-
const expected = currentResolutionOf(members);
|
|
27
|
-
if (JSON.stringify(declared ?? {}) === JSON.stringify(expected)) {return null;}
|
|
28
|
-
return `"currentResolution" is ${JSON.stringify(declared)}, not ${JSON.stringify(expected)}, the members the data root declares keep their current resolution`;
|
|
29
|
-
}
|