@empire-builder-kit/nx 1.0.0-rc.4 → 1.0.0-rc.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/executors.json +21 -1
- package/generators.json +10 -0
- package/package.json +31 -7
- package/src/aws/child-environment.d.ts +10 -0
- package/src/aws/child-environment.js +77 -0
- package/src/aws/identity.d.ts +13 -0
- package/src/aws/identity.js +41 -0
- package/src/aws-authority/index.d.ts +2 -0
- package/src/aws-authority/index.js +6 -0
- package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
- package/src/aws-authority/lambda-policy-ordering.js +56 -0
- package/src/aws-authority/stage-authority.d.ts +248 -0
- package/src/aws-authority/stage-authority.js +3558 -0
- package/src/blueprints/external-sandbox.js +21 -9
- package/src/blueprints/manifest.d.ts +1 -1
- package/src/blueprints/resolver.js +28 -15
- package/src/cli/bootstrap.d.ts +1 -1
- package/src/cli/deploy-runtime.d.ts +6 -0
- package/src/cli/deploy-runtime.js +58 -0
- package/src/cli/dev-command.d.ts +16 -4
- package/src/cli/dev-command.js +63 -0
- package/src/cli/main.d.ts +9 -1
- package/src/cli/main.js +139 -20
- package/src/cli/output.d.ts +1 -1
- package/src/cli/output.js +1 -1
- package/src/developer-agent/context.js +41 -9
- package/src/developer-agent/generator-planning.js +20 -6
- package/src/developer-agent/git-inspection.d.ts +6 -2
- package/src/developer-agent/git-inspection.js +78 -6
- package/src/developer-agent/model.d.ts +5 -3
- package/src/developer-agent/model.js +4 -4
- package/src/developer-agent/operation-registry.d.ts +5 -0
- package/src/developer-agent/operation-registry.js +286 -40
- package/src/developer-agent/planning.js +16 -13
- package/src/developer-agent/preview-changes.d.ts +2 -0
- package/src/developer-agent/preview-changes.js +14 -2
- package/src/developer-agent/preview-source.js +3 -0
- package/src/developer-agent/validation.js +25 -9
- package/src/developer-agent/workspace-inspection.js +60 -5
- package/src/executors/blueprint-trust/blueprint-trust.js +6 -0
- package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
- package/src/executors/deployment-plan/deployment-plan.js +57 -2
- package/src/executors/dev-doctor/dev-doctor.js +13 -6
- package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
- package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
- package/src/executors/dev-task-cleanup/schema.json +9 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
- package/src/executors/fleet/fleet.js +1 -1
- package/src/executors/foundation-preflight/foundation-preflight.d.ts +1 -0
- package/src/executors/foundation-preflight/foundation-preflight.js +6 -2
- package/src/executors/foundation-preflight/schema.json +5 -0
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +13 -2
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -31
- package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +65 -0
- package/src/executors/foundation-profile-preflight/production-database-safeguard.js +223 -0
- package/src/executors/foundation-profile-preflight/schema.json +15 -4
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +70 -20
- package/src/executors/foundation-remove-preflight/schema.json +6 -1
- package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js +3 -0
- package/src/executors/github-bootstrap/schema.json +7 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +29 -136
- package/src/executors/infrastructure-plan/infrastructure-plan.js +230 -3282
- package/src/executors/infrastructure-plan/schema.json +12 -52
- package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
- package/src/executors/local-deploy/federated-credential-transport.js +252 -0
- package/src/executors/local-deploy/local-approval.d.ts +18 -0
- package/src/executors/local-deploy/local-approval.js +39 -0
- package/src/executors/local-deploy/local-deploy.d.ts +112 -0
- package/src/executors/local-deploy/local-deploy.js +1404 -0
- package/src/executors/local-deploy/schema.json +70 -0
- package/src/executors/refresh/refresh.js +2 -2
- package/src/executors/remove/remove.js +2 -2
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +42 -0
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +1229 -0
- package/src/executors/router-waf-rehearsal/schema.json +29 -0
- package/src/executors/secret-initialize/schema.json +42 -0
- package/src/executors/secret-initialize/secret-initialize.d.ts +34 -0
- package/src/executors/secret-initialize/secret-initialize.js +297 -0
- package/src/executors/secret-metadata/schema.json +5 -0
- package/src/executors/secret-metadata/secret-metadata.d.ts +16 -2
- package/src/executors/secret-metadata/secret-metadata.js +129 -30
- package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
- package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
- package/src/executors/sst-lifecycle/governed-native-operation.d.ts +48 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js +162 -0
- package/src/executors/sst-lifecycle/logging-preflight.d.ts +5 -0
- package/src/executors/sst-lifecycle/logging-preflight.js +23 -13
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +40 -6
- package/src/executors/sst-lifecycle/run-sst-command.js +779 -70
- package/src/executors/sst-lifecycle/schema.json +8 -1
- package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
- package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
- package/src/executors/sst-lifecycle/sst-environment-source.d.ts +33 -0
- package/src/executors/sst-lifecycle/sst-environment-source.js +267 -0
- package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
- package/src/executors/sst-lifecycle/task-unlock.js +126 -0
- package/src/executors/unlock/unlock.js +2 -2
- package/src/foundation/capability-plan.d.ts +43 -0
- package/src/foundation/capability-plan.js +168 -0
- package/src/foundation/discovery.d.ts +14 -11
- package/src/foundation/discovery.js +32 -6
- package/src/foundation/index.d.ts +4 -0
- package/src/foundation/index.js +11 -0
- package/src/foundation/local-database-contract.d.ts +20 -0
- package/src/foundation/local-database-contract.js +262 -13
- package/src/foundation/local-private-smoke-access.d.ts +20 -0
- package/src/foundation/local-private-smoke-access.js +197 -0
- package/src/foundation/logging-preflight.js +1 -1
- package/src/foundation/logging.d.ts +3 -1
- package/src/foundation/logging.js +1 -1
- package/src/foundation/partial-state.d.ts +10 -0
- package/src/foundation/partial-state.js +21 -0
- package/src/foundation/preflight.js +37 -18
- package/src/foundation/private-smoke-access.d.ts +25 -0
- package/src/foundation/private-smoke-access.js +135 -0
- package/src/foundation/private-smoke-admission.d.ts +45 -0
- package/src/foundation/private-smoke-admission.js +180 -0
- package/src/foundation/private-smoke-control-plane.d.ts +18 -0
- package/src/foundation/private-smoke-control-plane.js +184 -0
- package/src/foundation/provision-database-bindings.d.ts +5 -0
- package/src/foundation/provision-database-bindings.js +41 -8
- package/src/foundation/provision-logical-database.js +15 -8
- package/src/foundation/requirements.d.ts +3 -3
- package/src/foundation/requirements.js +24 -12
- package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
- package/src/foundation/router-waf-rate-rehearsal.js +210 -0
- package/src/foundation/router-waf.d.ts +149 -0
- package/src/foundation/router-waf.js +809 -0
- package/src/foundation/stages.d.ts +1 -0
- package/src/foundation/stages.js +11 -0
- package/src/generators/blueprint/blueprint.d.ts +5 -0
- package/src/generators/blueprint/blueprint.js +102 -0
- package/src/generators/blueprint/files.d.ts +6 -0
- package/src/generators/blueprint/files.js +217 -0
- package/src/generators/blueprint/schema.d.ts +4 -0
- package/src/generators/blueprint/schema.json +18 -0
- package/src/generators/formatting.d.ts +8 -0
- package/src/generators/formatting.js +141 -0
- package/src/generators/function/function.js +38 -17
- package/src/generators/logging-registry.d.ts +2 -0
- package/src/generators/logging-registry.js +22 -0
- package/src/generators/post-generation-install.js +2 -2
- package/src/generators/preset/dependency-overrides.d.ts +8 -0
- package/src/generators/preset/dependency-overrides.js +55 -0
- package/src/generators/preset/generator.js +43 -3
- package/src/generators/preset/schema.d.ts +10 -0
- package/src/generators/preset/schema.json +47 -0
- package/src/generators/preset/tool-versions.d.ts +2 -0
- package/src/generators/preset/tool-versions.js +3 -1
- package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
- package/src/generators/preset/workspace-files-adopter-skills.js +303 -0
- package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
- package/src/generators/preset/workspace-files-ci-acceptance.js +791 -0
- package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
- package/src/generators/preset/workspace-files-ci-install.js +196 -0
- package/src/generators/preset/workspace-files-developer-agent.d.ts +2 -0
- package/src/generators/preset/workspace-files-developer-agent.js +90 -28
- package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
- package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js +5 -2
- package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
- package/src/generators/preset/workspace-files-performance-cost.js +8 -8
- package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
- package/src/generators/preset/workspace-files-performance-load.js +39 -25
- package/src/generators/preset/workspace-files-stage-authority.d.ts +6 -0
- package/src/generators/preset/workspace-files-stage-authority.js +518 -0
- package/src/generators/preset/workspace-files-thin-deploy.d.ts +55 -0
- package/src/generators/preset/workspace-files-thin-deploy.js +2473 -0
- package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
- package/src/generators/preset/workspace-files-thin-docs.js +352 -0
- package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
- package/src/generators/preset/workspace-files-thin-release.js +26 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js +254 -42
- package/src/generators/preset/workspace-files.d.ts +18 -2
- package/src/generators/preset/workspace-files.js +1504 -608
- package/src/generators/repository-policy/repository-policy.js +235 -5
- package/src/generators/repository-policy/schema.d.ts +10 -0
- package/src/generators/repository-policy/schema.json +80 -4
- package/src/generators/repository-policy/tree-policy.d.ts +3 -0
- package/src/generators/repository-policy/tree-policy.js +25 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
- package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-api-files.js +130 -414
- package/src/generators/slice/built-in-plan-async-work-files.js +166 -1969
- package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +60 -2
- package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
- package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
- package/src/generators/slice/built-in-plan-background-work-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-background-work-files.js +99 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
- package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-data-files.js +163 -1196
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +37 -2
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2443
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +50 -8
- package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +44 -25
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +20 -1
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-foundation-files.js +39 -18
- package/src/generators/slice/built-in-plan-frontend-files.js +7 -3
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js +933 -729
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +67 -11
- package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.js +137 -0
- package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
- package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
- package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
- package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
- package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
- package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
- package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
- package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
- package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
- package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-metadata-files.js +157 -28
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +324 -0
- package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-operations-files.js +585 -97
- package/src/generators/slice/built-in-plan-performance-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-performance-files.js +220 -1074
- package/src/generators/slice/built-in-plan-project-files.js +141 -135
- package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-release-files.js +310 -70
- package/src/generators/slice/built-in-plan-reliability-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-reliability-files.js +279 -43
- package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js +87 -76
- package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
- package/src/generators/slice/built-in-plan-shared.js +41 -19
- package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
- package/src/generators/slice/built-in-plan-sql-events.js +276 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-testing-files.js +304 -172
- package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
- package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
- package/src/generators/slice/built-in-plan-thin-release-files.js +162 -0
- package/src/generators/slice/built-in-plan-verification-files.js +76 -2
- package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-web-files.js +223 -16
- package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js +143 -279
- package/src/generators/slice/built-in-plan.d.ts +11 -1
- package/src/generators/slice/built-in-plan.js +80 -29
- package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
- package/src/generators/slice/data-policy-review-seed.js +22 -0
- package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
- package/src/generators/slice/deployed-smoke-readiness.js +214 -0
- package/src/generators/slice/local-source-identity.d.ts +2 -0
- package/src/generators/slice/local-source-identity.js +31 -0
- package/src/generators/slice/persistence-contract.d.ts +14 -0
- package/src/generators/slice/persistence-contract.js +32 -0
- package/src/generators/slice/slice.js +61 -50
- package/src/generators/sql/schema.d.ts +7 -0
- package/src/generators/sql/schema.json +38 -0
- package/src/generators/sql/sql.d.ts +6 -0
- package/src/generators/sql/sql.js +53 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
- package/src/generators/upgrade/upgrade.d.ts +15 -1
- package/src/generators/upgrade/upgrade.js +435 -44
- package/src/generators/workload/performance-registration.d.ts +1 -0
- package/src/generators/workload/performance-registration.js +9 -11
- package/src/generators/workload/service-performance-files.d.ts +1 -0
- package/src/generators/workload/service-performance-files.js +27 -7
- package/src/generators/workload/workload.d.ts +1 -1
- package/src/generators/workload/workload.js +105 -29
- package/src/git-policy/action-pins.d.ts +5 -0
- package/src/git-policy/action-pins.js +5 -0
- package/src/git-policy/github-bootstrap.d.ts +39 -8
- package/src/git-policy/github-bootstrap.js +329 -175
- package/src/git-policy/routing.d.ts +7 -1
- package/src/git-policy/routing.js +62 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/infrastructure-change/local-capability.d.ts +73 -0
- package/src/infrastructure-change/local-capability.js +114 -0
- package/src/infrastructure-change/model.d.ts +25 -4
- package/src/infrastructure-change/model.js +1 -0
- package/src/infrastructure-change/normalize.d.ts +4 -0
- package/src/infrastructure-change/normalize.js +47 -7
- package/src/infrastructure-change/plan.d.ts +30 -3
- package/src/infrastructure-change/plan.js +323 -13
- package/src/infrastructure-change/risk.d.ts +3 -1
- package/src/infrastructure-change/risk.js +96 -16
- package/src/local-dev/browser-verification.d.ts +37 -0
- package/src/local-dev/browser-verification.js +281 -0
- package/src/local-dev/contracts.d.ts +10 -1
- package/src/local-dev/contracts.js +114 -13
- package/src/local-dev/dev-command-core.js +24 -5
- package/src/local-dev/docker-credential-health.d.ts +14 -0
- package/src/local-dev/docker-credential-health.js +94 -0
- package/src/local-dev/environment-inspector.d.ts +7 -0
- package/src/local-dev/environment-inspector.js +42 -15
- package/src/local-dev/environment-state.js +2 -2
- package/src/local-dev/errors.d.ts +1 -1
- package/src/local-dev/errors.js +2 -0
- package/src/local-dev/fleet-client.js +2 -2
- package/src/local-dev/fleet-configuration.js +57 -25
- package/src/local-dev/fleet-inventory.js +46 -18
- package/src/local-dev/fleet-ipc.d.ts +7 -0
- package/src/local-dev/fleet-ipc.js +14 -2
- package/src/local-dev/fleet-launcher.d.ts +6 -0
- package/src/local-dev/fleet-launcher.js +14 -2
- package/src/local-dev/fleet-logs.js +50 -22
- package/src/local-dev/fleet-process.d.ts +20 -1
- package/src/local-dev/fleet-process.js +197 -41
- package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
- package/src/local-dev/fleet-runner-evidence.js +56 -0
- package/src/local-dev/fleet-runtime.js +268 -229
- package/src/local-dev/fleet-session.d.ts +2 -0
- package/src/local-dev/fleet-session.js +28 -11
- package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
- package/src/local-dev/fleet-state.d.ts +5 -2
- package/src/local-dev/fleet-state.js +25 -4
- package/src/local-dev/fleet-supervisor.d.ts +3 -0
- package/src/local-dev/fleet-supervisor.js +66 -11
- package/src/local-dev/fleet-web-start.d.ts +12 -0
- package/src/local-dev/fleet-web-start.js +48 -0
- package/src/local-dev/identity.js +3 -14
- package/src/local-dev/index.d.ts +1 -0
- package/src/local-dev/index.js +1 -0
- package/src/local-dev/native-completion.d.ts +9 -0
- package/src/local-dev/native-completion.js +130 -0
- package/src/local-dev/nx-workspace.d.ts +4 -2
- package/src/local-dev/nx-workspace.js +11 -6
- package/src/local-dev/personal-stage.d.ts +4 -5
- package/src/local-dev/personal-stage.js +6 -54
- package/src/local-dev/port-claims.d.ts +13 -0
- package/src/local-dev/port-claims.js +46 -0
- package/src/local-dev/ports.d.ts +14 -2
- package/src/local-dev/ports.js +78 -3
- package/src/local-dev/private-state.d.ts +11 -0
- package/src/local-dev/private-state.js +146 -40
- package/src/local-dev/process-group.d.ts +4 -0
- package/src/local-dev/process-group.js +29 -0
- package/src/local-dev/process-identity.d.ts +8 -0
- package/src/local-dev/process-identity.js +31 -1
- package/src/local-dev/proxy.js +11 -12
- package/src/local-dev/runtime-paths.js +1 -1
- package/src/local-dev/slice-claim.js +1 -1
- package/src/local-dev/slice-runner.d.ts +15 -6
- package/src/local-dev/slice-runner.js +189 -54
- package/src/local-dev/task-attachment.d.ts +17 -0
- package/src/local-dev/task-attachment.js +73 -0
- package/src/local-dev/task-authority.d.ts +10 -0
- package/src/local-dev/task-authority.js +27 -0
- package/src/local-dev/task-identity.d.ts +33 -0
- package/src/local-dev/task-identity.js +418 -0
- package/src/local-dev/task-native-writer.d.ts +18 -0
- package/src/local-dev/task-native-writer.js +329 -0
- package/src/local-dev/tls.js +8 -2
- package/src/local-dev/web-launch.d.ts +9 -0
- package/src/local-dev/web-launch.js +130 -0
- package/src/ownership/composition.d.ts +2 -1
- package/src/ownership/composition.js +1 -0
- package/src/performance/cost-collection.d.ts +1 -1
- package/src/performance/cost-collection.js +4 -2
- package/src/performance/cost-controls.d.ts +8 -4
- package/src/performance/cost-controls.js +39 -28
- package/src/performance/evidence.d.ts +1 -1
- package/src/performance/evidence.js +5 -3
- package/src/performance/load-safety.js +5 -3
- package/src/performance/model.d.ts +4 -4
- package/src/performance/model.js +4 -5
- package/src/performance/scenario.d.ts +22 -0
- package/src/performance/scenario.js +100 -92
- package/src/release/index.d.ts +0 -2
- package/src/release/index.js +0 -2
- package/src/release/source-authority.d.ts +5 -5
- package/src/release/source-authority.js +141 -124
- package/src/repository-policy/aurora-preflight.d.ts +1 -1
- package/src/repository-policy/aurora-preflight.js +4 -1
- package/src/repository-policy/capacity-migration.d.ts +3 -0
- package/src/repository-policy/capacity-migration.js +21 -0
- package/src/repository-policy/deployment-plan.d.ts +4 -1
- package/src/repository-policy/deployment-plan.js +9 -0
- package/src/repository-policy/foundation-profile.js +10 -1
- package/src/repository-policy/policy.d.ts +57 -3
- package/src/repository-policy/policy.js +497 -11
- package/src/schemas/blueprint-v1.json +5 -4
- package/src/schemas/foundation-requirement-v1.json +5 -4
- package/src/schemas/performance-policy-v1.json +3 -3
- package/src/schemas/repository-policy-v1.json +130 -6
- package/src/schemas/testing-evidence-result-v1.json +1 -1
- package/src/secrets/adapters.d.ts +7 -2
- package/src/secrets/adapters.js +34 -3
- package/src/secrets/aws-control-plane.d.ts +10 -1
- package/src/secrets/aws-control-plane.js +67 -0
- package/src/secrets/generated-aws-control-plane.d.ts +23 -0
- package/src/secrets/generated-aws-control-plane.js +259 -0
- package/src/secrets/metadata.js +38 -10
- package/src/secrets/model.d.ts +8 -1
- package/src/secrets/model.js +24 -3
- package/src/secrets/operator.d.ts +91 -3
- package/src/secrets/operator.js +463 -13
- package/src/secrets/registry.d.ts +2 -1
- package/src/secrets/registry.js +18 -1
- package/src/secrets/verification.js +9 -1
- package/src/secrets/workload-access.js +10 -2
- package/src/sst-environment-source-format.d.ts +6 -0
- package/src/sst-environment-source-format.js +199 -0
- package/src/supply-chain/action-pins.js +61 -7
- package/src/supply-chain/blueprint-trust-git.js +85 -24
- package/src/supply-chain/blueprint-verification-authority.js +55 -3
- package/src/supply-chain/build-output-bounds.d.ts +2 -0
- package/src/supply-chain/build-output-bounds.js +12 -0
- package/src/supply-chain/build-output.d.ts +7 -1
- package/src/supply-chain/build-output.js +177 -24
- package/src/supply-chain/ecr-scanning.d.ts +5 -3
- package/src/supply-chain/ecr-scanning.js +11 -7
- package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
- package/src/supply-chain/ecs-deployed-image.js +6 -4
- package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
- package/src/supply-chain/generated-command.js +1 -0
- package/src/supply-chain/generated-container-release-command.js +1285 -124
- package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js +200 -93
- package/src/supply-chain/generated-files.js +25 -14
- package/src/supply-chain/generated-scanner-command.js +2 -1
- package/src/supply-chain/index.d.ts +1 -1
- package/src/supply-chain/index.js +2 -1
- package/src/supply-chain/sbom.d.ts +1 -1
- package/src/supply-chain/sbom.js +30 -5
- package/src/supply-chain/scanner.js +3 -0
- package/src/testing-evidence/fixture-scope.d.ts +2 -1
- package/src/testing-evidence/fixture-scope.js +4 -2
- package/src/testing-evidence/result.d.ts +2 -1
- package/src/testing-evidence/result.js +18 -4
- package/src/workload-roles/account-baseline.d.ts +11 -0
- package/src/workload-roles/account-baseline.js +253 -16
- package/src/workload-roles/authority.d.ts +3 -1
- package/src/workload-roles/authority.js +48 -2
- package/src/workload-roles/aws-s3-state.js +27 -0
- package/src/workload-roles/boundary.d.ts +2 -1
- package/src/workload-roles/boundary.js +9 -2
- package/src/workload-roles/handler.js +52 -24
- package/src/workload-roles/index.d.ts +10 -17
- package/src/workload-roles/index.js +5 -18
- package/src/workload-roles/injection.js +1 -1
- package/src/workload-roles/provisioner.js +12 -4
- package/src/workload-roles/registration.d.ts +1 -0
- package/src/workload-roles/registration.js +5 -0
- package/src/workload-roles/stage-boundary.js +1 -1
- package/src/workload-roles/standard-slice.js +3 -3
- package/src/workspace-deployment/affected-lifecycle.d.ts +53 -0
- package/src/workspace-deployment/affected-lifecycle.js +84 -0
- package/src/workspace-deployment/identity.d.ts +3 -0
- package/src/workspace-deployment/identity.js +22 -0
- package/src/workspace-deployment/index.d.ts +4 -0
- package/src/workspace-deployment/index.js +8 -0
- package/src/workspace-deployment/migration-evidence.d.ts +29 -0
- package/src/workspace-deployment/migration-evidence.js +83 -0
- package/src/workspace-deployment/migration.d.ts +27 -0
- package/src/workspace-deployment/migration.js +109 -0
- package/src/workspace-deployment/ownership.d.ts +81 -0
- package/src/workspace-deployment/ownership.js +381 -0
- package/src/api-contract/baseline-update.js.map +0 -1
- package/src/api-contract/compatibility.js.map +0 -1
- package/src/api-contract/contract-graph.js.map +0 -1
- package/src/api-contract/evidence.js.map +0 -1
- package/src/api-contract/index.js.map +0 -1
- package/src/api-contract/model.fixtures.d.ts +0 -2
- package/src/api-contract/model.fixtures.js +0 -81
- package/src/api-contract/model.fixtures.js.map +0 -1
- package/src/api-contract/model.js.map +0 -1
- package/src/api-contract/rollout.js.map +0 -1
- package/src/authorization/compatibility.js.map +0 -1
- package/src/authorization/index.js.map +0 -1
- package/src/blueprints/execution.js.map +0 -1
- package/src/blueprints/external-sandbox.js.map +0 -1
- package/src/blueprints/index.js.map +0 -1
- package/src/blueprints/inputs.js.map +0 -1
- package/src/blueprints/manifest.js.map +0 -1
- package/src/blueprints/resolver.js.map +0 -1
- package/src/blueprints/transitions.js.map +0 -1
- package/src/cli/agent-command.js.map +0 -1
- package/src/cli/agent-runtime.js.map +0 -1
- package/src/cli/blueprint-authority.js.map +0 -1
- package/src/cli/blueprint-command.js.map +0 -1
- package/src/cli/bootstrap.js.map +0 -1
- package/src/cli/dev-command.js.map +0 -1
- package/src/cli/main.js.map +0 -1
- package/src/cli/output.js.map +0 -1
- package/src/cli/personal-secret-runtime.js.map +0 -1
- package/src/cli/secret-terminal.js.map +0 -1
- package/src/container-images.js.map +0 -1
- package/src/data-lifecycle/index.js.map +0 -1
- package/src/data-lifecycle/model.fixtures.d.ts +0 -2
- package/src/data-lifecycle/model.fixtures.js +0 -244
- package/src/data-lifecycle/model.fixtures.js.map +0 -1
- package/src/data-lifecycle/model.js.map +0 -1
- package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
- package/src/data-lifecycle/validation.js.map +0 -1
- package/src/database-retirement/contract.js.map +0 -1
- package/src/database-retirement/index.js.map +0 -1
- package/src/deterministic-order.js.map +0 -1
- package/src/developer-agent/context.js.map +0 -1
- package/src/developer-agent/generator-planning.js.map +0 -1
- package/src/developer-agent/generator-preview.js.map +0 -1
- package/src/developer-agent/git-inspection.js.map +0 -1
- package/src/developer-agent/handoff.js.map +0 -1
- package/src/developer-agent/index.js.map +0 -1
- package/src/developer-agent/model.js.map +0 -1
- package/src/developer-agent/operation-registry.js.map +0 -1
- package/src/developer-agent/ordering.js.map +0 -1
- package/src/developer-agent/planning.js.map +0 -1
- package/src/developer-agent/preview-changes.js.map +0 -1
- package/src/developer-agent/preview-source.js.map +0 -1
- package/src/developer-agent/validation.js.map +0 -1
- package/src/developer-agent/workspace-inspection.js.map +0 -1
- package/src/developer-agent/workspace-path.js.map +0 -1
- package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
- package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
- package/src/executors/deploy/deploy.js.map +0 -1
- package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
- package/src/executors/dev/dev.js.map +0 -1
- package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
- package/src/executors/dev-setup/dev-setup.js.map +0 -1
- package/src/executors/developer-context/developer-context.js.map +0 -1
- package/src/executors/fleet/fleet.js.map +0 -1
- package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
- package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
- package/src/executors/refresh/refresh.js.map +0 -1
- package/src/executors/remove/remove.js.map +0 -1
- package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
- package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
- package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
- package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
- package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
- package/src/executors/unlock/unlock.js.map +0 -1
- package/src/executors/work-markers/work-markers.js.map +0 -1
- package/src/foundation/discovery.js.map +0 -1
- package/src/foundation/index.js.map +0 -1
- package/src/foundation/local-database-contract.js.map +0 -1
- package/src/foundation/logging-preflight.js.map +0 -1
- package/src/foundation/logging.js.map +0 -1
- package/src/foundation/preflight.js.map +0 -1
- package/src/foundation/provision-database-bindings.js.map +0 -1
- package/src/foundation/provision-logical-database.js.map +0 -1
- package/src/foundation/requirements.js.map +0 -1
- package/src/foundation/router-origin-proof.js.map +0 -1
- package/src/foundation/stages.js.map +0 -1
- package/src/frontend-security/index.js.map +0 -1
- package/src/frontend-security/security-headers.js.map +0 -1
- package/src/generators/feature-registry.js.map +0 -1
- package/src/generators/function/function.js.map +0 -1
- package/src/generators/job/job.js.map +0 -1
- package/src/generators/logging-registry.js.map +0 -1
- package/src/generators/post-generation-install.js.map +0 -1
- package/src/generators/preset/generator.js.map +0 -1
- package/src/generators/preset/tool-versions.js.map +0 -1
- package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
- package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
- package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
- package/src/generators/preset/workspace-files.js.map +0 -1
- package/src/generators/repository-policy/repository-policy.js.map +0 -1
- package/src/generators/service/service.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-shared.js.map +0 -1
- package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
- package/src/generators/slice/built-in-plan.js.map +0 -1
- package/src/generators/slice/slice.js.map +0 -1
- package/src/generators/upgrade/upgrade.js.map +0 -1
- package/src/generators/workload/frozen-container.js.map +0 -1
- package/src/generators/workload/performance-registration.js.map +0 -1
- package/src/generators/workload/reliability-registration.js.map +0 -1
- package/src/generators/workload/service-performance-files.js.map +0 -1
- package/src/generators/workload/workload.js.map +0 -1
- package/src/git-policy/action-pins.js.map +0 -1
- package/src/git-policy/github-bootstrap.js.map +0 -1
- package/src/git-policy/index.js.map +0 -1
- package/src/git-policy/routing.js.map +0 -1
- package/src/index.js.map +0 -1
- package/src/infrastructure-change/convergence.js.map +0 -1
- package/src/infrastructure-change/drift.js.map +0 -1
- package/src/infrastructure-change/index.js.map +0 -1
- package/src/infrastructure-change/model.js.map +0 -1
- package/src/infrastructure-change/normalize.js.map +0 -1
- package/src/infrastructure-change/plan.js.map +0 -1
- package/src/infrastructure-change/risk.js.map +0 -1
- package/src/infrastructure-change/summary.js.map +0 -1
- package/src/local-dev/context-discovery.js.map +0 -1
- package/src/local-dev/contract-validation.js.map +0 -1
- package/src/local-dev/contracts.js.map +0 -1
- package/src/local-dev/control-contract.js.map +0 -1
- package/src/local-dev/dev-command-core.js.map +0 -1
- package/src/local-dev/effects.js.map +0 -1
- package/src/local-dev/environment-inspector.js.map +0 -1
- package/src/local-dev/environment-state.js.map +0 -1
- package/src/local-dev/errors.js.map +0 -1
- package/src/local-dev/fleet-client.js.map +0 -1
- package/src/local-dev/fleet-configuration.js.map +0 -1
- package/src/local-dev/fleet-inventory.js.map +0 -1
- package/src/local-dev/fleet-ipc.js.map +0 -1
- package/src/local-dev/fleet-launcher.js.map +0 -1
- package/src/local-dev/fleet-lock.js.map +0 -1
- package/src/local-dev/fleet-logs.js.map +0 -1
- package/src/local-dev/fleet-process.js.map +0 -1
- package/src/local-dev/fleet-runtime.js.map +0 -1
- package/src/local-dev/fleet-session.js.map +0 -1
- package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
- package/src/local-dev/fleet-startup.js.map +0 -1
- package/src/local-dev/fleet-state.js.map +0 -1
- package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
- package/src/local-dev/fleet-supervisor.js.map +0 -1
- package/src/local-dev/gateway-daemon.js.map +0 -1
- package/src/local-dev/gateway.js.map +0 -1
- package/src/local-dev/identity.js.map +0 -1
- package/src/local-dev/index.js.map +0 -1
- package/src/local-dev/local-context.js.map +0 -1
- package/src/local-dev/nx-workspace.js.map +0 -1
- package/src/local-dev/personal-secret-ledger.js.map +0 -1
- package/src/local-dev/personal-stage.js.map +0 -1
- package/src/local-dev/portless.js.map +0 -1
- package/src/local-dev/ports.js.map +0 -1
- package/src/local-dev/private-state.js.map +0 -1
- package/src/local-dev/process-identity.js.map +0 -1
- package/src/local-dev/proxy.js.map +0 -1
- package/src/local-dev/runtime-paths.js.map +0 -1
- package/src/local-dev/secret-slice-claim.js.map +0 -1
- package/src/local-dev/slice-claim.js.map +0 -1
- package/src/local-dev/slice-runner.js.map +0 -1
- package/src/local-dev/tls.js.map +0 -1
- package/src/ownership/composition.js.map +0 -1
- package/src/ownership/foundation-record.js.map +0 -1
- package/src/ownership/hash.js.map +0 -1
- package/src/ownership/index.js.map +0 -1
- package/src/ownership/json-ownership.js.map +0 -1
- package/src/ownership/record.js.map +0 -1
- package/src/ownership/workspace-record.js.map +0 -1
- package/src/performance/cost-collection.js.map +0 -1
- package/src/performance/cost-controls.js.map +0 -1
- package/src/performance/evidence.js.map +0 -1
- package/src/performance/index.js.map +0 -1
- package/src/performance/load-safety.js.map +0 -1
- package/src/performance/model.js.map +0 -1
- package/src/performance/pr-artifact-budget.js.map +0 -1
- package/src/performance/runner.js.map +0 -1
- package/src/performance/scenario-endpoint.js.map +0 -1
- package/src/performance/scenario.js.map +0 -1
- package/src/performance/test-fixtures.d.ts +0 -7
- package/src/performance/test-fixtures.js +0 -169
- package/src/performance/test-fixtures.js.map +0 -1
- package/src/performance/unit-cost.js.map +0 -1
- package/src/release/index.js.map +0 -1
- package/src/release/lifecycle.js.map +0 -1
- package/src/release/manifest.js.map +0 -1
- package/src/release/rollout.js.map +0 -1
- package/src/release/source-authority.js.map +0 -1
- package/src/repository-policy/aurora-preflight.js.map +0 -1
- package/src/repository-policy/deployment-plan.js.map +0 -1
- package/src/repository-policy/foundation-profile.js.map +0 -1
- package/src/repository-policy/index.js.map +0 -1
- package/src/repository-policy/policy.js.map +0 -1
- package/src/secrets/adapters.js.map +0 -1
- package/src/secrets/aws-control-plane.js.map +0 -1
- package/src/secrets/declaration-verification.js.map +0 -1
- package/src/secrets/guardrails.js.map +0 -1
- package/src/secrets/index.js.map +0 -1
- package/src/secrets/metadata.js.map +0 -1
- package/src/secrets/model.js.map +0 -1
- package/src/secrets/operator.js.map +0 -1
- package/src/secrets/permissions.js.map +0 -1
- package/src/secrets/personal-command.js.map +0 -1
- package/src/secrets/personal-ledger.js.map +0 -1
- package/src/secrets/registry.js.map +0 -1
- package/src/secrets/verification.js.map +0 -1
- package/src/secrets/workload-access.js.map +0 -1
- package/src/supply-chain/action-pins.js.map +0 -1
- package/src/supply-chain/blueprint-trust-git.js.map +0 -1
- package/src/supply-chain/blueprint-trust-process.js.map +0 -1
- package/src/supply-chain/blueprint-trust.js.map +0 -1
- package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
- package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
- package/src/supply-chain/build-output.js.map +0 -1
- package/src/supply-chain/common.js.map +0 -1
- package/src/supply-chain/container-artifact-contract.js.map +0 -1
- package/src/supply-chain/container-release.js.map +0 -1
- package/src/supply-chain/ecr-applicability.js.map +0 -1
- package/src/supply-chain/ecr-scanning.js.map +0 -1
- package/src/supply-chain/ecs-deployed-image.js.map +0 -1
- package/src/supply-chain/errors.js.map +0 -1
- package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
- package/src/supply-chain/generated-command.js.map +0 -1
- package/src/supply-chain/generated-container-release-command.js.map +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
- package/src/supply-chain/generated-files.js.map +0 -1
- package/src/supply-chain/generated-scanner-command.js.map +0 -1
- package/src/supply-chain/index.js.map +0 -1
- package/src/supply-chain/inventory.js.map +0 -1
- package/src/supply-chain/license-expression.js.map +0 -1
- package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
- package/src/supply-chain/policy.js.map +0 -1
- package/src/supply-chain/publication.js.map +0 -1
- package/src/supply-chain/sbom.js.map +0 -1
- package/src/supply-chain/scanner.js.map +0 -1
- package/src/supply-chain/vendored-source.js.map +0 -1
- package/src/testing-evidence/fixture-scope.js.map +0 -1
- package/src/testing-evidence/index.js.map +0 -1
- package/src/testing-evidence/quarantine.js.map +0 -1
- package/src/testing-evidence/result.js.map +0 -1
- package/src/testing-evidence/runner-adapter.js.map +0 -1
- package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
- package/src/validation.js.map +0 -1
- package/src/work-markers/index.js.map +0 -1
- package/src/work-markers/work-markers.js.map +0 -1
- package/src/workload-roles/account-baseline.js.map +0 -1
- package/src/workload-roles/authority.js.map +0 -1
- package/src/workload-roles/aws-adapter.js.map +0 -1
- package/src/workload-roles/aws-internal-handler.js.map +0 -1
- package/src/workload-roles/aws-s3-state.js.map +0 -1
- package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
- package/src/workload-roles/boundary.js.map +0 -1
- package/src/workload-roles/convergence.js.map +0 -1
- package/src/workload-roles/effective-policy.js.map +0 -1
- package/src/workload-roles/handler.js.map +0 -1
- package/src/workload-roles/history.js.map +0 -1
- package/src/workload-roles/index.js.map +0 -1
- package/src/workload-roles/injection.js.map +0 -1
- package/src/workload-roles/manifest.js.map +0 -1
- package/src/workload-roles/provisioner.js.map +0 -1
- package/src/workload-roles/registration.js.map +0 -1
- package/src/workload-roles/stage-boundary.js.map +0 -1
- package/src/workload-roles/standard-slice.js.map +0 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertGovernedAwsLifecyclePlatform = assertGovernedAwsLifecyclePlatform;
|
|
4
|
+
exports.runGovernedChildProcess = runGovernedChildProcess;
|
|
3
5
|
exports.createSstChildEnvironment = createSstChildEnvironment;
|
|
4
6
|
exports.assertSafeSstForwardedArguments = assertSafeSstForwardedArguments;
|
|
5
7
|
exports.resolveSstDevMode = resolveSstDevMode;
|
|
@@ -10,14 +12,28 @@ exports.runSstLifecyclePreflights = runSstLifecyclePreflights;
|
|
|
10
12
|
exports.runSstCommand = runSstCommand;
|
|
11
13
|
const devkit_1 = require("@nx/devkit");
|
|
12
14
|
const node_child_process_1 = require("node:child_process");
|
|
15
|
+
const node_fs_1 = require("node:fs");
|
|
13
16
|
const node_path_1 = require("node:path");
|
|
17
|
+
const index_js_1 = require("../../aws-authority/index.js");
|
|
18
|
+
const child_environment_js_1 = require("../../aws/child-environment.js");
|
|
19
|
+
const identity_js_1 = require("../../aws/identity.js");
|
|
14
20
|
const stages_js_1 = require("../../foundation/stages.js");
|
|
15
21
|
const personal_stage_js_1 = require("../../local-dev/personal-stage.js");
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
22
|
+
const task_identity_js_1 = require("../../local-dev/task-identity.js");
|
|
23
|
+
const federated_credential_transport_js_1 = require("../local-deploy/federated-credential-transport.js");
|
|
24
|
+
const index_js_2 = require("../../repository-policy/index.js");
|
|
25
|
+
const index_js_3 = require("../../workspace-deployment/index.js");
|
|
26
|
+
const index_js_4 = require("../../work-markers/index.js");
|
|
19
27
|
const secret_preflight_js_1 = require("./secret-preflight.js");
|
|
20
|
-
const
|
|
28
|
+
const task_native_writer_js_1 = require("../../local-dev/task-native-writer.js");
|
|
29
|
+
const local_deploy_js_1 = require("../local-deploy/local-deploy.js");
|
|
30
|
+
const task_stack_absence_js_1 = require("../dev-task-cleanup/task-stack-absence.js");
|
|
31
|
+
const process_group_js_1 = require("../../local-dev/process-group.js");
|
|
32
|
+
const secret_initialize_js_1 = require("../secret-initialize/secret-initialize.js");
|
|
33
|
+
const generated_secret_retirement_js_1 = require("./generated-secret-retirement.js");
|
|
34
|
+
const sst_environment_source_js_1 = require("./sst-environment-source.js");
|
|
35
|
+
const GOVERNED_STAGES = new Set(['development', 'staging', 'production']);
|
|
36
|
+
const DEPLOYMENT_STAGES = new Set(['development', 'staging', 'production']);
|
|
21
37
|
const RESERVED_FORWARDED_OPTIONS = new Set([
|
|
22
38
|
'--config',
|
|
23
39
|
'--profile',
|
|
@@ -27,17 +43,349 @@ const RESERVED_FORWARDED_OPTIONS = new Set([
|
|
|
27
43
|
]);
|
|
28
44
|
const SST_DEV_MODES = new Set(['basic', 'mono']);
|
|
29
45
|
const AWS_REGION_PATTERN = /^[a-z]{2}(?:-gov)?-[a-z]+-\d$/;
|
|
30
|
-
|
|
31
|
-
|
|
46
|
+
const AWS_ROLE_ARN_PATTERN = /^arn:(aws|aws-us-gov|aws-cn):iam::\d{12}:role\/[A-Za-z0-9+=,.@_/-]{1,512}$/;
|
|
47
|
+
const MAX_CALLER_IDENTITY_BYTES = 1024 * 1024;
|
|
48
|
+
const SST_SIGNAL_GRACE_PERIOD_MS = process_group_js_1.OWNED_PROCESS_SIGNAL_GRACE_MS;
|
|
49
|
+
const SST_SIGNAL_KILL_WAIT_MS = process_group_js_1.OWNED_PROCESS_KILL_WAIT_MS;
|
|
50
|
+
const SST_PROCESS_GROUP_POLL_MS = 25;
|
|
51
|
+
const GOVERNED_PROCESS_GROUP_ENV = 'EBK_GOVERNED_PROCESS_GROUP';
|
|
52
|
+
function assertGovernedAwsLifecyclePlatform(platform = process.platform) {
|
|
53
|
+
if (platform === 'win32') {
|
|
54
|
+
throw new Error('Governed AWS infrastructure lifecycle is unavailable on native Windows; use macOS, Linux, or WSL2. Native-Windows task Fleet is not validated in this prerelease either.');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function isMissingProcessError(error) {
|
|
58
|
+
return (typeof error === 'object' &&
|
|
59
|
+
error !== null &&
|
|
60
|
+
'code' in error &&
|
|
61
|
+
error.code === 'ESRCH');
|
|
62
|
+
}
|
|
63
|
+
function exactWindowsSystemRoot() {
|
|
64
|
+
const values = new Set(Object.entries(process.env)
|
|
65
|
+
.filter(([name, value]) => name.toLowerCase() === 'systemroot' &&
|
|
66
|
+
typeof value === 'string' &&
|
|
67
|
+
value.length > 0)
|
|
68
|
+
.map(([, value]) => value));
|
|
69
|
+
if (values.size !== 1) {
|
|
70
|
+
throw new Error('Workspace SST tree cleanup requires exact SystemRoot.');
|
|
71
|
+
}
|
|
72
|
+
const systemRoot = values.values().next().value;
|
|
73
|
+
if (typeof systemRoot !== 'string' ||
|
|
74
|
+
!(0, node_path_1.isAbsolute)(systemRoot) ||
|
|
75
|
+
/[\0\r\n"]/u.test(systemRoot)) {
|
|
76
|
+
throw new Error('Workspace SST tree cleanup has an unsafe SystemRoot.');
|
|
77
|
+
}
|
|
78
|
+
return systemRoot;
|
|
79
|
+
}
|
|
80
|
+
function exactWindowsTaskkill() {
|
|
81
|
+
const systemRoot = exactWindowsSystemRoot();
|
|
82
|
+
const requested = (0, node_path_1.join)(systemRoot, 'System32', 'taskkill.exe');
|
|
83
|
+
const metadata = (0, node_fs_1.lstatSync)(requested);
|
|
84
|
+
const canonical = (0, node_fs_1.realpathSync)(requested);
|
|
85
|
+
if (metadata.isSymbolicLink() ||
|
|
86
|
+
!metadata.isFile() ||
|
|
87
|
+
canonical.toLowerCase() !== requested.toLowerCase()) {
|
|
88
|
+
throw new Error('Workspace SST taskkill authority is not exact.');
|
|
89
|
+
}
|
|
90
|
+
return { executable: canonical, systemRoot };
|
|
91
|
+
}
|
|
92
|
+
function signalExactGovernedProcessTree(child, signal) {
|
|
93
|
+
const pid = child.pid;
|
|
94
|
+
if (typeof pid !== 'number' || !Number.isSafeInteger(pid) || pid <= 0) {
|
|
95
|
+
throw new Error('Workspace SST child has no exact process identity.');
|
|
96
|
+
}
|
|
97
|
+
if (process.platform === 'win32') {
|
|
98
|
+
const taskkill = exactWindowsTaskkill();
|
|
99
|
+
const terminated = (0, node_child_process_1.spawnSync)(taskkill.executable, ['/pid', String(pid), '/t', '/f'], {
|
|
100
|
+
env: { SystemRoot: taskkill.systemRoot },
|
|
101
|
+
shell: false,
|
|
102
|
+
stdio: 'ignore',
|
|
103
|
+
timeout: 15_000,
|
|
104
|
+
windowsHide: true,
|
|
105
|
+
});
|
|
106
|
+
if ((terminated.error || terminated.signal || terminated.status !== 0) &&
|
|
107
|
+
child.exitCode === null &&
|
|
108
|
+
child.signalCode === null) {
|
|
109
|
+
throw new Error('Workspace SST process-tree termination failed.');
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
process.kill(-pid, signal);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (!isMissingProcessError(error))
|
|
118
|
+
throw error;
|
|
119
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
120
|
+
child.kill(signal);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function exactGovernedProcessTreeExists(pid) {
|
|
125
|
+
if (process.platform === 'win32')
|
|
126
|
+
return false;
|
|
127
|
+
return (0, process_group_js_1.exactOwnedProcessGroupExists)(pid);
|
|
128
|
+
}
|
|
129
|
+
async function waitForExactGovernedProcessTreeExit(pid, deadline = Date.now() + SST_SIGNAL_GRACE_PERIOD_MS + SST_SIGNAL_KILL_WAIT_MS) {
|
|
130
|
+
while (exactGovernedProcessTreeExists(pid)) {
|
|
131
|
+
if (Date.now() >= deadline) {
|
|
132
|
+
throw new Error('Workspace SST process tree did not stop within the bounded deadline.');
|
|
133
|
+
}
|
|
134
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, SST_PROCESS_GROUP_POLL_MS));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function waitForGovernedChildSettlement(childSettled, deadline) {
|
|
138
|
+
const remaining = deadline - Date.now();
|
|
139
|
+
if (remaining <= 0) {
|
|
140
|
+
throw new Error('Workspace SST child did not stop within the bounded deadline.');
|
|
141
|
+
}
|
|
142
|
+
let timeout;
|
|
143
|
+
try {
|
|
144
|
+
await Promise.race([
|
|
145
|
+
childSettled,
|
|
146
|
+
new Promise((_resolve, reject) => {
|
|
147
|
+
timeout = setTimeout(() => reject(new Error('Workspace SST child did not stop within the bounded deadline.')), remaining);
|
|
148
|
+
}),
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
if (timeout)
|
|
153
|
+
clearTimeout(timeout);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function terminateRetainedGovernedProcessGroup(pid) {
|
|
157
|
+
if (process.platform === 'win32' || !exactGovernedProcessTreeExists(pid)) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
const deadline = Date.now() + SST_SIGNAL_GRACE_PERIOD_MS + SST_SIGNAL_KILL_WAIT_MS;
|
|
161
|
+
try {
|
|
162
|
+
process.kill(-pid, 'SIGTERM');
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (!isMissingProcessError(error))
|
|
166
|
+
throw error;
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
const escalation = setTimeout(() => {
|
|
170
|
+
try {
|
|
171
|
+
process.kill(-pid, 'SIGKILL');
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (!isMissingProcessError(error)) {
|
|
175
|
+
process.stderr.write('Governed descendant process-tree escalation failed.\n');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}, SST_SIGNAL_GRACE_PERIOD_MS);
|
|
179
|
+
try {
|
|
180
|
+
await waitForExactGovernedProcessTreeExit(pid, deadline);
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
clearTimeout(escalation);
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
async function stopExactGovernedProcessTree(child, signal, childSettled, isSettled, ownsProcessGroup = true) {
|
|
188
|
+
const pid = child.pid;
|
|
189
|
+
const deadline = Date.now() + SST_SIGNAL_GRACE_PERIOD_MS + SST_SIGNAL_KILL_WAIT_MS;
|
|
190
|
+
if (process.platform === 'win32' || ownsProcessGroup) {
|
|
191
|
+
signalExactGovernedProcessTree(child, signal);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
child.kill(signal);
|
|
195
|
+
}
|
|
196
|
+
let escalationError;
|
|
197
|
+
const escalation = setTimeout(() => {
|
|
198
|
+
try {
|
|
199
|
+
if (!isSettled() ||
|
|
200
|
+
(ownsProcessGroup && pid && exactGovernedProcessTreeExists(pid))) {
|
|
201
|
+
if (process.platform === 'win32' || ownsProcessGroup) {
|
|
202
|
+
signalExactGovernedProcessTree(child, 'SIGKILL');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
child.kill('SIGKILL');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
escalationError = error;
|
|
211
|
+
}
|
|
212
|
+
}, SST_SIGNAL_GRACE_PERIOD_MS);
|
|
213
|
+
try {
|
|
214
|
+
await waitForGovernedChildSettlement(childSettled, deadline);
|
|
215
|
+
if (ownsProcessGroup && pid && process.platform !== 'win32') {
|
|
216
|
+
await waitForExactGovernedProcessTreeExit(pid, deadline);
|
|
217
|
+
}
|
|
218
|
+
if (escalationError)
|
|
219
|
+
throw escalationError;
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
clearTimeout(escalation);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/** Run one exact shell-free child as an owned process tree. The returned
|
|
226
|
+
* promise settles only after child teardown and the bounded caller-supplied
|
|
227
|
+
* close reconciliation complete. */
|
|
228
|
+
function runGovernedChildProcess(input) {
|
|
229
|
+
return new Promise((resolveChildRun) => {
|
|
230
|
+
const environment = { ...input.environment };
|
|
231
|
+
for (const name of Object.keys(environment)) {
|
|
232
|
+
if (name.toUpperCase() === GOVERNED_PROCESS_GROUP_ENV) {
|
|
233
|
+
delete environment[name];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (process.platform !== 'win32') {
|
|
237
|
+
environment[GOVERNED_PROCESS_GROUP_ENV] = '1';
|
|
238
|
+
}
|
|
239
|
+
const child = (input.spawnChild ?? node_child_process_1.spawn)(input.executable, [...input.args], {
|
|
240
|
+
cwd: input.cwd,
|
|
241
|
+
detached: process.platform !== 'win32',
|
|
242
|
+
env: environment,
|
|
243
|
+
shell: false,
|
|
244
|
+
stdio: 'inherit',
|
|
245
|
+
});
|
|
246
|
+
let finishing = false;
|
|
247
|
+
let settled = false;
|
|
248
|
+
let cancellationSignal;
|
|
249
|
+
let spawnError;
|
|
250
|
+
let unregisterSignalCleanup = () => undefined;
|
|
251
|
+
let resolveChildSettled = () => undefined;
|
|
252
|
+
const childSettled = new Promise((resolveChild) => {
|
|
253
|
+
resolveChildSettled = resolveChild;
|
|
254
|
+
});
|
|
255
|
+
const finish = async (status, signal) => {
|
|
256
|
+
if (finishing)
|
|
257
|
+
return;
|
|
258
|
+
finishing = true;
|
|
259
|
+
const result = {
|
|
260
|
+
...(spawnError ? { error: spawnError } : {}),
|
|
261
|
+
signal,
|
|
262
|
+
status,
|
|
263
|
+
};
|
|
264
|
+
if (!(0, federated_credential_transport_js_1.governedSignalCleanupInProgress)() && child.pid) {
|
|
265
|
+
try {
|
|
266
|
+
if (await terminateRetainedGovernedProcessGroup(child.pid)) {
|
|
267
|
+
result.error ??= new Error('Governed child exited before its exact descendant process tree stopped.');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
result.error =
|
|
272
|
+
error instanceof Error
|
|
273
|
+
? error
|
|
274
|
+
: new Error('Governed child descendant process-tree reconciliation failed.');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
// A child may acknowledge cancellation with exit zero. Preserve the
|
|
279
|
+
// observed parent signal before callers reconcile a successful close.
|
|
280
|
+
result.signal ??= cancellationSignal ?? null;
|
|
281
|
+
await input.afterClose?.(result);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
result.error =
|
|
285
|
+
error instanceof Error
|
|
286
|
+
? error
|
|
287
|
+
: new Error('Governed child close reconciliation failed.');
|
|
288
|
+
}
|
|
289
|
+
result.signal ??= cancellationSignal ?? null;
|
|
290
|
+
settled = true;
|
|
291
|
+
unregisterSignalCleanup();
|
|
292
|
+
resolveChildSettled();
|
|
293
|
+
resolveChildRun(result);
|
|
294
|
+
};
|
|
295
|
+
unregisterSignalCleanup = (0, federated_credential_transport_js_1.registerGovernedSignalCleanup)((signal) => {
|
|
296
|
+
if (settled)
|
|
297
|
+
return;
|
|
298
|
+
cancellationSignal ??= signal;
|
|
299
|
+
return stopExactGovernedProcessTree(child, signal, childSettled, () => settled);
|
|
300
|
+
}, 100);
|
|
301
|
+
child.once('error', (error) => {
|
|
302
|
+
spawnError = error;
|
|
303
|
+
void finish(null, null);
|
|
304
|
+
});
|
|
305
|
+
child.once('close', (status, signal) => {
|
|
306
|
+
void finish(status, signal);
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
function partitionForRegion(region) {
|
|
311
|
+
if (region.startsWith('cn-'))
|
|
312
|
+
return 'aws-cn';
|
|
313
|
+
if (region.startsWith('us-gov-'))
|
|
314
|
+
return 'aws-us-gov';
|
|
315
|
+
return 'aws';
|
|
316
|
+
}
|
|
317
|
+
function captureSstEnvironmentSource(context) {
|
|
318
|
+
const projectName = context.projectName;
|
|
319
|
+
const configured = projectName
|
|
320
|
+
? context.projectsConfigurations?.projects[projectName]?.root
|
|
321
|
+
: undefined;
|
|
322
|
+
if (!projectName || !configured) {
|
|
323
|
+
throw new Error('SST lifecycle tool-owned source requires one exact Nx project root.');
|
|
324
|
+
}
|
|
325
|
+
return (0, sst_environment_source_js_1.captureSstEnvironmentSourceTree)({
|
|
326
|
+
projectRoot: (0, node_path_1.isAbsolute)(configured)
|
|
327
|
+
? configured
|
|
328
|
+
: (0, node_path_1.join)(context.root, configured),
|
|
329
|
+
workspaceRoot: context.root,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
function requiresSourceReconciliation(command, stage) {
|
|
333
|
+
return ((GOVERNED_STAGES.has(stage) ||
|
|
334
|
+
(command === 'remove' && /^personal-[a-f0-9]{24}$/.test(stage))) &&
|
|
32
335
|
(command === 'deploy' || command === 'refresh' || command === 'remove'));
|
|
33
336
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
337
|
+
function isGovernedLocalCommand(command) {
|
|
338
|
+
return (command === 'deploy' ||
|
|
339
|
+
command === 'refresh' ||
|
|
340
|
+
command === 'remove' ||
|
|
341
|
+
command === 'unlock');
|
|
37
342
|
}
|
|
38
|
-
async function
|
|
39
|
-
const
|
|
40
|
-
|
|
343
|
+
async function authorizeLocalUnlock(options, invocation, environment = process.env) {
|
|
344
|
+
const expectedAccount = invocation.environment.AWS_EXPECTED_ACCOUNT_ID?.trim() ?? '';
|
|
345
|
+
const expectedRoleArn = invocation.environment.EBK_EXPECTED_DEPLOYMENT_ROLE_ARN?.trim() ?? '';
|
|
346
|
+
if (!/^\d{12}$/.test(expectedAccount) || !expectedRoleArn) {
|
|
347
|
+
throw new Error('Local unlock requires one exact committed account and temporary assumed role.');
|
|
348
|
+
}
|
|
349
|
+
const ambientExpectedAccount = environment.AWS_EXPECTED_ACCOUNT_ID?.trim();
|
|
350
|
+
if (ambientExpectedAccount && ambientExpectedAccount !== expectedAccount) {
|
|
351
|
+
throw new Error('Ambient AWS_EXPECTED_ACCOUNT_ID does not match committed deployment topology.');
|
|
352
|
+
}
|
|
353
|
+
const result = (0, node_child_process_1.spawnSync)('aws', [
|
|
354
|
+
'sts',
|
|
355
|
+
'get-caller-identity',
|
|
356
|
+
'--endpoint-url',
|
|
357
|
+
(0, identity_js_1.canonicalStsEndpoint)(invocation.environment.AWS_REGION?.trim() ?? ''),
|
|
358
|
+
'--output',
|
|
359
|
+
'json',
|
|
360
|
+
...(options.profile ? ['--profile', options.profile] : []),
|
|
361
|
+
], {
|
|
362
|
+
cwd: invocation.cwd,
|
|
363
|
+
encoding: 'utf8',
|
|
364
|
+
env: createSstChildEnvironment(environment, invocation.environment),
|
|
365
|
+
maxBuffer: MAX_CALLER_IDENTITY_BYTES,
|
|
366
|
+
shell: false,
|
|
367
|
+
windowsHide: true,
|
|
368
|
+
});
|
|
369
|
+
if (result.error || result.status !== 0 || result.signal) {
|
|
370
|
+
throw new Error('Local unlock AWS caller identity could not be verified.');
|
|
371
|
+
}
|
|
372
|
+
let caller;
|
|
373
|
+
try {
|
|
374
|
+
caller = JSON.parse(result.stdout);
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
throw new Error('Local unlock AWS caller identity is not valid JSON.');
|
|
378
|
+
}
|
|
379
|
+
if (!caller ||
|
|
380
|
+
typeof caller !== 'object' ||
|
|
381
|
+
Array.isArray(caller) ||
|
|
382
|
+
!('Account' in caller) ||
|
|
383
|
+
!('Arn' in caller) ||
|
|
384
|
+
caller.Account !== expectedAccount ||
|
|
385
|
+
typeof caller.Arn !== 'string' ||
|
|
386
|
+
!(0, identity_js_1.matchesExpectedAssumedRoleArn)(expectedAccount, caller.Arn, expectedRoleArn)) {
|
|
387
|
+
throw new Error('Local unlock AWS caller does not match the committed account and exact temporary assumed role.');
|
|
388
|
+
}
|
|
41
389
|
}
|
|
42
390
|
function projectKind(context) {
|
|
43
391
|
if (!context.projectName) {
|
|
@@ -52,11 +400,31 @@ function projectKind(context) {
|
|
|
52
400
|
return foundation ? 'foundation' : 'slice';
|
|
53
401
|
}
|
|
54
402
|
function createSstChildEnvironment(ambient, invocation) {
|
|
55
|
-
const
|
|
403
|
+
const stageSanitized = (0, personal_stage_js_1.isFrameworkPersonalStage)(invocation.EBK_CONSUMER_STAGE)
|
|
56
404
|
? (0, personal_stage_js_1.createPersonalDevelopmentEnvironment)(invocation.EBK_CONSUMER_STAGE, ambient)
|
|
57
405
|
: (0, personal_stage_js_1.stripAmbientStageAuthority)(ambient);
|
|
406
|
+
const sanitized = (0, child_environment_js_1.sanitizeGovernedAwsChildEnvironment)(stageSanitized, {
|
|
407
|
+
preserveVerifiedGithubCredentials: stageSanitized.GITHUB_ACTIONS === 'true',
|
|
408
|
+
});
|
|
58
409
|
delete sanitized.EBK_PRODUCTION_FOUNDATION_PROFILE;
|
|
59
|
-
|
|
410
|
+
delete sanitized.EBK_LOCAL_MUTATION_CAPABILITY_NONCE;
|
|
411
|
+
delete sanitized.EBK_LOCAL_MUTATION_CAPABILITY_PATH;
|
|
412
|
+
delete sanitized.EBK_GITHUB_JOB_WORKFLOW_REF;
|
|
413
|
+
delete sanitized.EBK_NX_STAGE_LIFECYCLE;
|
|
414
|
+
delete sanitized.EBK_NX_TASK_CLEANUP;
|
|
415
|
+
delete sanitized.EBK_NX_TASK_UNLOCK;
|
|
416
|
+
// Nx injects task identity, target, hash, terminal, cache, and invocation
|
|
417
|
+
// metadata into every executor process. Those values describe orchestration,
|
|
418
|
+
// not desired infrastructure. Never let them reach SST, where build tools
|
|
419
|
+
// can persist ambient environment values into deployment archives.
|
|
420
|
+
for (const name of Object.keys(sanitized)) {
|
|
421
|
+
if (name.startsWith('NX_') || name === 'LERNA_PACKAGE_NAME') {
|
|
422
|
+
delete sanitized[name];
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
const childEnvironment = { ...sanitized, ...invocation };
|
|
426
|
+
delete childEnvironment.EBK_NX_TASK_UNLOCK;
|
|
427
|
+
return childEnvironment;
|
|
60
428
|
}
|
|
61
429
|
function assertSafeSstForwardedArguments(args) {
|
|
62
430
|
const reserved = args.find((argument) => {
|
|
@@ -80,21 +448,39 @@ function resolveSstDevMode(environment, forwardedArguments = []) {
|
|
|
80
448
|
}
|
|
81
449
|
return requested;
|
|
82
450
|
}
|
|
83
|
-
function assertSstLifecyclePolicy(command, stage, environment = process.env) {
|
|
84
|
-
if (!
|
|
451
|
+
function assertSstLifecyclePolicy(command, stage, environment = process.env, deploymentProfile = 'fully-isolated') {
|
|
452
|
+
if (!GOVERNED_STAGES.has(stage))
|
|
85
453
|
return;
|
|
86
454
|
if (command === 'dev') {
|
|
87
455
|
throw new Error(`SST dev is not permitted for protected stage ${stage}.`);
|
|
88
456
|
}
|
|
457
|
+
if (command === 'remove' &&
|
|
458
|
+
stage === 'production' &&
|
|
459
|
+
environment.EBK_ALLOW_PRODUCTION_REMOVE !== 'true') {
|
|
460
|
+
throw new Error('Production removal requires EBK_ALLOW_PRODUCTION_REMOVE=true in the governed production environment.');
|
|
461
|
+
}
|
|
462
|
+
if (!(0, index_js_2.requiresGithubDeployment)(deploymentProfile, stage) &&
|
|
463
|
+
environment.GITHUB_ACTIONS !== 'true') {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
89
466
|
const repository = environment.GITHUB_REPOSITORY;
|
|
90
|
-
const expectedBranch = stage === '
|
|
467
|
+
const expectedBranch = stage === 'production' ? 'main' : 'develop';
|
|
91
468
|
const expectedRef = `refs/heads/${expectedBranch}`;
|
|
92
|
-
const
|
|
469
|
+
const expectedCalledWorkflowRef = repository
|
|
93
470
|
? `${repository}/.github/workflows/deploy.yml@${expectedRef}`
|
|
94
471
|
: undefined;
|
|
95
472
|
const eventName = environment.GITHUB_EVENT_NAME;
|
|
96
473
|
const allowedEvent = eventName === 'workflow_dispatch' ||
|
|
97
|
-
(eventName === 'push' &&
|
|
474
|
+
(eventName === 'push' &&
|
|
475
|
+
command === 'deploy' &&
|
|
476
|
+
deploymentProfile !== 'starter');
|
|
477
|
+
const expectedCallerWorkflowRef = eventName === 'push'
|
|
478
|
+
? repository
|
|
479
|
+
? `${repository}/.github/workflows/ci.yml@${expectedRef}`
|
|
480
|
+
: undefined
|
|
481
|
+
: eventName === 'workflow_dispatch'
|
|
482
|
+
? expectedCalledWorkflowRef
|
|
483
|
+
: undefined;
|
|
98
484
|
// These GitHub-provided values are a fail-closed provenance consistency
|
|
99
485
|
// check, not a credential boundary: a local process can spoof them. Actual
|
|
100
486
|
// protected-stage authority comes from environment-scoped OIDC role access
|
|
@@ -104,14 +490,10 @@ function assertSstLifecyclePolicy(command, stage, environment = process.env) {
|
|
|
104
490
|
environment.GITHUB_ACTIONS === 'true' &&
|
|
105
491
|
allowedEvent &&
|
|
106
492
|
environment.GITHUB_REF === expectedRef &&
|
|
107
|
-
environment.GITHUB_WORKFLOW_REF ===
|
|
493
|
+
environment.GITHUB_WORKFLOW_REF === expectedCallerWorkflowRef &&
|
|
494
|
+
environment.EBK_GITHUB_JOB_WORKFLOW_REF === expectedCalledWorkflowRef;
|
|
108
495
|
if (!workflowProvenanceMatches) {
|
|
109
|
-
throw new Error(`SST ${command} for protected stage ${stage} must run from the ${expectedBranch}-branch deploy
|
|
110
|
-
}
|
|
111
|
-
if (command === 'remove' &&
|
|
112
|
-
stage === 'production' &&
|
|
113
|
-
environment.EBK_ALLOW_PRODUCTION_REMOVE !== 'true') {
|
|
114
|
-
throw new Error('Production removal requires EBK_ALLOW_PRODUCTION_REMOVE=true in the protected production environment.');
|
|
496
|
+
throw new Error(`SST ${command} for protected stage ${stage} must run from the exact ${expectedBranch}-branch caller and reusable deploy workflows; isolated-profile pushes may run only deploy and other lifecycle actions require workflow_dispatch.`);
|
|
115
497
|
}
|
|
116
498
|
}
|
|
117
499
|
function resolveSstLifecycleStages(options, environment = process.env) {
|
|
@@ -165,7 +547,7 @@ function buildSstCommandInvocation(command, options, context, environment = proc
|
|
|
165
547
|
}
|
|
166
548
|
return {
|
|
167
549
|
consumerStage: (dependencies.personalStageResolver ??
|
|
168
|
-
(0, personal_stage_js_1.createPersonalStageResolver)()).resolve().stage,
|
|
550
|
+
(0, personal_stage_js_1.createPersonalStageResolver)()).resolve(context.root).stage,
|
|
169
551
|
foundationStage: 'development',
|
|
170
552
|
mapped: true,
|
|
171
553
|
};
|
|
@@ -180,15 +562,138 @@ function buildSstCommandInvocation(command, options, context, environment = proc
|
|
|
180
562
|
stages.mapped) {
|
|
181
563
|
throw new Error(`Full deploy is not permitted for mapped personal stage ${stages.consumerStage}. Use ebk dev against the ${stages.foundationStage} Foundation.`);
|
|
182
564
|
}
|
|
183
|
-
|
|
184
|
-
|
|
565
|
+
const taskCleanup = environment.EBK_NX_TASK_CLEANUP !== undefined;
|
|
566
|
+
const taskUnlock = environment.EBK_NX_TASK_UNLOCK !== undefined;
|
|
567
|
+
if (taskUnlock) {
|
|
568
|
+
if (taskCleanup ||
|
|
569
|
+
command !== 'unlock' ||
|
|
570
|
+
kind !== 'slice' ||
|
|
571
|
+
environment.GITHUB_ACTIONS === 'true' ||
|
|
572
|
+
options.args !== undefined ||
|
|
573
|
+
options.cwd !== undefined ||
|
|
574
|
+
options.target !== undefined ||
|
|
575
|
+
!stages.mapped ||
|
|
576
|
+
stages.foundationStage !== 'development') {
|
|
577
|
+
throw new Error('Task unlock is restricted to the current local Slice task.');
|
|
578
|
+
}
|
|
579
|
+
const task = (0, task_identity_js_1.resolveTaskIdentity)(context.root);
|
|
580
|
+
if (environment.EBK_NX_TASK_UNLOCK !== task.taskId ||
|
|
581
|
+
stages.consumerStage !== `personal-${task.taskId}`) {
|
|
582
|
+
throw new Error('Task unlock cannot select another task or stage.');
|
|
583
|
+
}
|
|
584
|
+
const source = (0, local_deploy_js_1.localWorkingTreeDigest)(context.root);
|
|
585
|
+
if (source.commit !== environment.EBK_SOURCE_COMMIT ||
|
|
586
|
+
source.digest !== environment.EBK_LOCAL_SOURCE_TREE) {
|
|
587
|
+
throw new Error('Task unlock requires the exact authorized source tree.');
|
|
588
|
+
}
|
|
589
|
+
(0, task_stack_absence_js_1.resolveStaticTaskApp)({
|
|
590
|
+
workspaceRoot: context.root,
|
|
591
|
+
projectRoot: cwd,
|
|
592
|
+
projectName: context.projectName ?? '',
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
else if (command === 'unlock' && stages.mapped) {
|
|
596
|
+
throw new Error('Personal task unlock requires the current-task governed adapter.');
|
|
597
|
+
}
|
|
598
|
+
if (taskCleanup) {
|
|
599
|
+
if (command !== 'remove' ||
|
|
600
|
+
kind !== 'slice' ||
|
|
601
|
+
environment.GITHUB_ACTIONS === 'true' ||
|
|
602
|
+
options.args !== undefined ||
|
|
603
|
+
options.cwd !== undefined ||
|
|
604
|
+
options.target !== undefined ||
|
|
605
|
+
!stages.mapped ||
|
|
606
|
+
stages.foundationStage !== 'development')
|
|
607
|
+
throw new Error('Task cleanup is restricted to the current local Slice task and native removal.');
|
|
608
|
+
const task = (0, task_identity_js_1.resolveTaskIdentity)(context.root);
|
|
609
|
+
if (environment.EBK_NX_TASK_CLEANUP !== task.taskId ||
|
|
610
|
+
stages.consumerStage !== `personal-${task.taskId}`) {
|
|
611
|
+
throw new Error('Task cleanup cannot select another task or stage.');
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
else if (command === 'remove' && stages.mapped) {
|
|
615
|
+
throw new Error('Personal task removal is owned by ebk dev down; canonical remove cannot select a task.');
|
|
616
|
+
}
|
|
617
|
+
const operatingPolicy = command === 'dev' ||
|
|
618
|
+
taskCleanup ||
|
|
619
|
+
taskUnlock ||
|
|
620
|
+
(DEPLOYMENT_STAGES.has(stages.consumerStage) &&
|
|
621
|
+
(command === 'deploy' ||
|
|
622
|
+
command === 'refresh' ||
|
|
623
|
+
command === 'remove' ||
|
|
624
|
+
command === 'unlock'))
|
|
625
|
+
? (0, index_js_2.readRepositoryOperatingPolicy)(context.root)
|
|
626
|
+
: undefined;
|
|
627
|
+
assertSstLifecyclePolicy(command, stages.consumerStage, environment, operatingPolicy?.deploymentProfile);
|
|
628
|
+
const authorityStage = command === 'dev' || taskCleanup || taskUnlock
|
|
629
|
+
? 'development'
|
|
630
|
+
: stages.consumerStage;
|
|
631
|
+
const deploymentAccount = operatingPolicy
|
|
632
|
+
? (0, index_js_2.configuredDeploymentAccountForStage)(operatingPolicy.deploymentProfile, operatingPolicy.deploymentAccounts, authorityStage)
|
|
633
|
+
: undefined;
|
|
634
|
+
const deploymentRegion = operatingPolicy
|
|
635
|
+
? (0, index_js_2.configuredDeploymentRegion)(operatingPolicy.deploymentRegion)
|
|
636
|
+
: undefined;
|
|
637
|
+
if ((taskCleanup || taskUnlock) && deploymentAccount && deploymentRegion) {
|
|
638
|
+
// This read cannot create or reassign the binding. The executor separately
|
|
639
|
+
// verifies the current caller and Foundation owner before constructing SST.
|
|
640
|
+
const owner = (0, index_js_2.readRepositoryOperatingPolicy)(context.root);
|
|
641
|
+
(0, task_identity_js_1.assertCurrentTaskEnvironment)(context.root, {
|
|
642
|
+
accountId: deploymentAccount,
|
|
643
|
+
region: deploymentRegion,
|
|
644
|
+
workspaceDeploymentId: owner.workspaceDeploymentId,
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
if (deploymentRegion &&
|
|
648
|
+
options.region?.trim() &&
|
|
649
|
+
options.region.trim() !== deploymentRegion) {
|
|
650
|
+
throw new Error(`SST lifecycle Region ${options.region.trim()} differs from committed deployment Region ${deploymentRegion}.`);
|
|
651
|
+
}
|
|
652
|
+
if (options.expectedRoleArn !== undefined &&
|
|
653
|
+
!AWS_ROLE_ARN_PATTERN.test(options.expectedRoleArn.trim())) {
|
|
654
|
+
throw new Error('SST lifecycle expectedRoleArn must be one exact IAM role ARN.');
|
|
655
|
+
}
|
|
656
|
+
const committedRoleArn = operatingPolicy &&
|
|
657
|
+
deploymentAccount &&
|
|
658
|
+
deploymentRegion &&
|
|
659
|
+
isGovernedLocalCommand(command)
|
|
660
|
+
? (0, index_js_1.createStageAuthorityIdentity)({
|
|
661
|
+
accountId: deploymentAccount,
|
|
662
|
+
partition: partitionForRegion(deploymentRegion),
|
|
663
|
+
region: deploymentRegion,
|
|
664
|
+
stage: authorityStage,
|
|
665
|
+
}).deploymentRoleArn
|
|
666
|
+
: undefined;
|
|
667
|
+
if (committedRoleArn &&
|
|
668
|
+
options.expectedRoleArn?.trim() &&
|
|
669
|
+
options.expectedRoleArn.trim() !== committedRoleArn) {
|
|
670
|
+
throw new Error(`SST ${command} requires the exact committed ${authorityStage} stage authority role ${committedRoleArn}.`);
|
|
671
|
+
}
|
|
672
|
+
const profile = options.profile?.trim();
|
|
673
|
+
if (options.profile !== undefined &&
|
|
674
|
+
(!profile || profile !== options.profile || profile.length > 128)) {
|
|
675
|
+
throw new Error('SST lifecycle profile must be one non-empty exact AWS profile name up to 128 characters.');
|
|
676
|
+
}
|
|
677
|
+
if (operatingPolicy &&
|
|
678
|
+
environment.GITHUB_ACTIONS !== 'true' &&
|
|
679
|
+
command === 'deploy' &&
|
|
680
|
+
environment.EBK_NX_STAGE_LIFECYCLE !== 'local') {
|
|
681
|
+
throw new Error(`Local deploy for ${stages.consumerStage} must be invoked by the governed root stage lifecycle (EBK_NX_STAGE_LIFECYCLE=local).`);
|
|
682
|
+
}
|
|
683
|
+
if (operatingPolicy &&
|
|
684
|
+
environment.GITHUB_ACTIONS !== 'true' &&
|
|
685
|
+
isGovernedLocalCommand(command) &&
|
|
686
|
+
!options.expectedRoleArn?.trim()) {
|
|
687
|
+
throw new Error(`Local ${command} for ${stages.consumerStage} requires --expectedRoleArn for one temporary assumed-role session.`);
|
|
688
|
+
}
|
|
689
|
+
if (GOVERNED_STAGES.has(stages.consumerStage) &&
|
|
185
690
|
(command === 'deploy' || command === 'refresh')) {
|
|
186
|
-
(0,
|
|
187
|
-
protectedPromotion:
|
|
691
|
+
(0, index_js_4.assertWorkMarkerReport)((0, index_js_4.scanWorkMarkers)(context.root), {
|
|
692
|
+
protectedPromotion: stages.consumerStage !== 'development',
|
|
188
693
|
});
|
|
189
694
|
}
|
|
190
695
|
const policyDecision = stages.consumerStage === 'production'
|
|
191
|
-
? (0,
|
|
696
|
+
? (0, index_js_2.assertRepositoryPolicyRequest)(context.root, {
|
|
192
697
|
action: command,
|
|
193
698
|
projects: [
|
|
194
699
|
{
|
|
@@ -200,9 +705,8 @@ function buildSstCommandInvocation(command, options, context, environment = proc
|
|
|
200
705
|
})
|
|
201
706
|
: undefined;
|
|
202
707
|
const args = [command, '--stage', stages.consumerStage];
|
|
203
|
-
if (
|
|
204
|
-
args.push('--
|
|
205
|
-
}
|
|
708
|
+
if (command === 'refresh')
|
|
709
|
+
args.push('--yes');
|
|
206
710
|
if (options.target) {
|
|
207
711
|
args.push('--target', options.target);
|
|
208
712
|
}
|
|
@@ -222,8 +726,29 @@ function buildSstCommandInvocation(command, options, context, environment = proc
|
|
|
222
726
|
],
|
|
223
727
|
cwd,
|
|
224
728
|
environment: {
|
|
225
|
-
...(
|
|
729
|
+
...(deploymentAccount
|
|
730
|
+
? {
|
|
731
|
+
AWS_EXPECTED_ACCOUNT_ID: deploymentAccount,
|
|
732
|
+
}
|
|
733
|
+
: {}),
|
|
734
|
+
...(profile ? { AWS_PROFILE: profile } : {}),
|
|
735
|
+
...(deploymentRegion
|
|
736
|
+
? { AWS_REGION: deploymentRegion }
|
|
737
|
+
: options.region?.trim()
|
|
738
|
+
? { AWS_REGION: options.region.trim() }
|
|
739
|
+
: {}),
|
|
226
740
|
EBK_CONSUMER_STAGE: stages.consumerStage,
|
|
741
|
+
...(taskCleanup
|
|
742
|
+
? { EBK_NX_TASK_CLEANUP: environment.EBK_NX_TASK_CLEANUP }
|
|
743
|
+
: {}),
|
|
744
|
+
...(taskUnlock
|
|
745
|
+
? { EBK_NX_TASK_UNLOCK: environment.EBK_NX_TASK_UNLOCK }
|
|
746
|
+
: {}),
|
|
747
|
+
...((committedRoleArn ?? options.expectedRoleArn?.trim())
|
|
748
|
+
? {
|
|
749
|
+
EBK_EXPECTED_DEPLOYMENT_ROLE_ARN: committedRoleArn ?? options.expectedRoleArn?.trim(),
|
|
750
|
+
}
|
|
751
|
+
: {}),
|
|
227
752
|
EBK_FOUNDATION_STAGE: stages.foundationStage,
|
|
228
753
|
...(policyDecision?.effectiveProductionProfile
|
|
229
754
|
? {
|
|
@@ -234,77 +759,261 @@ function buildSstCommandInvocation(command, options, context, environment = proc
|
|
|
234
759
|
executable: process.execPath,
|
|
235
760
|
};
|
|
236
761
|
}
|
|
237
|
-
async function runSstLifecyclePreflights(command, options, context, invocation, dependencies = {}) {
|
|
238
|
-
|
|
239
|
-
|
|
762
|
+
async function runSstLifecyclePreflights(command, options, context, invocation, dependencies = {}, environment = process.env) {
|
|
763
|
+
// Standard Slices contain a Python infrastructure provisioner even when
|
|
764
|
+
// their application handlers are TypeScript. Fail before SST can partially
|
|
765
|
+
// create resources; recovery operations must remain available without build
|
|
766
|
+
// tooling. This is a local prerequisite, not a provider-plan gate.
|
|
767
|
+
if ((command === 'dev' || command === 'deploy') &&
|
|
768
|
+
(0, node_fs_1.existsSync)((0, node_path_1.join)(invocation.cwd, 'pyproject.toml'))) {
|
|
769
|
+
const manifest = (0, node_fs_1.lstatSync)((0, node_path_1.join)(invocation.cwd, 'pyproject.toml'));
|
|
770
|
+
if (!manifest.isFile() || manifest.isSymbolicLink()) {
|
|
771
|
+
throw new Error('Python tooling manifest must be a regular project file.');
|
|
772
|
+
}
|
|
773
|
+
const childEnvironment = {};
|
|
774
|
+
for (const key of ['PATH', 'Path', 'PATHEXT', 'SystemRoot', 'SYSTEMROOT']) {
|
|
775
|
+
if (environment[key] !== undefined)
|
|
776
|
+
childEnvironment[key] = environment[key];
|
|
777
|
+
}
|
|
778
|
+
const result = (0, node_child_process_1.spawnSync)('uv', ['--version'], {
|
|
779
|
+
cwd: invocation.cwd,
|
|
780
|
+
env: childEnvironment,
|
|
781
|
+
encoding: 'utf8',
|
|
782
|
+
timeout: 5_000,
|
|
783
|
+
maxBuffer: 4_096,
|
|
784
|
+
windowsHide: true,
|
|
785
|
+
shell: false,
|
|
786
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
787
|
+
});
|
|
788
|
+
if (result.error ||
|
|
789
|
+
result.status !== 0 ||
|
|
790
|
+
!/^uv \d+\.\d+\.\d+\b/.test(result.stdout ?? '')) {
|
|
791
|
+
// Do not surface arbitrary tool stderr or inherited credential material.
|
|
792
|
+
throw new Error(`Python tooling for ${context.projectName ?? 'the selected project'} requires uv on PATH. Install the workspace-documented uv version and retry the same EBK command. No SST child started.`);
|
|
793
|
+
}
|
|
240
794
|
}
|
|
795
|
+
const stage = command === 'dev' ||
|
|
796
|
+
(command === 'remove' && invocation.environment.EBK_NX_TASK_CLEANUP) ||
|
|
797
|
+
(command === 'unlock' && invocation.environment.EBK_NX_TASK_UNLOCK)
|
|
798
|
+
? 'development'
|
|
799
|
+
: invocation.environment.EBK_CONSUMER_STAGE;
|
|
800
|
+
await (dependencies.ownership ?? index_js_3.assertWorkspaceStageOwnershipForWorkspace)(context.root, stage, {
|
|
801
|
+
...(environment.AWS_CONFIG_FILE
|
|
802
|
+
? { configFilepath: environment.AWS_CONFIG_FILE }
|
|
803
|
+
: {}),
|
|
804
|
+
...(environment.AWS_SHARED_CREDENTIALS_FILE
|
|
805
|
+
? { credentialsFilepath: environment.AWS_SHARED_CREDENTIALS_FILE }
|
|
806
|
+
: {}),
|
|
807
|
+
...(invocation.environment.AWS_PROFILE
|
|
808
|
+
? { profile: invocation.environment.AWS_PROFILE }
|
|
809
|
+
: {}),
|
|
810
|
+
});
|
|
241
811
|
if (command === 'deploy') {
|
|
812
|
+
if (environment.GITHUB_ACTIONS === 'true') {
|
|
813
|
+
await (dependencies.initializeSecrets ?? secret_initialize_js_1.initializeProtectedDeploymentSecrets)(stage, context, environment);
|
|
814
|
+
}
|
|
242
815
|
await (dependencies.secrets ?? secret_preflight_js_1.preflightSliceSecretMetadata)(options, context, invocation);
|
|
243
816
|
}
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
|
|
817
|
+
if (command === 'unlock' &&
|
|
818
|
+
invocation.environment.EBK_EXPECTED_DEPLOYMENT_ROLE_ARN) {
|
|
819
|
+
await (dependencies.unlockAuthorization ?? authorizeLocalUnlock)(options, invocation, environment);
|
|
247
820
|
}
|
|
248
821
|
}
|
|
249
822
|
async function runSstCommand(command, options, context, dependencies = {}) {
|
|
823
|
+
const environment = dependencies.environment ?? process.env;
|
|
824
|
+
if (command !== 'dev' &&
|
|
825
|
+
!(command === 'remove' && environment.EBK_NX_TASK_CLEANUP !== undefined) &&
|
|
826
|
+
!(command === 'unlock' && environment.EBK_NX_TASK_UNLOCK !== undefined)) {
|
|
827
|
+
assertGovernedAwsLifecyclePlatform(dependencies.platform);
|
|
828
|
+
}
|
|
829
|
+
const joinsGovernedProcessGroup = process.platform !== 'win32' &&
|
|
830
|
+
environment[GOVERNED_PROCESS_GROUP_ENV] === '1';
|
|
250
831
|
let invocation;
|
|
832
|
+
let environmentSource;
|
|
833
|
+
let taskWriter;
|
|
251
834
|
try {
|
|
252
|
-
invocation = buildSstCommandInvocation(command, options, context);
|
|
253
|
-
|
|
835
|
+
invocation = buildSstCommandInvocation(command, options, context, environment);
|
|
836
|
+
if (requiresSourceReconciliation(command, invocation.environment.EBK_CONSUMER_STAGE)) {
|
|
837
|
+
// Native SST can rewrite its generated environment declaration. Capture
|
|
838
|
+
// committed tool-owned source before the child so successful and failed
|
|
839
|
+
// lifecycle commands restore the repository exactly.
|
|
840
|
+
environmentSource = captureSstEnvironmentSource(context);
|
|
841
|
+
}
|
|
842
|
+
await runSstLifecyclePreflights(command, options, context, invocation, dependencies, environment);
|
|
843
|
+
if (environmentSource)
|
|
844
|
+
(0, sst_environment_source_js_1.reconcileSstEnvironmentSourceTree)(environmentSource);
|
|
845
|
+
if (command === 'dev' ||
|
|
846
|
+
invocation.environment.EBK_NX_TASK_CLEANUP ||
|
|
847
|
+
invocation.environment.EBK_NX_TASK_UNLOCK) {
|
|
848
|
+
// Rebuild after asynchronous authorization: source, task owner, and
|
|
849
|
+
// committed account/Region must still agree immediately before spawn.
|
|
850
|
+
const current = buildSstCommandInvocation(command, options, context, environment);
|
|
851
|
+
if (JSON.stringify(current) !== JSON.stringify(invocation))
|
|
852
|
+
throw new Error('Task native invocation changed during preflight.');
|
|
853
|
+
taskWriter = (dependencies.acquireTaskWriter ?? task_native_writer_js_1.acquireTaskNativeWriterLease)(context, invocation.environment.EBK_CONSUMER_STAGE.slice('personal-'.length), command === 'unlock', dependencies.taskNativeWriterEffects);
|
|
854
|
+
taskWriter.assertCurrent();
|
|
855
|
+
}
|
|
254
856
|
}
|
|
255
857
|
catch (error) {
|
|
858
|
+
let restorationError;
|
|
859
|
+
try {
|
|
860
|
+
// No native child has been spawned during this preflight phase.
|
|
861
|
+
taskWriter?.release();
|
|
862
|
+
}
|
|
863
|
+
catch (releaseError) {
|
|
864
|
+
devkit_1.logger.error(`Task native writer preflight evidence retained: ${releaseError instanceof Error ? releaseError.message : String(releaseError)}`);
|
|
865
|
+
}
|
|
866
|
+
if (environmentSource) {
|
|
867
|
+
try {
|
|
868
|
+
(0, sst_environment_source_js_1.reconcileSstEnvironmentSourceTree)(environmentSource);
|
|
869
|
+
}
|
|
870
|
+
catch (candidate) {
|
|
871
|
+
restorationError = candidate;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
256
874
|
devkit_1.logger.error(error instanceof Error ? error.message : String(error));
|
|
875
|
+
if (restorationError !== undefined) {
|
|
876
|
+
devkit_1.logger.error(`Failed to restore SST tool-owned source after preflight: ${restorationError instanceof Error
|
|
877
|
+
? restorationError.message
|
|
878
|
+
: String(restorationError)}`);
|
|
879
|
+
}
|
|
257
880
|
return { success: false };
|
|
258
881
|
}
|
|
259
882
|
devkit_1.logger.info(`Running workspace SST: ${command} --stage ${invocation.environment.EBK_CONSUMER_STAGE} foundationStage=${invocation.environment.EBK_FOUNDATION_STAGE} (${invocation.cwd})`);
|
|
260
883
|
return new Promise((resolve) => {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
884
|
+
let child;
|
|
885
|
+
try {
|
|
886
|
+
taskWriter?.assertCurrent();
|
|
887
|
+
child = (dependencies.spawnChild ?? node_child_process_1.spawn)(invocation.executable, invocation.args, {
|
|
888
|
+
cwd: invocation.cwd,
|
|
889
|
+
detached: process.platform !== 'win32' && !joinsGovernedProcessGroup,
|
|
890
|
+
env: createSstChildEnvironment(environment, invocation.environment),
|
|
891
|
+
shell: false,
|
|
892
|
+
stdio: 'inherit',
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
catch (error) {
|
|
896
|
+
try {
|
|
897
|
+
taskWriter?.release();
|
|
898
|
+
}
|
|
899
|
+
catch {
|
|
900
|
+
/* Keep ambiguous lease evidence. */
|
|
901
|
+
}
|
|
902
|
+
devkit_1.logger.error(error instanceof Error ? error.message : String(error));
|
|
903
|
+
resolve({ success: false });
|
|
904
|
+
return;
|
|
905
|
+
}
|
|
267
906
|
let settled = false;
|
|
907
|
+
let cancellationSignal;
|
|
908
|
+
let writerRegistrationFailed = false;
|
|
909
|
+
let unregisterSignalCleanup = () => undefined;
|
|
910
|
+
let resolveChildSettled = () => undefined;
|
|
911
|
+
const childSettled = new Promise((resolveChild) => {
|
|
912
|
+
resolveChildSettled = resolveChild;
|
|
913
|
+
});
|
|
268
914
|
const settle = (success) => {
|
|
269
915
|
if (settled)
|
|
270
916
|
return;
|
|
271
917
|
settled = true;
|
|
272
|
-
|
|
918
|
+
unregisterSignalCleanup();
|
|
919
|
+
resolveChildSettled();
|
|
920
|
+
try {
|
|
921
|
+
if (writerRegistrationFailed)
|
|
922
|
+
throw new Error('Native child registration failed.');
|
|
923
|
+
taskWriter?.release();
|
|
924
|
+
}
|
|
925
|
+
catch (error) {
|
|
926
|
+
success = false;
|
|
927
|
+
devkit_1.logger.error(`Task native writer evidence retained: ${error instanceof Error ? error.message : String(error)}`);
|
|
928
|
+
}
|
|
929
|
+
resolve({ success: success && !cancellationSignal });
|
|
273
930
|
};
|
|
931
|
+
unregisterSignalCleanup = (0, federated_credential_transport_js_1.registerGovernedSignalCleanup)((signal) => {
|
|
932
|
+
if (settled)
|
|
933
|
+
return;
|
|
934
|
+
cancellationSignal ??= signal;
|
|
935
|
+
return stopExactGovernedProcessTree(child, signal, childSettled, () => settled, !joinsGovernedProcessGroup);
|
|
936
|
+
}, 100);
|
|
274
937
|
child.on('error', (error) => {
|
|
275
938
|
devkit_1.logger.error(`Failed to start workspace SST: ${error.message}`);
|
|
276
939
|
settle(false);
|
|
277
940
|
});
|
|
278
941
|
child.on('close', async (code, signal) => {
|
|
279
|
-
if (
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
942
|
+
if (settled)
|
|
943
|
+
return;
|
|
944
|
+
let retainedProcessTree = false;
|
|
945
|
+
if (!(0, federated_credential_transport_js_1.governedSignalCleanupInProgress)() &&
|
|
946
|
+
!joinsGovernedProcessGroup &&
|
|
947
|
+
child.pid) {
|
|
948
|
+
try {
|
|
949
|
+
retainedProcessTree = await terminateRetainedGovernedProcessGroup(child.pid);
|
|
950
|
+
}
|
|
951
|
+
catch (error) {
|
|
952
|
+
retainedProcessTree = true;
|
|
953
|
+
devkit_1.logger.error(`Failed to stop retained SST descendant process tree: ${error instanceof Error ? error.message : String(error)}`);
|
|
954
|
+
}
|
|
955
|
+
if (retainedProcessTree) {
|
|
956
|
+
// The leader's exit is not evidence that its native writers ended.
|
|
957
|
+
// Keep task lease receipts for explicit, owner-proven recovery.
|
|
958
|
+
if (taskWriter)
|
|
959
|
+
writerRegistrationFailed = true;
|
|
960
|
+
devkit_1.logger.error('SST exited before its exact descendant process tree stopped.');
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
if (code !== 0 || cancellationSignal) {
|
|
964
|
+
devkit_1.logger.error(cancellationSignal
|
|
965
|
+
? `SST ${command} cancelled by ${cancellationSignal}.`
|
|
966
|
+
: signal
|
|
967
|
+
? `SST ${command} terminated with signal ${signal}.`
|
|
968
|
+
: `SST ${command} exited with status ${code ?? 'unknown'}.`);
|
|
283
969
|
if (command === 'deploy' || command === 'remove') {
|
|
284
970
|
devkit_1.logger.error(`If the stack is locked, run pnpm nx run ${context.projectName ?? '<project>'}:unlock --stage=${options.stage}.`);
|
|
285
971
|
}
|
|
286
972
|
}
|
|
287
|
-
|
|
288
|
-
if (
|
|
973
|
+
let sourceRestored = true;
|
|
974
|
+
if (environmentSource) {
|
|
289
975
|
try {
|
|
290
|
-
|
|
291
|
-
retainInfrastructureConvergence)(command, options, context, invocation, applySucceeded);
|
|
292
|
-
if (!mutationEvidenceRetained) {
|
|
293
|
-
devkit_1.logger.error(`SST ${command} did not retain valid infrastructure mutation evidence.`);
|
|
294
|
-
}
|
|
295
|
-
// A deploy retains apply-complete-unverified as a successful handoff
|
|
296
|
-
// to deployed smoke. It is not terminal convergence; the protected
|
|
297
|
-
// finalizer consumes the exact alarm, data, and journey evidence.
|
|
298
|
-
settle(applySucceeded && mutationEvidenceRetained);
|
|
976
|
+
(0, sst_environment_source_js_1.reconcileSstEnvironmentSourceTree)(environmentSource);
|
|
299
977
|
}
|
|
300
978
|
catch (error) {
|
|
301
|
-
|
|
302
|
-
|
|
979
|
+
sourceRestored = false;
|
|
980
|
+
devkit_1.logger.error(`Failed to restore SST tool-owned source: ${error instanceof Error ? error.message : String(error)}`);
|
|
303
981
|
}
|
|
304
|
-
return;
|
|
305
982
|
}
|
|
306
|
-
|
|
983
|
+
const applySucceeded = code === 0 &&
|
|
984
|
+
!cancellationSignal &&
|
|
985
|
+
sourceRestored &&
|
|
986
|
+
!retainedProcessTree;
|
|
987
|
+
let generatedSecretRetirementSucceeded = true;
|
|
988
|
+
if (applySucceeded &&
|
|
989
|
+
command === 'remove' &&
|
|
990
|
+
!invocation.environment.EBK_NX_TASK_CLEANUP &&
|
|
991
|
+
projectKind(context) === 'slice') {
|
|
992
|
+
try {
|
|
993
|
+
await (dependencies.generatedSecretRetirement ??
|
|
994
|
+
generated_secret_retirement_js_1.retireGeneratedSecretsAfterSliceRemove)(options, context, invocation, { environment });
|
|
995
|
+
}
|
|
996
|
+
catch (error) {
|
|
997
|
+
generatedSecretRetirementSucceeded = false;
|
|
998
|
+
devkit_1.logger.error(`Generated stage-secret retirement failed after native Slice removal: ${error instanceof Error ? error.message : String(error)}`);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
settle(applySucceeded && generatedSecretRetirementSucceeded);
|
|
307
1002
|
});
|
|
1003
|
+
if (taskWriter && child.pid) {
|
|
1004
|
+
try {
|
|
1005
|
+
taskWriter.recordChild(child.pid, !joinsGovernedProcessGroup);
|
|
1006
|
+
}
|
|
1007
|
+
catch (error) {
|
|
1008
|
+
writerRegistrationFailed = true;
|
|
1009
|
+
devkit_1.logger.error(`Task native child identity was not retained: ${error instanceof Error ? error.message : String(error)}`);
|
|
1010
|
+
// Never leave an unrecorded writer running after a failed registration.
|
|
1011
|
+
void stopExactGovernedProcessTree(child, 'SIGTERM', childSettled, () => settled, !joinsGovernedProcessGroup).catch((stopError) => {
|
|
1012
|
+
writerRegistrationFailed = true;
|
|
1013
|
+
devkit_1.logger.error(`Unregistered native child termination failed; writer evidence retained: ${stopError instanceof Error ? stopError.message : String(stopError)}`);
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
308
1017
|
});
|
|
309
1018
|
}
|
|
310
1019
|
//# sourceMappingURL=run-sst-command.js.map
|