@empire-builder-kit/nx 1.0.0-beta.9 → 1.0.0-rc.2
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/NOTICE +6 -0
- package/README.md +113 -3
- package/executors.json +30 -0
- package/package.json +84 -6
- package/src/api-contract/baseline-update.d.ts +82 -0
- package/src/api-contract/baseline-update.js +225 -0
- package/src/api-contract/baseline-update.js.map +1 -0
- package/src/api-contract/compatibility.d.ts +30 -0
- package/src/api-contract/compatibility.js +643 -0
- package/src/api-contract/compatibility.js.map +1 -0
- package/src/api-contract/contract-graph.d.ts +35 -0
- package/src/api-contract/contract-graph.js +141 -0
- package/src/api-contract/contract-graph.js.map +1 -0
- package/src/api-contract/evidence.d.ts +23 -0
- package/src/api-contract/evidence.js +87 -0
- package/src/api-contract/evidence.js.map +1 -0
- package/src/api-contract/index.d.ts +6 -0
- package/src/api-contract/index.js +10 -0
- package/src/api-contract/index.js.map +1 -0
- package/src/api-contract/model.d.ts +144 -0
- package/src/api-contract/model.fixtures.d.ts +2 -0
- package/src/api-contract/model.fixtures.js +81 -0
- package/src/api-contract/model.fixtures.js.map +1 -0
- package/src/api-contract/model.js +993 -0
- package/src/api-contract/model.js.map +1 -0
- package/src/api-contract/rollout.d.ts +32 -0
- package/src/api-contract/rollout.js +88 -0
- package/src/api-contract/rollout.js.map +1 -0
- package/src/authorization/compatibility.d.ts +62 -0
- package/src/authorization/compatibility.js +175 -0
- package/src/authorization/compatibility.js.map +1 -0
- package/src/authorization/index.d.ts +1 -0
- package/src/authorization/index.js +5 -0
- package/src/authorization/index.js.map +1 -0
- package/src/blueprints/execution.d.ts +25 -1
- package/src/blueprints/execution.js +246 -83
- package/src/blueprints/execution.js.map +1 -1
- package/src/blueprints/external-sandbox.d.ts +53 -0
- package/src/blueprints/external-sandbox.js +1182 -0
- package/src/blueprints/external-sandbox.js.map +1 -0
- package/src/blueprints/manifest.d.ts +42 -2
- package/src/blueprints/manifest.js +82 -27
- package/src/blueprints/manifest.js.map +1 -1
- package/src/blueprints/resolver.d.ts +14 -5
- package/src/blueprints/resolver.js +228 -68
- package/src/blueprints/resolver.js.map +1 -1
- package/src/cli/agent-command.d.ts +30 -0
- package/src/cli/agent-command.js +204 -0
- package/src/cli/agent-command.js.map +1 -0
- package/src/cli/agent-runtime.d.ts +25 -0
- package/src/cli/agent-runtime.js +488 -0
- package/src/cli/agent-runtime.js.map +1 -0
- package/src/cli/blueprint-authority.d.ts +9 -0
- package/src/cli/blueprint-authority.js +43 -0
- package/src/cli/blueprint-authority.js.map +1 -0
- package/src/cli/blueprint-command.d.ts +24 -0
- package/src/cli/blueprint-command.js +63 -0
- package/src/cli/blueprint-command.js.map +1 -0
- package/src/cli/bootstrap.d.ts +31 -0
- package/src/cli/bootstrap.js +165 -0
- package/src/cli/bootstrap.js.map +1 -0
- package/src/cli/dev-command.d.ts +92 -0
- package/src/cli/dev-command.js +561 -0
- package/src/cli/dev-command.js.map +1 -0
- package/src/cli/main.d.ts +131 -0
- package/src/cli/main.js +1199 -0
- package/src/cli/main.js.map +1 -0
- package/src/cli/output.d.ts +19 -0
- package/src/cli/output.js +51 -0
- package/src/cli/output.js.map +1 -0
- package/src/cli/personal-secret-runtime.d.ts +81 -0
- package/src/cli/personal-secret-runtime.js +567 -0
- package/src/cli/personal-secret-runtime.js.map +1 -0
- package/src/cli/secret-terminal.d.ts +12 -0
- package/src/cli/secret-terminal.js +128 -0
- package/src/cli/secret-terminal.js.map +1 -0
- package/src/container-images.d.ts +1 -0
- package/src/container-images.js +5 -0
- package/src/container-images.js.map +1 -0
- package/src/data-lifecycle/index.d.ts +3 -0
- package/src/data-lifecycle/index.js +7 -0
- package/src/data-lifecycle/index.js.map +1 -0
- package/src/data-lifecycle/model.d.ts +172 -0
- package/src/data-lifecycle/model.fixtures.d.ts +2 -0
- package/src/data-lifecycle/model.fixtures.js +244 -0
- package/src/data-lifecycle/model.fixtures.js.map +1 -0
- package/src/data-lifecycle/model.js +95 -0
- package/src/data-lifecycle/model.js.map +1 -0
- package/src/data-lifecycle/sensitive-artifacts.d.ts +28 -0
- package/src/data-lifecycle/sensitive-artifacts.js +146 -0
- package/src/data-lifecycle/sensitive-artifacts.js.map +1 -0
- package/src/data-lifecycle/validation.d.ts +32 -0
- package/src/data-lifecycle/validation.js +837 -0
- package/src/data-lifecycle/validation.js.map +1 -0
- package/src/database-retirement/contract.d.ts +68 -0
- package/src/database-retirement/contract.js +166 -0
- package/src/database-retirement/contract.js.map +1 -0
- package/src/database-retirement/index.d.ts +1 -0
- package/src/database-retirement/index.js +5 -0
- package/src/database-retirement/index.js.map +1 -0
- package/src/deterministic-order.d.ts +2 -0
- package/src/deterministic-order.js +7 -0
- package/src/deterministic-order.js.map +1 -0
- package/src/developer-agent/context.d.ts +27 -0
- package/src/developer-agent/context.js +497 -0
- package/src/developer-agent/context.js.map +1 -0
- package/src/developer-agent/generator-planning.d.ts +34 -0
- package/src/developer-agent/generator-planning.js +645 -0
- package/src/developer-agent/generator-planning.js.map +1 -0
- package/src/developer-agent/generator-preview.d.ts +8 -0
- package/src/developer-agent/generator-preview.js +650 -0
- package/src/developer-agent/generator-preview.js.map +1 -0
- package/src/developer-agent/git-inspection.d.ts +108 -0
- package/src/developer-agent/git-inspection.js +815 -0
- package/src/developer-agent/git-inspection.js.map +1 -0
- package/src/developer-agent/handoff.d.ts +43 -0
- package/src/developer-agent/handoff.js +698 -0
- package/src/developer-agent/handoff.js.map +1 -0
- package/src/developer-agent/index.d.ts +10 -0
- package/src/developer-agent/index.js +14 -0
- package/src/developer-agent/index.js.map +1 -0
- package/src/developer-agent/model.d.ts +481 -0
- package/src/developer-agent/model.js +143 -0
- package/src/developer-agent/model.js.map +1 -0
- package/src/developer-agent/operation-registry.d.ts +45 -0
- package/src/developer-agent/operation-registry.js +1255 -0
- package/src/developer-agent/operation-registry.js.map +1 -0
- package/src/developer-agent/ordering.d.ts +9 -0
- package/src/developer-agent/ordering.js +15 -0
- package/src/developer-agent/ordering.js.map +1 -0
- package/src/developer-agent/planning.d.ts +18 -0
- package/src/developer-agent/planning.js +447 -0
- package/src/developer-agent/planning.js.map +1 -0
- package/src/developer-agent/preview-changes.d.ts +26 -0
- package/src/developer-agent/preview-changes.js +203 -0
- package/src/developer-agent/preview-changes.js.map +1 -0
- package/src/developer-agent/preview-source.d.ts +2 -0
- package/src/developer-agent/preview-source.js +16 -0
- package/src/developer-agent/preview-source.js.map +1 -0
- package/src/developer-agent/validation.d.ts +18 -0
- package/src/developer-agent/validation.js +2617 -0
- package/src/developer-agent/validation.js.map +1 -0
- package/src/developer-agent/workspace-inspection.d.ts +20 -0
- package/src/developer-agent/workspace-inspection.js +1134 -0
- package/src/developer-agent/workspace-inspection.js.map +1 -0
- package/src/developer-agent/workspace-path.d.ts +6 -0
- package/src/developer-agent/workspace-path.js +22 -0
- package/src/developer-agent/workspace-path.js.map +1 -0
- package/src/executors/blueprint-trust/blueprint-trust.d.ts +29 -0
- package/src/executors/blueprint-trust/blueprint-trust.js +115 -0
- package/src/executors/blueprint-trust/blueprint-trust.js.map +1 -0
- package/src/executors/blueprint-trust/schema.json +27 -0
- package/src/executors/blueprint-verification/blueprint-verification.d.ts +13 -0
- package/src/executors/blueprint-verification/blueprint-verification.js +110 -0
- package/src/executors/blueprint-verification/blueprint-verification.js.map +1 -0
- package/src/executors/blueprint-verification/schema.json +44 -0
- package/src/executors/deployment-plan/deployment-plan.js +1 -0
- package/src/executors/deployment-plan/deployment-plan.js.map +1 -1
- package/src/executors/dev-doctor/dev-doctor.d.ts +19 -5
- package/src/executors/dev-doctor/dev-doctor.js +186 -32
- package/src/executors/dev-doctor/dev-doctor.js.map +1 -1
- package/src/executors/dev-doctor/schema.json +1 -6
- package/src/executors/dev-setup/dev-setup.d.ts +7 -1
- package/src/executors/dev-setup/dev-setup.js +14 -3
- package/src/executors/dev-setup/dev-setup.js.map +1 -1
- package/src/executors/developer-context/developer-context.d.ts +38 -0
- package/src/executors/developer-context/developer-context.js +78 -0
- package/src/executors/developer-context/developer-context.js.map +1 -0
- package/src/executors/developer-context/schema.json +87 -0
- package/src/executors/fleet/fleet.d.ts +12 -43
- package/src/executors/fleet/fleet.js +120 -500
- package/src/executors/fleet/fleet.js.map +1 -1
- package/src/executors/fleet/schema.json +64 -14
- package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js.map +1 -1
- package/src/executors/github-bootstrap/schema.json +5 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +144 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.js +3320 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +1 -0
- package/src/executors/infrastructure-plan/schema.json +78 -0
- package/src/executors/secret-guardrails/schema.json +6 -0
- package/src/executors/secret-guardrails/secret-guardrails.d.ts +3 -0
- package/src/executors/secret-guardrails/secret-guardrails.js +44 -0
- package/src/executors/secret-guardrails/secret-guardrails.js.map +1 -0
- package/src/executors/secret-metadata/schema.json +31 -0
- package/src/executors/secret-metadata/secret-metadata.d.ts +32 -0
- package/src/executors/secret-metadata/secret-metadata.js +131 -0
- package/src/executors/secret-metadata/secret-metadata.js.map +1 -0
- package/src/executors/sst-lifecycle/logging-preflight.d.ts +17 -0
- package/src/executors/sst-lifecycle/logging-preflight.js +196 -0
- package/src/executors/sst-lifecycle/logging-preflight.js.map +1 -0
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +23 -3
- package/src/executors/sst-lifecycle/run-sst-command.js +113 -10
- package/src/executors/sst-lifecycle/run-sst-command.js.map +1 -1
- package/src/executors/sst-lifecycle/schema.json +9 -5
- package/src/executors/sst-lifecycle/secret-preflight.d.ts +25 -0
- package/src/executors/sst-lifecycle/secret-preflight.js +119 -0
- package/src/executors/sst-lifecycle/secret-preflight.js.map +1 -0
- package/src/foundation/discovery.d.ts +17 -1
- package/src/foundation/discovery.js +16 -1
- package/src/foundation/discovery.js.map +1 -1
- package/src/foundation/index.d.ts +3 -0
- package/src/foundation/index.js +3 -0
- package/src/foundation/index.js.map +1 -1
- package/src/foundation/local-database-contract.d.ts +1 -0
- package/src/foundation/local-database-contract.js +3 -0
- package/src/foundation/local-database-contract.js.map +1 -1
- package/src/foundation/logging-preflight.d.ts +30 -0
- package/src/foundation/logging-preflight.js +138 -0
- package/src/foundation/logging-preflight.js.map +1 -0
- package/src/foundation/logging.d.ts +70 -0
- package/src/foundation/logging.js +133 -0
- package/src/foundation/logging.js.map +1 -0
- package/src/foundation/preflight.d.ts +9 -0
- package/src/foundation/preflight.js +58 -2
- package/src/foundation/preflight.js.map +1 -1
- package/src/foundation/provision-database-bindings.d.ts +9 -1
- package/src/foundation/provision-database-bindings.js +25 -5
- package/src/foundation/provision-database-bindings.js.map +1 -1
- package/src/foundation/provision-logical-database.d.ts +10 -2
- package/src/foundation/provision-logical-database.js +68 -113
- package/src/foundation/provision-logical-database.js.map +1 -1
- package/src/foundation/router-origin-proof.d.ts +2 -0
- package/src/foundation/router-origin-proof.js +25 -0
- package/src/foundation/router-origin-proof.js.map +1 -0
- package/src/foundation/stages.d.ts +1 -0
- package/src/foundation/stages.js +9 -1
- package/src/foundation/stages.js.map +1 -1
- package/src/frontend-security/index.d.ts +1 -0
- package/src/frontend-security/index.js +5 -0
- package/src/frontend-security/index.js.map +1 -0
- package/src/frontend-security/security-headers.d.ts +50 -0
- package/src/frontend-security/security-headers.js +418 -0
- package/src/frontend-security/security-headers.js.map +1 -0
- package/src/generators/feature-registry.d.ts +13 -0
- package/src/generators/feature-registry.js +73 -0
- package/src/generators/feature-registry.js.map +1 -0
- package/src/generators/function/function.d.ts +1 -1
- package/src/generators/function/function.js +51 -6
- package/src/generators/function/function.js.map +1 -1
- package/src/generators/function/schema.d.ts +1 -0
- package/src/generators/function/schema.json +6 -1
- package/src/generators/logging-registry.d.ts +13 -0
- package/src/generators/logging-registry.js +62 -0
- package/src/generators/logging-registry.js.map +1 -0
- package/src/generators/post-generation-install.d.ts +67 -0
- package/src/generators/post-generation-install.js +3308 -0
- package/src/generators/post-generation-install.js.map +1 -0
- package/src/generators/preset/generator.js +3 -0
- package/src/generators/preset/generator.js.map +1 -1
- package/src/generators/preset/tool-versions.d.ts +18 -0
- package/src/generators/preset/tool-versions.js +22 -0
- package/src/generators/preset/tool-versions.js.map +1 -0
- package/src/generators/preset/workspace-files-developer-agent.d.ts +14 -0
- package/src/generators/preset/workspace-files-developer-agent.js +511 -0
- package/src/generators/preset/workspace-files-developer-agent.js.map +1 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.d.ts +6 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js +406 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +1 -0
- package/src/generators/preset/workspace-files-performance-cost.d.ts +66 -0
- package/src/generators/preset/workspace-files-performance-cost.js +866 -0
- package/src/generators/preset/workspace-files-performance-cost.js.map +1 -0
- package/src/generators/preset/workspace-files-performance-load.d.ts +73 -0
- package/src/generators/preset/workspace-files-performance-load.js +801 -0
- package/src/generators/preset/workspace-files-performance-load.js.map +1 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.d.ts +9 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js +1102 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js.map +1 -0
- package/src/generators/preset/workspace-files.d.ts +14 -1
- package/src/generators/preset/workspace-files.js +8189 -245
- package/src/generators/preset/workspace-files.js.map +1 -1
- package/src/generators/repository-policy/repository-policy.js +3 -47
- package/src/generators/repository-policy/repository-policy.js.map +1 -1
- package/src/generators/slice/built-in-plan-api-contract-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js +2656 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-api-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-api-files.js +1186 -0
- package/src/generators/slice/built-in-plan-api-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-async-work-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-async-work-files.js +7903 -0
- package/src/generators/slice/built-in-plan-async-work-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-authorization-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-authorization-files.js +2314 -0
- package/src/generators/slice/built-in-plan-authorization-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +559 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js +1101 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +249 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-files.js +1530 -0
- package/src/generators/slice/built-in-plan-data-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js +750 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +828 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +2604 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +144 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-rights-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-rights-files.js +4628 -0
- package/src/generators/slice/built-in-plan-data-rights-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +1901 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +485 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-foundation-files.js +184 -0
- package/src/generators/slice/built-in-plan-foundation-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-frontend-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-frontend-files.js +2233 -0
- package/src/generators/slice/built-in-plan-frontend-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.js +3038 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +312 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-metadata-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-metadata-files.js +219 -0
- package/src/generators/slice/built-in-plan-metadata-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-operations-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-operations-files.js +630 -0
- package/src/generators/slice/built-in-plan-operations-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-performance-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-performance-files.js +3293 -0
- package/src/generators/slice/built-in-plan-performance-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-project-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-project-files.js +979 -0
- package/src/generators/slice/built-in-plan-project-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-release-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-release-files.js +6387 -0
- package/src/generators/slice/built-in-plan-release-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-reliability-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-reliability-files.js +4499 -0
- package/src/generators/slice/built-in-plan-reliability-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.js +1004 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-shared.d.ts +53 -0
- package/src/generators/slice/built-in-plan-shared.js +113 -0
- package/src/generators/slice/built-in-plan-shared.js.map +1 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-files.js +2356 -0
- package/src/generators/slice/built-in-plan-testing-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-verification-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-verification-files.js +358 -0
- package/src/generators/slice/built-in-plan-verification-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-web-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-web-files.js +430 -0
- package/src/generators/slice/built-in-plan-web-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-workload-role-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-workload-role-files.js +2356 -0
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +1 -0
- package/src/generators/slice/built-in-plan.d.ts +8 -0
- package/src/generators/slice/built-in-plan.js +264 -0
- package/src/generators/slice/built-in-plan.js.map +1 -0
- package/src/generators/slice/schema.json +1 -1
- package/src/generators/slice/slice.d.ts +1 -22
- package/src/generators/slice/slice.js +185 -1510
- package/src/generators/slice/slice.js.map +1 -1
- package/src/generators/upgrade/schema.d.ts +2 -0
- package/src/generators/upgrade/schema.json +11 -1
- package/src/generators/upgrade/upgrade.d.ts +51 -1
- package/src/generators/upgrade/upgrade.js +820 -82
- package/src/generators/upgrade/upgrade.js.map +1 -1
- package/src/generators/workload/frozen-container.d.ts +8 -0
- package/src/generators/workload/frozen-container.js +36 -0
- package/src/generators/workload/frozen-container.js.map +1 -0
- package/src/generators/workload/performance-registration.d.ts +32 -0
- package/src/generators/workload/performance-registration.js +226 -0
- package/src/generators/workload/performance-registration.js.map +1 -0
- package/src/generators/workload/reliability-registration.d.ts +16 -0
- package/src/generators/workload/reliability-registration.js +150 -0
- package/src/generators/workload/reliability-registration.js.map +1 -0
- package/src/generators/workload/schema.d.ts +1 -0
- package/src/generators/workload/schema.json +6 -1
- package/src/generators/workload/service-performance-files.d.ts +4 -0
- package/src/generators/workload/service-performance-files.js +1846 -0
- package/src/generators/workload/service-performance-files.js.map +1 -0
- package/src/generators/workload/workload.d.ts +3 -2
- package/src/generators/workload/workload.js +1083 -18
- package/src/generators/workload/workload.js.map +1 -1
- package/src/git-policy/action-pins.d.ts +10 -0
- package/src/git-policy/action-pins.js +10 -0
- package/src/git-policy/action-pins.js.map +1 -1
- package/src/git-policy/github-bootstrap.d.ts +14 -1
- package/src/git-policy/github-bootstrap.js +274 -46
- package/src/git-policy/github-bootstrap.js.map +1 -1
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/infrastructure-change/convergence.d.ts +13 -0
- package/src/infrastructure-change/convergence.js +85 -0
- package/src/infrastructure-change/convergence.js.map +1 -0
- package/src/infrastructure-change/drift.d.ts +13 -0
- package/src/infrastructure-change/drift.js +112 -0
- package/src/infrastructure-change/drift.js.map +1 -0
- package/src/infrastructure-change/index.d.ts +7 -0
- package/src/infrastructure-change/index.js +11 -0
- package/src/infrastructure-change/index.js.map +1 -0
- package/src/infrastructure-change/model.d.ts +253 -0
- package/src/infrastructure-change/model.js +28 -0
- package/src/infrastructure-change/model.js.map +1 -0
- package/src/infrastructure-change/normalize.d.ts +12 -0
- package/src/infrastructure-change/normalize.js +245 -0
- package/src/infrastructure-change/normalize.js.map +1 -0
- package/src/infrastructure-change/plan.d.ts +40 -0
- package/src/infrastructure-change/plan.js +361 -0
- package/src/infrastructure-change/plan.js.map +1 -0
- package/src/infrastructure-change/risk.d.ts +7 -0
- package/src/infrastructure-change/risk.js +269 -0
- package/src/infrastructure-change/risk.js.map +1 -0
- package/src/infrastructure-change/summary.d.ts +20 -0
- package/src/infrastructure-change/summary.js +130 -0
- package/src/infrastructure-change/summary.js.map +1 -0
- package/src/local-dev/context-discovery.d.ts +2 -0
- package/src/local-dev/context-discovery.js +59 -0
- package/src/local-dev/context-discovery.js.map +1 -0
- package/src/local-dev/contract-validation.d.ts +15 -0
- package/src/local-dev/contract-validation.js +84 -0
- package/src/local-dev/contract-validation.js.map +1 -0
- package/src/local-dev/contracts.d.ts +10 -1
- package/src/local-dev/contracts.js +57 -5
- package/src/local-dev/contracts.js.map +1 -1
- package/src/local-dev/control-contract.d.ts +67 -0
- package/src/local-dev/control-contract.js +180 -0
- package/src/local-dev/control-contract.js.map +1 -0
- package/src/local-dev/dev-command-core.d.ts +60 -0
- package/src/local-dev/dev-command-core.js +89 -0
- package/src/local-dev/dev-command-core.js.map +1 -0
- package/src/local-dev/effects.d.ts +16 -0
- package/src/local-dev/effects.js +63 -0
- package/src/local-dev/effects.js.map +1 -0
- package/src/local-dev/environment-inspector.d.ts +125 -0
- package/src/local-dev/environment-inspector.js +687 -0
- package/src/local-dev/environment-inspector.js.map +1 -0
- package/src/local-dev/environment-state.d.ts +113 -0
- package/src/local-dev/environment-state.js +463 -0
- package/src/local-dev/environment-state.js.map +1 -0
- package/src/local-dev/errors.d.ts +6 -0
- package/src/local-dev/errors.js +41 -0
- package/src/local-dev/errors.js.map +1 -0
- package/src/local-dev/fleet-client.d.ts +33 -0
- package/src/local-dev/fleet-client.js +156 -0
- package/src/local-dev/fleet-client.js.map +1 -0
- package/src/local-dev/fleet-configuration.d.ts +13 -0
- package/src/local-dev/fleet-configuration.js +71 -0
- package/src/local-dev/fleet-configuration.js.map +1 -0
- package/src/local-dev/fleet-inventory.d.ts +56 -0
- package/src/local-dev/fleet-inventory.js +469 -0
- package/src/local-dev/fleet-inventory.js.map +1 -0
- package/src/local-dev/fleet-ipc.d.ts +28 -0
- package/src/local-dev/fleet-ipc.js +267 -0
- package/src/local-dev/fleet-ipc.js.map +1 -0
- package/src/local-dev/fleet-launcher.d.ts +53 -0
- package/src/local-dev/fleet-launcher.js +379 -0
- package/src/local-dev/fleet-launcher.js.map +1 -0
- package/src/local-dev/fleet-lock.d.ts +41 -0
- package/src/local-dev/fleet-lock.js +135 -0
- package/src/local-dev/fleet-lock.js.map +1 -0
- package/src/local-dev/fleet-logs.d.ts +66 -0
- package/src/local-dev/fleet-logs.js +542 -0
- package/src/local-dev/fleet-logs.js.map +1 -0
- package/src/local-dev/fleet-process.d.ts +50 -0
- package/src/local-dev/fleet-process.js +289 -0
- package/src/local-dev/fleet-process.js.map +1 -0
- package/src/local-dev/fleet-runtime.d.ts +22 -0
- package/src/local-dev/fleet-runtime.js +368 -0
- package/src/local-dev/fleet-runtime.js.map +1 -0
- package/src/local-dev/fleet-session.d.ts +70 -0
- package/src/local-dev/fleet-session.js +301 -0
- package/src/local-dev/fleet-session.js.map +1 -0
- package/src/local-dev/fleet-slice-runner-daemon.d.ts +1 -0
- package/src/local-dev/fleet-slice-runner-daemon.js +21 -0
- package/src/local-dev/fleet-slice-runner-daemon.js.map +1 -0
- package/src/local-dev/fleet-startup.d.ts +22 -0
- package/src/local-dev/fleet-startup.js +114 -0
- package/src/local-dev/fleet-startup.js.map +1 -0
- package/src/local-dev/fleet-state.d.ts +62 -0
- package/src/local-dev/fleet-state.js +297 -0
- package/src/local-dev/fleet-state.js.map +1 -0
- package/src/local-dev/fleet-supervisor-daemon.d.ts +1 -0
- package/src/local-dev/fleet-supervisor-daemon.js +41 -0
- package/src/local-dev/fleet-supervisor-daemon.js.map +1 -0
- package/src/local-dev/fleet-supervisor.d.ts +52 -0
- package/src/local-dev/fleet-supervisor.js +384 -0
- package/src/local-dev/fleet-supervisor.js.map +1 -0
- package/src/local-dev/gateway.js +1 -1
- package/src/local-dev/gateway.js.map +1 -1
- package/src/local-dev/identity.js +4 -6
- package/src/local-dev/identity.js.map +1 -1
- package/src/local-dev/index.d.ts +1 -0
- package/src/local-dev/index.js +1 -0
- package/src/local-dev/index.js.map +1 -1
- package/src/local-dev/local-context.d.ts +62 -0
- package/src/local-dev/local-context.js +299 -0
- package/src/local-dev/local-context.js.map +1 -0
- package/src/local-dev/nx-workspace.d.ts +45 -0
- package/src/local-dev/nx-workspace.js +228 -0
- package/src/local-dev/nx-workspace.js.map +1 -0
- package/src/local-dev/personal-secret-ledger.d.ts +75 -0
- package/src/local-dev/personal-secret-ledger.js +391 -0
- package/src/local-dev/personal-secret-ledger.js.map +1 -0
- package/src/local-dev/personal-stage.d.ts +18 -0
- package/src/local-dev/personal-stage.js +129 -0
- package/src/local-dev/personal-stage.js.map +1 -0
- package/src/local-dev/private-state.d.ts +17 -0
- package/src/local-dev/private-state.js +254 -0
- package/src/local-dev/private-state.js.map +1 -0
- package/src/local-dev/process-identity.d.ts +9 -0
- package/src/local-dev/process-identity.js +79 -0
- package/src/local-dev/process-identity.js.map +1 -0
- package/src/local-dev/runtime-paths.d.ts +17 -0
- package/src/local-dev/runtime-paths.js +33 -0
- package/src/local-dev/runtime-paths.js.map +1 -0
- package/src/local-dev/secret-slice-claim.d.ts +17 -0
- package/src/local-dev/secret-slice-claim.js +75 -0
- package/src/local-dev/secret-slice-claim.js.map +1 -0
- package/src/local-dev/slice-claim.d.ts +36 -0
- package/src/local-dev/slice-claim.js +199 -0
- package/src/local-dev/slice-claim.js.map +1 -0
- package/src/local-dev/slice-runner.d.ts +121 -0
- package/src/local-dev/slice-runner.js +715 -0
- package/src/local-dev/slice-runner.js.map +1 -0
- package/src/local-dev/tls.js +51 -17
- package/src/local-dev/tls.js.map +1 -1
- package/src/ownership/composition.d.ts +5 -2
- package/src/ownership/composition.js +26 -3
- package/src/ownership/composition.js.map +1 -1
- package/src/ownership/hash.d.ts +1 -1
- package/src/ownership/hash.js +3 -1
- package/src/ownership/hash.js.map +1 -1
- package/src/ownership/record.d.ts +32 -1
- package/src/ownership/record.js +139 -2
- package/src/ownership/record.js.map +1 -1
- package/src/performance/cost-collection.d.ts +225 -0
- package/src/performance/cost-collection.js +825 -0
- package/src/performance/cost-collection.js.map +1 -0
- package/src/performance/cost-controls.d.ts +131 -0
- package/src/performance/cost-controls.js +336 -0
- package/src/performance/cost-controls.js.map +1 -0
- package/src/performance/evidence.d.ts +140 -0
- package/src/performance/evidence.js +599 -0
- package/src/performance/evidence.js.map +1 -0
- package/src/performance/index.d.ts +10 -0
- package/src/performance/index.js +14 -0
- package/src/performance/index.js.map +1 -0
- package/src/performance/load-safety.d.ts +84 -0
- package/src/performance/load-safety.js +346 -0
- package/src/performance/load-safety.js.map +1 -0
- package/src/performance/model.d.ts +129 -0
- package/src/performance/model.js +452 -0
- package/src/performance/model.js.map +1 -0
- package/src/performance/pr-artifact-budget.d.ts +42 -0
- package/src/performance/pr-artifact-budget.js +151 -0
- package/src/performance/pr-artifact-budget.js.map +1 -0
- package/src/performance/runner.d.ts +75 -0
- package/src/performance/runner.js +227 -0
- package/src/performance/runner.js.map +1 -0
- package/src/performance/scenario-endpoint.d.ts +1 -0
- package/src/performance/scenario-endpoint.js +5 -0
- package/src/performance/scenario-endpoint.js.map +1 -0
- package/src/performance/scenario.d.ts +193 -0
- package/src/performance/scenario.js +736 -0
- package/src/performance/scenario.js.map +1 -0
- package/src/performance/test-fixtures.d.ts +7 -0
- package/src/performance/test-fixtures.js +169 -0
- package/src/performance/test-fixtures.js.map +1 -0
- package/src/performance/unit-cost.d.ts +105 -0
- package/src/performance/unit-cost.js +364 -0
- package/src/performance/unit-cost.js.map +1 -0
- package/src/release/index.d.ts +4 -0
- package/src/release/index.js +8 -0
- package/src/release/index.js.map +1 -0
- package/src/release/lifecycle.d.ts +132 -0
- package/src/release/lifecycle.js +411 -0
- package/src/release/lifecycle.js.map +1 -0
- package/src/release/manifest.d.ts +148 -0
- package/src/release/manifest.js +503 -0
- package/src/release/manifest.js.map +1 -0
- package/src/release/rollout.d.ts +170 -0
- package/src/release/rollout.js +578 -0
- package/src/release/rollout.js.map +1 -0
- package/src/release/source-authority.d.ts +19 -0
- package/src/release/source-authority.js +195 -0
- package/src/release/source-authority.js.map +1 -0
- package/src/repository-policy/deployment-plan.d.ts +2 -1
- package/src/repository-policy/deployment-plan.js +2 -0
- package/src/repository-policy/deployment-plan.js.map +1 -1
- package/src/repository-policy/policy.d.ts +1 -1
- package/src/repository-policy/policy.js +29 -25
- package/src/repository-policy/policy.js.map +1 -1
- package/src/schemas/aggregate-count-evidence-v1.json +135 -0
- package/src/schemas/api-contract-baseline-v1.json +674 -0
- package/src/schemas/api-contract-compatibility-report-v1.json +126 -0
- package/src/schemas/aws-billing-actual-evidence-v1.json +407 -0
- package/src/schemas/blueprint-v1.json +18 -1
- package/src/schemas/data-lifecycle-policy-v1.json +517 -0
- package/src/schemas/generated-ownership-v2.json +22 -0
- package/src/schemas/performance-policy-v1.json +335 -0
- package/src/schemas/repository-policy-v1.json +1 -0
- package/src/schemas/testing-evidence-quarantine-v1.json +168 -0
- package/src/schemas/testing-evidence-result-v1.json +319 -0
- package/src/secrets/adapters.d.ts +49 -0
- package/src/secrets/adapters.js +184 -0
- package/src/secrets/adapters.js.map +1 -0
- package/src/secrets/aws-control-plane.d.ts +20 -0
- package/src/secrets/aws-control-plane.js +255 -0
- package/src/secrets/aws-control-plane.js.map +1 -0
- package/src/secrets/declaration-verification.d.ts +11 -0
- package/src/secrets/declaration-verification.js +68 -0
- package/src/secrets/declaration-verification.js.map +1 -0
- package/src/secrets/guardrails.d.ts +26 -0
- package/src/secrets/guardrails.js +328 -0
- package/src/secrets/guardrails.js.map +1 -0
- package/src/secrets/index.d.ts +12 -0
- package/src/secrets/index.js +16 -0
- package/src/secrets/index.js.map +1 -0
- package/src/secrets/metadata.d.ts +48 -0
- package/src/secrets/metadata.js +171 -0
- package/src/secrets/metadata.js.map +1 -0
- package/src/secrets/model.d.ts +49 -0
- package/src/secrets/model.js +125 -0
- package/src/secrets/model.js.map +1 -0
- package/src/secrets/operator.d.ts +101 -0
- package/src/secrets/operator.js +229 -0
- package/src/secrets/operator.js.map +1 -0
- package/src/secrets/permissions.d.ts +34 -0
- package/src/secrets/permissions.js +86 -0
- package/src/secrets/permissions.js.map +1 -0
- package/src/secrets/personal-command.d.ts +83 -0
- package/src/secrets/personal-command.js +197 -0
- package/src/secrets/personal-command.js.map +1 -0
- package/src/secrets/personal-ledger.d.ts +21 -0
- package/src/secrets/personal-ledger.js +135 -0
- package/src/secrets/personal-ledger.js.map +1 -0
- package/src/secrets/registry.d.ts +9 -0
- package/src/secrets/registry.js +86 -0
- package/src/secrets/registry.js.map +1 -0
- package/src/secrets/verification.d.ts +18 -0
- package/src/secrets/verification.js +139 -0
- package/src/secrets/verification.js.map +1 -0
- package/src/secrets/workload-access.d.ts +46 -0
- package/src/secrets/workload-access.js +163 -0
- package/src/secrets/workload-access.js.map +1 -0
- package/src/supply-chain/action-pins.d.ts +26 -0
- package/src/supply-chain/action-pins.js +208 -0
- package/src/supply-chain/action-pins.js.map +1 -0
- package/src/supply-chain/blueprint-trust-git.d.ts +130 -0
- package/src/supply-chain/blueprint-trust-git.js +1581 -0
- package/src/supply-chain/blueprint-trust-git.js.map +1 -0
- package/src/supply-chain/blueprint-trust-process.d.ts +4 -0
- package/src/supply-chain/blueprint-trust-process.js +88 -0
- package/src/supply-chain/blueprint-trust-process.js.map +1 -0
- package/src/supply-chain/blueprint-trust.d.ts +354 -0
- package/src/supply-chain/blueprint-trust.js +1558 -0
- package/src/supply-chain/blueprint-trust.js.map +1 -0
- package/src/supply-chain/blueprint-verification-authority.d.ts +62 -0
- package/src/supply-chain/blueprint-verification-authority.js +588 -0
- package/src/supply-chain/blueprint-verification-authority.js.map +1 -0
- package/src/supply-chain/blueprint-verification-execution.d.ts +68 -0
- package/src/supply-chain/blueprint-verification-execution.js +624 -0
- package/src/supply-chain/blueprint-verification-execution.js.map +1 -0
- package/src/supply-chain/build-output.d.ts +35 -0
- package/src/supply-chain/build-output.js +398 -0
- package/src/supply-chain/build-output.js.map +1 -0
- package/src/supply-chain/common.d.ts +21 -0
- package/src/supply-chain/common.js +107 -0
- package/src/supply-chain/common.js.map +1 -0
- package/src/supply-chain/container-artifact-contract.d.ts +23 -0
- package/src/supply-chain/container-artifact-contract.js +208 -0
- package/src/supply-chain/container-artifact-contract.js.map +1 -0
- package/src/supply-chain/container-release.d.ts +119 -0
- package/src/supply-chain/container-release.js +496 -0
- package/src/supply-chain/container-release.js.map +1 -0
- package/src/supply-chain/ecr-applicability.d.ts +19 -0
- package/src/supply-chain/ecr-applicability.js +103 -0
- package/src/supply-chain/ecr-applicability.js.map +1 -0
- package/src/supply-chain/ecr-scanning.d.ts +83 -0
- package/src/supply-chain/ecr-scanning.js +321 -0
- package/src/supply-chain/ecr-scanning.js.map +1 -0
- package/src/supply-chain/ecs-deployed-image.d.ts +85 -0
- package/src/supply-chain/ecs-deployed-image.js +300 -0
- package/src/supply-chain/ecs-deployed-image.js.map +1 -0
- package/src/supply-chain/errors.d.ts +6 -0
- package/src/supply-chain/errors.js +15 -0
- package/src/supply-chain/errors.js.map +1 -0
- package/src/supply-chain/generated-blueprint-trust-command.d.ts +4 -0
- package/src/supply-chain/generated-blueprint-trust-command.js +1362 -0
- package/src/supply-chain/generated-blueprint-trust-command.js.map +1 -0
- package/src/supply-chain/generated-command.d.ts +1 -0
- package/src/supply-chain/generated-command.js +687 -0
- package/src/supply-chain/generated-command.js.map +1 -0
- package/src/supply-chain/generated-container-release-command.d.ts +16 -0
- package/src/supply-chain/generated-container-release-command.js +2087 -0
- package/src/supply-chain/generated-container-release-command.js.map +1 -0
- package/src/supply-chain/generated-ecr-collector-command.d.ts +21 -0
- package/src/supply-chain/generated-ecr-collector-command.js +1338 -0
- package/src/supply-chain/generated-ecr-collector-command.js.map +1 -0
- package/src/supply-chain/generated-files.d.ts +13 -0
- package/src/supply-chain/generated-files.js +401 -0
- package/src/supply-chain/generated-files.js.map +1 -0
- package/src/supply-chain/generated-scanner-command.d.ts +1 -0
- package/src/supply-chain/generated-scanner-command.js +718 -0
- package/src/supply-chain/generated-scanner-command.js.map +1 -0
- package/src/supply-chain/index.d.ts +28 -0
- package/src/supply-chain/index.js +35 -0
- package/src/supply-chain/index.js.map +1 -0
- package/src/supply-chain/inventory.d.ts +79 -0
- package/src/supply-chain/inventory.js +717 -0
- package/src/supply-chain/inventory.js.map +1 -0
- package/src/supply-chain/license-expression.d.ts +7 -0
- package/src/supply-chain/license-expression.js +128 -0
- package/src/supply-chain/license-expression.js.map +1 -0
- package/src/supply-chain/pnpm-toolchain-authority.d.ts +31 -0
- package/src/supply-chain/pnpm-toolchain-authority.js +316 -0
- package/src/supply-chain/pnpm-toolchain-authority.js.map +1 -0
- package/src/supply-chain/policy.d.ts +105 -0
- package/src/supply-chain/policy.js +301 -0
- package/src/supply-chain/policy.js.map +1 -0
- package/src/supply-chain/publication.d.ts +48 -0
- package/src/supply-chain/publication.js +85 -0
- package/src/supply-chain/publication.js.map +1 -0
- package/src/supply-chain/sbom.d.ts +228 -0
- package/src/supply-chain/sbom.js +826 -0
- package/src/supply-chain/sbom.js.map +1 -0
- package/src/supply-chain/scanner.d.ts +77 -0
- package/src/supply-chain/scanner.js +502 -0
- package/src/supply-chain/scanner.js.map +1 -0
- package/src/supply-chain/vendored-source.d.ts +95 -0
- package/src/supply-chain/vendored-source.js +315 -0
- package/src/supply-chain/vendored-source.js.map +1 -0
- package/src/testing-evidence/fixture-scope.d.ts +52 -0
- package/src/testing-evidence/fixture-scope.js +140 -0
- package/src/testing-evidence/fixture-scope.js.map +1 -0
- package/src/testing-evidence/index.d.ts +5 -0
- package/src/testing-evidence/index.js +9 -0
- package/src/testing-evidence/index.js.map +1 -0
- package/src/testing-evidence/quarantine.d.ts +48 -0
- package/src/testing-evidence/quarantine.js +253 -0
- package/src/testing-evidence/quarantine.js.map +1 -0
- package/src/testing-evidence/result.d.ts +108 -0
- package/src/testing-evidence/result.js +571 -0
- package/src/testing-evidence/result.js.map +1 -0
- package/src/testing-evidence/runner-adapter.d.ts +51 -0
- package/src/testing-evidence/runner-adapter.js +288 -0
- package/src/testing-evidence/runner-adapter.js.map +1 -0
- package/src/testing-evidence/sensitive-artifacts.d.ts +13 -0
- package/src/testing-evidence/sensitive-artifacts.js +93 -0
- package/src/testing-evidence/sensitive-artifacts.js.map +1 -0
- package/src/work-markers/work-markers.js +4 -3
- package/src/work-markers/work-markers.js.map +1 -1
- package/src/workload-roles/account-baseline.d.ts +132 -0
- package/src/workload-roles/account-baseline.js +743 -0
- package/src/workload-roles/account-baseline.js.map +1 -0
- package/src/workload-roles/authority.d.ts +38 -0
- package/src/workload-roles/authority.js +156 -0
- package/src/workload-roles/authority.js.map +1 -0
- package/src/workload-roles/aws-adapter.d.ts +99 -0
- package/src/workload-roles/aws-adapter.js +416 -0
- package/src/workload-roles/aws-adapter.js.map +1 -0
- package/src/workload-roles/aws-internal-handler.d.ts +27 -0
- package/src/workload-roles/aws-internal-handler.js +58 -0
- package/src/workload-roles/aws-internal-handler.js.map +1 -0
- package/src/workload-roles/aws-s3-state.d.ts +52 -0
- package/src/workload-roles/aws-s3-state.js +164 -0
- package/src/workload-roles/aws-s3-state.js.map +1 -0
- package/src/workload-roles/aws-sdk-control-plane.d.ts +12 -0
- package/src/workload-roles/aws-sdk-control-plane.js +291 -0
- package/src/workload-roles/aws-sdk-control-plane.js.map +1 -0
- package/src/workload-roles/boundary.d.ts +33 -0
- package/src/workload-roles/boundary.js +130 -0
- package/src/workload-roles/boundary.js.map +1 -0
- package/src/workload-roles/convergence.d.ts +66 -0
- package/src/workload-roles/convergence.js +186 -0
- package/src/workload-roles/convergence.js.map +1 -0
- package/src/workload-roles/effective-policy.d.ts +51 -0
- package/src/workload-roles/effective-policy.js +183 -0
- package/src/workload-roles/effective-policy.js.map +1 -0
- package/src/workload-roles/handler.d.ts +43 -0
- package/src/workload-roles/handler.js +130 -0
- package/src/workload-roles/handler.js.map +1 -0
- package/src/workload-roles/history.d.ts +47 -0
- package/src/workload-roles/history.js +324 -0
- package/src/workload-roles/history.js.map +1 -0
- package/src/workload-roles/index.d.ts +17 -0
- package/src/workload-roles/index.js +21 -0
- package/src/workload-roles/index.js.map +1 -0
- package/src/workload-roles/injection.d.ts +119 -0
- package/src/workload-roles/injection.js +495 -0
- package/src/workload-roles/injection.js.map +1 -0
- package/src/workload-roles/manifest.d.ts +54 -0
- package/src/workload-roles/manifest.js +343 -0
- package/src/workload-roles/manifest.js.map +1 -0
- package/src/workload-roles/provisioner.d.ts +70 -0
- package/src/workload-roles/provisioner.js +231 -0
- package/src/workload-roles/provisioner.js.map +1 -0
- package/src/workload-roles/registration.d.ts +101 -0
- package/src/workload-roles/registration.js +457 -0
- package/src/workload-roles/registration.js.map +1 -0
- package/src/workload-roles/stage-boundary.d.ts +31 -0
- package/src/workload-roles/stage-boundary.js +208 -0
- package/src/workload-roles/stage-boundary.js.map +1 -0
- package/src/workload-roles/standard-slice.d.ts +54 -0
- package/src/workload-roles/standard-slice.js +252 -0
- package/src/workload-roles/standard-slice.js.map +1 -0
- package/migrations/standard-pre-v1-to-v1.md +0 -11
- package/src/foundation/aurora-logical-database.d.ts +0 -76
- package/src/foundation/aurora-logical-database.js +0 -419
- package/src/foundation/aurora-logical-database.js.map +0 -1
|
@@ -0,0 +1,1558 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BLUEPRINT_TRUST_OVERRIDE_MAX_DAYS = exports.BLUEPRINT_TRUST_MAX_FRESHNESS_DAYS = exports.BLUEPRINT_TRUST_LIFECYCLE_STATES = exports.BLUEPRINT_TRUST_SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.blueprintContainerRegistry = blueprintContainerRegistry;
|
|
5
|
+
exports.resolveBlueprintPackageIntegrity = resolveBlueprintPackageIntegrity;
|
|
6
|
+
exports.parsePnpmImporterPackageAuthorityLockfile = parsePnpmImporterPackageAuthorityLockfile;
|
|
7
|
+
exports.resolvePnpmImporterPackageVersionFromParsed = resolvePnpmImporterPackageVersionFromParsed;
|
|
8
|
+
exports.resolvePnpmImporterPackageVersion = resolvePnpmImporterPackageVersion;
|
|
9
|
+
exports.resolvePnpmRootPackageVersion = resolvePnpmRootPackageVersion;
|
|
10
|
+
exports.createBlueprintTrustSnapshot = createBlueprintTrustSnapshot;
|
|
11
|
+
exports.blueprintTrustSnapshotDigest = blueprintTrustSnapshotDigest;
|
|
12
|
+
exports.blueprintGeneratedContentApprovalDigest = blueprintGeneratedContentApprovalDigest;
|
|
13
|
+
exports.blueprintVerificationTargetDigest = blueprintVerificationTargetDigest;
|
|
14
|
+
exports.planBlueprintVerificationExecution = planBlueprintVerificationExecution;
|
|
15
|
+
exports.assertBlueprintVerificationTargetAgentSafe = assertBlueprintVerificationTargetAgentSafe;
|
|
16
|
+
exports.blueprintVerificationTargetDependencies = blueprintVerificationTargetDependencies;
|
|
17
|
+
exports.blueprintVerificationTargetClosure = blueprintVerificationTargetClosure;
|
|
18
|
+
exports.blueprintVerificationExecutionReceiptPath = blueprintVerificationExecutionReceiptPath;
|
|
19
|
+
exports.createBlueprintVerificationExecutionReceipt = createBlueprintVerificationExecutionReceipt;
|
|
20
|
+
exports.blueprintVerificationExecutionReceiptDigest = blueprintVerificationExecutionReceiptDigest;
|
|
21
|
+
exports.blueprintTrustPolicyDigest = blueprintTrustPolicyDigest;
|
|
22
|
+
exports.createBlueprintTrustState = createBlueprintTrustState;
|
|
23
|
+
exports.blueprintTrustStateDigest = blueprintTrustStateDigest;
|
|
24
|
+
exports.authorizeBlueprintTrust = authorizeBlueprintTrust;
|
|
25
|
+
exports.authorizeBlueprintOwnershipInventory = authorizeBlueprintOwnershipInventory;
|
|
26
|
+
exports.planBlueprintTrustSnapshotUpdate = planBlueprintTrustSnapshotUpdate;
|
|
27
|
+
exports.planBlueprintTrustStateTransition = planBlueprintTrustStateTransition;
|
|
28
|
+
exports.validateBlueprintTrustHistory = validateBlueprintTrustHistory;
|
|
29
|
+
const validation_js_1 = require("../validation.js");
|
|
30
|
+
const node_crypto_1 = require("node:crypto");
|
|
31
|
+
const record_js_1 = require("../ownership/record.js");
|
|
32
|
+
const deterministic_order_js_1 = require("../deterministic-order.js");
|
|
33
|
+
const semver_1 = require("semver");
|
|
34
|
+
const yaml_1 = require("yaml");
|
|
35
|
+
const common_js_1 = require("./common.js");
|
|
36
|
+
const errors_js_1 = require("./errors.js");
|
|
37
|
+
exports.BLUEPRINT_TRUST_SCHEMA_VERSION = 1;
|
|
38
|
+
function hasControlCharacter(value) {
|
|
39
|
+
return [...value].some((character) => {
|
|
40
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
41
|
+
return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
exports.BLUEPRINT_TRUST_LIFECYCLE_STATES = [
|
|
45
|
+
'candidate',
|
|
46
|
+
'verified',
|
|
47
|
+
'deprecated',
|
|
48
|
+
'quarantined',
|
|
49
|
+
'revoked',
|
|
50
|
+
'retired',
|
|
51
|
+
];
|
|
52
|
+
exports.BLUEPRINT_TRUST_MAX_FRESHNESS_DAYS = 30;
|
|
53
|
+
exports.BLUEPRINT_TRUST_OVERRIDE_MAX_DAYS = 7;
|
|
54
|
+
const BLUEPRINT_REGISTRY_INTEGRITY = /^sha512-[A-Za-z0-9+/]{86}==$/;
|
|
55
|
+
const BLUEPRINT_GENERATED_SLICE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
56
|
+
const BLUEPRINT_VERIFICATION_TARGET = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
57
|
+
const BLUEPRINT_GENERATED_FILE = /^(?!.*(?:^|\/)\.\.(?:\/|$))[A-Za-z0-9._@+~/-]{1,512}$/;
|
|
58
|
+
const BLUEPRINT_CONTAINER_REGISTRY = /^(?:[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?)(?::\d{1,5})?$/;
|
|
59
|
+
function hasExactProperties(value, allowed) {
|
|
60
|
+
const keys = Object.keys(value).sort();
|
|
61
|
+
return (keys.length === allowed.length &&
|
|
62
|
+
keys.every((key, index) => key === [...allowed].sort()[index]));
|
|
63
|
+
}
|
|
64
|
+
function blueprintContainerRegistry(base) {
|
|
65
|
+
if (typeof base !== 'string' ||
|
|
66
|
+
!/^[a-z0-9][a-z0-9._/-]*:[A-Za-z0-9._-]+@sha256:[a-f0-9]{64}$/.test(base)) {
|
|
67
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', 'Blueprint Dockerfile FROM', 'must be one exact digest-pinned base image');
|
|
68
|
+
}
|
|
69
|
+
const first = base.split('/')[0] ?? '';
|
|
70
|
+
const registry = base.includes('/') &&
|
|
71
|
+
(first.includes('.') || first.includes(':') || first === 'localhost')
|
|
72
|
+
? first
|
|
73
|
+
: 'docker.io';
|
|
74
|
+
if (!BLUEPRINT_CONTAINER_REGISTRY.test(registry)) {
|
|
75
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'Blueprint Dockerfile FROM', 'uses an invalid container registry authority');
|
|
76
|
+
}
|
|
77
|
+
return registry;
|
|
78
|
+
}
|
|
79
|
+
function resolveBlueprintPackageIntegrity(lockfile, name, version) {
|
|
80
|
+
let parsed;
|
|
81
|
+
try {
|
|
82
|
+
parsed = (0, yaml_1.parse)(lockfile);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'pnpm-lock.yaml', 'cannot be parsed for Blueprint registry integrity');
|
|
86
|
+
}
|
|
87
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) ||
|
|
88
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(version) ||
|
|
89
|
+
!(0, validation_js_1.isRecord)(parsed) ||
|
|
90
|
+
!(0, validation_js_1.isRecord)(parsed.packages) ||
|
|
91
|
+
!(0, validation_js_1.isRecord)(parsed.importers) ||
|
|
92
|
+
!(0, validation_js_1.isRecord)(parsed.importers['.'])) {
|
|
93
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${name}@${version}`, 'requires a complete pnpm lockfile and exact package identity');
|
|
94
|
+
}
|
|
95
|
+
const rootImporter = parsed.importers['.'];
|
|
96
|
+
let directDeclarations = 0;
|
|
97
|
+
for (const group of [
|
|
98
|
+
'dependencies',
|
|
99
|
+
'devDependencies',
|
|
100
|
+
'optionalDependencies',
|
|
101
|
+
]) {
|
|
102
|
+
if (!(0, validation_js_1.isRecord)(rootImporter[group]) ||
|
|
103
|
+
!Object.prototype.hasOwnProperty.call(rootImporter[group], name)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
directDeclarations += 1;
|
|
107
|
+
const declaration = rootImporter[group][name];
|
|
108
|
+
if (!(0, validation_js_1.isRecord)(declaration) ||
|
|
109
|
+
declaration.specifier !== version ||
|
|
110
|
+
typeof declaration.version !== 'string' ||
|
|
111
|
+
declaration.version.replace(/\(.+$/, '') !== version) {
|
|
112
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `pnpm-lock.yaml#importers.${group}.${name}`, `must bind exact direct Blueprint version ${version}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (directDeclarations !== 1) {
|
|
116
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `pnpm-lock.yaml#importers.${name}`, 'must contain exactly one direct root Blueprint declaration');
|
|
117
|
+
}
|
|
118
|
+
const integrities = new Set();
|
|
119
|
+
for (const [lockKey, metadata] of Object.entries(parsed.packages)) {
|
|
120
|
+
if (lockKey.replace(/\(.+$/, '') !== `${name}@${version}` ||
|
|
121
|
+
!(0, validation_js_1.isRecord)(metadata) ||
|
|
122
|
+
!(0, validation_js_1.isRecord)(metadata.resolution) ||
|
|
123
|
+
typeof metadata.resolution.integrity !== 'string') {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
integrities.add(metadata.resolution.integrity);
|
|
127
|
+
}
|
|
128
|
+
if (integrities.size !== 1 ||
|
|
129
|
+
!BLUEPRINT_REGISTRY_INTEGRITY.test([...integrities][0] ?? '')) {
|
|
130
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${name}@${version}`, 'must have one exact registry SHA-512 integrity in pnpm-lock.yaml');
|
|
131
|
+
}
|
|
132
|
+
return [...integrities][0] ?? '';
|
|
133
|
+
}
|
|
134
|
+
/** Resolves one protected importer tool declaration to its exact pnpm lock version. */
|
|
135
|
+
function parsePnpmImporterPackageAuthorityLockfile(lockfile) {
|
|
136
|
+
let parsed;
|
|
137
|
+
try {
|
|
138
|
+
parsed = (0, yaml_1.parse)(lockfile);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'pnpm-lock.yaml', 'cannot be parsed for protected root tool authority');
|
|
142
|
+
}
|
|
143
|
+
return parsed;
|
|
144
|
+
}
|
|
145
|
+
function resolvePnpmImporterPackageVersionFromParsed(parsed, importer, name, specifier) {
|
|
146
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) ||
|
|
147
|
+
typeof specifier !== 'string' ||
|
|
148
|
+
specifier.length === 0 ||
|
|
149
|
+
specifier.length > 128 ||
|
|
150
|
+
(importer !== '.' &&
|
|
151
|
+
!/^packages\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u.test(importer)) ||
|
|
152
|
+
!(0, validation_js_1.isRecord)(parsed) ||
|
|
153
|
+
!(0, validation_js_1.isRecord)(parsed.packages) ||
|
|
154
|
+
!(0, validation_js_1.isRecord)(parsed.importers) ||
|
|
155
|
+
!(0, validation_js_1.isRecord)(parsed.importers[importer])) {
|
|
156
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', name, 'requires one protected root declaration and complete pnpm lockfile');
|
|
157
|
+
}
|
|
158
|
+
const protectedImporter = parsed.importers[importer];
|
|
159
|
+
const declarations = [];
|
|
160
|
+
for (const group of [
|
|
161
|
+
'dependencies',
|
|
162
|
+
'devDependencies',
|
|
163
|
+
'optionalDependencies',
|
|
164
|
+
]) {
|
|
165
|
+
const values = protectedImporter[group];
|
|
166
|
+
if ((0, validation_js_1.isRecord)(values) &&
|
|
167
|
+
Object.prototype.hasOwnProperty.call(values, name)) {
|
|
168
|
+
declarations.push(values[name]);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const declaration = declarations[0];
|
|
172
|
+
const version = (0, validation_js_1.isRecord)(declaration) && typeof declaration.version === 'string'
|
|
173
|
+
? declaration.version.replace(/\(.+$/u, '')
|
|
174
|
+
: undefined;
|
|
175
|
+
if (declarations.length !== 1 ||
|
|
176
|
+
!(0, validation_js_1.isRecord)(declaration) ||
|
|
177
|
+
declaration.specifier !== specifier ||
|
|
178
|
+
typeof version !== 'string' ||
|
|
179
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(version) ||
|
|
180
|
+
!Object.prototype.hasOwnProperty.call(parsed.packages, `${name}@${version}`)) {
|
|
181
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `pnpm-lock.yaml#importers.${name}`, 'must bind one exact protected root package version');
|
|
182
|
+
}
|
|
183
|
+
return version;
|
|
184
|
+
}
|
|
185
|
+
/** Resolves one protected importer tool declaration to its exact pnpm lock version. */
|
|
186
|
+
function resolvePnpmImporterPackageVersion(lockfile, importer, name, specifier) {
|
|
187
|
+
return resolvePnpmImporterPackageVersionFromParsed(parsePnpmImporterPackageAuthorityLockfile(lockfile), importer, name, specifier);
|
|
188
|
+
}
|
|
189
|
+
function resolvePnpmRootPackageVersion(lockfile, name, specifier) {
|
|
190
|
+
return resolvePnpmImporterPackageVersion(lockfile, '.', name, specifier);
|
|
191
|
+
}
|
|
192
|
+
function timestamp(value, path) {
|
|
193
|
+
const parsed = Date.parse(value);
|
|
194
|
+
if (!Number.isFinite(parsed) || new Date(parsed).toISOString() !== value) {
|
|
195
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must be a canonical ISO-8601 timestamp');
|
|
196
|
+
}
|
|
197
|
+
return parsed;
|
|
198
|
+
}
|
|
199
|
+
function validateIntegrity(value, path) {
|
|
200
|
+
if (!BLUEPRINT_REGISTRY_INTEGRITY.test(value)) {
|
|
201
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must be an npm SHA-512 integrity value');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function validateEntry(entry, index) {
|
|
205
|
+
const path = `snapshot.entries[${index}]`;
|
|
206
|
+
if (!(0, validation_js_1.isRecord)(entry) ||
|
|
207
|
+
!hasExactProperties(entry, [
|
|
208
|
+
'compatibleFramework',
|
|
209
|
+
'evidenceDigest',
|
|
210
|
+
'integrity',
|
|
211
|
+
'lifecycle',
|
|
212
|
+
'name',
|
|
213
|
+
...(entry.notice === undefined ? [] : ['notice']),
|
|
214
|
+
'support',
|
|
215
|
+
'version',
|
|
216
|
+
]) ||
|
|
217
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(entry.name) ||
|
|
218
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(entry.version) ||
|
|
219
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(entry.evidenceDigest) ||
|
|
220
|
+
!exports.BLUEPRINT_TRUST_LIFECYCLE_STATES.includes(entry.lifecycle) ||
|
|
221
|
+
typeof entry.compatibleFramework !== 'string' ||
|
|
222
|
+
entry.compatibleFramework.trim() === '' ||
|
|
223
|
+
(0, semver_1.validRange)(entry.compatibleFramework) === null ||
|
|
224
|
+
typeof entry.support !== 'string' ||
|
|
225
|
+
entry.support.trim() === '' ||
|
|
226
|
+
(entry.notice !== undefined &&
|
|
227
|
+
(typeof entry.notice !== 'string' || entry.notice.trim() === '')) ||
|
|
228
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(entry)) {
|
|
229
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must bind one exact Blueprint release to reviewed lifecycle evidence');
|
|
230
|
+
}
|
|
231
|
+
validateIntegrity(entry.integrity, `${path}.integrity`);
|
|
232
|
+
}
|
|
233
|
+
function createBlueprintTrustSnapshot(input) {
|
|
234
|
+
timestamp(input.generatedAt, 'snapshot.generatedAt');
|
|
235
|
+
if (!(0, validation_js_1.isRecord)(input) ||
|
|
236
|
+
!hasExactProperties(input, [
|
|
237
|
+
'entries',
|
|
238
|
+
'generatedAt',
|
|
239
|
+
'schemaVersion',
|
|
240
|
+
'sequence',
|
|
241
|
+
'source',
|
|
242
|
+
]) ||
|
|
243
|
+
input.schemaVersion !== exports.BLUEPRINT_TRUST_SCHEMA_VERSION ||
|
|
244
|
+
!Number.isSafeInteger(input.sequence) ||
|
|
245
|
+
input.sequence < 1 ||
|
|
246
|
+
!(0, validation_js_1.isRecord)(input.source) ||
|
|
247
|
+
!hasExactProperties(input.source, ['kind', 'reference']) ||
|
|
248
|
+
input.source.kind !== 'repository-reviewed' ||
|
|
249
|
+
!common_js_1.SUPPLY_CHAIN_REFERENCE.test(input.source.reference) ||
|
|
250
|
+
!Array.isArray(input.entries) ||
|
|
251
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(input)) {
|
|
252
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'snapshot', 'must be a repository-reviewed trust snapshot v1');
|
|
253
|
+
}
|
|
254
|
+
input.entries.forEach(validateEntry);
|
|
255
|
+
const seen = new Set();
|
|
256
|
+
const entries = [...input.entries]
|
|
257
|
+
.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.name}\0${left.version}`, `${right.name}\0${right.version}`))
|
|
258
|
+
.map((entry, index) => {
|
|
259
|
+
const identity = `${entry.name}@${entry.version}`;
|
|
260
|
+
if (seen.has(identity)) {
|
|
261
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `snapshot.entries[${index}]`, `duplicates ${identity}`);
|
|
262
|
+
}
|
|
263
|
+
seen.add(identity);
|
|
264
|
+
return { ...entry };
|
|
265
|
+
});
|
|
266
|
+
return { ...input, entries };
|
|
267
|
+
}
|
|
268
|
+
function blueprintTrustSnapshotDigest(snapshot) {
|
|
269
|
+
return (0, common_js_1.supplyChainDigest)(createBlueprintTrustSnapshot(snapshot));
|
|
270
|
+
}
|
|
271
|
+
function validateOverride(value, index, now, requireActive) {
|
|
272
|
+
const path = `policy.emergencyOverrides[${index}]`;
|
|
273
|
+
if (!(0, validation_js_1.isRecord)(value) ||
|
|
274
|
+
!hasExactProperties(value, [
|
|
275
|
+
'approvedAt',
|
|
276
|
+
'approver',
|
|
277
|
+
'exactIntegrity',
|
|
278
|
+
'expiresAt',
|
|
279
|
+
'name',
|
|
280
|
+
'operations',
|
|
281
|
+
'reason',
|
|
282
|
+
'recoveryWork',
|
|
283
|
+
'version',
|
|
284
|
+
]) ||
|
|
285
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(value.name) ||
|
|
286
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(value.version) ||
|
|
287
|
+
!Array.isArray(value.operations) ||
|
|
288
|
+
value.operations.length === 0 ||
|
|
289
|
+
value.operations.some((operation) => !['adopt', 'deploy'].includes(operation)) ||
|
|
290
|
+
new Set(value.operations).size !== value.operations.length ||
|
|
291
|
+
[value.approver, value.reason, value.recoveryWork].some((entry) => typeof entry !== 'string' ||
|
|
292
|
+
entry.trim() === '' ||
|
|
293
|
+
entry !== entry.trim()) ||
|
|
294
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(value)) {
|
|
295
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must be an exact, attributable, recovery-bound emergency decision');
|
|
296
|
+
}
|
|
297
|
+
validateIntegrity(value.exactIntegrity, `${path}.exactIntegrity`);
|
|
298
|
+
const approvedAt = timestamp(value.approvedAt, `${path}.approvedAt`);
|
|
299
|
+
const expiresAt = timestamp(value.expiresAt, `${path}.expiresAt`);
|
|
300
|
+
if (approvedAt > now ||
|
|
301
|
+
expiresAt <= approvedAt ||
|
|
302
|
+
expiresAt - approvedAt >
|
|
303
|
+
exports.BLUEPRINT_TRUST_OVERRIDE_MAX_DAYS * 24 * 60 * 60 * 1_000) {
|
|
304
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}.expiresAt`, `must expire within ${exports.BLUEPRINT_TRUST_OVERRIDE_MAX_DAYS} days of approval`);
|
|
305
|
+
}
|
|
306
|
+
if (requireActive && expiresAt <= now) {
|
|
307
|
+
throw new errors_js_1.SupplyChainError('supply-chain-exception-expired', `${path}.expiresAt`, 'emergency trust override has expired');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function sortedUnique(values) {
|
|
311
|
+
return (new Set(values).size === values.length &&
|
|
312
|
+
values.every((value, index) => {
|
|
313
|
+
const previous = values[index - 1];
|
|
314
|
+
return index === 0 || (previous !== undefined && previous < value);
|
|
315
|
+
}));
|
|
316
|
+
}
|
|
317
|
+
function createBlueprintGeneratedContent(value, path) {
|
|
318
|
+
if (!(0, validation_js_1.isRecord)(value) ||
|
|
319
|
+
!hasExactProperties(value, [
|
|
320
|
+
'blueprintFiles',
|
|
321
|
+
'containerRegistries',
|
|
322
|
+
'projectPath',
|
|
323
|
+
'slice',
|
|
324
|
+
'verificationRoots',
|
|
325
|
+
'verificationTargets',
|
|
326
|
+
]) ||
|
|
327
|
+
typeof value.slice !== 'string' ||
|
|
328
|
+
!BLUEPRINT_GENERATED_SLICE.test(value.slice) ||
|
|
329
|
+
value.projectPath !== `packages/${value.slice}/project.json` ||
|
|
330
|
+
!Array.isArray(value.containerRegistries) ||
|
|
331
|
+
value.containerRegistries.length > 32 ||
|
|
332
|
+
value.containerRegistries.some((registry) => typeof registry !== 'string' ||
|
|
333
|
+
!BLUEPRINT_CONTAINER_REGISTRY.test(registry)) ||
|
|
334
|
+
!sortedUnique(value.containerRegistries) ||
|
|
335
|
+
!Array.isArray(value.blueprintFiles) ||
|
|
336
|
+
value.blueprintFiles.length === 0 ||
|
|
337
|
+
value.blueprintFiles.length > 8_192 ||
|
|
338
|
+
value.blueprintFiles.some((file) => !(0, validation_js_1.isRecord)(file) ||
|
|
339
|
+
!hasExactProperties(file, ['digest', 'mode', 'path']) ||
|
|
340
|
+
typeof file.path !== 'string' ||
|
|
341
|
+
!BLUEPRINT_GENERATED_FILE.test(file.path) ||
|
|
342
|
+
file.path
|
|
343
|
+
.split('/')
|
|
344
|
+
.some((segment) => ['', '.', '..'].includes(segment)) ||
|
|
345
|
+
typeof file.digest !== 'string' ||
|
|
346
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(file.digest) ||
|
|
347
|
+
(file.mode !== 'managed' && file.mode !== 'seeded')) ||
|
|
348
|
+
!sortedUnique(value.blueprintFiles.map(({ path: filePath }) => filePath)) ||
|
|
349
|
+
!Array.isArray(value.verificationRoots) ||
|
|
350
|
+
value.verificationRoots.length !== 1 ||
|
|
351
|
+
value.verificationRoots.some((name) => typeof name !== 'string' || !BLUEPRINT_VERIFICATION_TARGET.test(name)) ||
|
|
352
|
+
!sortedUnique(value.verificationRoots) ||
|
|
353
|
+
!Array.isArray(value.verificationTargets) ||
|
|
354
|
+
value.verificationTargets.length === 0 ||
|
|
355
|
+
value.verificationTargets.length > 64 ||
|
|
356
|
+
value.verificationTargets.some((target) => !(0, validation_js_1.isRecord)(target) ||
|
|
357
|
+
!hasExactProperties(target, ['digest', 'name']) ||
|
|
358
|
+
typeof target.name !== 'string' ||
|
|
359
|
+
!BLUEPRINT_VERIFICATION_TARGET.test(target.name) ||
|
|
360
|
+
typeof target.digest !== 'string' ||
|
|
361
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(target.digest)) ||
|
|
362
|
+
!sortedUnique(value.verificationTargets.map(({ name }) => name)) ||
|
|
363
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(value)) {
|
|
364
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must bind one exact verification closure, complete Blueprint-origin file inventory, and registry inventory to its Slice project');
|
|
365
|
+
}
|
|
366
|
+
const content = value;
|
|
367
|
+
return {
|
|
368
|
+
blueprintFiles: content.blueprintFiles.map((file) => ({ ...file })),
|
|
369
|
+
containerRegistries: [...content.containerRegistries],
|
|
370
|
+
projectPath: content.projectPath,
|
|
371
|
+
slice: content.slice,
|
|
372
|
+
verificationRoots: [...content.verificationRoots],
|
|
373
|
+
verificationTargets: content.verificationTargets.map((target) => ({
|
|
374
|
+
...target,
|
|
375
|
+
})),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Domain-separated approval for one exact Blueprint identity and every byte or
|
|
380
|
+
* execution authority generated for its Slice. Execution evidence refers to
|
|
381
|
+
* this digest but is retained as a later, separate object.
|
|
382
|
+
*/
|
|
383
|
+
function blueprintGeneratedContentApprovalDigest(blueprint, content) {
|
|
384
|
+
if (!(0, validation_js_1.isRecord)(blueprint) ||
|
|
385
|
+
!hasExactProperties(blueprint, ['integrity', 'name', 'version']) ||
|
|
386
|
+
typeof blueprint.name !== 'string' ||
|
|
387
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(blueprint.name) ||
|
|
388
|
+
typeof blueprint.version !== 'string' ||
|
|
389
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(blueprint.version) ||
|
|
390
|
+
typeof blueprint.integrity !== 'string') {
|
|
391
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintGeneratedContentApproval.blueprint', 'must identify one exact Blueprint release and integrity');
|
|
392
|
+
}
|
|
393
|
+
validateIntegrity(blueprint.integrity, 'blueprintGeneratedContentApproval.blueprint.integrity');
|
|
394
|
+
return (0, common_js_1.supplyChainDigest)({
|
|
395
|
+
blueprint: { ...blueprint },
|
|
396
|
+
content: createBlueprintGeneratedContent(content, 'blueprintGeneratedContentApproval.content'),
|
|
397
|
+
kind: 'ebk-blueprint-generated-content-approval',
|
|
398
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
const BLUEPRINT_VERIFICATION_TARGET_PROPERTIES = new Set([
|
|
402
|
+
'cache',
|
|
403
|
+
'configurations',
|
|
404
|
+
'continuous',
|
|
405
|
+
'defaultConfiguration',
|
|
406
|
+
'dependsOn',
|
|
407
|
+
'executor',
|
|
408
|
+
'inputs',
|
|
409
|
+
'metadata',
|
|
410
|
+
'options',
|
|
411
|
+
'outputs',
|
|
412
|
+
'parallelism',
|
|
413
|
+
'syncGenerators',
|
|
414
|
+
]);
|
|
415
|
+
const BLUEPRINT_VERIFICATION_PROJECT_ROOT = /^packages\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
416
|
+
const BLUEPRINT_VERIFICATION_SCRIPT = /^(?:scripts|testing)\/[a-z0-9][a-z0-9._/-]*\.mjs$/;
|
|
417
|
+
const BLUEPRINT_GENERATED_OUTPUT_PATH = /(?:^|\/)\.(?:next|open-next)(?:\/|$)/u;
|
|
418
|
+
const BLUEPRINT_VERIFICATION_PACKAGE = /^@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*$/;
|
|
419
|
+
const BLUEPRINT_MUTATING_TARGET = /(?:^|-)(?:apply|backfill|cleanup|create|delete|deploy|destroy|dev|down|drain|generate|migrate|promote|provision|publish|purge|recover|redrive|refresh|release|remove|reconcile|restore|retire|rollback|rotate|seed|start|sync|unlock|up|update|upload|write)(?:-|$)/;
|
|
420
|
+
const BLUEPRINT_MUTATING_COMMAND_TOKEN = /(?:^|[./_-])(?:apply|backfill|cleanup|create|delete|deploy|destroy|dev|down|drain|generate|migrate|promote|provision|publish|purge|recover|redrive|refresh|release|remove|reconcile|restore|retire|rollback|rotate|seed|start|sync|unlock|up|update|upload|write)(?=$|[./_-])/;
|
|
421
|
+
function sameJson(left, right) {
|
|
422
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Reduces an effective Nx target to the authored execution contract used by
|
|
426
|
+
* protected Blueprint review. Nx adds empty configuration/parallelism fields;
|
|
427
|
+
* stripping only those two inert values makes the raw project.json and
|
|
428
|
+
* effective project graph converge without concealing target-default
|
|
429
|
+
* dependencies, inputs, or cache behavior.
|
|
430
|
+
*/
|
|
431
|
+
function normalizeBlueprintVerificationTarget(name, value) {
|
|
432
|
+
if (!BLUEPRINT_VERIFICATION_TARGET.test(name) ||
|
|
433
|
+
!(0, validation_js_1.isRecord)(value) ||
|
|
434
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(value)) {
|
|
435
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintVerificationTarget.${name}`, 'must be one bounded, non-sensitive Nx target definition');
|
|
436
|
+
}
|
|
437
|
+
const normalized = { ...value };
|
|
438
|
+
if ((0, validation_js_1.isRecord)(normalized.configurations) &&
|
|
439
|
+
Object.keys(normalized.configurations).length === 0) {
|
|
440
|
+
delete normalized.configurations;
|
|
441
|
+
}
|
|
442
|
+
if (normalized.parallelism === true)
|
|
443
|
+
delete normalized.parallelism;
|
|
444
|
+
return normalized;
|
|
445
|
+
}
|
|
446
|
+
function blueprintVerificationTargetDigest(name, value) {
|
|
447
|
+
return (0, common_js_1.supplyChainDigest)(normalizeBlueprintVerificationTarget(name, value));
|
|
448
|
+
}
|
|
449
|
+
function blueprintTargetContainsRuntimeInput(value) {
|
|
450
|
+
if (Array.isArray(value)) {
|
|
451
|
+
return value.some(blueprintTargetContainsRuntimeInput);
|
|
452
|
+
}
|
|
453
|
+
if (!(0, validation_js_1.isRecord)(value))
|
|
454
|
+
return false;
|
|
455
|
+
if (Object.prototype.hasOwnProperty.call(value, 'runtime'))
|
|
456
|
+
return true;
|
|
457
|
+
return Object.values(value).some(blueprintTargetContainsRuntimeInput);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Parses the complete protected Blueprint verification option language. The
|
|
461
|
+
* same structured plan is consumed by validation, recurring Nx execution, and
|
|
462
|
+
* receipt review so accepted options cannot acquire a shell meaning.
|
|
463
|
+
*/
|
|
464
|
+
function planBlueprintVerificationExecution(options) {
|
|
465
|
+
if (!(0, validation_js_1.isRecord)(options) || typeof options.kind !== 'string')
|
|
466
|
+
return undefined;
|
|
467
|
+
if (options.kind === 'typescript' && Object.keys(options).length === 1) {
|
|
468
|
+
return { kind: 'typescript' };
|
|
469
|
+
}
|
|
470
|
+
if (options.kind === 'node') {
|
|
471
|
+
const keys = Object.keys(options);
|
|
472
|
+
const script = options.script;
|
|
473
|
+
const mode = options.mode;
|
|
474
|
+
const action = options.action;
|
|
475
|
+
if (keys.some((key) => !['action', 'kind', 'mode', 'script'].includes(key)) ||
|
|
476
|
+
typeof script !== 'string' ||
|
|
477
|
+
!BLUEPRINT_VERIFICATION_SCRIPT.test(script) ||
|
|
478
|
+
BLUEPRINT_GENERATED_OUTPUT_PATH.test(script) ||
|
|
479
|
+
script.includes('..') ||
|
|
480
|
+
BLUEPRINT_MUTATING_COMMAND_TOKEN.test(script) ||
|
|
481
|
+
(mode !== undefined && mode !== 'strip-types' && mode !== 'test') ||
|
|
482
|
+
(action !== undefined && action !== 'check' && action !== 'report')) {
|
|
483
|
+
return undefined;
|
|
484
|
+
}
|
|
485
|
+
if (mode === 'test') {
|
|
486
|
+
if (action !== undefined || !script.startsWith('testing/')) {
|
|
487
|
+
return undefined;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
const nodeMode = mode === 'strip-types' || mode === 'test' ? mode : undefined;
|
|
491
|
+
const nodeAction = action === 'check' || action === 'report' ? action : undefined;
|
|
492
|
+
const arguments_ = [];
|
|
493
|
+
if (nodeMode === 'strip-types')
|
|
494
|
+
arguments_.push('--experimental-strip-types');
|
|
495
|
+
if (nodeMode === 'test')
|
|
496
|
+
arguments_.push('--test');
|
|
497
|
+
arguments_.push(script);
|
|
498
|
+
if (nodeAction !== undefined)
|
|
499
|
+
arguments_.push(nodeAction);
|
|
500
|
+
return {
|
|
501
|
+
...(nodeAction === undefined ? {} : { action: nodeAction }),
|
|
502
|
+
arguments: arguments_,
|
|
503
|
+
kind: 'node',
|
|
504
|
+
...(nodeMode === undefined ? {} : { mode: nodeMode }),
|
|
505
|
+
script,
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
if (options.kind !== 'vitest' ||
|
|
509
|
+
Object.keys(options).sort().join(',') !== 'filterPackage,kind,spec' ||
|
|
510
|
+
typeof options.filterPackage !== 'string' ||
|
|
511
|
+
!BLUEPRINT_VERIFICATION_PACKAGE.test(options.filterPackage) ||
|
|
512
|
+
typeof options.spec !== 'string' ||
|
|
513
|
+
!/^testing\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*\.spec\.ts$/u.test(options.spec)) {
|
|
514
|
+
return undefined;
|
|
515
|
+
}
|
|
516
|
+
return {
|
|
517
|
+
filterPackage: options.filterPackage,
|
|
518
|
+
kind: 'vitest',
|
|
519
|
+
spec: options.spec,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
function blueprintVerificationOptionsAreClosed(value) {
|
|
523
|
+
return planBlueprintVerificationExecution(value) !== undefined;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Enforces the execution-shape boundary shared by protected Blueprint review,
|
|
527
|
+
* workspace inspection, and Developer-Agent exposure. Review authenticates
|
|
528
|
+
* exact bytes; it does not turn Nx runtime inputs, target configurations,
|
|
529
|
+
* synchronization hooks, continuous processes, or an unauthenticated cache
|
|
530
|
+
* contract into safe agent operations.
|
|
531
|
+
*/
|
|
532
|
+
function assertBlueprintVerificationTargetAgentSafe(name, value, projectRoot) {
|
|
533
|
+
const normalized = normalizeBlueprintVerificationTarget(name, value);
|
|
534
|
+
const configurations = (0, validation_js_1.isRecord)(value) ? value.configurations : undefined;
|
|
535
|
+
const syncGenerators = (0, validation_js_1.isRecord)(value) ? value.syncGenerators : undefined;
|
|
536
|
+
const cache = (0, validation_js_1.isRecord)(value) ? value.cache : undefined;
|
|
537
|
+
const inputs = (0, validation_js_1.isRecord)(value) ? value.inputs : undefined;
|
|
538
|
+
const executor = (0, validation_js_1.isRecord)(value) ? value.executor : undefined;
|
|
539
|
+
const options = (0, validation_js_1.isRecord)(value) ? value.options : undefined;
|
|
540
|
+
if (!BLUEPRINT_VERIFICATION_PROJECT_ROOT.test(projectRoot) ||
|
|
541
|
+
BLUEPRINT_MUTATING_TARGET.test(name) ||
|
|
542
|
+
!(0, validation_js_1.isRecord)(value) ||
|
|
543
|
+
Object.keys(value).some((property) => !BLUEPRINT_VERIFICATION_TARGET_PROPERTIES.has(property)) ||
|
|
544
|
+
executor !== '@empire-builder-kit/nx:blueprint-verification' ||
|
|
545
|
+
!blueprintVerificationOptionsAreClosed(options) ||
|
|
546
|
+
cache !== false ||
|
|
547
|
+
!Array.isArray(value.dependsOn) ||
|
|
548
|
+
value.dependsOn.length > 1 ||
|
|
549
|
+
!sameJson(inputs, []) ||
|
|
550
|
+
!sameJson(syncGenerators, []) ||
|
|
551
|
+
(configurations !== undefined &&
|
|
552
|
+
(!(0, validation_js_1.isRecord)(configurations) || Object.keys(configurations).length > 0)) ||
|
|
553
|
+
((0, validation_js_1.isRecord)(value) && value.defaultConfiguration !== undefined) ||
|
|
554
|
+
blueprintTargetContainsRuntimeInput(inputs) ||
|
|
555
|
+
((0, validation_js_1.isRecord)(value) &&
|
|
556
|
+
value.parallelism !== undefined &&
|
|
557
|
+
value.parallelism !== true) ||
|
|
558
|
+
((0, validation_js_1.isRecord)(value) &&
|
|
559
|
+
value.continuous !== undefined &&
|
|
560
|
+
value.continuous !== false) ||
|
|
561
|
+
((0, validation_js_1.isRecord)(value) && value.metadata !== undefined) ||
|
|
562
|
+
blueprintTargetContainsRuntimeInput(normalized)) {
|
|
563
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintVerificationTarget.${name}`, 'must use the structured no-shell external verification executor without inherited target-default dependencies, runtime inputs, configurations, sync hooks, continuous processes, metadata, or unauthenticated cache behavior');
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
function blueprintVerificationTargetDependencies(name, value, projectRoot) {
|
|
567
|
+
assertBlueprintVerificationTargetAgentSafe(name, value, projectRoot);
|
|
568
|
+
const dependsOn = normalizeBlueprintVerificationTarget(name, value).dependsOn;
|
|
569
|
+
if (dependsOn === undefined)
|
|
570
|
+
return [];
|
|
571
|
+
if (!Array.isArray(dependsOn) ||
|
|
572
|
+
dependsOn.some((dependency) => typeof dependency !== 'string' ||
|
|
573
|
+
!BLUEPRINT_VERIFICATION_TARGET.test(dependency))) {
|
|
574
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintVerificationTarget.${name}.dependsOn`, 'must contain only exact same-project target names');
|
|
575
|
+
}
|
|
576
|
+
return dependsOn;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Resolves the exact, same-project dependency closure of publisher-declared
|
|
580
|
+
* verification roots. Dynamic/cross-project Nx dependency syntax is refused:
|
|
581
|
+
* a protected review must describe a closed local verification program rather
|
|
582
|
+
* than inheriting an unbounded project-graph expansion.
|
|
583
|
+
*/
|
|
584
|
+
function blueprintVerificationTargetClosure(input) {
|
|
585
|
+
if (!Array.isArray(input.roots) ||
|
|
586
|
+
input.roots.length !== 1 ||
|
|
587
|
+
input.roots.some((name) => typeof name !== 'string' || !BLUEPRINT_VERIFICATION_TARGET.test(name)) ||
|
|
588
|
+
new Set(input.roots).size !== input.roots.length ||
|
|
589
|
+
typeof input.projectRoot !== 'string' ||
|
|
590
|
+
!BLUEPRINT_VERIFICATION_PROJECT_ROOT.test(input.projectRoot) ||
|
|
591
|
+
!(0, validation_js_1.isRecord)(input.targets)) {
|
|
592
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintVerificationTargetClosure', 'requires one canonical Slice project root, exactly one local verification root, and one target map');
|
|
593
|
+
}
|
|
594
|
+
const visiting = new Set();
|
|
595
|
+
const visited = new Set();
|
|
596
|
+
const resolved = [];
|
|
597
|
+
const visit = (name) => {
|
|
598
|
+
if (visited.has(name))
|
|
599
|
+
return;
|
|
600
|
+
if (visiting.has(name)) {
|
|
601
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintVerificationTargetClosure.${name}`, 'contains a verification dependency cycle');
|
|
602
|
+
}
|
|
603
|
+
const target = input.targets[name];
|
|
604
|
+
if (!(0, validation_js_1.isRecord)(target)) {
|
|
605
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintVerificationTargetClosure.${name}`, 'is missing one exact local target definition');
|
|
606
|
+
}
|
|
607
|
+
assertBlueprintVerificationTargetAgentSafe(name, target, input.projectRoot);
|
|
608
|
+
const normalized = normalizeBlueprintVerificationTarget(name, target);
|
|
609
|
+
const dependsOn = normalized.dependsOn ?? [];
|
|
610
|
+
if (!Array.isArray(dependsOn) ||
|
|
611
|
+
dependsOn.length > 1 ||
|
|
612
|
+
dependsOn.some((dependency) => typeof dependency !== 'string' ||
|
|
613
|
+
!BLUEPRINT_VERIFICATION_TARGET.test(dependency))) {
|
|
614
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintVerificationTargetClosure.${name}.dependsOn`, 'must contain at most one exact same-project target name');
|
|
615
|
+
}
|
|
616
|
+
visiting.add(name);
|
|
617
|
+
for (const dependency of dependsOn)
|
|
618
|
+
visit(dependency);
|
|
619
|
+
visiting.delete(name);
|
|
620
|
+
visited.add(name);
|
|
621
|
+
resolved.push({
|
|
622
|
+
digest: blueprintVerificationTargetDigest(name, target),
|
|
623
|
+
name,
|
|
624
|
+
});
|
|
625
|
+
if (resolved.length > 64) {
|
|
626
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintVerificationTargetClosure', 'exceeds the 64-target dependency bound');
|
|
627
|
+
}
|
|
628
|
+
};
|
|
629
|
+
for (const root of input.roots)
|
|
630
|
+
visit(root);
|
|
631
|
+
return resolved.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(left.name, right.name));
|
|
632
|
+
}
|
|
633
|
+
function blueprintVerificationExecutionReceiptPath(slice) {
|
|
634
|
+
if (!BLUEPRINT_GENERATED_SLICE.test(slice)) {
|
|
635
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintVerificationExecutionReceipt.slice', 'must be one canonical Slice identifier');
|
|
636
|
+
}
|
|
637
|
+
return `supply-chain/blueprint-verification-receipts/${slice}.json`;
|
|
638
|
+
}
|
|
639
|
+
function createBlueprintVerificationExecutionReceipt(value, expected) {
|
|
640
|
+
const path = 'blueprintVerificationExecutionReceipt';
|
|
641
|
+
if (!(0, validation_js_1.isRecord)(value) ||
|
|
642
|
+
!hasExactProperties(value, [
|
|
643
|
+
'approvalDigest',
|
|
644
|
+
'blueprint',
|
|
645
|
+
'blueprintFiles',
|
|
646
|
+
'containerRegistries',
|
|
647
|
+
'executedRoots',
|
|
648
|
+
'executionAuthorities',
|
|
649
|
+
'executionCommit',
|
|
650
|
+
'generatedAt',
|
|
651
|
+
'kind',
|
|
652
|
+
'lockfileSha256',
|
|
653
|
+
'nodeEngine',
|
|
654
|
+
'nodeVersion',
|
|
655
|
+
'nodeVersionDeclaration',
|
|
656
|
+
'projectPath',
|
|
657
|
+
'repositoryRootCommit',
|
|
658
|
+
'schemaVersion',
|
|
659
|
+
'slice',
|
|
660
|
+
'verificationRoots',
|
|
661
|
+
'verificationTargets',
|
|
662
|
+
'workspace',
|
|
663
|
+
]) ||
|
|
664
|
+
value.kind !== 'ebk-blueprint-verification-execution' ||
|
|
665
|
+
value.schemaVersion !== exports.BLUEPRINT_TRUST_SCHEMA_VERSION ||
|
|
666
|
+
typeof value.approvalDigest !== 'string' ||
|
|
667
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(value.approvalDigest) ||
|
|
668
|
+
typeof value.workspace !== 'string' ||
|
|
669
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(value.workspace) ||
|
|
670
|
+
typeof value.executionCommit !== 'string' ||
|
|
671
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value.executionCommit) ||
|
|
672
|
+
typeof value.repositoryRootCommit !== 'string' ||
|
|
673
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value.repositoryRootCommit) ||
|
|
674
|
+
!(0, validation_js_1.isRecord)(value.blueprint) ||
|
|
675
|
+
!hasExactProperties(value.blueprint, ['integrity', 'name', 'version']) ||
|
|
676
|
+
typeof value.blueprint.name !== 'string' ||
|
|
677
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(value.blueprint.name) ||
|
|
678
|
+
typeof value.blueprint.version !== 'string' ||
|
|
679
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(value.blueprint.version) ||
|
|
680
|
+
typeof value.blueprint.integrity !== 'string' ||
|
|
681
|
+
!Array.isArray(value.executedRoots) ||
|
|
682
|
+
!Array.isArray(value.executionAuthorities) ||
|
|
683
|
+
!Array.isArray(value.verificationRoots) ||
|
|
684
|
+
value.executedRoots.length !== value.verificationRoots.length ||
|
|
685
|
+
value.executedRoots.some((execution, index) => !(0, validation_js_1.isRecord)(execution) ||
|
|
686
|
+
!hasExactProperties(execution, ['outcome', 'target']) ||
|
|
687
|
+
execution.outcome !== 'passed' ||
|
|
688
|
+
execution.target !==
|
|
689
|
+
`${value.slice}:${String(value.verificationRoots[index])}`) ||
|
|
690
|
+
typeof value.nodeVersion !== 'string' ||
|
|
691
|
+
!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(value.nodeVersion) ||
|
|
692
|
+
typeof value.nodeEngine !== 'string' ||
|
|
693
|
+
value.nodeEngine.length === 0 ||
|
|
694
|
+
value.nodeEngine.length > 256 ||
|
|
695
|
+
value.nodeEngine.trim() !== value.nodeEngine ||
|
|
696
|
+
hasControlCharacter(value.nodeEngine) ||
|
|
697
|
+
(0, semver_1.validRange)(value.nodeEngine) === null ||
|
|
698
|
+
typeof value.nodeVersionDeclaration !== 'string' ||
|
|
699
|
+
!/^\d+\.\d+\.\d+$/u.test(value.nodeVersionDeclaration) ||
|
|
700
|
+
!(0, semver_1.satisfies)(value.nodeVersion, value.nodeEngine) ||
|
|
701
|
+
!(0, semver_1.satisfies)(value.nodeVersionDeclaration, value.nodeEngine) ||
|
|
702
|
+
typeof value.lockfileSha256 !== 'string' ||
|
|
703
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(value.lockfileSha256) ||
|
|
704
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(value)) {
|
|
705
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must be one bounded, exact-root, passed Blueprint verification execution receipt');
|
|
706
|
+
}
|
|
707
|
+
validateIntegrity(value.blueprint.integrity, `${path}.blueprint.integrity`);
|
|
708
|
+
const generatedAt = timestamp(value.generatedAt, `${path}.generatedAt`);
|
|
709
|
+
const content = createBlueprintGeneratedContent({
|
|
710
|
+
blueprintFiles: value.blueprintFiles,
|
|
711
|
+
containerRegistries: value.containerRegistries,
|
|
712
|
+
projectPath: value.projectPath,
|
|
713
|
+
slice: value.slice,
|
|
714
|
+
verificationRoots: value.verificationRoots,
|
|
715
|
+
verificationTargets: value.verificationTargets,
|
|
716
|
+
}, `${path}.content`);
|
|
717
|
+
const receipt = value;
|
|
718
|
+
if (receipt.executionAuthorities.length !==
|
|
719
|
+
content.verificationTargets.length ||
|
|
720
|
+
receipt.executionAuthorities.some((authority, index) => {
|
|
721
|
+
const target = `${content.slice}:${String(content.verificationTargets[index]?.name)}`;
|
|
722
|
+
if (!(0, validation_js_1.isRecord)(authority) || authority.target !== target)
|
|
723
|
+
return true;
|
|
724
|
+
if (authority.kind === 'node') {
|
|
725
|
+
return !hasExactProperties(authority, ['kind', 'target']);
|
|
726
|
+
}
|
|
727
|
+
if (authority.kind !== 'typescript' && authority.kind !== 'vitest') {
|
|
728
|
+
return true;
|
|
729
|
+
}
|
|
730
|
+
return (!hasExactProperties(authority, [
|
|
731
|
+
'bin',
|
|
732
|
+
'importer',
|
|
733
|
+
'kind',
|
|
734
|
+
'name',
|
|
735
|
+
'specifier',
|
|
736
|
+
'target',
|
|
737
|
+
'version',
|
|
738
|
+
]) ||
|
|
739
|
+
authority.name !== authority.kind ||
|
|
740
|
+
typeof authority.bin !== 'string' ||
|
|
741
|
+
!/^\.\/[A-Za-z0-9._/-]+$/u.test(authority.bin) ||
|
|
742
|
+
authority.bin.split('/').includes('..') ||
|
|
743
|
+
(authority.importer !== '.' &&
|
|
744
|
+
(typeof authority.importer !== 'string' ||
|
|
745
|
+
!BLUEPRINT_VERIFICATION_PROJECT_ROOT.test(authority.importer))) ||
|
|
746
|
+
typeof authority.specifier !== 'string' ||
|
|
747
|
+
authority.specifier.length === 0 ||
|
|
748
|
+
authority.specifier.length > 256 ||
|
|
749
|
+
hasControlCharacter(authority.specifier) ||
|
|
750
|
+
typeof authority.version !== 'string' ||
|
|
751
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(authority.version));
|
|
752
|
+
})) {
|
|
753
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${path}.executionAuthorities`, 'must bind every executed target to one exact portable Node or locked package execution authority');
|
|
754
|
+
}
|
|
755
|
+
const selfApprovalDigest = blueprintGeneratedContentApprovalDigest(receipt.blueprint, content);
|
|
756
|
+
if (receipt.approvalDigest !== selfApprovalDigest) {
|
|
757
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${path}.approvalDigest`, 'does not bind the exact Blueprint identity and generated content carried by this execution receipt');
|
|
758
|
+
}
|
|
759
|
+
if (expected !== undefined &&
|
|
760
|
+
(receipt.approvalDigest !== expected.approvalDigest ||
|
|
761
|
+
receipt.workspace !== expected.workspace ||
|
|
762
|
+
receipt.executionCommit !== expected.executionCommit ||
|
|
763
|
+
receipt.repositoryRootCommit !== expected.repositoryRootCommit ||
|
|
764
|
+
!sameJson(receipt.blueprint, expected.blueprint) ||
|
|
765
|
+
!sameJson(content, expected.content) ||
|
|
766
|
+
generatedAt <
|
|
767
|
+
timestamp(expected.reviewedAt, `${path}.expected.reviewedAt`))) {
|
|
768
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', path, 'does not postdate and bind the exact protected approval, repository, execution commit, workspace, Blueprint release, generated bytes, registry authorities, or verification closure');
|
|
769
|
+
}
|
|
770
|
+
return {
|
|
771
|
+
...receipt,
|
|
772
|
+
blueprint: { ...receipt.blueprint },
|
|
773
|
+
blueprintFiles: content.blueprintFiles,
|
|
774
|
+
containerRegistries: content.containerRegistries,
|
|
775
|
+
executedRoots: receipt.executedRoots.map((execution) => ({
|
|
776
|
+
...execution,
|
|
777
|
+
})),
|
|
778
|
+
executionAuthorities: receipt.executionAuthorities.map((authority) => ({
|
|
779
|
+
...authority,
|
|
780
|
+
})),
|
|
781
|
+
verificationRoots: content.verificationRoots,
|
|
782
|
+
verificationTargets: content.verificationTargets,
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
function blueprintVerificationExecutionReceiptDigest(value, expected) {
|
|
786
|
+
return (0, common_js_1.supplyChainDigest)(createBlueprintVerificationExecutionReceipt(value, expected));
|
|
787
|
+
}
|
|
788
|
+
function validateGeneratedReview(value, index, now) {
|
|
789
|
+
const path = `policy.generatedReviews[${index}]`;
|
|
790
|
+
if (!(0, validation_js_1.isRecord)(value) ||
|
|
791
|
+
!hasExactProperties(value, [
|
|
792
|
+
'allowedContainerRegistries',
|
|
793
|
+
'blueprint',
|
|
794
|
+
'blueprintFiles',
|
|
795
|
+
'evidenceDigest',
|
|
796
|
+
'projectPath',
|
|
797
|
+
'reference',
|
|
798
|
+
'reviewedAt',
|
|
799
|
+
'slice',
|
|
800
|
+
'verificationRoots',
|
|
801
|
+
'verificationTargets',
|
|
802
|
+
]) ||
|
|
803
|
+
!(0, validation_js_1.isRecord)(value.blueprint) ||
|
|
804
|
+
!hasExactProperties(value.blueprint, ['integrity', 'name', 'version']) ||
|
|
805
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(value.blueprint.name) ||
|
|
806
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(value.blueprint.version) ||
|
|
807
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(value.evidenceDigest) ||
|
|
808
|
+
!common_js_1.SUPPLY_CHAIN_REFERENCE.test(value.reference) ||
|
|
809
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(value)) {
|
|
810
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'must bind one exact generated-content approval to one Blueprint Slice');
|
|
811
|
+
}
|
|
812
|
+
validateIntegrity(value.blueprint.integrity, `${path}.blueprint.integrity`);
|
|
813
|
+
const content = createBlueprintGeneratedContent({
|
|
814
|
+
blueprintFiles: value.blueprintFiles,
|
|
815
|
+
containerRegistries: value.allowedContainerRegistries,
|
|
816
|
+
projectPath: value.projectPath,
|
|
817
|
+
slice: value.slice,
|
|
818
|
+
verificationRoots: value.verificationRoots,
|
|
819
|
+
verificationTargets: value.verificationTargets,
|
|
820
|
+
}, `${path}.content`);
|
|
821
|
+
if (value.evidenceDigest !==
|
|
822
|
+
blueprintGeneratedContentApprovalDigest(value.blueprint, content)) {
|
|
823
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${path}.evidenceDigest`, 'must equal the deterministic exact generated-content approval digest');
|
|
824
|
+
}
|
|
825
|
+
if (timestamp(value.reviewedAt, `${path}.reviewedAt`) > now) {
|
|
826
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}.reviewedAt`, 'cannot be later than its repository-reviewed snapshot');
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
function validatePolicy(policy, now, requireActive) {
|
|
830
|
+
if (!(0, validation_js_1.isRecord)(policy) ||
|
|
831
|
+
!hasExactProperties(policy, [
|
|
832
|
+
'emergencyOverrides',
|
|
833
|
+
'generatedReviews',
|
|
834
|
+
'maxAgeDays',
|
|
835
|
+
'schemaVersion',
|
|
836
|
+
'snapshotDigest',
|
|
837
|
+
]) ||
|
|
838
|
+
policy.schemaVersion !== exports.BLUEPRINT_TRUST_SCHEMA_VERSION ||
|
|
839
|
+
!common_js_1.SUPPLY_CHAIN_SHA256.test(policy.snapshotDigest) ||
|
|
840
|
+
!Number.isSafeInteger(policy.maxAgeDays) ||
|
|
841
|
+
policy.maxAgeDays < 1 ||
|
|
842
|
+
policy.maxAgeDays > exports.BLUEPRINT_TRUST_MAX_FRESHNESS_DAYS ||
|
|
843
|
+
!Array.isArray(policy.emergencyOverrides) ||
|
|
844
|
+
!Array.isArray(policy.generatedReviews) ||
|
|
845
|
+
policy.generatedReviews.length > 1_000 ||
|
|
846
|
+
(0, common_js_1.hasSensitiveSupplyChainShape)(policy)) {
|
|
847
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'policy', `must pin a snapshot and bound freshness to ${exports.BLUEPRINT_TRUST_MAX_FRESHNESS_DAYS} days`);
|
|
848
|
+
}
|
|
849
|
+
const identities = new Set();
|
|
850
|
+
policy.emergencyOverrides.forEach((override, index) => {
|
|
851
|
+
validateOverride(override, index, now, requireActive);
|
|
852
|
+
const identity = `${override.name}@${override.version}`;
|
|
853
|
+
if (identities.has(identity)) {
|
|
854
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `policy.emergencyOverrides[${index}]`, `duplicates the emergency decision for ${identity}`);
|
|
855
|
+
}
|
|
856
|
+
identities.add(identity);
|
|
857
|
+
});
|
|
858
|
+
const reviewReferences = new Set();
|
|
859
|
+
policy.generatedReviews.forEach((review, index) => {
|
|
860
|
+
validateGeneratedReview(review, index, now);
|
|
861
|
+
if (reviewReferences.has(review.reference)) {
|
|
862
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `policy.generatedReviews[${index}].reference`, 'must uniquely identify one append-only generated-content review');
|
|
863
|
+
}
|
|
864
|
+
reviewReferences.add(review.reference);
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
function blueprintTrustPolicyDigest(policy) {
|
|
868
|
+
return (0, common_js_1.supplyChainDigest)(policy);
|
|
869
|
+
}
|
|
870
|
+
function createBlueprintTrustState(input) {
|
|
871
|
+
const snapshot = createBlueprintTrustSnapshot(input.snapshot);
|
|
872
|
+
validatePolicy(input.policy, timestamp(snapshot.generatedAt, 'snapshot.generatedAt'), false);
|
|
873
|
+
const snapshotDigest = blueprintTrustSnapshotDigest(snapshot);
|
|
874
|
+
if (input.policy.snapshotDigest !== snapshotDigest) {
|
|
875
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'policy.snapshotDigest', 'does not match its repository-reviewed snapshot');
|
|
876
|
+
}
|
|
877
|
+
for (const [index, review] of input.policy.generatedReviews.entries()) {
|
|
878
|
+
const entry = snapshot.entries.find(({ name, version }) => name === review.blueprint.name && version === review.blueprint.version);
|
|
879
|
+
if (!entry || entry.integrity !== review.blueprint.integrity) {
|
|
880
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `policy.generatedReviews[${index}].blueprint`, 'must bind an exact release and integrity retained by the snapshot');
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
return {
|
|
884
|
+
policy: {
|
|
885
|
+
...input.policy,
|
|
886
|
+
emergencyOverrides: input.policy.emergencyOverrides.map((override) => ({
|
|
887
|
+
...override,
|
|
888
|
+
operations: [...override.operations],
|
|
889
|
+
})),
|
|
890
|
+
generatedReviews: input.policy.generatedReviews.map((review) => ({
|
|
891
|
+
...review,
|
|
892
|
+
allowedContainerRegistries: [...review.allowedContainerRegistries],
|
|
893
|
+
blueprint: { ...review.blueprint },
|
|
894
|
+
blueprintFiles: review.blueprintFiles.map((file) => ({ ...file })),
|
|
895
|
+
verificationRoots: [...review.verificationRoots],
|
|
896
|
+
verificationTargets: review.verificationTargets.map((target) => ({
|
|
897
|
+
...target,
|
|
898
|
+
})),
|
|
899
|
+
})),
|
|
900
|
+
},
|
|
901
|
+
snapshot,
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
function blueprintTrustStateDigest(input) {
|
|
905
|
+
const state = createBlueprintTrustState(input);
|
|
906
|
+
return (0, common_js_1.supplyChainDigest)({
|
|
907
|
+
policy: state.policy,
|
|
908
|
+
snapshot: state.snapshot,
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
function authorizeBlueprintTrust(input) {
|
|
912
|
+
const now = timestamp(input.now, 'now');
|
|
913
|
+
if (!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(input.frameworkVersion) ||
|
|
914
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(input.name) ||
|
|
915
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(input.version) ||
|
|
916
|
+
!['adopt', 'deploy'].includes(input.operation)) {
|
|
917
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintTrust', 'requires exact package, release, framework, and operation identities');
|
|
918
|
+
}
|
|
919
|
+
validateIntegrity(input.integrity, 'integrity');
|
|
920
|
+
const snapshot = createBlueprintTrustSnapshot(input.snapshot);
|
|
921
|
+
validatePolicy(input.policy, now, true);
|
|
922
|
+
if (timestamp(snapshot.generatedAt, 'snapshot.generatedAt') > now) {
|
|
923
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'snapshot.generatedAt', 'reviewed trust snapshot cannot be generated in the future');
|
|
924
|
+
}
|
|
925
|
+
const digest = blueprintTrustSnapshotDigest(snapshot);
|
|
926
|
+
if (digest !== input.policy.snapshotDigest) {
|
|
927
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'policy.snapshotDigest', 'does not match the reviewed local snapshot bytes');
|
|
928
|
+
}
|
|
929
|
+
if (now - timestamp(snapshot.generatedAt, 'snapshot.generatedAt') >
|
|
930
|
+
input.policy.maxAgeDays * 24 * 60 * 60 * 1_000) {
|
|
931
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-snapshot-stale', 'snapshot.generatedAt', 'reviewed trust snapshot is outside the declared freshness bound');
|
|
932
|
+
}
|
|
933
|
+
const entry = snapshot.entries.find(({ name, version }) => name === input.name && version === input.version);
|
|
934
|
+
if (!entry || entry.integrity !== input.integrity) {
|
|
935
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${input.name}@${input.version}`, 'is absent from the snapshot or has different registry integrity');
|
|
936
|
+
}
|
|
937
|
+
if (!(0, semver_1.satisfies)(input.frameworkVersion, entry.compatibleFramework)) {
|
|
938
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${input.name}@${input.version}`, `is not reviewed for framework ${input.frameworkVersion}`);
|
|
939
|
+
}
|
|
940
|
+
if (entry.lifecycle === 'verified') {
|
|
941
|
+
return {
|
|
942
|
+
decision: 'allow',
|
|
943
|
+
entry: {
|
|
944
|
+
lifecycle: entry.lifecycle,
|
|
945
|
+
name: entry.name,
|
|
946
|
+
version: entry.version,
|
|
947
|
+
},
|
|
948
|
+
reason: 'verified',
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
if (entry.lifecycle === 'deprecated') {
|
|
952
|
+
return {
|
|
953
|
+
decision: 'allow',
|
|
954
|
+
entry: {
|
|
955
|
+
lifecycle: entry.lifecycle,
|
|
956
|
+
name: entry.name,
|
|
957
|
+
version: entry.version,
|
|
958
|
+
},
|
|
959
|
+
reason: 'deprecated',
|
|
960
|
+
};
|
|
961
|
+
}
|
|
962
|
+
const override = input.policy.emergencyOverrides.find((candidate) => candidate.name === entry.name &&
|
|
963
|
+
candidate.version === entry.version &&
|
|
964
|
+
candidate.exactIntegrity === entry.integrity &&
|
|
965
|
+
candidate.operations.includes(input.operation));
|
|
966
|
+
if (override) {
|
|
967
|
+
return {
|
|
968
|
+
decision: 'allow',
|
|
969
|
+
entry: {
|
|
970
|
+
lifecycle: entry.lifecycle,
|
|
971
|
+
name: entry.name,
|
|
972
|
+
version: entry.version,
|
|
973
|
+
},
|
|
974
|
+
override: {
|
|
975
|
+
approver: override.approver,
|
|
976
|
+
expiresAt: override.expiresAt,
|
|
977
|
+
recoveryWork: override.recoveryWork,
|
|
978
|
+
},
|
|
979
|
+
reason: 'emergency-override',
|
|
980
|
+
};
|
|
981
|
+
}
|
|
982
|
+
const result = {
|
|
983
|
+
decision: 'deny',
|
|
984
|
+
entry: {
|
|
985
|
+
lifecycle: entry.lifecycle,
|
|
986
|
+
name: entry.name,
|
|
987
|
+
version: entry.version,
|
|
988
|
+
},
|
|
989
|
+
reason: 'lifecycle-denied',
|
|
990
|
+
};
|
|
991
|
+
if (entry.lifecycle === 'revoked') {
|
|
992
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-revoked', `${entry.name}@${entry.version}`, `is revoked for ${input.operation}; use the reviewed recovery or exact emergency path`);
|
|
993
|
+
}
|
|
994
|
+
return result;
|
|
995
|
+
}
|
|
996
|
+
function authorizeBlueprintOwnershipInventory(input) {
|
|
997
|
+
timestamp(input.now, 'now');
|
|
998
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(input.builtIn.name) ||
|
|
999
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(input.builtIn.version) ||
|
|
1000
|
+
!Array.isArray(input.builtIn.provenance) ||
|
|
1001
|
+
input.builtIn.provenance.length > 1_000 ||
|
|
1002
|
+
!Array.isArray(input.generatedContent) ||
|
|
1003
|
+
input.generatedContent.length > 1_000 ||
|
|
1004
|
+
!['adopt', 'deploy'].includes(input.operation) ||
|
|
1005
|
+
!Array.isArray(input.ownership) ||
|
|
1006
|
+
input.ownership.length > 1_000 ||
|
|
1007
|
+
!(0, validation_js_1.isRecord)(input.manifest) ||
|
|
1008
|
+
typeof input.manifest.name !== 'string' ||
|
|
1009
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(input.manifest.name) ||
|
|
1010
|
+
!Array.isArray(input.verificationReceipts) ||
|
|
1011
|
+
input.verificationReceipts.length > 1_000 ||
|
|
1012
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(input.repositoryRootCommit)) {
|
|
1013
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintOwnership', 'requires one exact in-process Blueprint identity, a bounded ownership inventory, and a workspace manifest');
|
|
1014
|
+
}
|
|
1015
|
+
const byIdentity = new Map();
|
|
1016
|
+
const provenanceByPath = new Map();
|
|
1017
|
+
for (const [index, provenance] of input.builtIn.provenance.entries()) {
|
|
1018
|
+
const candidate = provenance;
|
|
1019
|
+
if (!(0, validation_js_1.isRecord)(candidate) ||
|
|
1020
|
+
!hasExactProperties(candidate, [
|
|
1021
|
+
'authority',
|
|
1022
|
+
...(candidate.commit === undefined ? [] : ['commit']),
|
|
1023
|
+
'name',
|
|
1024
|
+
'path',
|
|
1025
|
+
'version',
|
|
1026
|
+
]) ||
|
|
1027
|
+
typeof candidate.authority !== 'string' ||
|
|
1028
|
+
![
|
|
1029
|
+
'candidate-git-history',
|
|
1030
|
+
'protected-git-history',
|
|
1031
|
+
'working-tree-adoption',
|
|
1032
|
+
].includes(candidate.authority) ||
|
|
1033
|
+
typeof candidate.path !== 'string' ||
|
|
1034
|
+
typeof candidate.name !== 'string' ||
|
|
1035
|
+
typeof candidate.version !== 'string' ||
|
|
1036
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(candidate.name) ||
|
|
1037
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(candidate.version) ||
|
|
1038
|
+
!/^packages\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*\/\.ebk\/ownership\.json$/.test(candidate.path) ||
|
|
1039
|
+
(candidate.commit !== undefined &&
|
|
1040
|
+
(typeof candidate.commit !== 'string' ||
|
|
1041
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(candidate.commit))) ||
|
|
1042
|
+
(candidate.authority === 'working-tree-adoption' &&
|
|
1043
|
+
candidate.commit !== undefined) ||
|
|
1044
|
+
(candidate.authority !== 'working-tree-adoption' &&
|
|
1045
|
+
candidate.commit === undefined) ||
|
|
1046
|
+
provenanceByPath.has(candidate.path)) {
|
|
1047
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintOwnership.builtIn.provenance[${index}]`, 'must be one unique Git-derived built-in provenance decision');
|
|
1048
|
+
}
|
|
1049
|
+
provenanceByPath.set(candidate.path, candidate);
|
|
1050
|
+
}
|
|
1051
|
+
const generatedContentBySlice = new Map();
|
|
1052
|
+
for (const [index, candidate] of input.generatedContent.entries()) {
|
|
1053
|
+
const content = createBlueprintGeneratedContent(candidate, `blueprintOwnership.generatedContent[${index}]`);
|
|
1054
|
+
if (generatedContentBySlice.has(content.slice)) {
|
|
1055
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintOwnership.generatedContent[${index}]`, `duplicates Slice ${content.slice}`);
|
|
1056
|
+
}
|
|
1057
|
+
generatedContentBySlice.set(content.slice, content);
|
|
1058
|
+
}
|
|
1059
|
+
const verificationReceiptBySlice = new Map();
|
|
1060
|
+
const workspaceNodeEngine = (0, validation_js_1.isRecord)(input.manifest.engines)
|
|
1061
|
+
? input.manifest.engines.node
|
|
1062
|
+
: undefined;
|
|
1063
|
+
for (const [index, candidate] of input.verificationReceipts.entries()) {
|
|
1064
|
+
if (!(0, validation_js_1.isRecord)(candidate) ||
|
|
1065
|
+
!hasExactProperties(candidate, [
|
|
1066
|
+
'protectedCommit',
|
|
1067
|
+
'receipt',
|
|
1068
|
+
'reference',
|
|
1069
|
+
]) ||
|
|
1070
|
+
typeof candidate.protectedCommit !== 'string' ||
|
|
1071
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(candidate.protectedCommit)) {
|
|
1072
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintOwnership.verificationReceipts[${index}]`, 'must be one exact protected-Git receipt blob');
|
|
1073
|
+
}
|
|
1074
|
+
const receipt = createBlueprintVerificationExecutionReceipt(candidate.receipt);
|
|
1075
|
+
if (typeof input.lockfile !== 'string' ||
|
|
1076
|
+
(0, node_crypto_1.createHash)('sha256').update(input.lockfile, 'utf8').digest('hex') !==
|
|
1077
|
+
receipt.lockfileSha256) {
|
|
1078
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintOwnership.verificationReceipts[${index}].receipt.lockfileSha256`, 'must bind the exact current bounded pnpm lockfile bytes');
|
|
1079
|
+
}
|
|
1080
|
+
if (typeof workspaceNodeEngine !== 'string' ||
|
|
1081
|
+
workspaceNodeEngine !== receipt.nodeEngine ||
|
|
1082
|
+
input.nodeVersionSource !== `${receipt.nodeVersionDeclaration}\n` ||
|
|
1083
|
+
!(0, semver_1.satisfies)(receipt.nodeVersion, workspaceNodeEngine)) {
|
|
1084
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintOwnership.verificationReceipts[${index}].receipt.nodeVersion`, 'must record an execution Node version allowed by the protected workspace engine contract');
|
|
1085
|
+
}
|
|
1086
|
+
if (candidate.reference !==
|
|
1087
|
+
blueprintVerificationExecutionReceiptPath(receipt.slice)) {
|
|
1088
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `blueprintOwnership.verificationReceipts[${index}].reference`, 'must equal the canonical protected receipt path for its Slice');
|
|
1089
|
+
}
|
|
1090
|
+
if (verificationReceiptBySlice.has(receipt.slice)) {
|
|
1091
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintOwnership.verificationReceipts[${index}]`, `duplicates Slice ${receipt.slice}`);
|
|
1092
|
+
}
|
|
1093
|
+
verificationReceiptBySlice.set(receipt.slice, receipt);
|
|
1094
|
+
}
|
|
1095
|
+
const seenSlices = new Set();
|
|
1096
|
+
const externalSlices = new Set();
|
|
1097
|
+
const blueprintFileShapesBySlice = new Map();
|
|
1098
|
+
for (const [index, candidate] of input.ownership.entries()) {
|
|
1099
|
+
if (!(0, validation_js_1.isRecord)(candidate) ||
|
|
1100
|
+
typeof candidate.path !== 'string' ||
|
|
1101
|
+
!Object.prototype.hasOwnProperty.call(candidate, 'value')) {
|
|
1102
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintOwnership[${index}]`, 'must bind one ownership value to its repository-relative path');
|
|
1103
|
+
}
|
|
1104
|
+
const validated = (0, record_js_1.validateGeneratedOwnershipRecord)(candidate.value);
|
|
1105
|
+
if (!validated.valid) {
|
|
1106
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', candidate.path, validated.issues
|
|
1107
|
+
.slice(0, 10)
|
|
1108
|
+
.map(({ message, path }) => `${path}: ${message}`)
|
|
1109
|
+
.join('; '));
|
|
1110
|
+
}
|
|
1111
|
+
const ownership = validated.value;
|
|
1112
|
+
const expectedPath = `packages/${ownership.slice}/.ebk/ownership.json`;
|
|
1113
|
+
if (candidate.path !== expectedPath || seenSlices.has(ownership.slice)) {
|
|
1114
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', candidate.path, candidate.path !== expectedPath
|
|
1115
|
+
? `must equal ${expectedPath}`
|
|
1116
|
+
: `duplicates Slice ${ownership.slice}`);
|
|
1117
|
+
}
|
|
1118
|
+
seenSlices.add(ownership.slice);
|
|
1119
|
+
const source = ownership.blueprint.name === input.builtIn.name
|
|
1120
|
+
? 'built-in'
|
|
1121
|
+
: 'external';
|
|
1122
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(ownership.blueprint.name) ||
|
|
1123
|
+
!common_js_1.SUPPLY_CHAIN_EXACT_VERSION.test(ownership.blueprint.version) ||
|
|
1124
|
+
(source === 'built-in' &&
|
|
1125
|
+
ownership.blueprint.version !== input.builtIn.version)) {
|
|
1126
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${candidate.path}#blueprint`, source === 'built-in'
|
|
1127
|
+
? `must match in-process ${input.builtIn.name}@${input.builtIn.version}`
|
|
1128
|
+
: 'must identify an exact external package release');
|
|
1129
|
+
}
|
|
1130
|
+
if (source === 'built-in') {
|
|
1131
|
+
const provenance = provenanceByPath.get(candidate.path);
|
|
1132
|
+
if (!provenance ||
|
|
1133
|
+
provenance.name !== ownership.blueprint.name ||
|
|
1134
|
+
provenance.version !== ownership.blueprint.version ||
|
|
1135
|
+
(input.operation === 'deploy' &&
|
|
1136
|
+
provenance.authority !== 'protected-git-history')) {
|
|
1137
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${candidate.path}#blueprint`, input.operation === 'deploy'
|
|
1138
|
+
? 'built-in provenance must be established by the protected Git history before deployment'
|
|
1139
|
+
: 'built-in provenance must be established by Git history or a new working-tree adoption');
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
else {
|
|
1143
|
+
externalSlices.add(ownership.slice);
|
|
1144
|
+
blueprintFileShapesBySlice.set(ownership.slice, ownership.paths
|
|
1145
|
+
.filter(({ origin }) => origin === 'blueprint')
|
|
1146
|
+
.map(({ mode, path }) => ({ mode, path }))
|
|
1147
|
+
.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(left.path, right.path)));
|
|
1148
|
+
}
|
|
1149
|
+
const identity = `${ownership.blueprint.name}@${ownership.blueprint.version}`;
|
|
1150
|
+
const existing = byIdentity.get(identity);
|
|
1151
|
+
if (existing) {
|
|
1152
|
+
existing.slices.add(ownership.slice);
|
|
1153
|
+
}
|
|
1154
|
+
else {
|
|
1155
|
+
byIdentity.set(identity, {
|
|
1156
|
+
name: ownership.blueprint.name,
|
|
1157
|
+
slices: new Set([ownership.slice]),
|
|
1158
|
+
source,
|
|
1159
|
+
version: ownership.blueprint.version,
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
if (generatedContentBySlice.size !== externalSlices.size ||
|
|
1164
|
+
[...generatedContentBySlice.keys()].some((slice) => !externalSlices.has(slice)) ||
|
|
1165
|
+
verificationReceiptBySlice.size !== externalSlices.size ||
|
|
1166
|
+
[...verificationReceiptBySlice.keys()].some((slice) => !externalSlices.has(slice))) {
|
|
1167
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', 'blueprintOwnership.generatedContent', 'must cover every and only externally generated Slice');
|
|
1168
|
+
}
|
|
1169
|
+
const devDependencies = (0, validation_js_1.isRecord)(input.manifest.devDependencies)
|
|
1170
|
+
? input.manifest.devDependencies
|
|
1171
|
+
: {};
|
|
1172
|
+
const decisions = [];
|
|
1173
|
+
for (const blueprint of [...byIdentity.values()].sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.name}\0${left.version}`, `${right.name}\0${right.version}`))) {
|
|
1174
|
+
const slices = [...blueprint.slices].sort();
|
|
1175
|
+
if (blueprint.source === 'built-in') {
|
|
1176
|
+
const authorities = slices.map((slice) => {
|
|
1177
|
+
const provenance = provenanceByPath.get(`packages/${slice}/.ebk/ownership.json`);
|
|
1178
|
+
if (!provenance) {
|
|
1179
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `packages/${slice}/.ebk/ownership.json#blueprint`, 'is missing built-in provenance');
|
|
1180
|
+
}
|
|
1181
|
+
return provenance.authority;
|
|
1182
|
+
});
|
|
1183
|
+
decisions.push({
|
|
1184
|
+
name: blueprint.name,
|
|
1185
|
+
provenance: authorities.includes('working-tree-adoption')
|
|
1186
|
+
? 'working-tree-adoption'
|
|
1187
|
+
: authorities.includes('candidate-git-history')
|
|
1188
|
+
? 'candidate-git-history'
|
|
1189
|
+
: 'protected-git-history',
|
|
1190
|
+
reason: 'in-process',
|
|
1191
|
+
slices,
|
|
1192
|
+
source: blueprint.source,
|
|
1193
|
+
version: blueprint.version,
|
|
1194
|
+
});
|
|
1195
|
+
continue;
|
|
1196
|
+
}
|
|
1197
|
+
if (devDependencies[blueprint.name] !== blueprint.version) {
|
|
1198
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `package.json#devDependencies.${blueprint.name}`, `must declare exact generated Blueprint version ${blueprint.version}`);
|
|
1199
|
+
}
|
|
1200
|
+
if (typeof input.lockfile !== 'string' ||
|
|
1201
|
+
input.policy === undefined ||
|
|
1202
|
+
input.snapshot === undefined) {
|
|
1203
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${blueprint.name}@${blueprint.version}`, 'requires the exact lockfile and reviewed offline trust inputs');
|
|
1204
|
+
}
|
|
1205
|
+
const integrity = resolveBlueprintPackageIntegrity(input.lockfile, blueprint.name, blueprint.version);
|
|
1206
|
+
const decision = authorizeBlueprintTrust({
|
|
1207
|
+
frameworkVersion: input.builtIn.version,
|
|
1208
|
+
integrity,
|
|
1209
|
+
name: blueprint.name,
|
|
1210
|
+
now: input.now,
|
|
1211
|
+
operation: input.operation,
|
|
1212
|
+
policy: input.policy,
|
|
1213
|
+
snapshot: input.snapshot,
|
|
1214
|
+
version: blueprint.version,
|
|
1215
|
+
});
|
|
1216
|
+
if (decision.decision !== 'allow' ||
|
|
1217
|
+
decision.reason === 'lifecycle-denied') {
|
|
1218
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `${blueprint.name}@${blueprint.version}`, `${decision.entry.lifecycle} lifecycle denies ${input.operation}`);
|
|
1219
|
+
}
|
|
1220
|
+
for (const slice of slices) {
|
|
1221
|
+
const content = generatedContentBySlice.get(slice);
|
|
1222
|
+
if (!content) {
|
|
1223
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `packages/${slice}/project.json`, 'has no exact generated-content inventory');
|
|
1224
|
+
}
|
|
1225
|
+
const expectedFileShapes = blueprintFileShapesBySlice.get(slice);
|
|
1226
|
+
const actualFileShapes = content.blueprintFiles.map(({ mode, path }) => ({
|
|
1227
|
+
mode,
|
|
1228
|
+
path,
|
|
1229
|
+
}));
|
|
1230
|
+
if (expectedFileShapes === undefined ||
|
|
1231
|
+
!sameJson(actualFileShapes, expectedFileShapes)) {
|
|
1232
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `packages/${slice}/.ebk/ownership.json#paths`, 'every and only Blueprint-origin managed and seeded file must appear in the exact full-byte approval inventory');
|
|
1233
|
+
}
|
|
1234
|
+
const receipt = verificationReceiptBySlice.get(slice);
|
|
1235
|
+
if (!receipt) {
|
|
1236
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', blueprintVerificationExecutionReceiptPath(slice), 'is required for every externally generated Slice');
|
|
1237
|
+
}
|
|
1238
|
+
const exactBlueprint = {
|
|
1239
|
+
integrity,
|
|
1240
|
+
name: blueprint.name,
|
|
1241
|
+
version: blueprint.version,
|
|
1242
|
+
};
|
|
1243
|
+
const approvalDigest = blueprintGeneratedContentApprovalDigest(exactBlueprint, content);
|
|
1244
|
+
const review = input.policy.generatedReviews.find((review) => review.blueprint.name === blueprint.name &&
|
|
1245
|
+
review.blueprint.version === blueprint.version &&
|
|
1246
|
+
review.blueprint.integrity === integrity &&
|
|
1247
|
+
review.slice === slice &&
|
|
1248
|
+
review.projectPath === content.projectPath &&
|
|
1249
|
+
(0, common_js_1.supplyChainDigest)(review.verificationTargets) ===
|
|
1250
|
+
(0, common_js_1.supplyChainDigest)(content.verificationTargets) &&
|
|
1251
|
+
(0, common_js_1.supplyChainDigest)(review.blueprintFiles) ===
|
|
1252
|
+
(0, common_js_1.supplyChainDigest)(content.blueprintFiles) &&
|
|
1253
|
+
(0, common_js_1.supplyChainDigest)(review.verificationRoots) ===
|
|
1254
|
+
(0, common_js_1.supplyChainDigest)(content.verificationRoots) &&
|
|
1255
|
+
(0, common_js_1.supplyChainDigest)(review.allowedContainerRegistries) ===
|
|
1256
|
+
(0, common_js_1.supplyChainDigest)(content.containerRegistries) &&
|
|
1257
|
+
review.evidenceDigest === approvalDigest);
|
|
1258
|
+
if (!review) {
|
|
1259
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `packages/${slice}/project.json`, 'verification roots, target closure, full Blueprint-origin bytes, or Blueprint-authored container registries lack an exact protected generated-content approval');
|
|
1260
|
+
}
|
|
1261
|
+
blueprintVerificationExecutionReceiptDigest(receipt, {
|
|
1262
|
+
approvalDigest: review.evidenceDigest,
|
|
1263
|
+
blueprint: exactBlueprint,
|
|
1264
|
+
content,
|
|
1265
|
+
executionCommit: receipt.executionCommit,
|
|
1266
|
+
repositoryRootCommit: input.repositoryRootCommit,
|
|
1267
|
+
reviewedAt: review.reviewedAt,
|
|
1268
|
+
workspace: input.manifest.name,
|
|
1269
|
+
});
|
|
1270
|
+
}
|
|
1271
|
+
decisions.push({
|
|
1272
|
+
integrity,
|
|
1273
|
+
lifecycle: decision.entry.lifecycle,
|
|
1274
|
+
name: blueprint.name,
|
|
1275
|
+
reason: decision.reason,
|
|
1276
|
+
slices,
|
|
1277
|
+
source: blueprint.source,
|
|
1278
|
+
version: blueprint.version,
|
|
1279
|
+
});
|
|
1280
|
+
}
|
|
1281
|
+
return {
|
|
1282
|
+
decisions,
|
|
1283
|
+
generatedAt: input.now,
|
|
1284
|
+
kind: 'ebk-blueprint-trust-check',
|
|
1285
|
+
operation: input.operation,
|
|
1286
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
1287
|
+
};
|
|
1288
|
+
}
|
|
1289
|
+
const ALLOWED_TRANSITIONS = {
|
|
1290
|
+
candidate: ['verified', 'quarantined', 'revoked'],
|
|
1291
|
+
deprecated: ['quarantined', 'retired', 'revoked', 'verified'],
|
|
1292
|
+
quarantined: ['deprecated', 'retired', 'revoked', 'verified'],
|
|
1293
|
+
retired: [],
|
|
1294
|
+
revoked: [],
|
|
1295
|
+
verified: ['deprecated', 'quarantined', 'revoked'],
|
|
1296
|
+
};
|
|
1297
|
+
function planBlueprintTrustSnapshotUpdate(currentInput, proposedInput) {
|
|
1298
|
+
const current = createBlueprintTrustSnapshot(currentInput);
|
|
1299
|
+
const proposed = createBlueprintTrustSnapshot(proposedInput);
|
|
1300
|
+
if (proposed.sequence <= current.sequence ||
|
|
1301
|
+
timestamp(proposed.generatedAt, 'proposed.generatedAt') <=
|
|
1302
|
+
timestamp(current.generatedAt, 'current.generatedAt')) {
|
|
1303
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'proposed', 'must advance both snapshot sequence and generation time');
|
|
1304
|
+
}
|
|
1305
|
+
const proposedByIdentity = new Map(proposed.entries.map((entry) => [`${entry.name}@${entry.version}`, entry]));
|
|
1306
|
+
const changes = [];
|
|
1307
|
+
for (const currentEntry of current.entries) {
|
|
1308
|
+
const identity = `${currentEntry.name}@${currentEntry.version}`;
|
|
1309
|
+
const next = proposedByIdentity.get(identity);
|
|
1310
|
+
if (!next) {
|
|
1311
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}`, 'cannot remove an exact release and erase its revocation history');
|
|
1312
|
+
}
|
|
1313
|
+
if (next.integrity !== currentEntry.integrity ||
|
|
1314
|
+
next.compatibleFramework !== currentEntry.compatibleFramework) {
|
|
1315
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}`, 'cannot rewrite immutable package integrity or compatibility identity');
|
|
1316
|
+
}
|
|
1317
|
+
const metadataChanged = next.notice !== currentEntry.notice ||
|
|
1318
|
+
next.support !== currentEntry.support;
|
|
1319
|
+
if (next.lifecycle !== currentEntry.lifecycle) {
|
|
1320
|
+
if (!ALLOWED_TRANSITIONS[currentEntry.lifecycle].includes(next.lifecycle)) {
|
|
1321
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}.lifecycle`, `cannot transition ${currentEntry.lifecycle} to ${next.lifecycle}`);
|
|
1322
|
+
}
|
|
1323
|
+
if (next.evidenceDigest === currentEntry.evidenceDigest) {
|
|
1324
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}.evidenceDigest`, 'lifecycle transition requires new reviewed evidence');
|
|
1325
|
+
}
|
|
1326
|
+
changes.push({
|
|
1327
|
+
from: currentEntry.lifecycle,
|
|
1328
|
+
identity,
|
|
1329
|
+
kind: 'lifecycle',
|
|
1330
|
+
to: next.lifecycle,
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
else if (metadataChanged) {
|
|
1334
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}`, 'snapshot-only planning cannot rewrite reviewed support metadata');
|
|
1335
|
+
}
|
|
1336
|
+
else if (next.evidenceDigest !== currentEntry.evidenceDigest) {
|
|
1337
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.entries.${identity}.evidenceDigest`, 'cannot rewrite evidence without a trust decision change');
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
const currentIdentities = new Set(current.entries.map(({ name, version }) => `${name}@${version}`));
|
|
1341
|
+
for (const entry of proposed.entries) {
|
|
1342
|
+
const identity = `${entry.name}@${entry.version}`;
|
|
1343
|
+
if (!currentIdentities.has(identity)) {
|
|
1344
|
+
changes.push({
|
|
1345
|
+
identity,
|
|
1346
|
+
kind: 'added',
|
|
1347
|
+
to: entry.lifecycle,
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
if (changes.length === 0) {
|
|
1352
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'proposed', 'contains no trust decision change');
|
|
1353
|
+
}
|
|
1354
|
+
return {
|
|
1355
|
+
applies: false,
|
|
1356
|
+
changes: changes.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(left.identity, right.identity)),
|
|
1357
|
+
currentDigest: blueprintTrustSnapshotDigest(current),
|
|
1358
|
+
proposedDigest: blueprintTrustSnapshotDigest(proposed),
|
|
1359
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
function compareTrustChange(left, right) {
|
|
1363
|
+
const leftKey = `${left.identity}\0${left.kind}`;
|
|
1364
|
+
const rightKey = `${right.identity}\0${right.kind}`;
|
|
1365
|
+
return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;
|
|
1366
|
+
}
|
|
1367
|
+
function emergencyOverrideIdentity(value) {
|
|
1368
|
+
return `${value.name}@${value.version}`;
|
|
1369
|
+
}
|
|
1370
|
+
function transitionStateIdentity(state) {
|
|
1371
|
+
return {
|
|
1372
|
+
policyDigest: blueprintTrustPolicyDigest(state.policy),
|
|
1373
|
+
sequence: state.snapshot.sequence,
|
|
1374
|
+
snapshotDigest: blueprintTrustSnapshotDigest(state.snapshot),
|
|
1375
|
+
stateDigest: blueprintTrustStateDigest(state),
|
|
1376
|
+
};
|
|
1377
|
+
}
|
|
1378
|
+
function planBlueprintTrustStateTransition(currentInput, proposedInput) {
|
|
1379
|
+
const current = createBlueprintTrustState(currentInput);
|
|
1380
|
+
const proposed = createBlueprintTrustState(proposedInput);
|
|
1381
|
+
if (proposed.snapshot.sequence <= current.snapshot.sequence ||
|
|
1382
|
+
timestamp(proposed.snapshot.generatedAt, 'proposed.snapshot.generatedAt') <=
|
|
1383
|
+
timestamp(current.snapshot.generatedAt, 'current.snapshot.generatedAt')) {
|
|
1384
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'proposed', 'must advance both snapshot sequence and generation time');
|
|
1385
|
+
}
|
|
1386
|
+
const proposedByIdentity = new Map(proposed.snapshot.entries.map((entry) => [
|
|
1387
|
+
`${entry.name}@${entry.version}`,
|
|
1388
|
+
entry,
|
|
1389
|
+
]));
|
|
1390
|
+
const changes = [];
|
|
1391
|
+
for (const currentEntry of current.snapshot.entries) {
|
|
1392
|
+
const identity = `${currentEntry.name}@${currentEntry.version}`;
|
|
1393
|
+
const next = proposedByIdentity.get(identity);
|
|
1394
|
+
if (!next) {
|
|
1395
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.snapshot.entries.${identity}`, 'cannot remove an exact release and erase its trust history');
|
|
1396
|
+
}
|
|
1397
|
+
if (next.integrity !== currentEntry.integrity ||
|
|
1398
|
+
next.compatibleFramework !== currentEntry.compatibleFramework) {
|
|
1399
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.snapshot.entries.${identity}`, 'cannot rewrite immutable package integrity or compatibility identity');
|
|
1400
|
+
}
|
|
1401
|
+
const lifecycleChanged = next.lifecycle !== currentEntry.lifecycle;
|
|
1402
|
+
const metadataChanged = next.notice !== currentEntry.notice ||
|
|
1403
|
+
next.support !== currentEntry.support;
|
|
1404
|
+
const evidenceChanged = next.evidenceDigest !== currentEntry.evidenceDigest;
|
|
1405
|
+
if (lifecycleChanged) {
|
|
1406
|
+
if (!ALLOWED_TRANSITIONS[currentEntry.lifecycle].includes(next.lifecycle)) {
|
|
1407
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.snapshot.entries.${identity}.lifecycle`, `cannot transition ${currentEntry.lifecycle} to ${next.lifecycle}`);
|
|
1408
|
+
}
|
|
1409
|
+
if (!evidenceChanged) {
|
|
1410
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.snapshot.entries.${identity}.evidenceDigest`, 'lifecycle transition requires new reviewed evidence');
|
|
1411
|
+
}
|
|
1412
|
+
changes.push({
|
|
1413
|
+
from: currentEntry.lifecycle,
|
|
1414
|
+
identity,
|
|
1415
|
+
kind: 'lifecycle',
|
|
1416
|
+
to: next.lifecycle,
|
|
1417
|
+
});
|
|
1418
|
+
}
|
|
1419
|
+
else if (metadataChanged || evidenceChanged) {
|
|
1420
|
+
if (!evidenceChanged) {
|
|
1421
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.snapshot.entries.${identity}.evidenceDigest`, 'reviewed support metadata change requires new evidence');
|
|
1422
|
+
}
|
|
1423
|
+
changes.push({ identity, kind: 'reviewed-evidence' });
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
const currentIdentities = new Set(current.snapshot.entries.map(({ name, version }) => `${name}@${version}`));
|
|
1427
|
+
for (const entry of proposed.snapshot.entries) {
|
|
1428
|
+
const identity = `${entry.name}@${entry.version}`;
|
|
1429
|
+
if (!currentIdentities.has(identity)) {
|
|
1430
|
+
changes.push({ identity, kind: 'added', to: entry.lifecycle });
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
if (current.policy.maxAgeDays !== proposed.policy.maxAgeDays) {
|
|
1434
|
+
changes.push({
|
|
1435
|
+
from: current.policy.maxAgeDays,
|
|
1436
|
+
identity: 'policy.maxAgeDays',
|
|
1437
|
+
kind: 'freshness',
|
|
1438
|
+
to: proposed.policy.maxAgeDays,
|
|
1439
|
+
});
|
|
1440
|
+
}
|
|
1441
|
+
const currentOverrides = new Map(current.policy.emergencyOverrides.map((override) => [
|
|
1442
|
+
emergencyOverrideIdentity(override),
|
|
1443
|
+
override,
|
|
1444
|
+
]));
|
|
1445
|
+
const proposedOverrides = new Map(proposed.policy.emergencyOverrides.map((override) => [
|
|
1446
|
+
emergencyOverrideIdentity(override),
|
|
1447
|
+
override,
|
|
1448
|
+
]));
|
|
1449
|
+
for (const [identity, override] of currentOverrides) {
|
|
1450
|
+
const next = proposedOverrides.get(identity);
|
|
1451
|
+
if (!next) {
|
|
1452
|
+
changes.push({ identity, kind: 'emergency-override-removed' });
|
|
1453
|
+
continue;
|
|
1454
|
+
}
|
|
1455
|
+
if ((0, common_js_1.supplyChainDigest)(next) !== (0, common_js_1.supplyChainDigest)(override)) {
|
|
1456
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.policy.emergencyOverrides.${identity}`, 'cannot rewrite an attributable emergency decision in place');
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
for (const [identity, override] of proposedOverrides) {
|
|
1460
|
+
if (currentOverrides.has(identity))
|
|
1461
|
+
continue;
|
|
1462
|
+
const entry = proposedByIdentity.get(identity);
|
|
1463
|
+
if (!entry || entry.integrity !== override.exactIntegrity) {
|
|
1464
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.policy.emergencyOverrides.${identity}`, 'must bind an exact release and integrity retained by the snapshot');
|
|
1465
|
+
}
|
|
1466
|
+
changes.push({ identity, kind: 'emergency-override-added' });
|
|
1467
|
+
}
|
|
1468
|
+
const currentReviews = new Map(current.policy.generatedReviews.map((review) => [review.reference, review]));
|
|
1469
|
+
const proposedReviews = new Map(proposed.policy.generatedReviews.map((review) => [
|
|
1470
|
+
review.reference,
|
|
1471
|
+
review,
|
|
1472
|
+
]));
|
|
1473
|
+
for (const [reference, review] of currentReviews) {
|
|
1474
|
+
const next = proposedReviews.get(reference);
|
|
1475
|
+
if (!next) {
|
|
1476
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.policy.generatedReviews.${reference}`, 'cannot remove an append-only generated-content review');
|
|
1477
|
+
}
|
|
1478
|
+
if ((0, common_js_1.supplyChainDigest)(next) !== (0, common_js_1.supplyChainDigest)(review)) {
|
|
1479
|
+
throw new errors_js_1.SupplyChainError('supply-chain-blueprint-untrusted', `proposed.policy.generatedReviews.${reference}`, 'cannot rewrite an append-only generated-content review');
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
for (const reference of proposedReviews.keys()) {
|
|
1483
|
+
if (!currentReviews.has(reference)) {
|
|
1484
|
+
changes.push({
|
|
1485
|
+
identity: reference,
|
|
1486
|
+
kind: 'generated-content-review-added',
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
if (changes.length === 0) {
|
|
1491
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'proposed', 'contains no trust or policy decision change');
|
|
1492
|
+
}
|
|
1493
|
+
if (proposed.snapshot.source.reference === current.snapshot.source.reference) {
|
|
1494
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'proposed.snapshot.source.reference', 'must identify the new repository review for this transition');
|
|
1495
|
+
}
|
|
1496
|
+
const currentIdentity = transitionStateIdentity(current);
|
|
1497
|
+
const proposedIdentity = transitionStateIdentity(proposed);
|
|
1498
|
+
const receiptWithoutDigest = {
|
|
1499
|
+
changes: changes.sort(compareTrustChange),
|
|
1500
|
+
current: currentIdentity,
|
|
1501
|
+
kind: 'ebk-blueprint-trust-transition',
|
|
1502
|
+
proposed: proposedIdentity,
|
|
1503
|
+
reference: proposed.snapshot.source.reference,
|
|
1504
|
+
reviewedAt: proposed.snapshot.generatedAt,
|
|
1505
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
1506
|
+
};
|
|
1507
|
+
return {
|
|
1508
|
+
applies: false,
|
|
1509
|
+
receipt: {
|
|
1510
|
+
...receiptWithoutDigest,
|
|
1511
|
+
transitionDigest: (0, common_js_1.supplyChainDigest)(receiptWithoutDigest),
|
|
1512
|
+
},
|
|
1513
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
1514
|
+
};
|
|
1515
|
+
}
|
|
1516
|
+
function validateBlueprintTrustHistory(input) {
|
|
1517
|
+
if (!Array.isArray(input) || input.length === 0 || input.length > 10_000) {
|
|
1518
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintTrustHistory', 'must contain one through 10,000 first-parent Git states');
|
|
1519
|
+
}
|
|
1520
|
+
const commits = new Set();
|
|
1521
|
+
const transitions = [];
|
|
1522
|
+
let previous;
|
|
1523
|
+
let previousDigest;
|
|
1524
|
+
for (const [index, candidate] of input.entries()) {
|
|
1525
|
+
if (!(0, validation_js_1.isRecord)(candidate) ||
|
|
1526
|
+
typeof candidate.commit !== 'string' ||
|
|
1527
|
+
!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(candidate.commit) ||
|
|
1528
|
+
commits.has(candidate.commit)) {
|
|
1529
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `blueprintTrustHistory[${index}].commit`, 'must be a unique full Git object ID in first-parent order');
|
|
1530
|
+
}
|
|
1531
|
+
const commit = candidate.commit;
|
|
1532
|
+
commits.add(commit);
|
|
1533
|
+
const current = createBlueprintTrustState(candidate);
|
|
1534
|
+
const currentDigest = blueprintTrustStateDigest(current);
|
|
1535
|
+
if (previous && currentDigest !== previousDigest) {
|
|
1536
|
+
transitions.push({
|
|
1537
|
+
...planBlueprintTrustStateTransition(previous, current).receipt,
|
|
1538
|
+
commit,
|
|
1539
|
+
});
|
|
1540
|
+
}
|
|
1541
|
+
previous = current;
|
|
1542
|
+
previousDigest = currentDigest;
|
|
1543
|
+
}
|
|
1544
|
+
const first = input[0];
|
|
1545
|
+
const last = input.at(-1);
|
|
1546
|
+
if (!first || !last || !previousDigest) {
|
|
1547
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'blueprintTrustHistory', 'could not resolve its anchor and head states');
|
|
1548
|
+
}
|
|
1549
|
+
return {
|
|
1550
|
+
anchorCommit: first.commit,
|
|
1551
|
+
headCommit: last.commit,
|
|
1552
|
+
kind: 'ebk-blueprint-trust-history',
|
|
1553
|
+
schemaVersion: exports.BLUEPRINT_TRUST_SCHEMA_VERSION,
|
|
1554
|
+
stateDigest: previousDigest,
|
|
1555
|
+
transitions,
|
|
1556
|
+
};
|
|
1557
|
+
}
|
|
1558
|
+
//# sourceMappingURL=blueprint-trust.js.map
|