@empire-builder-kit/nx 1.0.0-rc.38 → 1.0.0-rc.39
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 +5 -0
- package/generators.json +10 -0
- package/package.json +20 -3
- package/src/aws-authority/index.d.ts +1 -0
- package/src/aws-authority/index.js +1 -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 +11 -3
- package/src/aws-authority/stage-authority.js +615 -29
- 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 +7 -1
- package/src/cli/main.js +128 -20
- package/src/cli/output.d.ts +1 -1
- package/src/developer-agent/context.js +41 -9
- package/src/developer-agent/generator-planning.js +16 -2
- 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 +4 -2
- package/src/developer-agent/operation-registry.d.ts +5 -0
- package/src/developer-agent/operation-registry.js +179 -23
- 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 +20 -8
- package/src/developer-agent/workspace-inspection.js +37 -3
- package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
- package/src/executors/deployment-plan/deployment-plan.js +51 -4
- 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-remove-preflight/foundation-remove-preflight.js +28 -1
- package/src/executors/local-deploy/local-deploy.d.ts +8 -1
- package/src/executors/local-deploy/local-deploy.js +97 -24
- package/src/executors/local-deploy/schema.json +8 -0
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
- package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
- package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
- package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
- package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
- package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
- package/src/executors/sst-lifecycle/task-unlock.js +126 -0
- 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 +1 -0
- package/src/foundation/index.js +1 -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/preflight.js +37 -18
- package/src/foundation/private-smoke-access.js +10 -2
- package/src/foundation/private-smoke-admission.d.ts +3 -1
- package/src/foundation/private-smoke-admission.js +29 -8
- package/src/foundation/private-smoke-control-plane.js +17 -6
- 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 +13 -8
- package/src/foundation/requirements.d.ts +3 -3
- package/src/foundation/requirements.js +24 -12
- package/src/foundation/router-waf.d.ts +1 -0
- package/src/foundation/router-waf.js +14 -1
- 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.js +24 -1
- package/src/generators/logging-registry.d.ts +2 -0
- package/src/generators/logging-registry.js +22 -0
- package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
- package/src/generators/preset/workspace-files-adopter-skills.js +301 -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.js +40 -13
- package/src/generators/preset/workspace-files-performance-load.js +8 -0
- package/src/generators/preset/workspace-files-stage-authority.js +40 -1
- package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
- package/src/generators/preset/workspace-files-thin-docs.js +64 -18
- package/src/generators/preset/workspace-files.d.ts +4 -0
- package/src/generators/preset/workspace-files.js +159 -91
- package/src/generators/repository-policy/repository-policy.js +37 -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 +47 -389
- package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
- package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -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 +1 -1
- package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
- package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
- package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-data-files.js +61 -1164
- 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 +18 -2
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
- package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
- package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
- 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 +120 -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 +140 -28
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
- package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-operations-files.js +89 -50
- package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
- package/src/generators/slice/built-in-plan-project-files.js +116 -67
- package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-release-files.js +64 -15
- package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
- package/src/generators/slice/built-in-plan-shared.d.ts +3 -1
- package/src/generators/slice/built-in-plan-shared.js +40 -18
- package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
- package/src/generators/slice/built-in-plan-sql-events.js +257 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-testing-files.js +184 -132
- 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 +1 -1
- package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
- package/src/generators/slice/built-in-plan-verification-files.js +70 -0
- package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-web-files.js +191 -14
- 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 +113 -274
- package/src/generators/slice/built-in-plan.d.ts +9 -1
- package/src/generators/slice/built-in-plan.js +49 -21
- 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 +29 -24
- 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 +2 -0
- package/src/generators/upgrade/upgrade.js +136 -9
- package/src/generators/workload/workload.js +51 -2
- 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 +6 -0
- package/src/local-dev/private-state.js +126 -34
- 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 +3 -1
- 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/scenario.d.ts +22 -0
- package/src/performance/scenario.js +100 -92
- package/src/repository-policy/deployment-plan.d.ts +2 -2
- package/src/repository-policy/deployment-plan.js +2 -1
- package/src/repository-policy/policy.js +38 -3
- package/src/schemas/blueprint-v1.json +5 -4
- package/src/schemas/foundation-requirement-v1.json +5 -4
- package/src/schemas/testing-evidence-result-v1.json +1 -1
- package/src/secrets/operator.d.ts +3 -1
- package/src/secrets/operator.js +22 -3
- package/src/sst-environment-source-format.d.ts +3 -0
- package/src/sst-environment-source-format.js +20 -0
- package/src/supply-chain/blueprint-trust-git.js +13 -3
- package/src/supply-chain/build-output.js +15 -0
- package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
- 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/standard-slice.js +2 -3
- 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/aws/child-environment.js.map +0 -1
- package/src/aws/identity.js.map +0 -1
- package/src/aws-authority/index.js.map +0 -1
- package/src/aws-authority/stage-authority.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-profile-preflight/production-database-safeguard.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/local-deploy/federated-credential-transport.js.map +0 -1
- package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
- package/src/executors/local-deploy/local-approval.js.map +0 -1
- package/src/executors/local-deploy/local-deploy.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/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
- package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
- package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
- package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
- package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
- package/src/executors/sst-lifecycle/governed-native-operation.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/sst-lifecycle/sst-environment-source.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/partial-state.js.map +0 -1
- package/src/foundation/preflight.js.map +0 -1
- package/src/foundation/private-smoke-access.js.map +0 -1
- package/src/foundation/private-smoke-admission.js.map +0 -1
- package/src/foundation/private-smoke-control-plane.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/router-waf-rate-rehearsal.js.map +0 -1
- package/src/foundation/router-waf.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/formatting.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/dependency-overrides.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-ci-acceptance.js.map +0 -1
- package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
- package/src/generators/preset/workspace-files-ecr-inspector.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-stage-authority.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-release.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/repository-policy/tree-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-background-work-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-native-runtime-authority-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-thin-release-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/local-capability.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 -167
- 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/capacity-migration.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/generated-aws-control-plane.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/sst-environment-source-format.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-bounds.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
- package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
- package/src/workspace-deployment/identity.js.map +0 -1
- package/src/workspace-deployment/index.js.map +0 -1
- package/src/workspace-deployment/migration-evidence.js.map +0 -1
- package/src/workspace-deployment/migration.js.map +0 -1
- package/src/workspace-deployment/ownership.js.map +0 -1
|
@@ -6,6 +6,15 @@ exports.postgresIdentifierByteLength = postgresIdentifierByteLength;
|
|
|
6
6
|
exports.assertPostgresIdentifierLength = assertPostgresIdentifierLength;
|
|
7
7
|
exports.resolveLogicalDatabaseIdentifiers = resolveLogicalDatabaseIdentifiers;
|
|
8
8
|
exports.resolveLocalDatabaseContract = resolveLocalDatabaseContract;
|
|
9
|
+
exports.prepareLocalDatabaseContract = prepareLocalDatabaseContract;
|
|
10
|
+
exports.runLocalDatabaseLifecycle = runLocalDatabaseLifecycle;
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const node_crypto_1 = require("node:crypto");
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const ports_js_1 = require("../local-dev/ports.js");
|
|
16
|
+
const private_state_js_1 = require("../local-dev/private-state.js");
|
|
17
|
+
const task_identity_js_1 = require("../local-dev/task-identity.js");
|
|
9
18
|
exports.POSTGRES_IDENTIFIER_MAX_BYTES = 63;
|
|
10
19
|
function normalizePostgresIdentifier(input) {
|
|
11
20
|
const sanitized = input.replace(/[^A-Za-z0-9_]/g, '_');
|
|
@@ -22,7 +31,7 @@ function postgresIdentifierByteLength(identifier) {
|
|
|
22
31
|
function assertPostgresIdentifierLength(identifier, label) {
|
|
23
32
|
const bytes = postgresIdentifierByteLength(identifier);
|
|
24
33
|
if (bytes > exports.POSTGRES_IDENTIFIER_MAX_BYTES) {
|
|
25
|
-
throw new Error(`${label} "${identifier}" is ${bytes} UTF-8 bytes; PostgreSQL identifiers must be ${exports.POSTGRES_IDENTIFIER_MAX_BYTES} bytes or fewer.
|
|
34
|
+
throw new Error(`${label} "${identifier}" is ${bytes} UTF-8 bytes; PostgreSQL identifiers must be ${exports.POSTGRES_IDENTIFIER_MAX_BYTES} bytes or fewer. Shorten a user-selected Slice or database identifier before deployment; framework task stages are not user-selectable. Identifiers are never truncated.`);
|
|
26
35
|
}
|
|
27
36
|
}
|
|
28
37
|
function resolveLogicalDatabaseIdentifiers(options) {
|
|
@@ -54,25 +63,265 @@ function resolveLogicalDatabaseIdentifiers(options) {
|
|
|
54
63
|
readwriteRole,
|
|
55
64
|
};
|
|
56
65
|
}
|
|
57
|
-
function
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
hash = (hash * 33) ^ key.charCodeAt(index);
|
|
66
|
+
function databaseIdentity(options) {
|
|
67
|
+
if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(options.slice)) {
|
|
68
|
+
throw new Error('Local Slice must be a DNS-safe identifier.');
|
|
61
69
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
70
|
+
if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/.test(options.database)) {
|
|
71
|
+
throw new Error('Local database must be a logical database identifier.');
|
|
72
|
+
}
|
|
73
|
+
const workspaceRoot = (0, node_fs_1.realpathSync)(options.workspaceRoot ??
|
|
74
|
+
(0, node_child_process_1.execFileSync)('git', [
|
|
75
|
+
'--no-optional-locks',
|
|
76
|
+
'-c',
|
|
77
|
+
'core.fsmonitor=false',
|
|
78
|
+
'rev-parse',
|
|
79
|
+
'--show-toplevel',
|
|
80
|
+
], {
|
|
81
|
+
cwd: process.cwd(),
|
|
82
|
+
encoding: 'utf8',
|
|
83
|
+
timeout: 5_000,
|
|
84
|
+
env: Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('GIT_'))),
|
|
85
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
86
|
+
}).trim());
|
|
87
|
+
const { taskId } = (0, task_identity_js_1.resolveTaskIdentity)(workspaceRoot);
|
|
88
|
+
const stage = (0, task_identity_js_1.taskStage)(taskId);
|
|
89
|
+
if (options.stage !== undefined && options.stage !== stage) {
|
|
90
|
+
throw new Error(`Local database stage does not match this worktree's task (${stage}).`);
|
|
91
|
+
}
|
|
92
|
+
const readableDatabase = normalizePostgresIdentifier(`t_${taskId}_${options.slice.length}_${options.slice}_${options.database}`);
|
|
93
|
+
// Preserve every previously valid allocation. Overlength names were never
|
|
94
|
+
// accepted, so use a bounded task + tuple digest only for that new domain.
|
|
95
|
+
const database = postgresIdentifierByteLength(`${readableDatabase}_readwrite`) <=
|
|
96
|
+
exports.POSTGRES_IDENTIFIER_MAX_BYTES
|
|
97
|
+
? readableDatabase
|
|
98
|
+
: `t_${taskId}_${(0, node_crypto_1.createHash)('sha256')
|
|
99
|
+
.update(JSON.stringify([options.slice, options.database]))
|
|
100
|
+
.digest('hex')
|
|
101
|
+
.slice(0, 24)}`;
|
|
66
102
|
const username = `${database}_readwrite`;
|
|
67
103
|
assertPostgresIdentifierLength(database, 'Local database identifier');
|
|
68
104
|
assertPostgresIdentifierLength(username, 'Local read-write role identifier');
|
|
105
|
+
const directory = (0, node_path_1.join)((0, node_path_1.dirname)((0, task_identity_js_1.taskIdentityPath)(workspaceRoot)), 'databases', taskId);
|
|
69
106
|
return {
|
|
107
|
+
taskId,
|
|
108
|
+
stage,
|
|
109
|
+
directory,
|
|
110
|
+
path: (0, node_path_1.join)(directory, `${options.slice.length}-${options.slice}-${options.database}.json`),
|
|
111
|
+
project: `ebk-${taskId}-${options.slice.length}-${options.slice}-${options.database}`,
|
|
70
112
|
database,
|
|
71
|
-
host: '127.0.0.1',
|
|
72
|
-
password: options.password ?? `${options.slice}-local-dev`,
|
|
73
|
-
port: options.port ??
|
|
74
|
-
deterministicLocalDatabasePort(`${options.slice}_${options.database}`),
|
|
75
113
|
username,
|
|
76
114
|
};
|
|
77
115
|
}
|
|
116
|
+
function readDatabaseContract(options, identity) {
|
|
117
|
+
if (!allocationExists(identity.path)) {
|
|
118
|
+
throw new Error(`Local database allocation is missing. Run the ${options.slice} local-database up target before connecting.`);
|
|
119
|
+
}
|
|
120
|
+
const record = JSON.parse((0, private_state_js_1.readPrivateFile)(identity.path).toString('utf8'));
|
|
121
|
+
if (record.schemaVersion !== 1 ||
|
|
122
|
+
record.taskId !== identity.taskId ||
|
|
123
|
+
record.slice !== options.slice ||
|
|
124
|
+
record.logicalDatabase !== options.database ||
|
|
125
|
+
record.database !== identity.database ||
|
|
126
|
+
record.username !== identity.username ||
|
|
127
|
+
record.host !== '127.0.0.1' ||
|
|
128
|
+
typeof record.password !== 'string' ||
|
|
129
|
+
!record.password ||
|
|
130
|
+
!Number.isSafeInteger(record.port) ||
|
|
131
|
+
record.port < 1024 ||
|
|
132
|
+
record.port > 65535 ||
|
|
133
|
+
(options.port !== undefined && options.port !== record.port) ||
|
|
134
|
+
(options.password !== undefined && options.password !== record.password)) {
|
|
135
|
+
throw new Error('Local database allocation ownership or connection coordinates do not match; refusing to connect.');
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
database: record.database,
|
|
139
|
+
host: '127.0.0.1',
|
|
140
|
+
password: record.password,
|
|
141
|
+
port: record.port,
|
|
142
|
+
username: record.username,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function allocationExists(path) {
|
|
146
|
+
try {
|
|
147
|
+
(0, node_fs_1.lstatSync)(path);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error.code === 'ENOENT')
|
|
152
|
+
return false;
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Read the same private allocation used by Docker, Drizzle, and SST links. */
|
|
157
|
+
function resolveLocalDatabaseContract(options) {
|
|
158
|
+
return readDatabaseContract(options, databaseIdentity(options));
|
|
159
|
+
}
|
|
160
|
+
/** Prepare coordinates only; Docker's bind remains authoritative against races. */
|
|
161
|
+
async function prepareLocalDatabaseContract(options, isAvailable = ports_js_1.canBindLoopbackPort) {
|
|
162
|
+
const identity = databaseIdentity(options);
|
|
163
|
+
if (allocationExists(identity.path))
|
|
164
|
+
return readDatabaseContract(options, identity);
|
|
165
|
+
const reserved = new Set();
|
|
166
|
+
if ((0, node_fs_1.existsSync)(identity.directory)) {
|
|
167
|
+
for (const name of (0, node_fs_1.readdirSync)(identity.directory)) {
|
|
168
|
+
if (name.endsWith('.json')) {
|
|
169
|
+
const sibling = JSON.parse((0, private_state_js_1.readPrivateFile)((0, node_path_1.join)(identity.directory, name)).toString('utf8'));
|
|
170
|
+
if (Number.isSafeInteger(sibling.port))
|
|
171
|
+
reserved.add(sibling.port);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
let port = options.port;
|
|
176
|
+
if (port !== undefined) {
|
|
177
|
+
if (!Number.isSafeInteger(port) ||
|
|
178
|
+
port < 1024 ||
|
|
179
|
+
port > 65535 ||
|
|
180
|
+
reserved.has(port) ||
|
|
181
|
+
!(await isAvailable(port))) {
|
|
182
|
+
throw new Error('Requested local database port is invalid, reserved, or occupied.');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
port = await (0, ports_js_1.allocateFleetPort)(identity.project, { isAvailable, reserved });
|
|
187
|
+
}
|
|
188
|
+
(0, private_state_js_1.publishPrivateFileExclusive)(identity.path, `${JSON.stringify({
|
|
189
|
+
schemaVersion: 1,
|
|
190
|
+
taskId: identity.taskId,
|
|
191
|
+
slice: options.slice,
|
|
192
|
+
logicalDatabase: options.database,
|
|
193
|
+
database: identity.database,
|
|
194
|
+
host: '127.0.0.1',
|
|
195
|
+
password: options.password ?? `${identity.taskId}-local-dev`,
|
|
196
|
+
port,
|
|
197
|
+
username: identity.username,
|
|
198
|
+
})}\n`);
|
|
199
|
+
return readDatabaseContract(options, identity);
|
|
200
|
+
}
|
|
201
|
+
/** Exact-owned local Docker lifecycle. Volumes and allocation survive down. */
|
|
202
|
+
async function runLocalDatabaseLifecycle(options, dependencies = {}) {
|
|
203
|
+
const environment = dependencies.environment ?? process.env;
|
|
204
|
+
const overrides = Object.keys(environment).filter((key) => key.startsWith('COMPOSE_') && environment[key] !== undefined);
|
|
205
|
+
if (overrides.length)
|
|
206
|
+
throw new Error(`Ambient Compose overrides are not allowed: ${overrides.join(', ')}.`);
|
|
207
|
+
const identity = databaseIdentity(options);
|
|
208
|
+
let local = allocationExists(identity.path)
|
|
209
|
+
? readDatabaseContract(options, identity)
|
|
210
|
+
: undefined;
|
|
211
|
+
const env = {
|
|
212
|
+
...environment,
|
|
213
|
+
...(local
|
|
214
|
+
? {
|
|
215
|
+
EBK_LOCAL_DATABASE: local.database,
|
|
216
|
+
EBK_LOCAL_DATABASE_PASSWORD: local.password,
|
|
217
|
+
EBK_LOCAL_DATABASE_PORT: String(local.port),
|
|
218
|
+
EBK_LOCAL_DATABASE_USERNAME: local.username,
|
|
219
|
+
}
|
|
220
|
+
: {}),
|
|
221
|
+
EBK_LOCAL_DATABASE_PROJECT: identity.project,
|
|
222
|
+
EBK_LOCAL_DATABASE_TASK: identity.taskId,
|
|
223
|
+
EBK_LOCAL_DATABASE_SLICE: options.slice,
|
|
224
|
+
EBK_LOCAL_DATABASE_LOGICAL: options.database,
|
|
225
|
+
};
|
|
226
|
+
const docker = dependencies.docker ??
|
|
227
|
+
((args, childEnvironment) => (0, node_child_process_1.spawnSync)('docker', args, {
|
|
228
|
+
env: childEnvironment,
|
|
229
|
+
encoding: 'utf8',
|
|
230
|
+
timeout: 120_000,
|
|
231
|
+
windowsHide: true,
|
|
232
|
+
}));
|
|
233
|
+
const run = (args) => {
|
|
234
|
+
const result = docker(args, env);
|
|
235
|
+
if (result.error)
|
|
236
|
+
throw result.error;
|
|
237
|
+
return result;
|
|
238
|
+
};
|
|
239
|
+
const inspect = (kind, name) => {
|
|
240
|
+
const result = run([kind, 'inspect', name]);
|
|
241
|
+
if (result.status !== 0) {
|
|
242
|
+
if (/No such (?:object|container|volume|network)/i.test(result.stderr) ||
|
|
243
|
+
(kind === 'network' &&
|
|
244
|
+
result.stderr.includes(`network ${name} not found`)))
|
|
245
|
+
return undefined;
|
|
246
|
+
throw new Error(`Unable to inspect exact local database ${kind}; check Docker availability before retrying.`);
|
|
247
|
+
}
|
|
248
|
+
const records = JSON.parse(result.stdout);
|
|
249
|
+
if (!Array.isArray(records) || records.length !== 1)
|
|
250
|
+
throw new Error('Ambiguous local database Docker ownership.');
|
|
251
|
+
const record = records[0];
|
|
252
|
+
const labels = kind === 'container' ? record.Config?.Labels : record.Labels;
|
|
253
|
+
if (labels?.['dev.ebk.task'] !== identity.taskId ||
|
|
254
|
+
labels?.['dev.ebk.slice'] !== options.slice ||
|
|
255
|
+
labels?.['dev.ebk.database'] !== options.database ||
|
|
256
|
+
labels?.['com.docker.compose.project'] !== identity.project) {
|
|
257
|
+
throw new Error(`Local database ${kind} ownership mismatch; refusing creation or cleanup.`);
|
|
258
|
+
}
|
|
259
|
+
if (kind === 'container' && local) {
|
|
260
|
+
const bindings = record.HostConfig?.PortBindings?.['5432/tcp'];
|
|
261
|
+
if (!Array.isArray(bindings) ||
|
|
262
|
+
bindings.length !== 1 ||
|
|
263
|
+
bindings[0].HostIp !== '127.0.0.1' ||
|
|
264
|
+
bindings[0].HostPort !== String(local.port)) {
|
|
265
|
+
throw new Error('Local database container port ownership mismatch; refusing to connect.');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return record;
|
|
269
|
+
};
|
|
270
|
+
const container = inspect('container', `${identity.project}-database`);
|
|
271
|
+
const volume = inspect('volume', `${identity.project}-data`);
|
|
272
|
+
const network = inspect('network', `${identity.project}-network`);
|
|
273
|
+
if (!local) {
|
|
274
|
+
if (container || volume || network) {
|
|
275
|
+
throw new Error('Local database allocation is missing while exact Docker resources remain. Restore the original private allocation before up or down; no coordinates were created and no resources were removed.');
|
|
276
|
+
}
|
|
277
|
+
// Missing coordinates are not absence evidence; exact Docker inspection is.
|
|
278
|
+
if (options.action === 'down')
|
|
279
|
+
return;
|
|
280
|
+
local = await prepareLocalDatabaseContract(options, dependencies.isAvailable);
|
|
281
|
+
Object.assign(env, {
|
|
282
|
+
EBK_LOCAL_DATABASE: local.database,
|
|
283
|
+
EBK_LOCAL_DATABASE_PASSWORD: local.password,
|
|
284
|
+
EBK_LOCAL_DATABASE_PORT: String(local.port),
|
|
285
|
+
EBK_LOCAL_DATABASE_USERNAME: local.username,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
if (options.action === 'down') {
|
|
289
|
+
// Never issue project-wide cleanup; use the verified immutable container ID.
|
|
290
|
+
if (container) {
|
|
291
|
+
if (typeof container.Id !== 'string' ||
|
|
292
|
+
!/^[a-f0-9]{64}$/.test(container.Id))
|
|
293
|
+
throw new Error('Invalid owned container ID.');
|
|
294
|
+
if (run(['container', 'rm', '--force', container.Id]).status !== 0)
|
|
295
|
+
throw new Error('Owned local database container cleanup failed; retry down.');
|
|
296
|
+
}
|
|
297
|
+
if (network) {
|
|
298
|
+
if (typeof network.Id !== 'string' || !/^[a-f0-9]{64}$/.test(network.Id))
|
|
299
|
+
throw new Error('Invalid owned network ID.');
|
|
300
|
+
if (run(['network', 'rm', network.Id]).status !== 0)
|
|
301
|
+
throw new Error('Owned local database network cleanup failed; inspect its remaining endpoints.');
|
|
302
|
+
}
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (!container &&
|
|
306
|
+
!(await (dependencies.isAvailable ?? ports_js_1.canBindLoopbackPort)(local.port))) {
|
|
307
|
+
throw new Error(`Task database port ${local.port} is occupied by another service. Free that exact port and retry; no connection was made.`);
|
|
308
|
+
}
|
|
309
|
+
const result = run([
|
|
310
|
+
'compose',
|
|
311
|
+
'--env-file',
|
|
312
|
+
process.platform === 'win32' ? 'NUL' : '/dev/null',
|
|
313
|
+
'--project-name',
|
|
314
|
+
identity.project,
|
|
315
|
+
'-f',
|
|
316
|
+
options.composeFile,
|
|
317
|
+
'up',
|
|
318
|
+
'-d',
|
|
319
|
+
'--wait',
|
|
320
|
+
]);
|
|
321
|
+
if (result.status !== 0) {
|
|
322
|
+
throw new Error(`Task database startup failed (possible port bind race). Run this task's local-database down, resolve the Docker/port conflict, then retry up.`);
|
|
323
|
+
}
|
|
324
|
+
if (!inspect('container', `${identity.project}-database`))
|
|
325
|
+
throw new Error('Docker reported success without the exact owned local database container.');
|
|
326
|
+
}
|
|
78
327
|
//# sourceMappingURL=local-database-contract.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type FleetProcessIdentity, type ProcessIdentityProbe } from '../local-dev/fleet-lock.js';
|
|
2
|
+
import { type PrivateStateSecurity } from '../local-dev/private-state.js';
|
|
3
|
+
import { openPrivateSmokeControlPlane } from './private-smoke-control-plane.js';
|
|
4
|
+
import type { GithubPrivateSmokeInput } from './private-smoke-access.js';
|
|
5
|
+
export interface LocalPrivateSmokeInput extends GithubPrivateSmokeInput {
|
|
6
|
+
/** Already verified invocation-private transport, never ambient credentials. */
|
|
7
|
+
credentialEnvironment: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
interface Dependencies {
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
open?: typeof openPrivateSmokeControlPlane;
|
|
12
|
+
capture?: () => FleetProcessIdentity;
|
|
13
|
+
probe?: (owner: FleetProcessIdentity) => ProcessIdentityProbe;
|
|
14
|
+
security?: PrivateStateSecurity;
|
|
15
|
+
wait?: (milliseconds: number) => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** Used after the local lifecycle verifies source, policy and federated role.
|
|
18
|
+
* A private process receipt proves recovery ownership, not deployment authority. */
|
|
19
|
+
export declare function runLocalPrivateSmoke(input: LocalPrivateSmokeInput, dependencies?: Dependencies): Promise<void>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runLocalPrivateSmoke = runLocalPrivateSmoke;
|
|
4
|
+
const client_cloudfront_1 = require("@aws-sdk/client-cloudfront");
|
|
5
|
+
const client_wafv2_1 = require("@aws-sdk/client-wafv2");
|
|
6
|
+
const credential_providers_1 = require("@aws-sdk/credential-providers");
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const process_identity_js_1 = require("../local-dev/process-identity.js");
|
|
11
|
+
const fleet_lock_js_1 = require("../local-dev/fleet-lock.js");
|
|
12
|
+
const private_state_js_1 = require("../local-dev/private-state.js");
|
|
13
|
+
const index_js_1 = require("../repository-policy/index.js");
|
|
14
|
+
const federated_credential_transport_js_1 = require("../executors/local-deploy/federated-credential-transport.js");
|
|
15
|
+
const router_waf_js_1 = require("./router-waf.js");
|
|
16
|
+
const private_smoke_control_plane_js_1 = require("./private-smoke-control-plane.js");
|
|
17
|
+
const private_smoke_admission_js_1 = require("./private-smoke-admission.js");
|
|
18
|
+
function check(value, message) {
|
|
19
|
+
if (!value)
|
|
20
|
+
throw new Error(`Local private smoke: ${message}`);
|
|
21
|
+
}
|
|
22
|
+
/** Used after the local lifecycle verifies source, policy and federated role.
|
|
23
|
+
* A private process receipt proves recovery ownership, not deployment authority. */
|
|
24
|
+
async function runLocalPrivateSmoke(input, dependencies = {}) {
|
|
25
|
+
check(!(0, index_js_1.requiresGithubDeployment)(input.deploymentProfile, input.stage), 'stage requires protected GitHub authority');
|
|
26
|
+
const policy = (0, router_waf_js_1.normalizeRouterWafPolicy)(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(input.root, 'packages/foundation/security/router-waf.json'), 'utf8')));
|
|
27
|
+
check(policy.deploymentProfile === input.deploymentProfile, 'deployment profile differs');
|
|
28
|
+
const stagePolicy = policy.stages[input.stage];
|
|
29
|
+
check(stagePolicy, 'stage is inactive');
|
|
30
|
+
if (stagePolicy.access === 'public' || stagePolicy.mode === 'count') {
|
|
31
|
+
await input.run();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const allowedCidrs = stagePolicy.allowedCidrs.filter((cidr) => !cidr.includes(':'));
|
|
35
|
+
// Temporary admission has its own empty set; never update the baseline.
|
|
36
|
+
const baseline = [];
|
|
37
|
+
check(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(input.source), 'source identity is invalid');
|
|
38
|
+
const policyDigest = (0, router_waf_js_1.routerWafPolicyDigest)(policy);
|
|
39
|
+
const identity = {
|
|
40
|
+
account: input.account,
|
|
41
|
+
stage: input.stage,
|
|
42
|
+
workspace: input.workspace,
|
|
43
|
+
policyDigest,
|
|
44
|
+
};
|
|
45
|
+
const open = dependencies.open ??
|
|
46
|
+
(async (resourceIdentity, url) => {
|
|
47
|
+
const environment = input.credentialEnvironment;
|
|
48
|
+
check(environment.AWS_PROFILE &&
|
|
49
|
+
environment.AWS_CONFIG_FILE &&
|
|
50
|
+
environment.AWS_SHARED_CREDENTIALS_FILE, 'verified private credential transport is missing');
|
|
51
|
+
const credentials = (0, credential_providers_1.fromIni)({
|
|
52
|
+
profile: environment.AWS_PROFILE,
|
|
53
|
+
configFilepath: environment.AWS_CONFIG_FILE,
|
|
54
|
+
filepath: environment.AWS_SHARED_CREDENTIALS_FILE,
|
|
55
|
+
// The invocation refreshes this same file before smoke. Ownership
|
|
56
|
+
// checks may already have populated Smithy's shared ini-file cache.
|
|
57
|
+
ignoreCache: true,
|
|
58
|
+
});
|
|
59
|
+
const options = {
|
|
60
|
+
credentials,
|
|
61
|
+
region: 'us-east-1',
|
|
62
|
+
maxAttempts: 3,
|
|
63
|
+
requestHandler: { connectionTimeout: 10_000, requestTimeout: 30_000 },
|
|
64
|
+
};
|
|
65
|
+
return (0, private_smoke_control_plane_js_1.openPrivateSmokeControlPlane)(resourceIdentity, url, {
|
|
66
|
+
waf: new client_wafv2_1.WAFV2Client({
|
|
67
|
+
...options,
|
|
68
|
+
endpoint: 'https://wafv2.us-east-1.amazonaws.com',
|
|
69
|
+
}),
|
|
70
|
+
cloudfront: new client_cloudfront_1.CloudFrontClient({
|
|
71
|
+
...options,
|
|
72
|
+
endpoint: 'https://cloudfront.amazonaws.com',
|
|
73
|
+
}),
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
const store = await open(identity, input.url);
|
|
77
|
+
const request = dependencies.fetch ?? fetch;
|
|
78
|
+
const wait = dependencies.wait ??
|
|
79
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
80
|
+
const path = (0, node_path_1.join)((0, node_fs_1.realpathSync)(input.root), '.ebk/evidence/local-smoke', `${input.stage}.json`);
|
|
81
|
+
const security = dependencies.security;
|
|
82
|
+
const readOwner = () => {
|
|
83
|
+
const value = JSON.parse((0, private_state_js_1.readPrivateFile)(path, security).toString('utf8'));
|
|
84
|
+
check(value?.kind === 'ebk-local-smoke-owner' &&
|
|
85
|
+
value.schemaVersion === 1 &&
|
|
86
|
+
value.account === input.account &&
|
|
87
|
+
value.stage === input.stage &&
|
|
88
|
+
value.workspace === input.workspace &&
|
|
89
|
+
value.policyDigest === policyDigest, 'retained owner or policy differs; preserve recovery evidence');
|
|
90
|
+
(0, fleet_lock_js_1.validateFleetProcessIdentity)(value.owner);
|
|
91
|
+
check(value.context?.authority === 'local' &&
|
|
92
|
+
/^[a-f0-9]{32}$/.test(value.context.run) &&
|
|
93
|
+
/^[1-9]\d*$/.test(value.context.attempt) &&
|
|
94
|
+
/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value.context.source) &&
|
|
95
|
+
JSON.stringify(value.context.baseline) === JSON.stringify(baseline), 'retained admission context is invalid');
|
|
96
|
+
return value;
|
|
97
|
+
};
|
|
98
|
+
const releaseOwner = (expected) => {
|
|
99
|
+
check(JSON.stringify(readOwner()) === JSON.stringify(expected), 'private owner changed; cleanup not accepted');
|
|
100
|
+
const retired = `${path}.${expected.context.run}.completed`;
|
|
101
|
+
check(!(0, node_fs_1.existsSync)(retired), 'prior recovery completion is unresolved');
|
|
102
|
+
(0, node_fs_1.renameSync)(path, retired);
|
|
103
|
+
if ((0, private_state_js_1.readPrivateFile)(retired, security).toString('utf8') !==
|
|
104
|
+
JSON.stringify(expected)) {
|
|
105
|
+
if (!(0, node_fs_1.existsSync)(path))
|
|
106
|
+
(0, node_fs_1.renameSync)(retired, path);
|
|
107
|
+
throw new Error('Local private smoke: owner changed during retirement');
|
|
108
|
+
}
|
|
109
|
+
(0, node_fs_1.unlinkSync)(retired);
|
|
110
|
+
};
|
|
111
|
+
if ((0, node_fs_1.existsSync)(path)) {
|
|
112
|
+
(0, private_state_js_1.assertPrivatePath)((0, node_path_1.join)(input.root, '.ebk/evidence/local-smoke'), 'directory', security);
|
|
113
|
+
const previous = readOwner();
|
|
114
|
+
check((dependencies.probe ?? process_identity_js_1.probeProcessIdentity)(previous.owner) === 'absent', 'prior smoke process is active or ambiguous');
|
|
115
|
+
await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async (lease) => lease.authority === 'local' &&
|
|
116
|
+
lease.run === previous.context.run &&
|
|
117
|
+
lease.attempt === previous.context.attempt &&
|
|
118
|
+
lease.source === previous.context.source);
|
|
119
|
+
releaseOwner(previous);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Foreign/local-without-receipt and hosted leases must not be claimed.
|
|
123
|
+
await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async () => false);
|
|
124
|
+
}
|
|
125
|
+
const ipResponse = await request('https://checkip.amazonaws.com', {
|
|
126
|
+
redirect: 'error',
|
|
127
|
+
signal: AbortSignal.timeout(15_000),
|
|
128
|
+
});
|
|
129
|
+
check(ipResponse.ok, 'operator IPv4 lookup failed');
|
|
130
|
+
const address = await ipResponse.text();
|
|
131
|
+
check(address.length <= 64, 'operator IPv4 response exceeds bound');
|
|
132
|
+
const cidr = (0, private_smoke_admission_js_1.publicRunnerIpv4)(address.trim());
|
|
133
|
+
if ((0, private_smoke_admission_js_1.runnerAlreadyAllowed)(cidr, allowedCidrs)) {
|
|
134
|
+
await input.run();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const owner = (dependencies.capture ?? process_identity_js_1.captureProcessIdentity)();
|
|
138
|
+
const context = {
|
|
139
|
+
authority: 'local',
|
|
140
|
+
run: (0, node_crypto_1.randomBytes)(16).toString('hex'),
|
|
141
|
+
attempt: String(owner.pid),
|
|
142
|
+
source: input.source,
|
|
143
|
+
baseline,
|
|
144
|
+
};
|
|
145
|
+
const record = {
|
|
146
|
+
kind: 'ebk-local-smoke-owner',
|
|
147
|
+
schemaVersion: 1,
|
|
148
|
+
...identity,
|
|
149
|
+
owner,
|
|
150
|
+
context,
|
|
151
|
+
};
|
|
152
|
+
check((0, private_state_js_1.createPrivateFileExclusive)(path, JSON.stringify(record), security), 'another invocation owns local smoke');
|
|
153
|
+
async function observe(allowed, signal) {
|
|
154
|
+
for (let i = 0; i < 24; i++) {
|
|
155
|
+
signal?.throwIfAborted();
|
|
156
|
+
const response = await request(input.url, {
|
|
157
|
+
redirect: 'manual',
|
|
158
|
+
signal: signal
|
|
159
|
+
? AbortSignal.any([signal, AbortSignal.timeout(15_000)])
|
|
160
|
+
: AbortSignal.timeout(15_000),
|
|
161
|
+
});
|
|
162
|
+
await response.body?.cancel();
|
|
163
|
+
if (allowed
|
|
164
|
+
? response.status >= 200 && response.status < 400
|
|
165
|
+
: response.status === 403)
|
|
166
|
+
return;
|
|
167
|
+
if (i < 23)
|
|
168
|
+
await wait(5_000);
|
|
169
|
+
}
|
|
170
|
+
throw new Error(`Local private smoke: ${allowed ? 'admission' : 'revocation'} not observed; deployment acceptance prohibited`);
|
|
171
|
+
}
|
|
172
|
+
const unregister = (0, federated_credential_transport_js_1.registerGovernedSignalCleanup)(async () => {
|
|
173
|
+
await (0, private_smoke_admission_js_1.cleanupSmokeAdmission)(store, context);
|
|
174
|
+
}, 90);
|
|
175
|
+
try {
|
|
176
|
+
await (0, private_smoke_admission_js_1.withPrivateSmokeAdmission)({
|
|
177
|
+
store,
|
|
178
|
+
context,
|
|
179
|
+
cidr,
|
|
180
|
+
run: input.run,
|
|
181
|
+
awaitAdmission: (signal) => observe(true, signal),
|
|
182
|
+
awaitRevocation: () => observe(false),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
try {
|
|
187
|
+
// A failed smoke may still have cleaned up correctly. Retain this receipt
|
|
188
|
+
// only when remote cleanup is unproved, for exact next-run recovery.
|
|
189
|
+
await (0, private_smoke_admission_js_1.cleanupSmokeAdmission)(store, context);
|
|
190
|
+
releaseOwner(record);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
unregister();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=local-private-smoke-access.js.map
|
|
@@ -73,19 +73,34 @@ async function evaluateFoundationPreflight(options) {
|
|
|
73
73
|
result.invalidNames.forEach((name) => invalidNames.add(name));
|
|
74
74
|
result.values.forEach((value, name) => values.set(name, value));
|
|
75
75
|
}
|
|
76
|
+
const value = (key) => values.get((0, discovery_js_1.foundationSsmPath)(foundationStage, key)) ?? '';
|
|
77
|
+
const capabilities = value('capabilities')
|
|
78
|
+
.split(',')
|
|
79
|
+
.map((capability) => capability.trim())
|
|
80
|
+
.filter(Boolean);
|
|
81
|
+
const hasPostgres = capabilities.includes('postgres');
|
|
82
|
+
const resourceNames = (0, discovery_js_1.foundationSsmKeysForCapabilities)(capabilities.filter(requirements_js_1.isStandardFoundationCapability))
|
|
83
|
+
.map((key) => (0, discovery_js_1.foundationSsmPath)(foundationStage, key))
|
|
84
|
+
.filter((name) => !names.includes(name));
|
|
85
|
+
for (const batch of chunks(resourceNames, 10)) {
|
|
86
|
+
const result = await options.readParameters(batch);
|
|
87
|
+
result.invalidNames.forEach((name) => invalidNames.add(name));
|
|
88
|
+
result.values.forEach((value, name) => values.set(name, value));
|
|
89
|
+
}
|
|
90
|
+
names.push(...resourceNames);
|
|
76
91
|
const issues = names
|
|
77
92
|
.filter((name) => invalidNames.has(name) || !values.get(name))
|
|
78
93
|
.map((name) => `missing required parameter ${name}`);
|
|
79
94
|
const allRequiredParametersMissing = names.every((name) => invalidNames.has(name) || !values.has(name));
|
|
80
|
-
const value = (key) => values.get((0, discovery_js_1.foundationSsmPath)(foundationStage, key)) ?? '';
|
|
81
95
|
const schemaVersion = Number(value('schemaVersion'));
|
|
82
96
|
if (schemaVersion !== discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION) {
|
|
83
97
|
issues.push(`Foundation discovery schema ${value('schemaVersion') || 'missing'} does not match ${discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION}`);
|
|
84
98
|
}
|
|
85
99
|
const databasePort = Number(value('databasePort'));
|
|
86
|
-
if (
|
|
87
|
-
databasePort
|
|
88
|
-
|
|
100
|
+
if (hasPostgres &&
|
|
101
|
+
(!Number.isSafeInteger(databasePort) ||
|
|
102
|
+
databasePort < 1 ||
|
|
103
|
+
databasePort > 65535)) {
|
|
89
104
|
issues.push('Foundation discovery databasePort must be from 1 through 65535');
|
|
90
105
|
}
|
|
91
106
|
const accountMonthlyMaximumUsd = Number(value('accountMonthlyMaximumUsd'));
|
|
@@ -103,10 +118,6 @@ async function evaluateFoundationPreflight(options) {
|
|
|
103
118
|
if (!isExactCognitoTokenEndpoint(value('identityTokenEndpoint'), options.region)) {
|
|
104
119
|
issues.push('Foundation discovery identityTokenEndpoint must be the exact Cognito HTTPS token endpoint for the selected AWS Region');
|
|
105
120
|
}
|
|
106
|
-
const capabilities = value('capabilities')
|
|
107
|
-
.split(',')
|
|
108
|
-
.map((capability) => capability.trim())
|
|
109
|
-
.filter(Boolean);
|
|
110
121
|
const compatibility = (0, requirements_js_1.validateFoundationCompatibility)(options.requirement, {
|
|
111
122
|
capabilities,
|
|
112
123
|
contractVersion: value('contractVersion'),
|
|
@@ -128,15 +139,21 @@ async function evaluateFoundationPreflight(options) {
|
|
|
128
139
|
accountMonthlyMaximumUsd,
|
|
129
140
|
alertTopicArn: value('alertTopicArn'),
|
|
130
141
|
capabilities: compatibility.value.capabilities,
|
|
131
|
-
|
|
142
|
+
...(capabilities.includes('container-compute')
|
|
143
|
+
? { clusterId: value('clusterId') }
|
|
144
|
+
: {}),
|
|
132
145
|
contractVersion: compatibility.value.contractVersion,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
146
|
+
...(hasPostgres
|
|
147
|
+
? {
|
|
148
|
+
databaseClusterArn: value('databaseClusterArn'),
|
|
149
|
+
databaseClusterEndpoint: value('databaseClusterEndpoint'),
|
|
150
|
+
databaseClusterId: value('databaseClusterId'),
|
|
151
|
+
databaseClusterResourceId: value('databaseClusterResourceId'),
|
|
152
|
+
databaseHost: value('databaseHost'),
|
|
153
|
+
databaseMasterSecretArn: value('databaseMasterSecretArn'),
|
|
154
|
+
databasePort,
|
|
155
|
+
}
|
|
156
|
+
: {}),
|
|
140
157
|
eventBusArn: value('eventBusArn'),
|
|
141
158
|
eventBusName: value('eventBusName'),
|
|
142
159
|
hasPublicDomain: value('hasPublicDomain') === 'true',
|
|
@@ -147,7 +164,7 @@ async function evaluateFoundationPreflight(options) {
|
|
|
147
164
|
routerDistributionId: value('routerDistributionId'),
|
|
148
165
|
routerUrl: value('routerUrl'),
|
|
149
166
|
schemaVersion: discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION,
|
|
150
|
-
vpcId: value('vpcId'),
|
|
167
|
+
...(capabilities.includes('network') ? { vpcId: value('vpcId') } : {}),
|
|
151
168
|
},
|
|
152
169
|
consumerStage,
|
|
153
170
|
foundationStage,
|
|
@@ -163,7 +180,9 @@ function formatFoundationPreflightReport(report) {
|
|
|
163
180
|
];
|
|
164
181
|
report.issues.forEach((issue) => lines.push(` - ${issue}`));
|
|
165
182
|
if (!report.ok) {
|
|
166
|
-
lines.push(
|
|
183
|
+
lines.push(report.foundationStage === 'development'
|
|
184
|
+
? ' Establish Foundation through ebk deploy development --profile=<approved-profile> --expectedRoleArn=<approved-development-role>; the governed stage lifecycle deploys Foundation before eligible Slices.'
|
|
185
|
+
: ` Establish Foundation through the governed ${report.foundationStage} stage lifecycle under the repository deployment profile; follow its protected deployment runbook.`);
|
|
167
186
|
}
|
|
168
187
|
return lines.join('\n');
|
|
169
188
|
}
|
|
@@ -30,8 +30,9 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
|
|
|
30
30
|
await input.run();
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
const
|
|
34
|
-
|
|
33
|
+
const allowedCidrs = stagePolicy.allowedCidrs.filter((cidr) => !cidr.includes(':'));
|
|
34
|
+
// Temporary admission has its own empty set; never update the baseline.
|
|
35
|
+
const baseline = [];
|
|
35
36
|
const repository = environment.GITHUB_REPOSITORY ?? '';
|
|
36
37
|
const ref = `refs/heads/${input.stage === 'production' ? 'main' : 'develop'}`;
|
|
37
38
|
const workflow = `${repository}/.github/workflows/deploy.yml@${ref}`;
|
|
@@ -58,6 +59,9 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
|
|
|
58
59
|
policyDigest: (0, router_waf_js_1.routerWafPolicyDigest)(policy),
|
|
59
60
|
}, cleanupOnly ? undefined : input.url);
|
|
60
61
|
await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async (lease) => {
|
|
62
|
+
// A local process lease has no GitHub run authority; never infer one.
|
|
63
|
+
if (lease.authority === 'local')
|
|
64
|
+
return false;
|
|
61
65
|
// An old attempt of this run can be recovered only after GitHub confirms it ended.
|
|
62
66
|
if (lease.run === run && lease.attempt === attempt)
|
|
63
67
|
return cleanupOnly && lease.source === input.source;
|
|
@@ -96,6 +100,10 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
|
|
|
96
100
|
const address = await ipResponse.text();
|
|
97
101
|
check(address.length <= 64, 'runner IPv4 response exceeds bound');
|
|
98
102
|
const cidr = (0, private_smoke_admission_js_1.publicRunnerIpv4)(address.trim());
|
|
103
|
+
if ((0, private_smoke_admission_js_1.runnerAlreadyAllowed)(cidr, allowedCidrs)) {
|
|
104
|
+
await input.run();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
99
107
|
const wait = dependencies.wait ??
|
|
100
108
|
((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
|
|
101
109
|
async function observe(allowed) {
|