@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
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderProductApiFiles = renderProductApiFiles;
|
|
4
4
|
const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
|
|
5
|
+
const built_in_plan_key_value_records_js_1 = require("./built-in-plan-key-value-records.js");
|
|
6
|
+
const built_in_plan_key_value_consumer_js_1 = require("./built-in-plan-key-value-consumer.js");
|
|
5
7
|
/** @internal */
|
|
6
|
-
function renderProductApiFiles(name, pascalName, workspace) {
|
|
8
|
+
function renderProductApiFiles(name, pascalName, workspace, sql = false) {
|
|
7
9
|
const identifierPrefix = (0, built_in_plan_shared_js_1.lowerCamelIdentifier)(pascalName);
|
|
8
|
-
|
|
10
|
+
const files = {
|
|
9
11
|
'api/health.ts': `import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
|
|
10
12
|
import { ${identifierPrefix}Health } from './contracts/protected.js';
|
|
11
13
|
|
|
@@ -206,7 +208,7 @@ async function retentionReview<Result>(
|
|
|
206
208
|
404,
|
|
207
209
|
);
|
|
208
210
|
}
|
|
209
|
-
if (
|
|
211
|
+
if (/^Data-rights (?:request requires a direct human principal|administration requires a direct admin)[.]$/.test(detail)) {
|
|
210
212
|
mappedError(
|
|
211
213
|
'authorization_denied',
|
|
212
214
|
'Authorization was denied.',
|
|
@@ -367,6 +369,18 @@ function holdPurpose(
|
|
|
367
369
|
);
|
|
368
370
|
}
|
|
369
371
|
|
|
372
|
+
function holdEffects(values: readonly string[]) {
|
|
373
|
+
if (values.length === 0 || new Set(values).size !== values.length)
|
|
374
|
+
return mappedError('data_rights_input_invalid', 'Hold effects must be unique.', 400);
|
|
375
|
+
return values.map(holdEffect);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function holdTimestamp(value: string) {
|
|
379
|
+
if (!Number.isFinite(Date.parse(value)) || new Date(value).toISOString() !== value)
|
|
380
|
+
return mappedError('data_rights_input_invalid', 'Hold times must be canonical ISO-8601 timestamps.', 400);
|
|
381
|
+
return value;
|
|
382
|
+
}
|
|
383
|
+
|
|
370
384
|
async function dataRights<Result>(
|
|
371
385
|
kind: 'export' | 'hold',
|
|
372
386
|
operation: () => Promise<Result>,
|
|
@@ -375,6 +389,12 @@ async function dataRights<Result>(
|
|
|
375
389
|
return await operation();
|
|
376
390
|
} catch (error) {
|
|
377
391
|
if (error instanceof RuntimeError) throw error;
|
|
392
|
+
const provider = error as { name?: string; $metadata?: unknown; CancellationReasons?: Array<{ Code?: string }> } | null;
|
|
393
|
+
if (provider?.name === 'ConditionalCheckFailedException' || provider?.name === 'TransactionConflictException' ||
|
|
394
|
+
provider?.name === 'TransactionCanceledException' && provider.CancellationReasons?.some(reason => reason.Code === 'ConditionalCheckFailed' || reason.Code === 'TransactionConflict'))
|
|
395
|
+
mappedError('data_rights_conflict', 'The data-rights state changed concurrently; retry the exact request.', 409, true);
|
|
396
|
+
if (provider?.$metadata || provider?.name?.endsWith('Exception'))
|
|
397
|
+
mappedError('data_rights_retry_required', 'Data-rights processing requires retry.', 503, true);
|
|
378
398
|
const detail = error instanceof Error ? error.message : '';
|
|
379
399
|
if (/not found/i.test(detail)) {
|
|
380
400
|
mappedError('record_not_found', 'The record was not found.', 404);
|
|
@@ -410,14 +430,14 @@ async function dataRights<Result>(
|
|
|
410
430
|
409,
|
|
411
431
|
);
|
|
412
432
|
}
|
|
413
|
-
if (kind === 'hold') {
|
|
433
|
+
if (kind === 'hold' && /Only an unexpired active hold|Use explicit expiry|not due for expiry|64 active holds/.test(detail)) {
|
|
414
434
|
mappedError(
|
|
415
435
|
'record_hold_invalid',
|
|
416
436
|
'The record hold cannot make the requested transition.',
|
|
417
437
|
409,
|
|
418
438
|
);
|
|
419
439
|
}
|
|
420
|
-
if (/
|
|
440
|
+
if (/requires|bounded|future/i.test(detail)) {
|
|
421
441
|
mappedError(
|
|
422
442
|
'data_rights_input_invalid',
|
|
423
443
|
'The data-rights request is invalid.',
|
|
@@ -425,8 +445,8 @@ async function dataRights<Result>(
|
|
|
425
445
|
);
|
|
426
446
|
}
|
|
427
447
|
mappedError(
|
|
428
|
-
'
|
|
429
|
-
'
|
|
448
|
+
'data_rights_retry_required',
|
|
449
|
+
'Data-rights processing requires retry.',
|
|
430
450
|
503,
|
|
431
451
|
true,
|
|
432
452
|
);
|
|
@@ -567,12 +587,12 @@ export const issueHoldHandler = createContractHttpJsonHandler<
|
|
|
567
587
|
const hold = await dataRights('hold', () =>
|
|
568
588
|
issueRecordHold({
|
|
569
589
|
correlationId: context.correlationId,
|
|
570
|
-
effects: request.body.effects
|
|
571
|
-
expiresAt: request.body.expiresAt,
|
|
590
|
+
effects: holdEffects(request.body.effects),
|
|
591
|
+
expiresAt: holdTimestamp(request.body.expiresAt),
|
|
572
592
|
principal,
|
|
573
593
|
purpose: holdPurpose(request.body.purpose),
|
|
574
594
|
recordId: request.path.recordId,
|
|
575
|
-
reviewAt: request.body.reviewAt,
|
|
595
|
+
reviewAt: holdTimestamp(request.body.reviewAt),
|
|
576
596
|
}),
|
|
577
597
|
);
|
|
578
598
|
return holdResponse(hold);
|
|
@@ -592,11 +612,11 @@ export const reviewHoldHandler = createContractHttpJsonHandler<
|
|
|
592
612
|
const hold = await dataRights('hold', () =>
|
|
593
613
|
reviewRecordHold({
|
|
594
614
|
correlationId: context.correlationId,
|
|
595
|
-
expiresAt: request.body.expiresAt,
|
|
615
|
+
expiresAt: holdTimestamp(request.body.expiresAt),
|
|
596
616
|
holdId: request.path.holdId,
|
|
597
617
|
principal,
|
|
598
618
|
recordId: request.path.recordId,
|
|
599
|
-
reviewAt: request.body.reviewAt,
|
|
619
|
+
reviewAt: holdTimestamp(request.body.reviewAt),
|
|
600
620
|
}),
|
|
601
621
|
);
|
|
602
622
|
return holdResponse(hold);
|
|
@@ -649,7 +669,11 @@ export const expireHoldHandler = createContractHttpJsonHandler<
|
|
|
649
669
|
`,
|
|
650
670
|
'database/runtime-client.ts': `import {
|
|
651
671
|
databaseTlsOptions,
|
|
672
|
+
isDatabaseConnectFailure,
|
|
652
673
|
runWithDatabaseCredential,
|
|
674
|
+
toNodePostgresConnectionOptions,
|
|
675
|
+
withDatabaseClient,
|
|
676
|
+
type DatabaseConnectRetry,
|
|
653
677
|
type LinkedDatabaseResource,
|
|
654
678
|
} from '@empire-builder-kit/runtime/database';
|
|
655
679
|
import { createLogger } from '@empire-builder-kit/runtime/logging';
|
|
@@ -708,21 +732,72 @@ function linkedDatabase(): LinkedDatabaseResource {
|
|
|
708
732
|
return resource as LinkedDatabaseResource;
|
|
709
733
|
}
|
|
710
734
|
|
|
735
|
+
type PrimaryDatabaseWorkload =
|
|
736
|
+
| 'api-database-health'
|
|
737
|
+
| 'api-database-records'
|
|
738
|
+
| 'api-publish-created'
|
|
739
|
+
| 'async-inbox-cleanup'
|
|
740
|
+
| 'async-outbox-relay'
|
|
741
|
+
| 'async-provider-worker'
|
|
742
|
+
| 'data-export-cleanup'
|
|
743
|
+
| 'data-retention-job'
|
|
744
|
+
| 'event-consumer'
|
|
745
|
+
| 'web-server';
|
|
746
|
+
|
|
747
|
+
// Aurora Serverless v2 resume can take 15-30 s or longer. Only connect()
|
|
748
|
+
// retries, within a per-call wall-clock budget that leaves room for the
|
|
749
|
+
// operation: HTTP routes and the web server run on SST's 20 s default
|
|
750
|
+
// timeout, workers and the outbox relay on 1 minute, and jobs on 5 minutes.
|
|
751
|
+
// HTTP attempts are short so a held or slow resume connect is retried
|
|
752
|
+
// inside the budget instead of consuming it in a single attempt.
|
|
753
|
+
const connectPolicy: Record<
|
|
754
|
+
PrimaryDatabaseWorkload,
|
|
755
|
+
{ attemptTimeoutMs: number; budgetMs: number }
|
|
756
|
+
> = {
|
|
757
|
+
'api-database-health': { attemptTimeoutMs: 5_000, budgetMs: 15_000 },
|
|
758
|
+
'api-database-records': { attemptTimeoutMs: 5_000, budgetMs: 15_000 },
|
|
759
|
+
'api-publish-created': { attemptTimeoutMs: 5_000, budgetMs: 15_000 },
|
|
760
|
+
'async-inbox-cleanup': { attemptTimeoutMs: 15_000, budgetMs: 120_000 },
|
|
761
|
+
'async-outbox-relay': { attemptTimeoutMs: 15_000, budgetMs: 40_000 },
|
|
762
|
+
'async-provider-worker': { attemptTimeoutMs: 15_000, budgetMs: 40_000 },
|
|
763
|
+
'data-export-cleanup': { attemptTimeoutMs: 15_000, budgetMs: 120_000 },
|
|
764
|
+
'data-retention-job': { attemptTimeoutMs: 15_000, budgetMs: 120_000 },
|
|
765
|
+
'event-consumer': { attemptTimeoutMs: 15_000, budgetMs: 40_000 },
|
|
766
|
+
'web-server': { attemptTimeoutMs: 5_000, budgetMs: 15_000 },
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
function logConnectionRetry(
|
|
770
|
+
context: { correlationId: string },
|
|
771
|
+
workload: PrimaryDatabaseWorkload,
|
|
772
|
+
retry: DatabaseConnectRetry,
|
|
773
|
+
): void {
|
|
774
|
+
createLogger({
|
|
775
|
+
component: workload,
|
|
776
|
+
feature: 'database',
|
|
777
|
+
operation: 'database.connect',
|
|
778
|
+
slice: '${name}',
|
|
779
|
+
stage: process.env.EBK_STAGE ?? '',
|
|
780
|
+
workspace: '${workspace}',
|
|
781
|
+
}).warn('Retrying database connection', {
|
|
782
|
+
attributes: {
|
|
783
|
+
databaseEvent: 'database_runtime_connection_retry',
|
|
784
|
+
...retry,
|
|
785
|
+
},
|
|
786
|
+
context: { correlationId: context.correlationId },
|
|
787
|
+
outcome: 'unknown',
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
|
|
711
791
|
export async function withPrimaryDatabase<Result>(
|
|
712
792
|
context: { correlationId: string },
|
|
713
|
-
workload:
|
|
714
|
-
| 'api-database-health'
|
|
715
|
-
| 'api-database-records'
|
|
716
|
-
| 'async-inbox-cleanup'
|
|
717
|
-
| 'async-outbox-relay'
|
|
718
|
-
| 'async-provider-worker'
|
|
719
|
-
| 'data-export-cleanup'
|
|
720
|
-
| 'data-retention-job'
|
|
721
|
-
| 'event-consumer'
|
|
722
|
-
| 'web-server',
|
|
793
|
+
workload: PrimaryDatabaseWorkload,
|
|
723
794
|
operation: (client: PgClient) => Promise<Result>,
|
|
724
795
|
): Promise<Result> {
|
|
725
796
|
const resource = linkedDatabase();
|
|
797
|
+
const policy = connectPolicy[workload];
|
|
798
|
+
// One per-call deadline spans credential resolution and any 28P01 refresh.
|
|
799
|
+
// Handlers that make several sequential calls bound their own total work.
|
|
800
|
+
const deadline = Date.now() + policy.budgetMs;
|
|
726
801
|
return runWithDatabaseCredential(
|
|
727
802
|
resource,
|
|
728
803
|
resource.provider === 'aws-secrets-manager'
|
|
@@ -732,22 +807,25 @@ export async function withPrimaryDatabase<Result>(
|
|
|
732
807
|
resolver: getSecretResolver(workload),
|
|
733
808
|
}
|
|
734
809
|
: undefined,
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
810
|
+
(credential) =>
|
|
811
|
+
withDatabaseClient(
|
|
812
|
+
{
|
|
813
|
+
attemptTimeoutMs: policy.attemptTimeoutMs,
|
|
814
|
+
createClient: (connectionTimeoutMillis) =>
|
|
815
|
+
new Client({
|
|
816
|
+
...toNodePostgresConnectionOptions(credential),
|
|
817
|
+
connectionTimeoutMillis,
|
|
818
|
+
ssl: databaseTlsOptions(resource),
|
|
819
|
+
}),
|
|
820
|
+
deadline,
|
|
821
|
+
onRetry: (retry) => logConnectionRetry(context, workload, retry),
|
|
822
|
+
},
|
|
823
|
+
operation,
|
|
824
|
+
),
|
|
825
|
+
// Refresh credentials only when connect() itself failed authentication,
|
|
826
|
+
// so a started operation is never run a second time.
|
|
748
827
|
(error) =>
|
|
749
|
-
error
|
|
750
|
-
typeof error === 'object' &&
|
|
828
|
+
isDatabaseConnectFailure(error) &&
|
|
751
829
|
'code' in error &&
|
|
752
830
|
error.code === '28P01',
|
|
753
831
|
);
|
|
@@ -758,7 +836,7 @@ import type { Principal } from '@empire-builder-kit/runtime/auth';
|
|
|
758
836
|
import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
|
|
759
837
|
import { ${identifierPrefix}DatabaseHealth } from '../api/contracts/protected.js';
|
|
760
838
|
import { authorize${pascalName}Operation } from '../authorization/runtime.js';
|
|
761
|
-
import {
|
|
839
|
+
${"import { dataStore } from '../data/key-value.js';"}
|
|
762
840
|
|
|
763
841
|
export const handler = createContractHttpJsonHandler<
|
|
764
842
|
typeof ${identifierPrefix}DatabaseHealth,
|
|
@@ -770,351 +848,21 @@ export const handler = createContractHttpJsonHandler<
|
|
|
770
848
|
workspace: '${workspace}',
|
|
771
849
|
authorize: authorize${pascalName}Operation,
|
|
772
850
|
async handle({ context }) {
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
(client) => client.query('SELECT 1'),
|
|
777
|
-
);
|
|
851
|
+
${` void context;
|
|
852
|
+
await dataStore().get('application', 'health', 'connectivity-probe');
|
|
853
|
+
`}\
|
|
778
854
|
return { service: '${name}', status: 'ok' };
|
|
779
855
|
},
|
|
780
856
|
});
|
|
781
857
|
`,
|
|
782
|
-
'database/records.ts':
|
|
783
|
-
|
|
784
|
-
import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
|
|
785
|
-
import type { AuthorizationPrincipal } from '@empire-builder-kit/runtime/authorization';
|
|
786
|
-
import { RuntimeError } from '@empire-builder-kit/runtime/response';
|
|
787
|
-
import {
|
|
788
|
-
${identifierPrefix}GetRecord,
|
|
789
|
-
${identifierPrefix}PutRecord,
|
|
790
|
-
} from '../api/contracts/protected.js';
|
|
791
|
-
import {
|
|
792
|
-
authorize${pascalName}DataRightsOperation,
|
|
793
|
-
authorize${pascalName}Operation,
|
|
794
|
-
} from '../authorization/runtime.js';
|
|
795
|
-
import {
|
|
796
|
-
correctRecordWithLifecycle,
|
|
797
|
-
publishRecordCorrection,
|
|
798
|
-
} from '../data/record-correction.js';
|
|
799
|
-
import { effectiveRecordOwner } from '../data/data-rights-shared.js';
|
|
800
|
-
import { withPrimaryDatabase } from './runtime-client.js';
|
|
801
|
-
|
|
802
|
-
function canonicalTestExpiresAt(value: string | undefined): string | undefined {
|
|
803
|
-
if (value === undefined) return undefined;
|
|
804
|
-
const expiresAt = Date.parse(value);
|
|
805
|
-
const now = Date.now();
|
|
806
|
-
if (
|
|
807
|
-
!Number.isFinite(expiresAt) ||
|
|
808
|
-
new Date(expiresAt).toISOString() !== value ||
|
|
809
|
-
expiresAt <= now ||
|
|
810
|
-
expiresAt - now > 48 * 60 * 60 * 1_000
|
|
811
|
-
) {
|
|
812
|
-
throw new RuntimeError({
|
|
813
|
-
code: 'test_data_expiry_invalid',
|
|
814
|
-
message:
|
|
815
|
-
'Test data expiry must be a canonical future timestamp within 48 hours.',
|
|
816
|
-
retryable: false,
|
|
817
|
-
status: 400,
|
|
818
|
-
});
|
|
819
|
-
}
|
|
820
|
-
return value;
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
function notFound(): never {
|
|
824
|
-
throw new RuntimeError({
|
|
825
|
-
code: 'record_not_found',
|
|
826
|
-
message: 'The record was not found.',
|
|
827
|
-
retryable: false,
|
|
828
|
-
status: 404,
|
|
829
|
-
});
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
export const putHandler = createContractHttpJsonHandler<
|
|
833
|
-
typeof ${identifierPrefix}PutRecord,
|
|
834
|
-
RuntimeHttpEvent,
|
|
835
|
-
AuthorizationPrincipal
|
|
836
|
-
>({
|
|
837
|
-
component: 'database-records',
|
|
838
|
-
operation: ${identifierPrefix}PutRecord,
|
|
839
|
-
workspace: '${workspace}',
|
|
840
|
-
authorize: authorize${pascalName}DataRightsOperation,
|
|
841
|
-
async handle({ context, principal, request }) {
|
|
842
|
-
const testExpiresAt = canonicalTestExpiresAt(request.body.testExpiresAt);
|
|
843
|
-
const ownerId = effectiveRecordOwner(principal);
|
|
844
|
-
const result = await withPrimaryDatabase(context, 'api-database-records', (client) =>
|
|
845
|
-
client.query<{
|
|
846
|
-
id: string;
|
|
847
|
-
name: string;
|
|
848
|
-
runScope: string;
|
|
849
|
-
}>(
|
|
850
|
-
\`INSERT INTO records
|
|
851
|
-
(id, name, owner_id, run_scope, test_expires_at)
|
|
852
|
-
VALUES ($1::uuid, $2, $3, $4, $5::timestamptz)
|
|
853
|
-
ON CONFLICT (id) DO NOTHING
|
|
854
|
-
RETURNING id::text, name, run_scope AS "runScope"\`,
|
|
855
|
-
[
|
|
856
|
-
request.path.recordId,
|
|
857
|
-
request.body.name,
|
|
858
|
-
ownerId,
|
|
859
|
-
request.body.runScope,
|
|
860
|
-
testExpiresAt ?? null,
|
|
861
|
-
],
|
|
862
|
-
),
|
|
863
|
-
);
|
|
864
|
-
const created = result.rows[0];
|
|
865
|
-
if (created) return created;
|
|
866
|
-
const ownership = await withPrimaryDatabase(
|
|
867
|
-
context,
|
|
868
|
-
'api-database-records',
|
|
869
|
-
(client) =>
|
|
870
|
-
client.query<{ ownerId: string }>(
|
|
871
|
-
\`SELECT owner_id AS "ownerId"
|
|
872
|
-
FROM records
|
|
873
|
-
WHERE id = $1::uuid\`,
|
|
874
|
-
[request.path.recordId],
|
|
875
|
-
),
|
|
876
|
-
);
|
|
877
|
-
if (ownership.rows[0]?.ownerId !== ownerId) {
|
|
878
|
-
throw new RuntimeError({
|
|
879
|
-
code: 'record_conflict',
|
|
880
|
-
message: 'The record identifier is owned by another principal.',
|
|
881
|
-
retryable: false,
|
|
882
|
-
status: 409,
|
|
883
|
-
});
|
|
884
|
-
}
|
|
885
|
-
const corrected = await correctRecordWithLifecycle({
|
|
886
|
-
correlationId: context.correlationId,
|
|
887
|
-
name: request.body.name,
|
|
888
|
-
principal,
|
|
889
|
-
recordId: request.path.recordId,
|
|
890
|
-
runScope: request.body.runScope,
|
|
891
|
-
testExpiresAt,
|
|
892
|
-
});
|
|
893
|
-
const propagation = await publishRecordCorrection(
|
|
894
|
-
context.correlationId,
|
|
895
|
-
corrected.requestRef,
|
|
896
|
-
);
|
|
897
|
-
if (propagation === 'retry-required') {
|
|
898
|
-
throw new RuntimeError({
|
|
899
|
-
code: 'record_correction_retry_required',
|
|
900
|
-
message: 'Record correction propagation requires retry.',
|
|
901
|
-
retryable: true,
|
|
902
|
-
status: 503,
|
|
903
|
-
});
|
|
904
|
-
}
|
|
905
|
-
return {
|
|
906
|
-
id: corrected.id,
|
|
907
|
-
name: corrected.name,
|
|
908
|
-
runScope: corrected.runScope,
|
|
909
|
-
};
|
|
910
|
-
},
|
|
911
|
-
});
|
|
912
|
-
|
|
913
|
-
export const getHandler = createContractHttpJsonHandler<
|
|
914
|
-
typeof ${identifierPrefix}GetRecord,
|
|
915
|
-
RuntimeHttpEvent,
|
|
916
|
-
Principal
|
|
917
|
-
>({
|
|
918
|
-
component: 'database-records',
|
|
919
|
-
operation: ${identifierPrefix}GetRecord,
|
|
920
|
-
workspace: '${workspace}',
|
|
921
|
-
authorize: authorize${pascalName}Operation,
|
|
922
|
-
async handle({ context, principal, request }) {
|
|
923
|
-
const result = await withPrimaryDatabase(context, 'api-database-records', (client) =>
|
|
924
|
-
client.query<{ id: string; name: string; runScope: string }>(
|
|
925
|
-
\`SELECT id::text, name, run_scope AS "runScope"
|
|
926
|
-
FROM records
|
|
927
|
-
WHERE id = $1::uuid AND owner_id = $2\`,
|
|
928
|
-
[request.path.recordId, principal.id],
|
|
929
|
-
),
|
|
930
|
-
);
|
|
931
|
-
return result.rows[0] ?? notFound();
|
|
932
|
-
},
|
|
933
|
-
});
|
|
934
|
-
|
|
935
|
-
`,
|
|
936
|
-
'api/event-consumer.ts': `import { parseDataLifecycleChangeEvent } from '@empire-builder-kit/runtime/data-lifecycle';
|
|
937
|
-
import { parseSqsEventBridgeRecords, toEventLogContext } from '@empire-builder-kit/runtime/events';
|
|
938
|
-
import { createLogger } from '@empire-builder-kit/runtime/logging';
|
|
939
|
-
import type {
|
|
940
|
-
${pascalName}CreatedData,
|
|
941
|
-
${pascalName}DataLifecycleChangedData,
|
|
942
|
-
} from '../contracts/events.js';
|
|
943
|
-
import {
|
|
944
|
-
${identifierPrefix}AuthorizationActions,
|
|
945
|
-
} from '../authorization/policy.js';
|
|
946
|
-
import {
|
|
947
|
-
authorize${pascalName}InternalOperation,
|
|
948
|
-
} from '../authorization/runtime.js';
|
|
949
|
-
import lifecycleConsumers from '../data/lifecycle-consumers.json';
|
|
950
|
-
import { withPrimaryDatabase } from '../database/runtime-client.js';
|
|
951
|
-
|
|
952
|
-
interface QueueRecord { body: string; messageId: string }
|
|
953
|
-
interface QueueEvent { Records: QueueRecord[] }
|
|
954
|
-
|
|
955
|
-
function acceptedLifecycleSources(): Set<string> {
|
|
956
|
-
const sources = lifecycleConsumers.acceptedSources;
|
|
957
|
-
if (
|
|
958
|
-
lifecycleConsumers.schemaVersion !== 1 ||
|
|
959
|
-
!Array.isArray(sources) ||
|
|
960
|
-
sources.length === 0 ||
|
|
961
|
-
sources.length > 32 ||
|
|
962
|
-
new Set(sources).size !== sources.length ||
|
|
963
|
-
sources.some((source) => !/^[a-z][a-z0-9-]{0,62}$/.test(source))
|
|
964
|
-
) {
|
|
965
|
-
throw new Error(
|
|
966
|
-
'Lifecycle consumer configuration must contain unique bounded Slice sources.',
|
|
967
|
-
);
|
|
968
|
-
}
|
|
969
|
-
return new Set(sources);
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
const lifecycleSources = acceptedLifecycleSources();
|
|
973
|
-
|
|
974
|
-
function requiredEventConsumerWorkloadIdentity(): string {
|
|
975
|
-
const configured = process.env.EBK_WORKLOAD_IDENTITY?.trim();
|
|
976
|
-
if (configured !== '${name}:event-consumer') {
|
|
977
|
-
throw new Error('Event consumer workload identity is invalid.');
|
|
978
|
-
}
|
|
979
|
-
return configured;
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
function lifecycleReconciliationExpiresAt(occurredAt: string): string {
|
|
983
|
-
const expiresAt = new Date(occurredAt);
|
|
984
|
-
expiresAt.setUTCDate(expiresAt.getUTCDate() + 400);
|
|
985
|
-
return expiresAt.toISOString();
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
export async function handler(event: QueueEvent) {
|
|
989
|
-
const workloadIdentity = requiredEventConsumerWorkloadIdentity();
|
|
990
|
-
const logger = createLogger({
|
|
991
|
-
component: 'event-consumer',
|
|
992
|
-
feature: 'events',
|
|
993
|
-
operation: 'consume-created',
|
|
994
|
-
slice: '${name}',
|
|
995
|
-
stage: process.env.EBK_STAGE ?? '',
|
|
996
|
-
workspace: '${workspace}',
|
|
997
|
-
});
|
|
998
|
-
const batch = parseSqsEventBridgeRecords<
|
|
999
|
-
${pascalName}CreatedData | ${pascalName}DataLifecycleChangedData
|
|
1000
|
-
>(event.Records);
|
|
1001
|
-
const failures = [...batch.failures];
|
|
1002
|
-
for (const { detailType, envelope, messageId, source } of batch.events) {
|
|
1003
|
-
if (messageId === undefined) {
|
|
1004
|
-
failures.push({
|
|
1005
|
-
error: 'Event processing failed without retaining payload data.',
|
|
1006
|
-
messageId: 'missing-message-id',
|
|
1007
|
-
});
|
|
1008
|
-
continue;
|
|
1009
|
-
}
|
|
1010
|
-
try {
|
|
1011
|
-
if (detailType === 'DataLifecycleChanged') {
|
|
1012
|
-
const lifecycle = parseDataLifecycleChangeEvent(envelope.data);
|
|
1013
|
-
if (
|
|
1014
|
-
source === undefined ||
|
|
1015
|
-
lifecycle.sourceSlice !== source ||
|
|
1016
|
-
!lifecycleSources.has(source)
|
|
1017
|
-
) {
|
|
1018
|
-
throw new Error(
|
|
1019
|
-
'Lifecycle event source is not declared by this consumer.',
|
|
1020
|
-
);
|
|
1021
|
-
}
|
|
1022
|
-
await authorize${pascalName}InternalOperation({
|
|
1023
|
-
action: ${identifierPrefix}AuthorizationActions.lifecycleConsume,
|
|
1024
|
-
correlationId: envelope.meta.correlationId,
|
|
1025
|
-
operationId: messageId,
|
|
1026
|
-
workloadIdentity,
|
|
1027
|
-
});
|
|
1028
|
-
await withPrimaryDatabase(
|
|
1029
|
-
{ correlationId: envelope.meta.correlationId },
|
|
1030
|
-
'event-consumer',
|
|
1031
|
-
async (client) => {
|
|
1032
|
-
await client.query('BEGIN');
|
|
1033
|
-
try {
|
|
1034
|
-
await client.query(
|
|
1035
|
-
\`INSERT INTO data_lifecycle_receipts
|
|
1036
|
-
(source_slice, pseudonymous_key, action, request_ref,
|
|
1037
|
-
policy_version, occurred_at)
|
|
1038
|
-
VALUES ($1, $2, $3, $4, $5, $6)
|
|
1039
|
-
ON CONFLICT
|
|
1040
|
-
(source_slice, pseudonymous_key, action, request_ref)
|
|
1041
|
-
DO NOTHING\`,
|
|
1042
|
-
[
|
|
1043
|
-
lifecycle.sourceSlice,
|
|
1044
|
-
lifecycle.pseudonymousKey,
|
|
1045
|
-
lifecycle.action,
|
|
1046
|
-
lifecycle.requestRef,
|
|
1047
|
-
lifecycle.policyVersion,
|
|
1048
|
-
lifecycle.occurredAt,
|
|
1049
|
-
],
|
|
1050
|
-
);
|
|
1051
|
-
await client.query(
|
|
1052
|
-
\`INSERT INTO data_lifecycle_downstream_copies
|
|
1053
|
-
(source_slice, pseudonymous_key, copy_id, recipient,
|
|
1054
|
-
purpose, expires_at, action, hold_refs, status,
|
|
1055
|
-
updated_at)
|
|
1056
|
-
VALUES ($1, $2, $3, $4, 'lifecycle-reconciliation', $5,
|
|
1057
|
-
$6, '[]'::jsonb, $7, $8)
|
|
1058
|
-
ON CONFLICT (source_slice, pseudonymous_key, copy_id)
|
|
1059
|
-
DO UPDATE SET
|
|
1060
|
-
action = EXCLUDED.action,
|
|
1061
|
-
expires_at = EXCLUDED.expires_at,
|
|
1062
|
-
hold_refs = EXCLUDED.hold_refs,
|
|
1063
|
-
status = EXCLUDED.status,
|
|
1064
|
-
updated_at = EXCLUDED.updated_at
|
|
1065
|
-
WHERE data_lifecycle_downstream_copies.updated_at
|
|
1066
|
-
<= EXCLUDED.updated_at\`,
|
|
1067
|
-
[
|
|
1068
|
-
lifecycle.sourceSlice,
|
|
1069
|
-
lifecycle.pseudonymousKey,
|
|
1070
|
-
'${name}-lifecycle-consumer',
|
|
1071
|
-
'${name}',
|
|
1072
|
-
lifecycleReconciliationExpiresAt(lifecycle.occurredAt),
|
|
1073
|
-
lifecycle.action,
|
|
1074
|
-
lifecycle.action === 'deletion'
|
|
1075
|
-
? 'deleted'
|
|
1076
|
-
: 'reconciled',
|
|
1077
|
-
lifecycle.occurredAt,
|
|
1078
|
-
],
|
|
1079
|
-
);
|
|
1080
|
-
await client.query('COMMIT');
|
|
1081
|
-
} catch (error) {
|
|
1082
|
-
await client.query('ROLLBACK').catch(() => undefined);
|
|
1083
|
-
throw error;
|
|
1084
|
-
}
|
|
1085
|
-
},
|
|
1086
|
-
);
|
|
1087
|
-
}
|
|
1088
|
-
logger.info('${name} event consumed', {
|
|
1089
|
-
context: toEventLogContext(envelope.meta, detailType),
|
|
1090
|
-
outcome: 'success',
|
|
1091
|
-
});
|
|
1092
|
-
} catch {
|
|
1093
|
-
failures.push({
|
|
1094
|
-
error: 'Event processing failed without retaining payload data.',
|
|
1095
|
-
messageId,
|
|
1096
|
-
});
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
logger.info('${name} event batch completed', {
|
|
1100
|
-
attributes: {
|
|
1101
|
-
eventCount: batch.events.length,
|
|
1102
|
-
failureCount: failures.length,
|
|
1103
|
-
},
|
|
1104
|
-
outcome: failures.length === 0 ? 'success' : 'failure',
|
|
1105
|
-
});
|
|
1106
|
-
return {
|
|
1107
|
-
batchItemFailures: failures.map(({ messageId }) => ({
|
|
1108
|
-
itemIdentifier: messageId ?? '',
|
|
1109
|
-
})),
|
|
1110
|
-
};
|
|
1111
|
-
}
|
|
1112
|
-
`,
|
|
858
|
+
'database/records.ts': (0, built_in_plan_key_value_records_js_1.renderKeyValueRecordApi)(pascalName, workspace),
|
|
859
|
+
'api/event-consumer.ts': (0, built_in_plan_key_value_consumer_js_1.renderKeyValueEventConsumer)(name, pascalName, workspace),
|
|
1113
860
|
'testing/event-consumer-identity.spec.ts': `import { afterEach, describe, expect, it } from 'vitest';
|
|
1114
861
|
import { handler } from '../api/event-consumer.js';
|
|
1115
862
|
|
|
1116
863
|
afterEach(() => {
|
|
1117
864
|
delete process.env.EBK_WORKLOAD_IDENTITY;
|
|
865
|
+
delete process.env.EBK_STAGE;
|
|
1118
866
|
});
|
|
1119
867
|
|
|
1120
868
|
describe('${pascalName} event-consumer identity', () => {
|
|
@@ -1133,54 +881,22 @@ describe('${pascalName} event-consumer identity', () => {
|
|
|
1133
881
|
|
|
1134
882
|
it('accepts only the exact generated identity', async () => {
|
|
1135
883
|
process.env.EBK_WORKLOAD_IDENTITY = '${name}:event-consumer';
|
|
884
|
+
process.env.EBK_STAGE = 'development';
|
|
1136
885
|
await expect(handler({ Records: [] })).resolves.toEqual({
|
|
1137
886
|
batchItemFailures: [],
|
|
1138
887
|
});
|
|
1139
888
|
});
|
|
1140
|
-
});
|
|
1141
|
-
`,
|
|
1142
|
-
'api/publish-created.ts': `import { EventBridgeClient, PutEventsCommand } from '@aws-sdk/client-eventbridge';
|
|
1143
|
-
import type { RuntimeHttpEvent } from '@empire-builder-kit/runtime';
|
|
1144
|
-
import type { Principal } from '@empire-builder-kit/runtime/auth';
|
|
1145
|
-
import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
|
|
1146
|
-
import { createEventPublisher } from '@empire-builder-kit/runtime/events';
|
|
1147
|
-
import { authorize${pascalName}Operation } from '../authorization/runtime.js';
|
|
1148
|
-
import { ${identifierPrefix}PublishCreated } from './contracts/protected.js';
|
|
1149
|
-
import { ${pascalName}Created } from '../contracts/events.js';
|
|
1150
889
|
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
stage: process.env.EBK_STAGE ?? '',
|
|
1157
|
-
send: (entry) => client.send(new PutEventsCommand({ Entries: [{
|
|
1158
|
-
Detail: entry.detail,
|
|
1159
|
-
DetailType: entry.detailType,
|
|
1160
|
-
EventBusName: entry.eventBusName,
|
|
1161
|
-
Source: entry.source,
|
|
1162
|
-
}] })),
|
|
890
|
+
it('fails closed without an exact receiver stage', async () => {
|
|
891
|
+
process.env.EBK_WORKLOAD_IDENTITY = '${name}:event-consumer';
|
|
892
|
+
await expect(handler({ Records: [] })).rejects.toThrow(
|
|
893
|
+
'Event consumer stage is required and must be exact.',
|
|
894
|
+
);
|
|
1163
895
|
});
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
export const handler = createContractHttpJsonHandler<
|
|
1167
|
-
typeof ${identifierPrefix}PublishCreated,
|
|
1168
|
-
RuntimeHttpEvent,
|
|
1169
|
-
Principal
|
|
1170
|
-
>({
|
|
1171
|
-
component: 'event-publisher',
|
|
1172
|
-
operation: ${identifierPrefix}PublishCreated,
|
|
1173
|
-
workspace: '${workspace}',
|
|
1174
|
-
authorize: authorize${pascalName}Operation,
|
|
1175
|
-
async handle({ context, principal }) {
|
|
1176
|
-
const publishedEvent = await getPublisher()(${pascalName}Created, {
|
|
1177
|
-
id: crypto.randomUUID(),
|
|
1178
|
-
occurredBy: principal.id,
|
|
1179
|
-
}, { context });
|
|
1180
|
-
return { eventId: publishedEvent.meta.eventId };
|
|
1181
|
-
},
|
|
1182
896
|
});
|
|
1183
897
|
`,
|
|
898
|
+
'api/publish-created.ts': (0, built_in_plan_key_value_consumer_js_1.renderKeyValueCreatedPublisher)(pascalName, workspace),
|
|
1184
899
|
};
|
|
900
|
+
return Object.fromEntries(Object.entries(files).filter(([path]) => sql || path !== 'database/runtime-client.ts'));
|
|
1185
901
|
}
|
|
1186
902
|
//# sourceMappingURL=built-in-plan-api-files.js.map
|