@xemahq/xema 0.59.1 → 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 -1423
- 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 -2351
- 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,128 +0,0 @@
|
|
|
1
|
-
// Third-party OCI biomes on the resolve side (XEMA-1611 design section 4).
|
|
2
|
-
//
|
|
3
|
-
// A biome from an organisation outside the vendor fleet reaches an edition as a lock row with NO `source` (the lock's
|
|
4
|
-
// `LockedBiomeSource` is git-only), an OCI `bundleSource` and `origin: third-party`. That triple is the whole key; the
|
|
5
|
-
// pin file (`third-party-source-pins.json`, written only by the trusted writer) is what the row is then held to. The
|
|
6
|
-
// image subjects of such a row take `imageRef`, `sourceCommit` and `contentHash` from the pin and are never built,
|
|
7
|
-
// hashed or probed by this plane: there is no checkout to hash.
|
|
8
|
-
//
|
|
9
|
-
// `contentHash` of such a subject is the PUBLISHER'S statement (`sourceTreeHash` of its image-source evidence), never
|
|
10
|
-
// a hash this plane computed. It is therefore labelled `contentHash (publisher-attested)` wherever it is printed and
|
|
11
|
-
// is not used as an image tag, a cache key or a reproducibility check by any path that serves third-party subjects.
|
|
12
|
-
|
|
13
|
-
import { loadKernelBiomeContracts } from './lib.mjs';
|
|
14
|
-
|
|
15
|
-
export const PUBLISHER_ATTESTED_LABEL = 'publisher-attested';
|
|
16
|
-
|
|
17
|
-
export const OCI_BUNDLE_SOURCE_KIND = 'oci';
|
|
18
|
-
|
|
19
|
-
const hasOciBundleSource = (row) => row.bundleSource?.kind === OCI_BUNDLE_SOURCE_KIND;
|
|
20
|
-
const isThirdPartyOrigin = (row) => row.origin === loadKernelBiomeContracts().BiomeOrigin.ThirdParty;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The lock key of a third-party OCI biome: no `source`, an OCI `bundleSource`, `origin: third-party`.
|
|
24
|
-
* A lock row and a walked index entry both carry these fields; an index entry's `source` is the walk's stamp, so it
|
|
25
|
-
* is dropped by the caller that tests an entry (`isThirdPartyOciEntry`).
|
|
26
|
-
*/
|
|
27
|
-
export const isThirdPartyOciRow = (row) => row.source === undefined && hasOciBundleSource(row) && isThirdPartyOrigin(row);
|
|
28
|
-
|
|
29
|
-
/** A walked index entry that is a third-party OCI biome: its `source` is the walk's stamp, not a lock source. */
|
|
30
|
-
export const isThirdPartyOciEntry = (entry) => hasOciBundleSource(entry) && isThirdPartyOrigin(entry);
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Refuse an OCI `bundleSource` on a row whose origin is not third-party: only a third-party biome is pulled from an OCI
|
|
34
|
-
* bundle by digest, so the vendor's origin on such a row would place an unevidenced bundle in the vendor's trust domain.
|
|
35
|
-
* A row drawn from a git `source` is not this key and carries no OCI `bundleSource` at all: resolve omits the manifest's
|
|
36
|
-
* (it names a release artifact not built from the pinned commit), and a lock stating one is refused (`locked-bundle-signer.mjs`).
|
|
37
|
-
*/
|
|
38
|
-
export function assertOciBundleSourceOrigin(row, label) {
|
|
39
|
-
if (row.source === undefined && hasOciBundleSource(row) && !isThirdPartyOrigin(row)) {
|
|
40
|
-
throw new Error(
|
|
41
|
-
`${label} carries an OCI bundleSource (${row.bundleSource.ociRef}) but its origin is "${row.origin}": an OCI ` +
|
|
42
|
-
`biome bundle is admitted only as origin "${loadKernelBiomeContracts().BiomeOrigin.ThirdParty}", with a pin of the data root's third-party source pins`,
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* The third-party source pin a third-party OCI row is held to, by the row's `repo` (the pinned repository). Refuses a
|
|
49
|
-
* row with no pin (naming why the data root has none when it has none), a pin for another biome, another bundle
|
|
50
|
-
* reference or another manifest hash, and a pin the distribution does not declare as an `oci` source of that name.
|
|
51
|
-
*
|
|
52
|
-
* @param {{row: object, declaredSources: readonly object[]|undefined, pins: {sources: readonly object[], reason: string|null, byRepository: (repository: string) => object|undefined}|undefined, label: string}} options
|
|
53
|
-
*/
|
|
54
|
-
export function thirdPartyPinForRow({ row, pins, declaredSources, label }) {
|
|
55
|
-
if (pins === undefined) {
|
|
56
|
-
throw new Error(`${label} is a third-party OCI biome, but this resolve was given no third-party source pins to hold it to`);
|
|
57
|
-
}
|
|
58
|
-
const pin = pins.byRepository(row.repo);
|
|
59
|
-
if (pin === undefined) {
|
|
60
|
-
throw new Error(
|
|
61
|
-
`${label} is a third-party OCI biome with neither a source nor a pin: ${pins.reason ?? `no third-party source pin names repository "${row.repo}"`}`,
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
if (row.id !== pin.bundle.biomeId) {
|
|
65
|
-
throw new Error(`${label} has biome id "${row.id}", but the third-party pin "${pin.name}" is for biome "${pin.bundle.biomeId}"`);
|
|
66
|
-
}
|
|
67
|
-
if (row.bundleSource.ociRef !== pin.bundle.ociRef) {
|
|
68
|
-
throw new Error(`${label} names bundle ${row.bundleSource.ociRef}, but the third-party pin "${pin.name}" pins ${pin.bundle.ociRef}`);
|
|
69
|
-
}
|
|
70
|
-
if (row.sourceManifestHash !== pin.bundle.sourceManifestHash) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
`${label} has sourceManifestHash ${row.sourceManifestHash}, but the third-party pin "${pin.name}" pins ${pin.bundle.sourceManifestHash}`,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
if (!Array.isArray(declaredSources) || !declaredSources.some((source) => source.kind === OCI_BUNDLE_SOURCE_KIND && source.name === pin.name)) {
|
|
76
|
-
throw new Error(`${label} is drawn from the third-party pin "${pin.name}", which the distribution does not declare as a sources[] entry of kind "${OCI_BUNDLE_SOURCE_KIND}"`);
|
|
77
|
-
}
|
|
78
|
-
return pin;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* The image subjects of one third-party OCI row, from its pin and nothing else: one per service and runtime
|
|
83
|
-
* component the row ships (a worker that runs its sibling's image has none). Every pinned image must be one of them and
|
|
84
|
-
* every shipped image must be pinned, so the pin and the lock describe the same images.
|
|
85
|
-
*
|
|
86
|
-
* `contentHash` is the publisher's `sourceTreeHash` (publisher-attested); `sourceCommit` is the pin's.
|
|
87
|
-
*/
|
|
88
|
-
export function thirdPartySubjectCandidates({ row, pin, enums, requiredPlatforms, label }) {
|
|
89
|
-
if (row.target === 'web') {
|
|
90
|
-
throw new Error(`${label} is a third-party OCI biome with target "web": a bundled web biome of a third party is not admitted (it has no pinned image)`);
|
|
91
|
-
}
|
|
92
|
-
const sharedImageWorkers = new Set(Object.keys(row.workerImages ?? {}));
|
|
93
|
-
const wanted = [
|
|
94
|
-
...(row.services ?? []).filter((service) => !sharedImageWorkers.has(service)).map((id) => [enums.RuntimeImageSubjectKind.Service, id]),
|
|
95
|
-
...(row.runtimeComponents ?? []).map((id) => [enums.RuntimeImageSubjectKind.RuntimeComponent, id]),
|
|
96
|
-
];
|
|
97
|
-
const byKey = new Map(pin.images.map((image) => [`${image.subjectKind}\0${image.subjectId}`, image]));
|
|
98
|
-
const used = new Set();
|
|
99
|
-
const candidates = wanted.map(([kind, id]) => {
|
|
100
|
-
const image = byKey.get(`${kind}\0${id}`);
|
|
101
|
-
if (image === undefined) {
|
|
102
|
-
throw new Error(`${label} ships ${kind} "${id}", which the third-party pin "${pin.name}" pins no image for`);
|
|
103
|
-
}
|
|
104
|
-
used.add(`${kind}\0${id}`);
|
|
105
|
-
return {
|
|
106
|
-
kind,
|
|
107
|
-
id,
|
|
108
|
-
imageRef: image.imageRef,
|
|
109
|
-
repo: row.repo,
|
|
110
|
-
path: row.path,
|
|
111
|
-
sourceCommit: pin.sourceCommit,
|
|
112
|
-
sourceManifestHash: row.sourceManifestHash,
|
|
113
|
-
requiredPlatforms,
|
|
114
|
-
owners: [{ kind: enums.RuntimeImageOwnerKind.Biome, biomeId: row.id }],
|
|
115
|
-
contentHash: image.sourceTreeHash,
|
|
116
|
-
};
|
|
117
|
-
});
|
|
118
|
-
const unused = [...byKey.keys()].filter((key) => !used.has(key));
|
|
119
|
-
if (unused.length > 0) {
|
|
120
|
-
throw new Error(
|
|
121
|
-
`the third-party pin "${pin.name}" pins image(s) ${unused.map((key) => key.replace('\0', ':')).join(', ')} that ${label} does not ship`,
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
return candidates;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** A third-party subject's content hash, as every CLI output prints it. */
|
|
128
|
-
export const attestedContentHash = (subject) => `contentHash (${PUBLISHER_ATTESTED_LABEL}) ${subject.contentHash}`;
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// `xema edition arming`: is the data root's declared evidence trust policy ARMED
|
|
3
|
-
// on one channel?
|
|
4
|
-
//
|
|
5
|
-
// usage: xema edition arming --channel <release|develop> --data-root <dir> --kernel <dir>
|
|
6
|
-
// stdout: {"channel":"<channel>","state":"armed|unarmed|partial","unmet":["…"]}
|
|
7
|
-
// exit: 0 only when the state is armed; 1 for any other state (each unmet
|
|
8
|
-
// entry on stderr) or a policy that does not hold to its pin; 2 for a
|
|
9
|
-
// usage error. A data root that declares no policy is `unarmed`.
|
|
10
|
-
// It reads the policy the way `xema edition check` does and never writes.
|
|
11
|
-
|
|
12
|
-
import { EditionChannel, parseChannelArgs } from './edition-channel.mjs';
|
|
13
|
-
import {
|
|
14
|
-
WorkspaceRoot,
|
|
15
|
-
configureEditionWorkspaceFromArgv,
|
|
16
|
-
isEntryModule,
|
|
17
|
-
} from './edition-workspace.mjs';
|
|
18
|
-
import { assessDeclaredTrustPolicyArming } from './evidence-trust-policy.mjs';
|
|
19
|
-
import { TrustPolicyArmingState } from './trust-policy-arming.mjs';
|
|
20
|
-
|
|
21
|
-
export const ARMING_USAGE = `usage: xema edition arming --channel <${Object.values(EditionChannel).join('|')}> --data-root <dir> --kernel <dir>`;
|
|
22
|
-
|
|
23
|
-
/** The process exit codes of the verb. */
|
|
24
|
-
export const ArmingExit = Object.freeze({ Armed: 0, NotArmed: 1, Usage: 2 });
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Judge the configured data root's policy on `channel`, writing the one JSON
|
|
28
|
-
* line to `stdout` and each unmet entry to `stderr`. Returns the exit code.
|
|
29
|
-
*/
|
|
30
|
-
export async function runArming({ channel, locateVerifier, stdout = process.stdout, stderr = process.stderr }) {
|
|
31
|
-
let verdict;
|
|
32
|
-
try {
|
|
33
|
-
verdict = await assessDeclaredTrustPolicyArming({ channel, locateVerifier });
|
|
34
|
-
} catch (error) {
|
|
35
|
-
stderr.write(`arming: ${error.message}\n`);
|
|
36
|
-
return ArmingExit.NotArmed;
|
|
37
|
-
}
|
|
38
|
-
const { state, unmet } = verdict;
|
|
39
|
-
stdout.write(`${JSON.stringify({ channel, state, unmet })}\n`);
|
|
40
|
-
if (state === TrustPolicyArmingState.ARMED) {return ArmingExit.Armed;}
|
|
41
|
-
for (const entry of unmet) {stderr.write(`${entry}\n`);}
|
|
42
|
-
return ArmingExit.NotArmed;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function main() {
|
|
46
|
-
let channel;
|
|
47
|
-
try {
|
|
48
|
-
const rest = configureEditionWorkspaceFromArgv(process.argv.slice(2), [WorkspaceRoot.Data, WorkspaceRoot.Kernel]);
|
|
49
|
-
({ channel } = parseChannelArgs(rest));
|
|
50
|
-
} catch (error) {
|
|
51
|
-
process.stderr.write(`arming: ${error.message}\n${ARMING_USAGE}\n`);
|
|
52
|
-
process.exitCode = ArmingExit.Usage;
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
process.exitCode = await runArming({ channel });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (isEntryModule(import.meta.url)) {
|
|
59
|
-
await main();
|
|
60
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
// Arming assertion for the offline Sigstore trust policy.
|
|
2
|
-
//
|
|
3
|
-
// The policy a data root declares (`evidenceTrustPolicy`) is schema-valid while
|
|
4
|
-
// authorizing nobody: `policies`, `trustedCosignBinaryDigests` and
|
|
5
|
-
// `trustedGitBinaryDigests` all default to `[]` and the zod schema has no
|
|
6
|
-
// `.min(1)` on any of them. So the file parses green while the delivery plane
|
|
7
|
-
// remains deliberately disabled. That is a valid bootstrap state only while all
|
|
8
|
-
// three authority collections are empty. A partially populated policy is
|
|
9
|
-
// neither disabled nor usable and must fail `xema edition check`; delivery
|
|
10
|
-
// itself always requires the fully armed state.
|
|
11
|
-
//
|
|
12
|
-
// It is deliberately not a lint of taste. Each requirement below names a place
|
|
13
|
-
// where an empty list makes verification impossible, not merely weaker:
|
|
14
|
-
//
|
|
15
|
-
// policies[] -> `image-evidence.mjs` throws "offline trust
|
|
16
|
-
// policy authorizes no signer for <predicate>
|
|
17
|
-
// on channel <channel>" before any cosign call.
|
|
18
|
-
// trustedCosignBinaryDigests -> `trusted-executable.mjs` compares the cosign
|
|
19
|
-
// binary digest with `[].includes(...)`, which
|
|
20
|
-
// is false for every possible binary.
|
|
21
|
-
// trustedGitBinaryDigests -> same, for the git binary that pins the
|
|
22
|
-
// graded checkouts.
|
|
23
|
-
//
|
|
24
|
-
// THE REQUIRED RELEASE ROWS ARE ONE RULE: the edition-catalogue (E4) predicate iff the edition consumes a catalogue
|
|
25
|
-
// (`consumesCatalogue`: a customer edition does, a vendor edition does not), plus the image producer, distribution
|
|
26
|
-
// completeness and delivery entitlement predicates. The same function judges the data root before the catalogue's
|
|
27
|
-
// kernel is adopted (inside the pinned verifier bundle, with its own embedded kernel) and after it (descriptorEvidenceTrust).
|
|
28
|
-
//
|
|
29
|
-
// The three predicate types are checked separately because a policy can be
|
|
30
|
-
// non-empty and still be unarmed for a stage: the verifier resolves candidates
|
|
31
|
-
// per predicate type, so authorizing only the producer identity leaves the
|
|
32
|
-
// completeness and entitlement stages throwing the same "authorizes no signer"
|
|
33
|
-
// at delivery time - armed-looking, and inert exactly where it matters.
|
|
34
|
-
//
|
|
35
|
-
// ARMING IS JUDGED FOR ONE CHANNEL: the channel of the edition being checked,
|
|
36
|
-
// sealed or verified. A release verification is only ever satisfied by a
|
|
37
|
-
// release signer and a develop one by a develop signer, so the signers of one
|
|
38
|
-
// channel neither arm nor disarm the other: a policy that authorizes the three
|
|
39
|
-
// stages on the release channel and pins both binaries is ARMED for a release
|
|
40
|
-
// edition whatever it says about develop.
|
|
41
|
-
//
|
|
42
|
-
// ONLY A STAGE ROW ARMS A CHANNEL: a row counts toward a channel's arming when it
|
|
43
|
-
// authorizes one of the stage predicates judged here. A bundle-signer row (SLSA
|
|
44
|
-
// provenance of a third-party bundle, e.g. the develop row of a git-sourced
|
|
45
|
-
// biome) authorizes bundle verification and arms no stage, so a channel whose
|
|
46
|
-
// only rows are bundle signers is UNARMED, exactly like a channel with no row.
|
|
47
|
-
// One stage row on the channel still makes it PARTIAL until every stage is met.
|
|
48
|
-
|
|
49
|
-
export const TrustPolicyArmingState = Object.freeze({
|
|
50
|
-
ARMED: 'armed',
|
|
51
|
-
UNARMED: 'unarmed',
|
|
52
|
-
PARTIAL: 'partial',
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
/** Arming has no channel-less answer: `channel` is one of the kernel's evidence channels. */
|
|
56
|
-
export function assertArmingChannel(schemas, channel) {
|
|
57
|
-
if (!schemas.EVIDENCE_CHANNELS.includes(channel)) {
|
|
58
|
-
throw new Error(
|
|
59
|
-
`trust-policy arming is judged for one channel; got ${JSON.stringify(channel)}, expected ${schemas.EVIDENCE_CHANNELS.join(' | ')}`,
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Assess whether a parsed trust policy can authorize anything on `channel`.
|
|
66
|
-
*
|
|
67
|
-
* Returns `{ state, armed, unmet }`. `unmet` is empty exactly when `armed` is
|
|
68
|
-
* true. `unarmed` means the channel has no signer at all in a policy that is
|
|
69
|
-
* otherwise coherent: the exact, explicit bootstrap state where every authority
|
|
70
|
-
* collection is empty, or a policy whose signers all belong to another channel.
|
|
71
|
-
* Anything else that is not armed is `partial`. Each unmet entry names the
|
|
72
|
-
* field and what makes verification impossible, so the failure is actionable
|
|
73
|
-
* without reading the verifier.
|
|
74
|
-
*/
|
|
75
|
-
export function assessTrustPolicyArming(policy, schemas, channel, { consumesCatalogue = false } = {}) {
|
|
76
|
-
assertArmingChannel(schemas, channel);
|
|
77
|
-
const unmet = [];
|
|
78
|
-
const stages = [
|
|
79
|
-
['image-producer', schemas.IMAGE_PRODUCER_PREDICATE_TYPE],
|
|
80
|
-
['distribution-completeness', schemas.DISTRIBUTION_IMAGES_PREDICATE_TYPE],
|
|
81
|
-
['delivery-entitlement', schemas.IMAGE_DELIVERY_ENTITLEMENT_PREDICATE_TYPE],
|
|
82
|
-
];
|
|
83
|
-
if (consumesCatalogue) {
|
|
84
|
-
// A kernel that states no E4 predicate cannot arm a catalogue consumer: an unmet entry, never a skip.
|
|
85
|
-
if (typeof schemas.EDITION_CATALOGUE_PREDICATE_TYPE !== 'string') {
|
|
86
|
-
unmet.push('this kernel states no edition-catalogue predicate (EDITION_CATALOGUE_PREDICATE_TYPE), so a catalogue consumer cannot be armed against it.');
|
|
87
|
-
} else {
|
|
88
|
-
stages.push(['edition-catalogue', schemas.EDITION_CATALOGUE_PREDICATE_TYPE]);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
const stagePredicateTypes = stages.map(([, predicateType]) => predicateType);
|
|
92
|
-
const stageRows = policy.policies.filter(
|
|
93
|
-
(candidate) => candidate.channel === channel && candidate.predicateTypes.some((predicateType) => stagePredicateTypes.includes(predicateType)),
|
|
94
|
-
);
|
|
95
|
-
const authorized = stages.filter(([, predicateType]) => stageRows.some((candidate) => candidate.predicateTypes.includes(predicateType)));
|
|
96
|
-
|
|
97
|
-
if (policy.policies.length === 0) {
|
|
98
|
-
unmet.push(
|
|
99
|
-
'policies[] is empty — no signer identity is authorized, so ' +
|
|
100
|
-
'verifySigstoreEvidenceDescriptor throws "offline trust policy ' +
|
|
101
|
-
'authorizes no signer" for every predicate before reading any bundle.',
|
|
102
|
-
);
|
|
103
|
-
} else {
|
|
104
|
-
for (const [stage, predicateType] of stages.filter((candidate) => !authorized.includes(candidate))) {
|
|
105
|
-
unmet.push(
|
|
106
|
-
`no policy authorizes the ${stage} predicate ${predicateType} on channel "${channel}" — ` +
|
|
107
|
-
`that stage of a ${channel} delivery would still throw "authorizes no signer" ` +
|
|
108
|
-
'while the policy reads as armed.',
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (policy.trustedCosignBinaryDigests.length === 0) {
|
|
114
|
-
unmet.push(
|
|
115
|
-
'trustedCosignBinaryDigests[] is empty — prepareDigestPinnedExecutable ' +
|
|
116
|
-
'tests membership with [].includes(digest), which is false for every ' +
|
|
117
|
-
'cosign binary, so no evidence can be verified on any host.',
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (policy.trustedGitBinaryDigests.length === 0) {
|
|
122
|
-
unmet.push(
|
|
123
|
-
'trustedGitBinaryDigests[] is empty — the same membership test rejects ' +
|
|
124
|
-
'every git binary, so no verified release checkout can be established.',
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const armed = unmet.length === 0;
|
|
129
|
-
const bootstrap =
|
|
130
|
-
policy.policies.length === 0 &&
|
|
131
|
-
policy.trustedCosignBinaryDigests.length === 0 &&
|
|
132
|
-
policy.trustedGitBinaryDigests.length === 0;
|
|
133
|
-
// The channel has no stage row while the policy has rows (another channel's,
|
|
134
|
-
// or bundle signers): those rows and the binary pins are not half of this
|
|
135
|
-
// channel's arming.
|
|
136
|
-
const noStageRow = stageRows.length === 0 && policy.policies.length > 0;
|
|
137
|
-
const state = armed
|
|
138
|
-
? TrustPolicyArmingState.ARMED
|
|
139
|
-
: bootstrap || noStageRow
|
|
140
|
-
? TrustPolicyArmingState.UNARMED
|
|
141
|
-
: TrustPolicyArmingState.PARTIAL;
|
|
142
|
-
|
|
143
|
-
return { state, armed, unmet };
|
|
144
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
// Who may name which image repository in the evidence trust policy (XEMA-1611 design section 3(e)).
|
|
2
|
-
//
|
|
3
|
-
// Checked when the declared policy is LOADED, so every consumer of the policy sees it:
|
|
4
|
-
// (a) an `imageRepositories` entry listed by rows whose `githubWorkflow.repository` OWNERS differ is
|
|
5
|
-
// refused: one repository, one publisher;
|
|
6
|
-
// (b) a row whose owner is not a first-party owner and that names a first-party namespace
|
|
7
|
-
// (`<registry>/<first-party owner>/<any>`) is refused.
|
|
8
|
-
// First-party owners are the owners of the runtime-image-source index `repositoryPins` URLs, plus the kernel scope owner.
|
|
9
|
-
|
|
10
|
-
import { KERNEL_PACKAGE_NAME } from './kernel-package.mjs';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* The vendor's publishing owner: the npm scope of the kernel package (`@<scope>/contracts`), read from the package name
|
|
14
|
-
* the CLI already pins, not written here. It is a first-party owner on purpose, beside the owners of the index's
|
|
15
|
-
* `repositoryPins`: the vendor publishes its kernel-scoped images under that owner, which no repository pin names, so
|
|
16
|
-
* without it a vendor row for them would be refused by rule (b) as a third party.
|
|
17
|
-
*/
|
|
18
|
-
export const KERNEL_SCOPE_OWNER = KERNEL_PACKAGE_NAME.replace(/^@/u, '').split('/')[0];
|
|
19
|
-
|
|
20
|
-
/** The lowercase owners of the `repositoryPins[].repositoryUrl` entries of a parsed runtime image source index, plus the kernel scope owner. */
|
|
21
|
-
export function firstPartyOwnersFromIndex(indexDocument) {
|
|
22
|
-
const pins = indexDocument?.repositoryPins;
|
|
23
|
-
if (!Array.isArray(pins)) {
|
|
24
|
-
throw new Error('runtime image source index has no repositoryPins array to derive the first-party owners from');
|
|
25
|
-
}
|
|
26
|
-
const owners = new Set([KERNEL_SCOPE_OWNER]);
|
|
27
|
-
for (const pin of pins) {
|
|
28
|
-
let url;
|
|
29
|
-
try {
|
|
30
|
-
url = new URL(pin?.repositoryUrl);
|
|
31
|
-
} catch {
|
|
32
|
-
throw new Error(`runtime image source index repositoryPins entry ${JSON.stringify(pin?.repo)} has no parsable repositoryUrl`);
|
|
33
|
-
}
|
|
34
|
-
const owner = url.pathname.split('/').filter(Boolean)[0];
|
|
35
|
-
if (owner === undefined) {
|
|
36
|
-
throw new Error(`runtime image source index repositoryUrl ${url.href} names no owner`);
|
|
37
|
-
}
|
|
38
|
-
owners.add(owner.toLowerCase());
|
|
39
|
-
}
|
|
40
|
-
return owners;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Whether an image repository sits in a first-party namespace: `<registry>/<first-party owner>/<any>`, an owner being
|
|
45
|
-
* one of `firstPartyOwners` (the data root's own, from `firstPartyOwnersFromIndex`). The registry is whatever the first
|
|
46
|
-
* path segment is; no registry or organisation is named here.
|
|
47
|
-
*/
|
|
48
|
-
export function isFirstPartyImageNamespace(imageRepository, firstPartyOwners) {
|
|
49
|
-
const segments = imageRepository.toLowerCase().split('/');
|
|
50
|
-
return segments.slice(1, -1).some((segment) => firstPartyOwners.has(segment));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const rowOwner = (row) => row.githubWorkflow?.repository?.split('/')[0]?.toLowerCase();
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Refuse a policy that breaks (a) or (b). `firstPartyOwners` is `null` when the data root has no runtime image source
|
|
57
|
-
* index (a customer data root): (b) cannot be judged there and is not applied; (a) always is.
|
|
58
|
-
*
|
|
59
|
-
* @param {{policy: {policies: object[]}, firstPartyOwners: Set<string>|null}} options
|
|
60
|
-
*/
|
|
61
|
-
export function assertTrustPolicyImageOwnership({ policy, firstPartyOwners }) {
|
|
62
|
-
const ownersByRepository = new Map();
|
|
63
|
-
for (const row of policy.policies) {
|
|
64
|
-
const owner = rowOwner(row);
|
|
65
|
-
if (owner === undefined || !Array.isArray(row.imageRepositories)) {
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
for (const imageRepository of row.imageRepositories) {
|
|
69
|
-
const seen = ownersByRepository.get(imageRepository);
|
|
70
|
-
if (seen !== undefined && seen.owner !== owner) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
`evidence trust policy: image repository ${imageRepository} is listed by rows of two publishers ` +
|
|
73
|
-
`(${seen.policyId} owned by ${seen.owner}, ${row.policyId} owned by ${owner}); one image repository has one publisher`,
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
ownersByRepository.set(imageRepository, { owner, policyId: row.policyId });
|
|
77
|
-
if (firstPartyOwners !== null && !firstPartyOwners.has(owner) && isFirstPartyImageNamespace(imageRepository, firstPartyOwners)) {
|
|
78
|
-
throw new Error(
|
|
79
|
-
`evidence trust policy: row ${row.policyId} (owner ${owner}, not a first-party owner) names image repository ` +
|
|
80
|
-
`${imageRepository} in a first-party namespace (<registry>/<first-party owner>/<any>)`,
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process';
|
|
2
|
-
import { createHash } from 'node:crypto';
|
|
3
|
-
import {
|
|
4
|
-
closeSync,
|
|
5
|
-
constants as fsConstants,
|
|
6
|
-
fsyncSync,
|
|
7
|
-
lstatSync,
|
|
8
|
-
mkdtempSync,
|
|
9
|
-
openSync,
|
|
10
|
-
readFileSync,
|
|
11
|
-
rmSync,
|
|
12
|
-
writeFileSync,
|
|
13
|
-
} from 'node:fs';
|
|
14
|
-
import { tmpdir } from 'node:os';
|
|
15
|
-
import { basename, dirname, isAbsolute, join } from 'node:path';
|
|
16
|
-
|
|
17
|
-
const PREPARED_EXECUTABLES = new WeakMap();
|
|
18
|
-
|
|
19
|
-
function sha256Digest(bytes) {
|
|
20
|
-
return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function validatePreparedExecutable(record, label) {
|
|
24
|
-
const stats = lstatSync(record.path);
|
|
25
|
-
if (!stats.isFile() || stats.isSymbolicLink()) {
|
|
26
|
-
throw new Error(
|
|
27
|
-
`prepared trusted ${label} must be a no-follow regular file`,
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
if (record.kind === 'root-owned') {
|
|
31
|
-
for (const field of ['dev', 'ino', 'uid', 'mode', 'size']) {
|
|
32
|
-
if (stats[field] !== record.snapshot[field]) {
|
|
33
|
-
throw new Error(`prepared trusted ${label} file identity changed`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
let current = record.path;
|
|
37
|
-
while (true) {
|
|
38
|
-
const currentStats = lstatSync(current);
|
|
39
|
-
if (currentStats.uid !== 0 || (currentStats.mode & 0o022) !== 0) {
|
|
40
|
-
throw new Error(
|
|
41
|
-
`${label} and every ancestor must be root-owned and not group/world writable`,
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
if (current === '/') {break;}
|
|
45
|
-
current = dirname(current);
|
|
46
|
-
}
|
|
47
|
-
if ((stats.mode & 0o777) !== 0o755) {
|
|
48
|
-
throw new Error(`prepared trusted ${label} must have exact mode 0755`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (sha256Digest(readFileSync(record.path)) !== record.digest) {
|
|
52
|
-
throw new Error(`prepared trusted ${label} bytes changed`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function prepareDigestPinnedExecutable({
|
|
57
|
-
executablePath,
|
|
58
|
-
trustedDigests,
|
|
59
|
-
label,
|
|
60
|
-
verifyVersion,
|
|
61
|
-
}) {
|
|
62
|
-
if (!isAbsolute(executablePath)) {
|
|
63
|
-
throw new Error(`${label} executable path must be absolute`);
|
|
64
|
-
}
|
|
65
|
-
const sourceStats = lstatSync(executablePath);
|
|
66
|
-
if (!sourceStats.isFile() || sourceStats.isSymbolicLink()) {
|
|
67
|
-
throw new Error(`${label} executable must be a no-follow regular file`);
|
|
68
|
-
}
|
|
69
|
-
const bytes = readFileSync(executablePath);
|
|
70
|
-
const digest = sha256Digest(bytes);
|
|
71
|
-
if (!trustedDigests.includes(digest)) {
|
|
72
|
-
throw new Error(
|
|
73
|
-
`${label} executable digest ${digest} is not trusted by policy`,
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
const directory = mkdtempSync(join(tmpdir(), `xema-trusted-${label}-`));
|
|
77
|
-
const privatePath = join(directory, basename(executablePath));
|
|
78
|
-
try {
|
|
79
|
-
let descriptor;
|
|
80
|
-
try {
|
|
81
|
-
descriptor = openSync(
|
|
82
|
-
privatePath,
|
|
83
|
-
fsConstants.O_CREAT |
|
|
84
|
-
fsConstants.O_EXCL |
|
|
85
|
-
fsConstants.O_WRONLY |
|
|
86
|
-
fsConstants.O_NOFOLLOW,
|
|
87
|
-
0o500,
|
|
88
|
-
);
|
|
89
|
-
writeFileSync(descriptor, bytes);
|
|
90
|
-
fsyncSync(descriptor);
|
|
91
|
-
} finally {
|
|
92
|
-
if (descriptor !== undefined) {closeSync(descriptor);}
|
|
93
|
-
}
|
|
94
|
-
verifyVersion(privatePath);
|
|
95
|
-
} catch (error) {
|
|
96
|
-
rmSync(directory, { recursive: true, force: true });
|
|
97
|
-
throw error;
|
|
98
|
-
}
|
|
99
|
-
const handle = {
|
|
100
|
-
path: privatePath,
|
|
101
|
-
dispose() {
|
|
102
|
-
rmSync(directory, { recursive: true, force: true });
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
PREPARED_EXECUTABLES.set(handle, {
|
|
106
|
-
kind: 'private-copy',
|
|
107
|
-
path: privatePath,
|
|
108
|
-
digest,
|
|
109
|
-
});
|
|
110
|
-
return handle;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export function prepareRootOwnedPinnedExecutable({
|
|
114
|
-
executablePath,
|
|
115
|
-
trustedDigests,
|
|
116
|
-
label,
|
|
117
|
-
verifyVersion,
|
|
118
|
-
}) {
|
|
119
|
-
if (!isAbsolute(executablePath)) {
|
|
120
|
-
throw new Error(`${label} executable path must be absolute`);
|
|
121
|
-
}
|
|
122
|
-
const initialStats = lstatSync(executablePath);
|
|
123
|
-
if (!initialStats.isFile() || initialStats.isSymbolicLink()) {
|
|
124
|
-
throw new Error(`${label} executable must be a no-follow regular file`);
|
|
125
|
-
}
|
|
126
|
-
const handle = { path: executablePath, dispose() {} };
|
|
127
|
-
const record = {
|
|
128
|
-
kind: 'root-owned',
|
|
129
|
-
path: executablePath,
|
|
130
|
-
digest: sha256Digest(readFileSync(executablePath)),
|
|
131
|
-
snapshot: {
|
|
132
|
-
dev: initialStats.dev,
|
|
133
|
-
ino: initialStats.ino,
|
|
134
|
-
uid: initialStats.uid,
|
|
135
|
-
mode: initialStats.mode,
|
|
136
|
-
size: initialStats.size,
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
PREPARED_EXECUTABLES.set(handle, record);
|
|
140
|
-
validatePreparedExecutable(record, label);
|
|
141
|
-
if (!trustedDigests.includes(record.digest)) {
|
|
142
|
-
throw new Error(
|
|
143
|
-
`${label} executable digest ${record.digest} is not trusted by policy`,
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
verifyVersion(executablePath);
|
|
147
|
-
validatePreparedExecutable(record, label);
|
|
148
|
-
return handle;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function assertPreparedExecutable(handle, label) {
|
|
152
|
-
const record = PREPARED_EXECUTABLES.get(handle);
|
|
153
|
-
if (!record) {
|
|
154
|
-
throw new Error(`a prepared trusted ${label} executable is required`);
|
|
155
|
-
}
|
|
156
|
-
validatePreparedExecutable(record, label);
|
|
157
|
-
return record.path;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function exactExecutableOutput(path, args, options = {}) {
|
|
161
|
-
return execFileSync(path, args, {
|
|
162
|
-
encoding: 'utf8',
|
|
163
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
164
|
-
...options,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// What the running evidence verifier is held to before it trusts anything:
|
|
2
|
-
// a clean launch environment, an install nobody else can write, and the
|
|
3
|
-
// data-root pin of its own bytes. (The kernel the workspace states is held to
|
|
4
|
-
// the bundled edition protocol by `edition-protocol.mjs`.)
|
|
5
|
-
|
|
6
|
-
import { readFileSync, realpathSync } from 'node:fs';
|
|
7
|
-
import { dirname, join } from 'node:path';
|
|
8
|
-
|
|
9
|
-
import { assertProtectedPathAncestry } from './evidence-checkout.mjs';
|
|
10
|
-
import { VERIFIER_PROVENANCE_FILE } from './verifier-files.mjs';
|
|
11
|
-
import { parseVerifierProvenance } from './verifier-provenance.mjs';
|
|
12
|
-
|
|
13
|
-
/** The launch environment carries no variable that changes what code runs. */
|
|
14
|
-
export function assertSanitizedOperatorEnvironment(env) {
|
|
15
|
-
for (const key of Object.keys(env)) {
|
|
16
|
-
if (
|
|
17
|
-
key === 'NODE_OPTIONS' ||
|
|
18
|
-
key === 'NODE_PATH' ||
|
|
19
|
-
key.startsWith('DYLD_') ||
|
|
20
|
-
key.startsWith('LD_') ||
|
|
21
|
-
key.startsWith('GIT_')
|
|
22
|
-
) {
|
|
23
|
-
throw new Error(
|
|
24
|
-
`trusted verifier launch refuses inherited control variable ${key}`,
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The verifier file that is running (the realpath of `bundlePath`) and its
|
|
32
|
-
* provenance beside it, after refusing an install anyone else can write or
|
|
33
|
-
* that a foreign user owns, and a provenance that does not describe this
|
|
34
|
-
* bundle. Returns the bytes the pin is compared with.
|
|
35
|
-
*/
|
|
36
|
-
export function readRunningVerifier(bundlePath) {
|
|
37
|
-
const realBundle = realpathSync(bundlePath);
|
|
38
|
-
assertProtectedPathAncestry(realBundle, 'the evidence verifier install');
|
|
39
|
-
const bundleBytes = readFileSync(realBundle);
|
|
40
|
-
const provenanceBytes = readFileSync(
|
|
41
|
-
join(dirname(realBundle), VERIFIER_PROVENANCE_FILE),
|
|
42
|
-
);
|
|
43
|
-
parseVerifierProvenance({ provenanceBytes, bundleBytes });
|
|
44
|
-
return { bundleBytes, provenanceBytes };
|
|
45
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// The names and place of the built evidence verifier. Pure constants, shared by
|
|
2
|
-
// the build, the gate and the verifier itself (which is bundled and so must not
|
|
3
|
-
// derive anything from where it sits).
|
|
4
|
-
|
|
5
|
-
export const VERIFIER_BUNDLE_FILE = 'verify-image-evidence.bundle.mjs';
|
|
6
|
-
export const VERIFIER_PROVENANCE_FILE =
|
|
7
|
-
'verify-image-evidence.bundle.provenance.json';
|
|
8
|
-
export const VERIFIER_DIST_SUBPATH = Object.freeze(['dist', 'edition']);
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { assertKernelEditionProtocol } from './edition-protocol.mjs';
|
|
2
|
-
import { kernelPackageDir } from './edition-workspace.mjs';
|
|
3
|
-
import { loadKernelDistributionSchemas } from './lib.mjs';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The ONE place the evidence verifier obtains the kernel distribution schemas,
|
|
7
|
-
* and the edition protocol they implement.
|
|
8
|
-
*
|
|
9
|
-
* From source it loads the built kernel the workspace states with `--kernel`,
|
|
10
|
-
* whose protocol is then trivially the stated one. The verifier build
|
|
11
|
-
* (`scripts/build-evidence-verifier.mjs`) replaces this module with the
|
|
12
|
-
* `@xemahq/contracts` distribution schemas and edition protocol identity
|
|
13
|
-
* bundled from the CLI's own dependency, so the bundle never executes a schema
|
|
14
|
-
* from outside itself; the entry then holds `--kernel`'s declared protocol
|
|
15
|
-
* equal to the bundled one.
|
|
16
|
-
*/
|
|
17
|
-
export async function loadVerifierKernelSchemas() {
|
|
18
|
-
return {
|
|
19
|
-
schemas: await loadKernelDistributionSchemas(),
|
|
20
|
-
editionProtocol: assertKernelEditionProtocol(kernelPackageDir()),
|
|
21
|
-
};
|
|
22
|
-
}
|