@empire-builder-kit/nx 1.0.0-rc.37 → 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 +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 +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 +206 -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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderKeyValueHoldFiles = renderKeyValueHoldFiles;
|
|
4
|
+
/** Native data-rights holds. The versioned per-record set closes absent-hold races. */
|
|
5
|
+
function renderKeyValueHoldFiles(name, pascalName) {
|
|
6
|
+
return {
|
|
7
|
+
'data/data-rights-shared.ts': `import { randomUUID } from 'node:crypto';
|
|
8
|
+
import type { AuthorizationPrincipal } from '@empire-builder-kit/runtime/authorization';
|
|
9
|
+
import type { KeyValueChange } from '@empire-builder-kit/runtime/key-value';
|
|
10
|
+
import { createDataLifecycleAuditRecord, createDataLifecyclePseudonymousReference,
|
|
11
|
+
type DataLifecycleAuditAction, type DataLifecycleEvidenceOutcome } from '@empire-builder-kit/runtime/data-lifecycle';
|
|
12
|
+
import { approvalReference, productRecordReference } from './pseudonymous-reference.js';
|
|
13
|
+
import { ${pascalName}DataLifecycleRuntimePolicy } from './runtime-policy.cjs';
|
|
14
|
+
|
|
15
|
+
export const DATA_RIGHTS_POLICY_VERSION = ${pascalName}DataLifecycleRuntimePolicy.policyVersion;
|
|
16
|
+
export const DATA_RIGHTS_AUDIT_RETENTION_DAYS = 400;
|
|
17
|
+
export function canonicalDataRightsNow(now?: string): string {
|
|
18
|
+
const value = now ?? new Date().toISOString();
|
|
19
|
+
if (typeof value !== 'string' || !Number.isFinite(Date.parse(value)) || new Date(value).toISOString() !== value)
|
|
20
|
+
throw new Error('Data-rights time must be a canonical ISO-8601 timestamp.');
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
export const plusDataRightsDays = (value: string, days: number) => new Date(Date.parse(value) + days * 86_400_000).toISOString();
|
|
24
|
+
export const plusDataRightsHours = (value: string, hours: number) => new Date(Date.parse(value) + hours * 3_600_000).toISOString();
|
|
25
|
+
export const dataRightsSubjectReference = (value: string) => createDataLifecyclePseudonymousReference({ categoryId: 'authorization-subject', slice: '${name}', value });
|
|
26
|
+
export const dataRightsCorrelationReference = (value: string) => createDataLifecyclePseudonymousReference({ categoryId: 'correlation', slice: '${name}', value });
|
|
27
|
+
export const dataRightsArtifactReference = (value: string) => createDataLifecyclePseudonymousReference({ categoryId: 'subject-export', slice: '${name}', value });
|
|
28
|
+
export function requireDirectHuman(principal: AuthorizationPrincipal): AuthorizationPrincipal {
|
|
29
|
+
if (principal.actor.type !== 'user' || principal.subject.type !== 'user' ||
|
|
30
|
+
principal.actor.id !== principal.subject.id || principal.authority.mode !== 'direct')
|
|
31
|
+
throw new Error('Data-rights request requires a direct human principal.');
|
|
32
|
+
return principal;
|
|
33
|
+
}
|
|
34
|
+
export function requireDirectAdmin(principal: AuthorizationPrincipal): AuthorizationPrincipal {
|
|
35
|
+
requireDirectHuman(principal);
|
|
36
|
+
if (principal.kind !== 'admin') throw new Error('Data-rights administration requires a direct admin.');
|
|
37
|
+
return principal;
|
|
38
|
+
}
|
|
39
|
+
export function requireExportCleanupAuthority(principal: AuthorizationPrincipal): AuthorizationPrincipal {
|
|
40
|
+
if (principal.authority.mode === 'machine' && principal.actor.type === 'service' &&
|
|
41
|
+
principal.subject.type === 'service' && principal.actor.id === '${name}:data-export-cleanup' &&
|
|
42
|
+
principal.subject.id === principal.actor.id && principal.audience === principal.actor.id &&
|
|
43
|
+
principal.authority.machineIdentityId === principal.actor.id) return principal;
|
|
44
|
+
return requireDirectAdmin(principal);
|
|
45
|
+
}
|
|
46
|
+
export { effectiveRecordOwner } from './records.js';
|
|
47
|
+
|
|
48
|
+
/** Include this returned change in the same transaction as the protected effect. */
|
|
49
|
+
export function dataRightsAuditChange(input: {
|
|
50
|
+
action: DataLifecycleAuditAction; approvalRequestId?: string; correlationId: string; now: string;
|
|
51
|
+
outcome: DataLifecycleEvidenceOutcome; principal: AuthorizationPrincipal; purposeCode: string;
|
|
52
|
+
recordId?: string; resourceReference?: string; summary: string;
|
|
53
|
+
}): KeyValueChange {
|
|
54
|
+
const resourceReference = input.resourceReference ?? (input.recordId ? productRecordReference(input.recordId) : undefined);
|
|
55
|
+
if (!resourceReference) throw new Error('Data-rights audit requires a resource reference.');
|
|
56
|
+
const audit = createDataLifecycleAuditRecord({ action: input.action,
|
|
57
|
+
actorRef: dataRightsSubjectReference(input.principal.actor.id), authorityCode: input.principal.authority.mode,
|
|
58
|
+
correlationRef: dataRightsCorrelationReference(input.correlationId), outcome: input.outcome,
|
|
59
|
+
policyVersion: DATA_RIGHTS_POLICY_VERSION, purposeCode: input.purposeCode,
|
|
60
|
+
summary: input.summary, targetCategoryId: 'product-record', timestamp: canonicalDataRightsNow(input.now) });
|
|
61
|
+
return { action: 'put', collection: 'data-lifecycle-audit', id: randomUUID(), expectedVersion: 0,
|
|
62
|
+
value: { audit, resourceReference, approvalReference: input.approvalRequestId ? approvalReference(input.approvalRequestId) : null,
|
|
63
|
+
principalKind: input.principal.kind, subjectType: input.principal.actor.type,
|
|
64
|
+
slice: '${name}', stage: process.env.EBK_STAGE,
|
|
65
|
+
expiresAt: plusDataRightsDays(input.now, DATA_RIGHTS_AUDIT_RETENTION_DAYS) } };
|
|
66
|
+
}
|
|
67
|
+
`,
|
|
68
|
+
'data/record-holds.ts': `import { randomUUID } from 'node:crypto';
|
|
69
|
+
import type { AuthorizationPrincipal } from '@empire-builder-kit/runtime/authorization';
|
|
70
|
+
import type { KeyValueChange } from '@empire-builder-kit/runtime/key-value';
|
|
71
|
+
import { evaluateDataLifecycleHolds, normalizeDataLifecycleRuntimeHold,
|
|
72
|
+
type DataLifecycleRuntimeHoldEffect, type DataLifecycleRuntimeHoldPurpose,
|
|
73
|
+
type DataLifecycleRuntimeHoldV1 } from '@empire-builder-kit/runtime/data-lifecycle';
|
|
74
|
+
import { productRecordReference } from './pseudonymous-reference.js';
|
|
75
|
+
import { canonicalDataRightsNow, requireDirectAdmin, dataRightsAuditChange } from './data-rights-shared.js';
|
|
76
|
+
import { ${pascalName}DataLifecycleRuntimePolicy } from './runtime-policy.cjs';
|
|
77
|
+
import { dataStore } from './key-value.js';
|
|
78
|
+
import { readProductRecord } from './records.js';
|
|
79
|
+
|
|
80
|
+
const MAXIMUM_HOLD_LIFETIME_MS = 90 * 86_400_000;
|
|
81
|
+
const MAXIMUM_RECORD_HOLDS = 64;
|
|
82
|
+
interface HoldSet { scopeRef: string; holds: DataLifecycleRuntimeHoldV1[] }
|
|
83
|
+
interface HoldCommand { correlationId: string; now?: string; principal: AuthorizationPrincipal; recordId: string }
|
|
84
|
+
interface ExistingHoldCommand extends HoldCommand { holdId: string }
|
|
85
|
+
function interval(startsAt: string, reviewAt: string, expiresAt: string) {
|
|
86
|
+
for (const value of [startsAt, reviewAt, expiresAt]) canonicalDataRightsNow(value);
|
|
87
|
+
if (Date.parse(startsAt) >= Date.parse(reviewAt) || Date.parse(reviewAt) > Date.parse(expiresAt) ||
|
|
88
|
+
Date.parse(expiresAt) - Date.parse(startsAt) > MAXIMUM_HOLD_LIFETIME_MS)
|
|
89
|
+
throw new Error('Record hold requires a future review and a lifetime of at most 90 days.');
|
|
90
|
+
}
|
|
91
|
+
export function createRecordHold(input: {
|
|
92
|
+
effects: readonly DataLifecycleRuntimeHoldEffect[]; expiresAt: string; principal: AuthorizationPrincipal;
|
|
93
|
+
purpose: DataLifecycleRuntimeHoldPurpose; recordId: string; reviewAt: string;
|
|
94
|
+
}, now = canonicalDataRightsNow()): DataLifecycleRuntimeHoldV1 {
|
|
95
|
+
requireDirectAdmin(input.principal);
|
|
96
|
+
interval(now, input.reviewAt, input.expiresAt);
|
|
97
|
+
return normalizeDataLifecycleRuntimeHold({ categoryId: 'product-record', effects: [...input.effects],
|
|
98
|
+
expiresAt: input.expiresAt, holdId: 'hold.' + randomUUID().replaceAll('-', ''), issuerCode: 'direct-admin',
|
|
99
|
+
purpose: input.purpose, reviewAt: input.reviewAt, scopeRef: productRecordReference(input.recordId),
|
|
100
|
+
startsAt: now, status: 'active' }, 0);
|
|
101
|
+
}
|
|
102
|
+
async function holdSet(recordId: string) {
|
|
103
|
+
const scopeRef = productRecordReference(recordId);
|
|
104
|
+
const row = await dataStore().get('application', 'data-lifecycle-hold-sets', scopeRef);
|
|
105
|
+
const value = row?.value as HoldSet | undefined;
|
|
106
|
+
if (row && (!value || value.scopeRef !== scopeRef || !Array.isArray(value.holds) || value.holds.length > MAXIMUM_RECORD_HOLDS))
|
|
107
|
+
throw new Error('Stored hold set is malformed or belongs to another record.');
|
|
108
|
+
const holds = (value?.holds ?? []).map((hold, index) => normalizeDataLifecycleRuntimeHold(hold, index));
|
|
109
|
+
if (new Set(holds.map(hold => hold.holdId)).size !== holds.length || holds.some(hold =>
|
|
110
|
+
hold.scopeRef !== scopeRef || hold.categoryId !== 'product-record' || hold.status !== 'active' ||
|
|
111
|
+
Date.parse(hold.expiresAt) - Date.parse(hold.startsAt) > MAXIMUM_HOLD_LIFETIME_MS))
|
|
112
|
+
throw new Error('Stored hold set contains substituted, duplicate or invalid holds.');
|
|
113
|
+
return { scopeRef, holds, version: row?.version ?? 0 };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Callers must include check in the effect transaction, including when no hold exists. */
|
|
117
|
+
export async function loadActiveRecordHolds(recordId: string, now: string, operation: 'deletion' | 'export') {
|
|
118
|
+
const retained = await holdSet(recordId);
|
|
119
|
+
const holds = [...${pascalName}DataLifecycleRuntimePolicy.declaredHolds, ...retained.holds];
|
|
120
|
+
const evaluation = evaluateDataLifecycleHolds({ categoryId: 'product-record', holds,
|
|
121
|
+
now: canonicalDataRightsNow(now), operation, scopeRef: retained.scopeRef });
|
|
122
|
+
const check: KeyValueChange = { action: 'check', collection: 'data-lifecycle-hold-sets',
|
|
123
|
+
id: retained.scopeRef, expectedVersion: retained.version };
|
|
124
|
+
return { holds, evaluation, check };
|
|
125
|
+
}
|
|
126
|
+
async function persist(input: HoldCommand, now: string, hold: DataLifecycleRuntimeHoldV1,
|
|
127
|
+
currentVersion: number, set: Awaited<ReturnType<typeof holdSet>>, purposeCode: string) {
|
|
128
|
+
const store = dataStore();
|
|
129
|
+
const record = await store.get('application', 'records', input.recordId);
|
|
130
|
+
if (!record) throw new Error('The held record was not found.');
|
|
131
|
+
readProductRecord(record.value, input.recordId);
|
|
132
|
+
const holds = set.holds.filter(item => item.holdId !== hold.holdId);
|
|
133
|
+
if (hold.status === 'active') holds.push(hold);
|
|
134
|
+
if (holds.length > MAXIMUM_RECORD_HOLDS) throw new Error('Record has 64 active holds; explicitly close due holds before issuing another.');
|
|
135
|
+
holds.sort((a, b) => a.holdId < b.holdId ? -1 : a.holdId > b.holdId ? 1 : 0);
|
|
136
|
+
await store.commit({ tenantId: 'application', changes: [
|
|
137
|
+
{ action: 'check', collection: 'records', id: input.recordId, expectedVersion: record.version },
|
|
138
|
+
{ action: 'put', collection: 'data-lifecycle-hold-sets', id: set.scopeRef,
|
|
139
|
+
expectedVersion: set.version, value: { scopeRef: set.scopeRef, holds } },
|
|
140
|
+
{ action: 'put', collection: 'data-lifecycle-holds', id: hold.holdId, expectedVersion: currentVersion, value: hold },
|
|
141
|
+
dataRightsAuditChange({ action: 'hold', correlationId: input.correlationId, now, outcome: 'succeeded',
|
|
142
|
+
principal: input.principal, purposeCode, recordId: input.recordId, summary: 'A bounded record hold transition was committed.' }),
|
|
143
|
+
] });
|
|
144
|
+
return hold;
|
|
145
|
+
}
|
|
146
|
+
export async function issueRecordHold(input: HoldCommand & {
|
|
147
|
+
effects: readonly DataLifecycleRuntimeHoldEffect[]; expiresAt: string; purpose: DataLifecycleRuntimeHoldPurpose; reviewAt: string;
|
|
148
|
+
}) {
|
|
149
|
+
const now = canonicalDataRightsNow(input.now);
|
|
150
|
+
const hold = createRecordHold(input, now);
|
|
151
|
+
return persist(input, now, hold, 0, await holdSet(input.recordId), 'hold-issue');
|
|
152
|
+
}
|
|
153
|
+
async function current(input: ExistingHoldCommand) {
|
|
154
|
+
requireDirectAdmin(input.principal);
|
|
155
|
+
const now = canonicalDataRightsNow(input.now);
|
|
156
|
+
const set = await holdSet(input.recordId);
|
|
157
|
+
const row = await dataStore().get('application', 'data-lifecycle-holds', input.holdId);
|
|
158
|
+
if (!row) throw new Error('The record hold was not found.');
|
|
159
|
+
const hold = normalizeDataLifecycleRuntimeHold(row.value as DataLifecycleRuntimeHoldV1, 0);
|
|
160
|
+
const indexed = set.holds.find(value => value.holdId === input.holdId);
|
|
161
|
+
if (hold.holdId !== input.holdId || hold.scopeRef !== set.scopeRef || hold.categoryId !== 'product-record' ||
|
|
162
|
+
hold.status !== 'active' || !indexed || JSON.stringify(indexed) !== JSON.stringify(hold))
|
|
163
|
+
throw new Error('The active record hold and its set do not agree.');
|
|
164
|
+
return { now, set, hold, version: row.version };
|
|
165
|
+
}
|
|
166
|
+
export async function reviewRecordHold(input: ExistingHoldCommand & { expiresAt: string; reviewAt: string }) {
|
|
167
|
+
const { now, set, hold, version } = await current(input);
|
|
168
|
+
if (Date.parse(now) >= Date.parse(hold.expiresAt)) throw new Error('Only an unexpired active hold can be reviewed.');
|
|
169
|
+
interval(hold.startsAt, input.reviewAt, input.expiresAt);
|
|
170
|
+
if (Date.parse(input.reviewAt) <= Date.parse(now)) throw new Error('Reviewed hold must set a future review time.');
|
|
171
|
+
const reviewed = normalizeDataLifecycleRuntimeHold({ ...hold, reviewAt: input.reviewAt, expiresAt: input.expiresAt }, 0);
|
|
172
|
+
return persist(input, now, reviewed, version, set, 'hold-review');
|
|
173
|
+
}
|
|
174
|
+
export async function releaseRecordHold(input: ExistingHoldCommand) {
|
|
175
|
+
const { now, set, hold, version } = await current(input);
|
|
176
|
+
if (Date.parse(now) >= Date.parse(hold.expiresAt)) throw new Error('Use explicit expiry for a due record hold.');
|
|
177
|
+
const released = normalizeDataLifecycleRuntimeHold({ ...hold, releasedAt: now, status: 'released' }, 0);
|
|
178
|
+
return persist(input, now, released, version, set, 'hold-release');
|
|
179
|
+
}
|
|
180
|
+
export async function expireRecordHold(input: ExistingHoldCommand) {
|
|
181
|
+
const { now, set, hold, version } = await current(input);
|
|
182
|
+
if (Date.parse(now) < Date.parse(hold.expiresAt)) throw new Error('Record hold is not due for expiry.');
|
|
183
|
+
const expired = normalizeDataLifecycleRuntimeHold({ ...hold, releasedAt: hold.expiresAt, status: 'released' }, 0);
|
|
184
|
+
return persist(input, now, expired, version, set, 'hold-expiry');
|
|
185
|
+
}
|
|
186
|
+
`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=built-in-plan-key-value-holds.js.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderKeyValueInfrastructureFiles = renderKeyValueInfrastructureFiles;
|
|
4
|
+
/** Slice/task-owned resources. No VPC, shared table, pre-created role, or SQL dependency. */
|
|
5
|
+
function renderKeyValueInfrastructureFiles(name, pascalName) {
|
|
6
|
+
return {
|
|
7
|
+
'infra/key-value.ts': `export function createKeyValueInfrastructure(input: {
|
|
8
|
+
eventBusArn: any;
|
|
9
|
+
eventBusName: any;
|
|
10
|
+
alertTopicArn: any;
|
|
11
|
+
outbox: { scheduleExpression: string; state: 'ENABLED' | 'DISABLED' };
|
|
12
|
+
managedLogGroup(logicalName: string, component: string, alertTopicArn: any): { logGroup: { name: any } };
|
|
13
|
+
lambdaLogging(logGroupName: any): { logging: any; transform: any };
|
|
14
|
+
}) {
|
|
15
|
+
const production = $app.stage === 'production';
|
|
16
|
+
const tags = { 'ebk:slice': '${name}', 'ebk:stage': $app.stage, 'ebk:persistence': 'key-value' };
|
|
17
|
+
const table = new aws.dynamodb.Table('${pascalName}KeyValue', {
|
|
18
|
+
name: '${name}-' + $app.stage + '-key-value',
|
|
19
|
+
billingMode: 'PAY_PER_REQUEST', hashKey: 'pk', rangeKey: 'sk',
|
|
20
|
+
attributes: [
|
|
21
|
+
{ name: 'pk', type: 'S' }, { name: 'sk', type: 'S' },
|
|
22
|
+
{ name: 'pendingPk', type: 'S' }, { name: 'pendingAt', type: 'N' },
|
|
23
|
+
],
|
|
24
|
+
globalSecondaryIndexes: [{ name: 'PendingEvents', hashKey: 'pendingPk', rangeKey: 'pendingAt', projectionType: 'ALL' }],
|
|
25
|
+
streamEnabled: true, streamViewType: 'NEW_AND_OLD_IMAGES',
|
|
26
|
+
ttl: { attributeName: 'expiresAt', enabled: true },
|
|
27
|
+
pointInTimeRecovery: { enabled: true, recoveryPeriodInDays: 35 },
|
|
28
|
+
serverSideEncryption: { enabled: true },
|
|
29
|
+
deletionProtectionEnabled: production,
|
|
30
|
+
tags,
|
|
31
|
+
}, { protect: production, retainOnDelete: production });
|
|
32
|
+
const environment = {
|
|
33
|
+
EBK_STAGE: $app.stage, EBK_KEY_VALUE_TABLE: table.name,
|
|
34
|
+
EVENT_BUS_NAME: input.eventBusName,
|
|
35
|
+
};
|
|
36
|
+
const indexArn = table.arn.apply((arn: string) => arn + '/index/PendingEvents');
|
|
37
|
+
const dataPermissions = [{
|
|
38
|
+
// DynamoDB transactions authorize their constituent item operations.
|
|
39
|
+
actions: ['dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:DeleteItem', 'dynamodb:ConditionCheckItem', 'dynamodb:Query'],
|
|
40
|
+
resources: [table.arn],
|
|
41
|
+
}];
|
|
42
|
+
const link = new sst.Linkable('${pascalName}KeyValueAccess', {
|
|
43
|
+
properties: { tableName: table.name },
|
|
44
|
+
include: dataPermissions.map((permission) => sst.aws.permission(permission)),
|
|
45
|
+
});
|
|
46
|
+
const streamPermissions = [{
|
|
47
|
+
actions: ['dynamodb:DescribeStream', 'dynamodb:GetRecords', 'dynamodb:GetShardIterator', 'dynamodb:ListStreams'],
|
|
48
|
+
resources: [table.streamArn],
|
|
49
|
+
}];
|
|
50
|
+
const deliveryPermissions = [
|
|
51
|
+
{ actions: ['dynamodb:GetItem', 'dynamodb:UpdateItem'], resources: [table.arn] },
|
|
52
|
+
{ actions: ['events:PutEvents'], resources: [input.eventBusArn] },
|
|
53
|
+
];
|
|
54
|
+
// SST creates these roles; the workspace's stage-boundary transform still applies.
|
|
55
|
+
const dispatcherLogs = input.managedLogGroup('${pascalName}KeyValueStreamDeliveryLogs', 'key-value-stream-delivery', input.alertTopicArn);
|
|
56
|
+
const dispatcher = new sst.aws.Function('${pascalName}KeyValueStreamDelivery', {
|
|
57
|
+
handler: 'async/key-value-delivery.stream', dev: false,
|
|
58
|
+
environment: { ...environment, EBK_KEY_VALUE_STREAM_ARN: table.streamArn },
|
|
59
|
+
permissions: [...deliveryPermissions, ...streamPermissions],
|
|
60
|
+
timeout: '5 minutes', ...input.lambdaLogging(dispatcherLogs.logGroup.name),
|
|
61
|
+
});
|
|
62
|
+
const mapping = new aws.lambda.EventSourceMapping('${pascalName}KeyValueStreamMapping', {
|
|
63
|
+
eventSourceArn: table.streamArn, functionName: dispatcher.arn,
|
|
64
|
+
enabled: input.outbox.state === 'ENABLED', startingPosition: 'TRIM_HORIZON',
|
|
65
|
+
batchSize: 100, maximumBatchingWindowInSeconds: 1,
|
|
66
|
+
functionResponseTypes: ['ReportBatchItemFailures'], bisectBatchOnFunctionError: true,
|
|
67
|
+
maximumRetryAttempts: 3, maximumRecordAgeInSeconds: 3600,
|
|
68
|
+
filterCriteria: { filters: [{ pattern: JSON.stringify({
|
|
69
|
+
eventName: ['INSERT'], dynamodb: { NewImage: { kind: { S: ['outbox'] }, state: { S: ['pending'] } } },
|
|
70
|
+
}) }] },
|
|
71
|
+
});
|
|
72
|
+
const reconcilerLogs = input.managedLogGroup('${pascalName}KeyValueReconciliationLogs', 'key-value-reconciliation', input.alertTopicArn);
|
|
73
|
+
const reconciler = new sst.aws.Function('${pascalName}KeyValueReconciliation', {
|
|
74
|
+
handler: 'async/key-value-delivery.reconcile', dev: false, environment,
|
|
75
|
+
permissions: [...deliveryPermissions,
|
|
76
|
+
{ actions: ['dynamodb:PutItem', 'dynamodb:DeleteItem'], resources: [table.arn] },
|
|
77
|
+
// Published intents leave the index; bounded deletion completion scans
|
|
78
|
+
// its own table collection using an independent persisted cursor.
|
|
79
|
+
{ actions: ['dynamodb:Query'], resources: [table.arn, indexArn] },
|
|
80
|
+
],
|
|
81
|
+
// Per-intent leases and versioned checkpoints, not account concurrency
|
|
82
|
+
// reservations, coordinate overlapping reconciliation invocations.
|
|
83
|
+
timeout: '15 minutes',
|
|
84
|
+
...input.lambdaLogging(reconcilerLogs.logGroup.name),
|
|
85
|
+
});
|
|
86
|
+
const rule = new aws.cloudwatch.EventRule('${pascalName}KeyValueReconciliationSchedule', {
|
|
87
|
+
...input.outbox, description: 'Bounded recovery of durable event intents, independent of stream retention.', tags,
|
|
88
|
+
});
|
|
89
|
+
const permission = new aws.lambda.Permission('${pascalName}KeyValueReconciliationPermission', {
|
|
90
|
+
action: 'lambda:InvokeFunction', function: reconciler.arn,
|
|
91
|
+
principal: 'events.amazonaws.com', sourceArn: rule.arn,
|
|
92
|
+
});
|
|
93
|
+
const target = new aws.cloudwatch.EventTarget('${pascalName}KeyValueReconciliationTarget', {
|
|
94
|
+
arn: reconciler.arn, rule: rule.name,
|
|
95
|
+
retryPolicy: { maximumEventAgeInSeconds: 3600, maximumRetryAttempts: 2 },
|
|
96
|
+
}, { dependsOn: [permission] });
|
|
97
|
+
return { table, link, environment, dataPermissions, dispatcher, mapping, reconciler, rule, target };
|
|
98
|
+
}
|
|
99
|
+
`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=built-in-plan-key-value-infrastructure.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Protected test effects use native collections, never the application's records. */
|
|
2
|
+
export declare function renderKeyValuePerformanceFiles(name: string): Readonly<Record<string, string>>;
|
|
3
|
+
export declare function renderKeyValueOutboxTests(): string;
|
|
4
|
+
/** The common protected HTTP shell owns HMAC, release, target and body limits. */
|
|
5
|
+
export declare function renderKeyValuePerformanceEndpointFunctions(): string;
|