@empire-builder-kit/nx 1.0.0-rc.38 → 1.0.0-rc.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +18 -0
  2. package/executors.json +5 -0
  3. package/generators.json +10 -0
  4. package/package.json +20 -3
  5. package/src/aws-authority/index.d.ts +1 -0
  6. package/src/aws-authority/index.js +1 -0
  7. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  8. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  9. package/src/aws-authority/stage-authority.d.ts +11 -3
  10. package/src/aws-authority/stage-authority.js +615 -29
  11. package/src/blueprints/external-sandbox.js +21 -9
  12. package/src/blueprints/manifest.d.ts +1 -1
  13. package/src/blueprints/resolver.js +28 -15
  14. package/src/cli/bootstrap.d.ts +1 -1
  15. package/src/cli/deploy-runtime.d.ts +6 -0
  16. package/src/cli/deploy-runtime.js +58 -0
  17. package/src/cli/dev-command.d.ts +16 -4
  18. package/src/cli/dev-command.js +63 -0
  19. package/src/cli/main.d.ts +7 -1
  20. package/src/cli/main.js +128 -20
  21. package/src/cli/output.d.ts +1 -1
  22. package/src/developer-agent/context.js +41 -9
  23. package/src/developer-agent/generator-planning.js +16 -2
  24. package/src/developer-agent/git-inspection.d.ts +6 -2
  25. package/src/developer-agent/git-inspection.js +78 -6
  26. package/src/developer-agent/model.d.ts +4 -2
  27. package/src/developer-agent/operation-registry.d.ts +5 -0
  28. package/src/developer-agent/operation-registry.js +179 -23
  29. package/src/developer-agent/preview-changes.d.ts +2 -0
  30. package/src/developer-agent/preview-changes.js +14 -2
  31. package/src/developer-agent/preview-source.js +3 -0
  32. package/src/developer-agent/validation.js +20 -8
  33. package/src/developer-agent/workspace-inspection.js +37 -3
  34. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  35. package/src/executors/deployment-plan/deployment-plan.js +51 -4
  36. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  37. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  38. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  39. package/src/executors/dev-task-cleanup/schema.json +9 -0
  40. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  41. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  42. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  43. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  44. package/src/executors/fleet/fleet.js +1 -1
  45. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
  46. package/src/executors/local-deploy/local-deploy.d.ts +8 -1
  47. package/src/executors/local-deploy/local-deploy.js +97 -24
  48. package/src/executors/local-deploy/schema.json +8 -0
  49. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
  50. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
  51. package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
  52. package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
  53. package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
  54. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
  55. package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
  56. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  57. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  58. package/src/foundation/capability-plan.d.ts +43 -0
  59. package/src/foundation/capability-plan.js +168 -0
  60. package/src/foundation/discovery.d.ts +14 -11
  61. package/src/foundation/discovery.js +32 -6
  62. package/src/foundation/index.d.ts +1 -0
  63. package/src/foundation/index.js +1 -0
  64. package/src/foundation/local-database-contract.d.ts +20 -0
  65. package/src/foundation/local-database-contract.js +262 -13
  66. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  67. package/src/foundation/local-private-smoke-access.js +197 -0
  68. package/src/foundation/preflight.js +37 -18
  69. package/src/foundation/private-smoke-access.js +10 -2
  70. package/src/foundation/private-smoke-admission.d.ts +3 -1
  71. package/src/foundation/private-smoke-admission.js +29 -8
  72. package/src/foundation/private-smoke-control-plane.js +17 -6
  73. package/src/foundation/provision-database-bindings.d.ts +5 -0
  74. package/src/foundation/provision-database-bindings.js +41 -8
  75. package/src/foundation/provision-logical-database.js +13 -8
  76. package/src/foundation/requirements.d.ts +3 -3
  77. package/src/foundation/requirements.js +24 -12
  78. package/src/foundation/router-waf.d.ts +1 -0
  79. package/src/foundation/router-waf.js +14 -1
  80. package/src/generators/blueprint/blueprint.d.ts +5 -0
  81. package/src/generators/blueprint/blueprint.js +102 -0
  82. package/src/generators/blueprint/files.d.ts +6 -0
  83. package/src/generators/blueprint/files.js +217 -0
  84. package/src/generators/blueprint/schema.d.ts +4 -0
  85. package/src/generators/blueprint/schema.json +18 -0
  86. package/src/generators/formatting.js +24 -1
  87. package/src/generators/logging-registry.d.ts +2 -0
  88. package/src/generators/logging-registry.js +22 -0
  89. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  90. package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
  91. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  92. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  93. package/src/generators/preset/workspace-files-developer-agent.js +40 -13
  94. package/src/generators/preset/workspace-files-performance-load.js +8 -0
  95. package/src/generators/preset/workspace-files-stage-authority.js +40 -1
  96. package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
  97. package/src/generators/preset/workspace-files-thin-docs.js +64 -18
  98. package/src/generators/preset/workspace-files.d.ts +4 -0
  99. package/src/generators/preset/workspace-files.js +159 -91
  100. package/src/generators/repository-policy/repository-policy.js +37 -0
  101. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  102. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  103. package/src/generators/slice/built-in-plan-api-files.js +47 -389
  104. package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
  105. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  106. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
  107. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  108. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  109. package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
  110. package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
  111. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  112. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  113. package/src/generators/slice/built-in-plan-data-files.js +61 -1164
  114. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  115. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
  116. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
  117. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
  118. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  119. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
  120. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  121. package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
  122. package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
  123. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  124. package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
  125. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  126. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  127. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  128. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  129. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  130. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  131. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  132. package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
  133. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  134. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  135. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  136. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  137. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  138. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  139. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  140. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  141. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  142. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  143. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  144. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  145. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  146. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  147. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  148. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  149. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  150. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  151. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  152. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  153. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  154. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  155. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  156. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  157. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  158. package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
  159. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
  160. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
  161. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  162. package/src/generators/slice/built-in-plan-operations-files.js +89 -50
  163. package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
  164. package/src/generators/slice/built-in-plan-project-files.js +116 -67
  165. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  166. package/src/generators/slice/built-in-plan-release-files.js +64 -15
  167. package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
  168. package/src/generators/slice/built-in-plan-shared.d.ts +3 -1
  169. package/src/generators/slice/built-in-plan-shared.js +40 -18
  170. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  171. package/src/generators/slice/built-in-plan-sql-events.js +257 -0
  172. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  173. package/src/generators/slice/built-in-plan-testing-files.js +184 -132
  174. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  175. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  176. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
  177. package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
  178. package/src/generators/slice/built-in-plan-verification-files.js +70 -0
  179. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  180. package/src/generators/slice/built-in-plan-web-files.js +191 -14
  181. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  182. package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
  183. package/src/generators/slice/built-in-plan.d.ts +9 -1
  184. package/src/generators/slice/built-in-plan.js +49 -21
  185. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  186. package/src/generators/slice/data-policy-review-seed.js +22 -0
  187. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  188. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  189. package/src/generators/slice/local-source-identity.d.ts +2 -0
  190. package/src/generators/slice/local-source-identity.js +31 -0
  191. package/src/generators/slice/persistence-contract.d.ts +14 -0
  192. package/src/generators/slice/persistence-contract.js +32 -0
  193. package/src/generators/slice/slice.js +29 -24
  194. package/src/generators/sql/schema.d.ts +7 -0
  195. package/src/generators/sql/schema.json +38 -0
  196. package/src/generators/sql/sql.d.ts +6 -0
  197. package/src/generators/sql/sql.js +53 -0
  198. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  199. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  200. package/src/generators/upgrade/upgrade.d.ts +2 -0
  201. package/src/generators/upgrade/upgrade.js +136 -9
  202. package/src/generators/workload/workload.js +51 -2
  203. package/src/local-dev/browser-verification.d.ts +37 -0
  204. package/src/local-dev/browser-verification.js +281 -0
  205. package/src/local-dev/contracts.d.ts +10 -1
  206. package/src/local-dev/contracts.js +114 -13
  207. package/src/local-dev/dev-command-core.js +24 -5
  208. package/src/local-dev/docker-credential-health.d.ts +14 -0
  209. package/src/local-dev/docker-credential-health.js +94 -0
  210. package/src/local-dev/environment-inspector.d.ts +7 -0
  211. package/src/local-dev/environment-inspector.js +42 -15
  212. package/src/local-dev/environment-state.js +2 -2
  213. package/src/local-dev/errors.d.ts +1 -1
  214. package/src/local-dev/errors.js +2 -0
  215. package/src/local-dev/fleet-client.js +2 -2
  216. package/src/local-dev/fleet-configuration.js +57 -25
  217. package/src/local-dev/fleet-inventory.js +46 -18
  218. package/src/local-dev/fleet-ipc.d.ts +7 -0
  219. package/src/local-dev/fleet-ipc.js +14 -2
  220. package/src/local-dev/fleet-launcher.d.ts +6 -0
  221. package/src/local-dev/fleet-launcher.js +14 -2
  222. package/src/local-dev/fleet-logs.js +50 -22
  223. package/src/local-dev/fleet-process.d.ts +20 -1
  224. package/src/local-dev/fleet-process.js +197 -41
  225. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  226. package/src/local-dev/fleet-runner-evidence.js +56 -0
  227. package/src/local-dev/fleet-runtime.js +268 -229
  228. package/src/local-dev/fleet-session.d.ts +2 -0
  229. package/src/local-dev/fleet-session.js +28 -11
  230. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  231. package/src/local-dev/fleet-state.d.ts +5 -2
  232. package/src/local-dev/fleet-state.js +25 -4
  233. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  234. package/src/local-dev/fleet-supervisor.js +66 -11
  235. package/src/local-dev/fleet-web-start.d.ts +12 -0
  236. package/src/local-dev/fleet-web-start.js +48 -0
  237. package/src/local-dev/identity.js +3 -14
  238. package/src/local-dev/index.d.ts +1 -0
  239. package/src/local-dev/index.js +1 -0
  240. package/src/local-dev/native-completion.d.ts +9 -0
  241. package/src/local-dev/native-completion.js +130 -0
  242. package/src/local-dev/nx-workspace.d.ts +4 -2
  243. package/src/local-dev/nx-workspace.js +11 -6
  244. package/src/local-dev/personal-stage.d.ts +4 -5
  245. package/src/local-dev/personal-stage.js +6 -54
  246. package/src/local-dev/port-claims.d.ts +13 -0
  247. package/src/local-dev/port-claims.js +46 -0
  248. package/src/local-dev/ports.d.ts +14 -2
  249. package/src/local-dev/ports.js +78 -3
  250. package/src/local-dev/private-state.d.ts +6 -0
  251. package/src/local-dev/private-state.js +126 -34
  252. package/src/local-dev/process-group.d.ts +4 -0
  253. package/src/local-dev/process-group.js +29 -0
  254. package/src/local-dev/process-identity.d.ts +8 -0
  255. package/src/local-dev/process-identity.js +31 -1
  256. package/src/local-dev/proxy.js +11 -12
  257. package/src/local-dev/runtime-paths.js +1 -1
  258. package/src/local-dev/slice-claim.js +1 -1
  259. package/src/local-dev/slice-runner.d.ts +15 -6
  260. package/src/local-dev/slice-runner.js +189 -54
  261. package/src/local-dev/task-attachment.d.ts +17 -0
  262. package/src/local-dev/task-attachment.js +73 -0
  263. package/src/local-dev/task-authority.d.ts +10 -0
  264. package/src/local-dev/task-authority.js +27 -0
  265. package/src/local-dev/task-identity.d.ts +33 -0
  266. package/src/local-dev/task-identity.js +418 -0
  267. package/src/local-dev/task-native-writer.d.ts +18 -0
  268. package/src/local-dev/task-native-writer.js +329 -0
  269. package/src/local-dev/tls.js +3 -1
  270. package/src/local-dev/web-launch.d.ts +9 -0
  271. package/src/local-dev/web-launch.js +130 -0
  272. package/src/ownership/composition.d.ts +2 -1
  273. package/src/ownership/composition.js +1 -0
  274. package/src/performance/scenario.d.ts +22 -0
  275. package/src/performance/scenario.js +100 -92
  276. package/src/repository-policy/deployment-plan.d.ts +2 -2
  277. package/src/repository-policy/deployment-plan.js +2 -1
  278. package/src/repository-policy/policy.js +38 -3
  279. package/src/schemas/blueprint-v1.json +5 -4
  280. package/src/schemas/foundation-requirement-v1.json +5 -4
  281. package/src/schemas/testing-evidence-result-v1.json +1 -1
  282. package/src/secrets/operator.d.ts +3 -1
  283. package/src/secrets/operator.js +22 -3
  284. package/src/sst-environment-source-format.d.ts +3 -0
  285. package/src/sst-environment-source-format.js +20 -0
  286. package/src/supply-chain/blueprint-trust-git.js +13 -3
  287. package/src/supply-chain/build-output.js +15 -0
  288. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  289. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  290. package/src/testing-evidence/fixture-scope.js +4 -2
  291. package/src/testing-evidence/result.d.ts +2 -1
  292. package/src/testing-evidence/result.js +18 -4
  293. package/src/workload-roles/standard-slice.js +2 -3
  294. package/src/api-contract/baseline-update.js.map +0 -1
  295. package/src/api-contract/compatibility.js.map +0 -1
  296. package/src/api-contract/contract-graph.js.map +0 -1
  297. package/src/api-contract/evidence.js.map +0 -1
  298. package/src/api-contract/index.js.map +0 -1
  299. package/src/api-contract/model.fixtures.d.ts +0 -2
  300. package/src/api-contract/model.fixtures.js +0 -81
  301. package/src/api-contract/model.fixtures.js.map +0 -1
  302. package/src/api-contract/model.js.map +0 -1
  303. package/src/api-contract/rollout.js.map +0 -1
  304. package/src/authorization/compatibility.js.map +0 -1
  305. package/src/authorization/index.js.map +0 -1
  306. package/src/aws/child-environment.js.map +0 -1
  307. package/src/aws/identity.js.map +0 -1
  308. package/src/aws-authority/index.js.map +0 -1
  309. package/src/aws-authority/stage-authority.js.map +0 -1
  310. package/src/blueprints/execution.js.map +0 -1
  311. package/src/blueprints/external-sandbox.js.map +0 -1
  312. package/src/blueprints/index.js.map +0 -1
  313. package/src/blueprints/inputs.js.map +0 -1
  314. package/src/blueprints/manifest.js.map +0 -1
  315. package/src/blueprints/resolver.js.map +0 -1
  316. package/src/blueprints/transitions.js.map +0 -1
  317. package/src/cli/agent-command.js.map +0 -1
  318. package/src/cli/agent-runtime.js.map +0 -1
  319. package/src/cli/blueprint-authority.js.map +0 -1
  320. package/src/cli/blueprint-command.js.map +0 -1
  321. package/src/cli/bootstrap.js.map +0 -1
  322. package/src/cli/dev-command.js.map +0 -1
  323. package/src/cli/main.js.map +0 -1
  324. package/src/cli/output.js.map +0 -1
  325. package/src/cli/personal-secret-runtime.js.map +0 -1
  326. package/src/cli/secret-terminal.js.map +0 -1
  327. package/src/container-images.js.map +0 -1
  328. package/src/data-lifecycle/index.js.map +0 -1
  329. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  330. package/src/data-lifecycle/model.fixtures.js +0 -244
  331. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  332. package/src/data-lifecycle/model.js.map +0 -1
  333. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  334. package/src/data-lifecycle/validation.js.map +0 -1
  335. package/src/database-retirement/contract.js.map +0 -1
  336. package/src/database-retirement/index.js.map +0 -1
  337. package/src/deterministic-order.js.map +0 -1
  338. package/src/developer-agent/context.js.map +0 -1
  339. package/src/developer-agent/generator-planning.js.map +0 -1
  340. package/src/developer-agent/generator-preview.js.map +0 -1
  341. package/src/developer-agent/git-inspection.js.map +0 -1
  342. package/src/developer-agent/handoff.js.map +0 -1
  343. package/src/developer-agent/index.js.map +0 -1
  344. package/src/developer-agent/model.js.map +0 -1
  345. package/src/developer-agent/operation-registry.js.map +0 -1
  346. package/src/developer-agent/ordering.js.map +0 -1
  347. package/src/developer-agent/planning.js.map +0 -1
  348. package/src/developer-agent/preview-changes.js.map +0 -1
  349. package/src/developer-agent/preview-source.js.map +0 -1
  350. package/src/developer-agent/validation.js.map +0 -1
  351. package/src/developer-agent/workspace-inspection.js.map +0 -1
  352. package/src/developer-agent/workspace-path.js.map +0 -1
  353. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  354. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  355. package/src/executors/deploy/deploy.js.map +0 -1
  356. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  357. package/src/executors/dev/dev.js.map +0 -1
  358. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  359. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  360. package/src/executors/developer-context/developer-context.js.map +0 -1
  361. package/src/executors/fleet/fleet.js.map +0 -1
  362. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  363. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  364. package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
  365. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  366. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  367. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  368. package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
  369. package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
  370. package/src/executors/local-deploy/local-approval.js.map +0 -1
  371. package/src/executors/local-deploy/local-deploy.js.map +0 -1
  372. package/src/executors/refresh/refresh.js.map +0 -1
  373. package/src/executors/remove/remove.js.map +0 -1
  374. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
  375. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  376. package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
  377. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  378. package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
  379. package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
  380. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  381. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  382. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  383. package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
  384. package/src/executors/unlock/unlock.js.map +0 -1
  385. package/src/executors/work-markers/work-markers.js.map +0 -1
  386. package/src/foundation/discovery.js.map +0 -1
  387. package/src/foundation/index.js.map +0 -1
  388. package/src/foundation/local-database-contract.js.map +0 -1
  389. package/src/foundation/logging-preflight.js.map +0 -1
  390. package/src/foundation/logging.js.map +0 -1
  391. package/src/foundation/partial-state.js.map +0 -1
  392. package/src/foundation/preflight.js.map +0 -1
  393. package/src/foundation/private-smoke-access.js.map +0 -1
  394. package/src/foundation/private-smoke-admission.js.map +0 -1
  395. package/src/foundation/private-smoke-control-plane.js.map +0 -1
  396. package/src/foundation/provision-database-bindings.js.map +0 -1
  397. package/src/foundation/provision-logical-database.js.map +0 -1
  398. package/src/foundation/requirements.js.map +0 -1
  399. package/src/foundation/router-origin-proof.js.map +0 -1
  400. package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
  401. package/src/foundation/router-waf.js.map +0 -1
  402. package/src/foundation/stages.js.map +0 -1
  403. package/src/frontend-security/index.js.map +0 -1
  404. package/src/frontend-security/security-headers.js.map +0 -1
  405. package/src/generators/feature-registry.js.map +0 -1
  406. package/src/generators/formatting.js.map +0 -1
  407. package/src/generators/function/function.js.map +0 -1
  408. package/src/generators/job/job.js.map +0 -1
  409. package/src/generators/logging-registry.js.map +0 -1
  410. package/src/generators/post-generation-install.js.map +0 -1
  411. package/src/generators/preset/dependency-overrides.js.map +0 -1
  412. package/src/generators/preset/generator.js.map +0 -1
  413. package/src/generators/preset/tool-versions.js.map +0 -1
  414. package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
  415. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  416. package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
  417. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  418. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  419. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  420. package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
  421. package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
  422. package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
  423. package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
  424. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  425. package/src/generators/preset/workspace-files.js.map +0 -1
  426. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  427. package/src/generators/repository-policy/tree-policy.js.map +0 -1
  428. package/src/generators/service/service.js.map +0 -1
  429. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  430. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  431. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  432. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  433. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  434. package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
  435. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  436. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  437. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  438. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  439. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  440. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  441. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  442. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  443. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  444. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  445. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  446. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  447. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  448. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  449. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  450. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
  451. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  452. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  453. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  454. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  455. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  456. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  457. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  458. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  459. package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
  460. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  461. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  462. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  463. package/src/generators/slice/built-in-plan.js.map +0 -1
  464. package/src/generators/slice/slice.js.map +0 -1
  465. package/src/generators/upgrade/upgrade.js.map +0 -1
  466. package/src/generators/workload/frozen-container.js.map +0 -1
  467. package/src/generators/workload/performance-registration.js.map +0 -1
  468. package/src/generators/workload/reliability-registration.js.map +0 -1
  469. package/src/generators/workload/service-performance-files.js.map +0 -1
  470. package/src/generators/workload/workload.js.map +0 -1
  471. package/src/git-policy/action-pins.js.map +0 -1
  472. package/src/git-policy/github-bootstrap.js.map +0 -1
  473. package/src/git-policy/index.js.map +0 -1
  474. package/src/git-policy/routing.js.map +0 -1
  475. package/src/index.js.map +0 -1
  476. package/src/infrastructure-change/convergence.js.map +0 -1
  477. package/src/infrastructure-change/drift.js.map +0 -1
  478. package/src/infrastructure-change/index.js.map +0 -1
  479. package/src/infrastructure-change/local-capability.js.map +0 -1
  480. package/src/infrastructure-change/model.js.map +0 -1
  481. package/src/infrastructure-change/normalize.js.map +0 -1
  482. package/src/infrastructure-change/plan.js.map +0 -1
  483. package/src/infrastructure-change/risk.js.map +0 -1
  484. package/src/infrastructure-change/summary.js.map +0 -1
  485. package/src/local-dev/context-discovery.js.map +0 -1
  486. package/src/local-dev/contract-validation.js.map +0 -1
  487. package/src/local-dev/contracts.js.map +0 -1
  488. package/src/local-dev/control-contract.js.map +0 -1
  489. package/src/local-dev/dev-command-core.js.map +0 -1
  490. package/src/local-dev/effects.js.map +0 -1
  491. package/src/local-dev/environment-inspector.js.map +0 -1
  492. package/src/local-dev/environment-state.js.map +0 -1
  493. package/src/local-dev/errors.js.map +0 -1
  494. package/src/local-dev/fleet-client.js.map +0 -1
  495. package/src/local-dev/fleet-configuration.js.map +0 -1
  496. package/src/local-dev/fleet-inventory.js.map +0 -1
  497. package/src/local-dev/fleet-ipc.js.map +0 -1
  498. package/src/local-dev/fleet-launcher.js.map +0 -1
  499. package/src/local-dev/fleet-lock.js.map +0 -1
  500. package/src/local-dev/fleet-logs.js.map +0 -1
  501. package/src/local-dev/fleet-process.js.map +0 -1
  502. package/src/local-dev/fleet-runtime.js.map +0 -1
  503. package/src/local-dev/fleet-session.js.map +0 -1
  504. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  505. package/src/local-dev/fleet-startup.js.map +0 -1
  506. package/src/local-dev/fleet-state.js.map +0 -1
  507. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  508. package/src/local-dev/fleet-supervisor.js.map +0 -1
  509. package/src/local-dev/gateway-daemon.js.map +0 -1
  510. package/src/local-dev/gateway.js.map +0 -1
  511. package/src/local-dev/identity.js.map +0 -1
  512. package/src/local-dev/index.js.map +0 -1
  513. package/src/local-dev/local-context.js.map +0 -1
  514. package/src/local-dev/nx-workspace.js.map +0 -1
  515. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  516. package/src/local-dev/personal-stage.js.map +0 -1
  517. package/src/local-dev/portless.js.map +0 -1
  518. package/src/local-dev/ports.js.map +0 -1
  519. package/src/local-dev/private-state.js.map +0 -1
  520. package/src/local-dev/process-identity.js.map +0 -1
  521. package/src/local-dev/proxy.js.map +0 -1
  522. package/src/local-dev/runtime-paths.js.map +0 -1
  523. package/src/local-dev/secret-slice-claim.js.map +0 -1
  524. package/src/local-dev/slice-claim.js.map +0 -1
  525. package/src/local-dev/slice-runner.js.map +0 -1
  526. package/src/local-dev/tls.js.map +0 -1
  527. package/src/ownership/composition.js.map +0 -1
  528. package/src/ownership/foundation-record.js.map +0 -1
  529. package/src/ownership/hash.js.map +0 -1
  530. package/src/ownership/index.js.map +0 -1
  531. package/src/ownership/json-ownership.js.map +0 -1
  532. package/src/ownership/record.js.map +0 -1
  533. package/src/ownership/workspace-record.js.map +0 -1
  534. package/src/performance/cost-collection.js.map +0 -1
  535. package/src/performance/cost-controls.js.map +0 -1
  536. package/src/performance/evidence.js.map +0 -1
  537. package/src/performance/index.js.map +0 -1
  538. package/src/performance/load-safety.js.map +0 -1
  539. package/src/performance/model.js.map +0 -1
  540. package/src/performance/pr-artifact-budget.js.map +0 -1
  541. package/src/performance/runner.js.map +0 -1
  542. package/src/performance/scenario-endpoint.js.map +0 -1
  543. package/src/performance/scenario.js.map +0 -1
  544. package/src/performance/test-fixtures.d.ts +0 -7
  545. package/src/performance/test-fixtures.js +0 -167
  546. package/src/performance/test-fixtures.js.map +0 -1
  547. package/src/performance/unit-cost.js.map +0 -1
  548. package/src/release/index.js.map +0 -1
  549. package/src/release/lifecycle.js.map +0 -1
  550. package/src/release/manifest.js.map +0 -1
  551. package/src/release/rollout.js.map +0 -1
  552. package/src/release/source-authority.js.map +0 -1
  553. package/src/repository-policy/aurora-preflight.js.map +0 -1
  554. package/src/repository-policy/capacity-migration.js.map +0 -1
  555. package/src/repository-policy/deployment-plan.js.map +0 -1
  556. package/src/repository-policy/foundation-profile.js.map +0 -1
  557. package/src/repository-policy/index.js.map +0 -1
  558. package/src/repository-policy/policy.js.map +0 -1
  559. package/src/secrets/adapters.js.map +0 -1
  560. package/src/secrets/aws-control-plane.js.map +0 -1
  561. package/src/secrets/declaration-verification.js.map +0 -1
  562. package/src/secrets/generated-aws-control-plane.js.map +0 -1
  563. package/src/secrets/guardrails.js.map +0 -1
  564. package/src/secrets/index.js.map +0 -1
  565. package/src/secrets/metadata.js.map +0 -1
  566. package/src/secrets/model.js.map +0 -1
  567. package/src/secrets/operator.js.map +0 -1
  568. package/src/secrets/permissions.js.map +0 -1
  569. package/src/secrets/personal-command.js.map +0 -1
  570. package/src/secrets/personal-ledger.js.map +0 -1
  571. package/src/secrets/registry.js.map +0 -1
  572. package/src/secrets/verification.js.map +0 -1
  573. package/src/secrets/workload-access.js.map +0 -1
  574. package/src/sst-environment-source-format.js.map +0 -1
  575. package/src/supply-chain/action-pins.js.map +0 -1
  576. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  577. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  578. package/src/supply-chain/blueprint-trust.js.map +0 -1
  579. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  580. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  581. package/src/supply-chain/build-output-bounds.js.map +0 -1
  582. package/src/supply-chain/build-output.js.map +0 -1
  583. package/src/supply-chain/common.js.map +0 -1
  584. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  585. package/src/supply-chain/container-release.js.map +0 -1
  586. package/src/supply-chain/ecr-applicability.js.map +0 -1
  587. package/src/supply-chain/ecr-scanning.js.map +0 -1
  588. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  589. package/src/supply-chain/errors.js.map +0 -1
  590. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  591. package/src/supply-chain/generated-command.js.map +0 -1
  592. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  593. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  594. package/src/supply-chain/generated-files.js.map +0 -1
  595. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  596. package/src/supply-chain/index.js.map +0 -1
  597. package/src/supply-chain/inventory.js.map +0 -1
  598. package/src/supply-chain/license-expression.js.map +0 -1
  599. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  600. package/src/supply-chain/policy.js.map +0 -1
  601. package/src/supply-chain/publication.js.map +0 -1
  602. package/src/supply-chain/sbom.js.map +0 -1
  603. package/src/supply-chain/scanner.js.map +0 -1
  604. package/src/supply-chain/vendored-source.js.map +0 -1
  605. package/src/testing-evidence/fixture-scope.js.map +0 -1
  606. package/src/testing-evidence/index.js.map +0 -1
  607. package/src/testing-evidence/quarantine.js.map +0 -1
  608. package/src/testing-evidence/result.js.map +0 -1
  609. package/src/testing-evidence/runner-adapter.js.map +0 -1
  610. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  611. package/src/validation.js.map +0 -1
  612. package/src/work-markers/index.js.map +0 -1
  613. package/src/work-markers/work-markers.js.map +0 -1
  614. package/src/workload-roles/account-baseline.js.map +0 -1
  615. package/src/workload-roles/authority.js.map +0 -1
  616. package/src/workload-roles/aws-adapter.js.map +0 -1
  617. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  618. package/src/workload-roles/aws-s3-state.js.map +0 -1
  619. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  620. package/src/workload-roles/boundary.js.map +0 -1
  621. package/src/workload-roles/convergence.js.map +0 -1
  622. package/src/workload-roles/effective-policy.js.map +0 -1
  623. package/src/workload-roles/handler.js.map +0 -1
  624. package/src/workload-roles/history.js.map +0 -1
  625. package/src/workload-roles/index.js.map +0 -1
  626. package/src/workload-roles/injection.js.map +0 -1
  627. package/src/workload-roles/manifest.js.map +0 -1
  628. package/src/workload-roles/provisioner.js.map +0 -1
  629. package/src/workload-roles/registration.js.map +0 -1
  630. package/src/workload-roles/stage-boundary.js.map +0 -1
  631. package/src/workload-roles/standard-slice.js.map +0 -1
  632. package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
  633. package/src/workspace-deployment/identity.js.map +0 -1
  634. package/src/workspace-deployment/index.js.map +0 -1
  635. package/src/workspace-deployment/migration-evidence.js.map +0 -1
  636. package/src/workspace-deployment/migration.js.map +0 -1
  637. package/src/workspace-deployment/ownership.js.map +0 -1
@@ -2,163 +2,49 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderProductInfrastructureFiles = renderProductInfrastructureFiles;
4
4
  const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
5
+ const built_in_plan_key_value_retention_infrastructure_js_1 = require("./built-in-plan-key-value-retention-infrastructure.js");
5
6
  /** @internal */
6
- function renderProductInfrastructureFiles(name, pascalName, workspace, protectedRuntimeStages = ['staging', 'production']) {
7
+ function renderProductInfrastructureFiles(name, pascalName, workspace, protectedRuntimeStages = ['staging', 'production'], sql = false, network = sql) {
7
8
  const identifierPrefix = (0, built_in_plan_shared_js_1.lowerCamelIdentifier)(pascalName);
8
9
  const recordExportWorkflowName = (0, built_in_plan_shared_js_1.stableGeneratedName)(40, name);
9
- return {
10
- 'jobs/data-retention-maintenance-launcher.ts': `import {
11
- ECSClient,
12
- RunTaskCommand,
13
- } from '@aws-sdk/client-ecs';
14
- import { createLogger } from '@empire-builder-kit/runtime/logging';
15
-
16
- const UUID =
17
- /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
18
- const ECS_CLUSTER_ARN =
19
- new RegExp(
20
- '^arn:(?:aws|aws-cn|aws-us-gov):ecs:[a-z0-9-]+:' +
21
- '[0-9]{12}:cluster/[A-Za-z0-9_./-]{1,255}$',
22
- );
23
- const ECS_TASK_DEFINITION_ARN =
24
- /^arn:(?:aws|aws-cn|aws-us-gov):ecs:[a-z0-9-]+:[0-9]{12}:task-definition\\/[A-Za-z0-9_-]{1,255}:[1-9][0-9]*$/;
25
- const NETWORK_ID = /^(?:sg|subnet)-[0-9a-f]{8,32}$/;
26
- const CONTAINER_NAME = /^[A-Za-z0-9_-]{1,255}$/;
27
-
28
- function required(name: string): string {
29
- const value = process.env[name]?.trim();
30
- if (!value) throw new Error(name + ' is required.');
31
- return value;
32
- }
33
-
34
- function requiredArn(name: string, pattern: RegExp): string {
35
- const value = required(name);
36
- if (!pattern.test(value)) {
37
- throw new Error(name + ' is not the exact expected ECS ARN.');
38
- }
39
- return value;
40
- }
41
-
42
- function requiredBoolean(name: string): boolean {
43
- const value = required(name);
44
- if (value !== 'true' && value !== 'false') {
45
- throw new Error(name + ' must be exactly true or false.');
46
- }
47
- return value === 'true';
48
- }
49
-
50
- function requiredNetworkIds(name: string): string[] {
51
- let value: unknown;
52
- try {
53
- value = JSON.parse(required(name));
54
- } catch {
55
- throw new Error(name + ' must be one bounded JSON array.');
56
- }
10
+ const files = {
11
+ 'infra/event-subscriptions.ts': `/** Read the existing seeded event contract; never broaden source or stage routing. */
12
+ export function sameSliceEventDetailTypes(value: unknown): string[] {
13
+ const contract = value as {
14
+ kind?: unknown;
15
+ schemaVersion?: unknown;
16
+ slice?: unknown;
17
+ events?: unknown;
18
+ } | null;
57
19
  if (
58
- !Array.isArray(value) ||
59
- value.length < 1 ||
60
- value.length > 16 ||
61
- value.some(
62
- (entry) => typeof entry !== 'string' || !NETWORK_ID.test(entry),
63
- )
64
- ) {
65
- throw new Error(name + ' must contain only exact AWS network IDs.');
66
- }
67
- return value;
68
- }
69
-
70
- function requiredScheduledEventId(event: unknown): string {
71
- const id =
72
- event && typeof event === 'object' && 'id' in event
73
- ? (event as { id?: unknown }).id
74
- : undefined;
75
- if (typeof id !== 'string' || !UUID.test(id)) {
76
- throw new Error('Scheduled maintenance requires one exact event ID.');
77
- }
78
- return id.toLowerCase();
79
- }
80
-
81
- export async function handler(event: unknown) {
82
- const stage = required('EBK_STAGE');
83
- const logger = createLogger({
84
- component: 'job-data-retention-maintenance-launcher',
85
- feature: 'data-lifecycle',
86
- operation: 'retention-maintenance-launch',
87
- slice: '${name}',
88
- stage,
89
- workspace: required('EBK_WORKSPACE'),
90
- });
91
- const correlationId = requiredScheduledEventId(event);
92
- try {
93
- const containerName = required('EBK_MAINTENANCE_CONTAINER_NAME');
94
- if (!CONTAINER_NAME.test(containerName)) {
95
- throw new Error('Maintenance container name is invalid.');
96
- }
97
- const response = await new ECSClient({}).send(
98
- new RunTaskCommand({
99
- cluster: requiredArn('EBK_MAINTENANCE_CLUSTER_ARN', ECS_CLUSTER_ARN),
100
- count: 1,
101
- enableExecuteCommand: false,
102
- launchType: 'FARGATE',
103
- networkConfiguration: {
104
- awsvpcConfiguration: {
105
- assignPublicIp:
106
- requiredBoolean('EBK_MAINTENANCE_ASSIGN_PUBLIC_IP')
107
- ? 'ENABLED'
108
- : 'DISABLED',
109
- securityGroups: requiredNetworkIds(
110
- 'EBK_MAINTENANCE_SECURITY_GROUP_IDS',
111
- ),
112
- subnets: requiredNetworkIds('EBK_MAINTENANCE_SUBNET_IDS'),
113
- },
114
- },
115
- overrides: {
116
- containerOverrides: [
117
- {
118
- command: [
119
- 'node',
120
- 'dist/jobs/data-retention/src/maintenance.js',
121
- ],
122
- environment: [
123
- {
124
- name: 'EBK_MAINTENANCE_CORRELATION_ID',
125
- value: correlationId,
126
- },
127
- ],
128
- name: containerName,
129
- },
130
- ],
131
- },
132
- taskDefinition: requiredArn(
133
- 'EBK_MAINTENANCE_TASK_DEFINITION_ARN',
134
- ECS_TASK_DEFINITION_ARN,
135
- ),
136
- }),
137
- );
20
+ !contract || contract.kind !== 'ebk-event-contract-schema' ||
21
+ contract.schemaVersion !== 1 || contract.slice !== '${name}' ||
22
+ !Array.isArray(contract.events) || contract.events.length < 2 ||
23
+ contract.events.length > 32
24
+ ) throw new Error('Event subscriptions require the bounded seeded ${name} EventContractSchema.');
25
+ const types = new Set<string>();
26
+ for (const raw of contract.events) {
27
+ const event = raw as {
28
+ detailType?: unknown;
29
+ source?: unknown;
30
+ schemaVersion?: unknown;
31
+ data?: unknown;
32
+ } | null;
138
33
  if (
139
- (response.failures?.length ?? 0) !== 0 ||
140
- response.tasks?.length !== 1 ||
141
- !response.tasks[0]?.taskArn
142
- ) {
143
- throw new Error('ECS did not accept exactly one maintenance task.');
144
- }
145
- logger.info('Retention maintenance task launched', {
146
- attributes: { launchCount: 1 },
147
- outcome: 'success',
148
- });
149
- return { accepted: true };
150
- } catch (error) {
151
- logger.error('Retention maintenance task launch failed', {
152
- attributes: {
153
- errorCode:
154
- error instanceof Error
155
- ? error.name.replace(/[^A-Za-z0-9_.-]/g, '').slice(0, 80)
156
- : 'RetentionMaintenanceLaunchError',
157
- },
158
- outcome: 'failure',
159
- });
160
- throw error;
34
+ !event || typeof event.detailType !== 'string' ||
35
+ !/^[A-Za-z][A-Za-z0-9._-]{0,127}$/.test(event.detailType) ||
36
+ event.source !== '${name}' || typeof event.schemaVersion !== 'number' ||
37
+ !Number.isSafeInteger(event.schemaVersion) || event.schemaVersion < 1 ||
38
+ !event.data || typeof event.data !== 'object' || Array.isArray(event.data) ||
39
+ types.has(event.detailType)
40
+ ) throw new Error('Event subscriptions require unique literal types, exact Slice sources and valid schemas.');
41
+ types.add(event.detailType);
161
42
  }
43
+ if (!types.has('${pascalName}Created') || !types.has('DataLifecycleChanged'))
44
+ throw new Error('The generated event contract must retain its built-in event declarations.');
45
+ // Lifecycle consumers have their own exact source declaration and rule.
46
+ types.delete('DataLifecycleChanged');
47
+ return [...types].sort();
162
48
  }
163
49
  `,
164
50
  'infra/route-function-materialization.ts': `type RouteFunctionArgs = {
@@ -181,7 +67,7 @@ type RouteRegistrar<Result> = (
181
67
 
182
68
  export function createVpcRouteFunctionMaterializer(input: {
183
69
  directHandlers: readonly string[];
184
- foundationVpc: unknown;
70
+ foundationVpc?: unknown;
185
71
  output: OutputFactory;
186
72
  }) {
187
73
  const directHandlerLimit = 2;
@@ -308,7 +194,7 @@ export function createVpcRouteFunctionMaterializer(input: {
308
194
  routeFunctions.set(handlerPath, {
309
195
  ...handler,
310
196
  handler: handlerPath,
311
- vpc: input.foundationVpc,
197
+ ...(input.foundationVpc === undefined ? {} : { vpc: input.foundationVpc }),
312
198
  });
313
199
  try {
314
200
  return register(rawRoute, handlerPath, args);
@@ -502,7 +388,7 @@ export function validateSuccessfulDeploymentReceipt(
502
388
  'infra/product.ts': `import {
503
389
  createManagedLogGroupContract,
504
390
  createRouterOriginProofInjection,
505
- provisionDatabaseBindings,
391
+ ${sql ? ' provisionDatabaseBindings,\n' : ''}\
506
392
  } from '@empire-builder-kit/nx/foundation';
507
393
  import * as random from '@pulumi/random';
508
394
  import { createHash } from 'node:crypto';
@@ -534,7 +420,12 @@ import {
534
420
  ${identifierPrefix}UseRecordDelegation,
535
421
  } from '../api/contracts/protected.js';
536
422
  import lifecycleConsumers from '../data/lifecycle-consumers.json';
537
- import databaseBindings from '../database/bindings.json';
423
+ import { EventContractSchema } from '../contracts/events.js';
424
+ import { sameSliceEventDetailTypes } from './event-subscriptions.js';
425
+ ${sql ? "import databaseBindings from '../database/bindings.json';\n" : ''}\
426
+ ${sql ? "import { createSqlOutboxInfrastructure } from './sql-outbox.js';\n" : ''}\
427
+ ${"import { createKeyValueInfrastructure } from './key-value.js';\n"}\
428
+ ${"import { createKeyValueRetentionInfrastructure } from './key-value-retention.js';\n"}\
538
429
  import localConfiguration from '../configuration/local-values.json';
539
430
  import backgroundWorkPolicy from '../operations/background-work.json';
540
431
  import { backgroundWorkSchedules } from './background-work.js';
@@ -542,7 +433,7 @@ import { ConfigurationDeclarations } from '../configuration/declarations.js';
542
433
  import { assertAsyncAdapterDeploymentReady } from '../async/recovery-adapters.js';
543
434
  import {
544
435
  getFoundationInfrastructure,
545
- registerProductMigration,
436
+ ${sql ? ' registerProductMigration,\n' : ''}\
546
437
  registerProductRetention,
547
438
  } from './foundation.js';
548
439
  import { createVpcRouteFunctionMaterializer } from './route-function-materialization.js';
@@ -550,9 +441,12 @@ import { removeFinderMetadataFromBuiltFunction } from './next-build-authority.js
550
441
  import {
551
442
  createStandardSliceNativeRuntimeAuthority,
552
443
  } from './native-runtime-authority/index.js';
553
- import {
444
+ ${sql
445
+ ? `import {
554
446
  standardSliceDatabaseTaskFamily,
555
447
  } from './native-runtime-authority/effective-intent.js';
448
+ `
449
+ : ''}\
556
450
  import { createStandardSliceSecretLinks } from './personal-secrets.js';
557
451
  import { create${pascalName}PerformanceCostControls } from './performance-cost-controls.js';
558
452
  import {
@@ -562,7 +456,7 @@ import {
562
456
  } from './authorization.js';
563
457
  import { createStandardDataExportStore } from './data-export.js';
564
458
  import { create${pascalName}Reliability } from './reliability.js';
565
- import { resolveStandardContainerImage } from './container-images.js';
459
+ ${sql ? "import { resolveStandardContainerImage } from './container-images.js';\n" : ''}\
566
460
  import {
567
461
  defineEventConsumerAlarms,
568
462
  } from '@empire-builder-kit/runtime/observability';
@@ -800,11 +694,14 @@ export function product() {
800
694
  process.env.EBK_SOURCE_COMMIT ?? (protectedStage ? '' : 'unresolved');
801
695
  const releaseSourceCommit =
802
696
  process.env.EBK_RELEASE_SOURCE_COMMIT ?? sourceCommit;
803
- const exactDevelopmentRetirement =
697
+ ${sql
698
+ ? ` const exactDevelopmentRetirement =
804
699
  $app.stage === 'development' &&
805
700
  Object.values(databaseBindings).some((binding) =>
806
701
  binding.provisioned.includes('retirement_rehearsal'),
807
702
  );
703
+ `
704
+ : ''}\
808
705
  if (
809
706
  protectedStage &&
810
707
  (!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(sourceCommit) ||
@@ -836,16 +733,9 @@ export function product() {
836
733
  args.triggers = { version: releaseSourceCommit };
837
734
  },
838
735
  );
839
- const dataRetentionContainer = resolveStandardContainerImage({
840
- artifactId: '${name}.job.data-retention',
841
- local: {
842
- context: '../..',
843
- dockerfile: 'packages/${name}/jobs/data-retention/Dockerfile',
844
- },
845
- sourceCommit: releaseSourceCommit,
846
- stage: $app.stage,
847
- });
848
- const databaseMigrationContainer = resolveStandardContainerImage({
736
+ ${''}\
737
+ ${sql
738
+ ? ` const databaseMigrationContainer = resolveStandardContainerImage({
849
739
  artifactId: '${name}.job.database-migration',
850
740
  local: {
851
741
  context: '../..',
@@ -864,6 +754,8 @@ export function product() {
864
754
  sourceCommit: releaseSourceCommit,
865
755
  stage: $app.stage,
866
756
  });
757
+ `
758
+ : ''}\
867
759
  const performanceDeploymentAuthority = protectedStage
868
760
  ? protectedPerformanceDeploymentAuthority({
869
761
  enabled: process.env.EBK_PERFORMANCE_LOAD_ENABLED ?? 'false',
@@ -872,12 +764,24 @@ export function product() {
872
764
  })
873
765
  : undefined;
874
766
  const foundation = getFoundationInfrastructure();
767
+ ${` const keyValue = createKeyValueInfrastructure({
768
+ eventBusArn: foundation.discovery.eventBusArn,
769
+ eventBusName: foundation.discovery.eventBusName,
770
+ alertTopicArn: foundation.discovery.alertTopicArn,
771
+ outbox: backgroundSchedules.outbox,
772
+ managedLogGroup,
773
+ lambdaLogging,
774
+ });
775
+ `}\
875
776
  const nativeAuthority = createStandardSliceNativeRuntimeAuthority({
876
- clusterId: foundation.discovery.clusterId,
777
+ ${sql
778
+ ? ` clusterId: foundation.discovery.clusterId,
877
779
  clusterResourceId: foundation.database.clusterResourceId,
780
+ masterSecretArn: foundation.database.masterSecretArn,
781
+ `
782
+ : ''}\
878
783
  eventBusArn: foundation.discovery.eventBusArn,
879
784
  identityUserPoolArn: foundation.discovery.identityUserPoolArn,
880
- masterSecretArn: foundation.database.masterSecretArn,
881
785
  });
882
786
  const runtimeResourceNames = nativeAuthority.resourceNames;
883
787
  $transform(aws.dynamodb.Table, (args: any, _opts: any, logicalName: string) => {
@@ -897,12 +801,15 @@ export function product() {
897
801
  alertTopicArn: foundation.discovery.alertTopicArn,
898
802
  workspace: '${workspace}',
899
803
  });
900
- const databaseProvisions = provisionDatabaseBindings(foundation, {
804
+ ${sql
805
+ ? ` const databaseProvisions = provisionDatabaseBindings(foundation, {
901
806
  bindings: databaseBindings,
902
807
  slice: '${name}',
903
808
  });
904
809
  const databaseProvision = databaseProvisions.bindings.primary;
905
810
  const { db: database } = databaseProvision;
811
+ `
812
+ : ''}\
906
813
  const authClient = foundation.userPool.addClient('${pascalName}WebAuthClient', {
907
814
  transform: {
908
815
  client: {
@@ -922,6 +829,7 @@ export function product() {
922
829
  const machineClientProvisioner = new sst.aws.Function(
923
830
  '${pascalName}MachineClientProvisioner',
924
831
  {
832
+ dev: false,
925
833
  permissions: standardSliceMachineClientProvisionerPermissions({
926
834
  userPoolArn: foundation.discovery.identityUserPoolArn,
927
835
  }),
@@ -1069,11 +977,11 @@ export function product() {
1069
977
  'api/health.handler',
1070
978
  'async/webhook-ingress.handler',
1071
979
  ],
1072
- foundationVpc: foundation.vpc,
980
+ ${''}\
1073
981
  output: $output,
1074
982
  });
1075
983
  const api = new sst.aws.ApiGatewayV2('${pascalName}Api', {
1076
- ...(performanceDeploymentAuthority ? { vpc: foundation.vpc } : {}),
984
+ ${network ? ' ...(performanceDeploymentAuthority ? { vpc: foundation.vpc } : {}),\n' : ''}\
1077
985
  transform: {
1078
986
  route: {
1079
987
  handler: vpcRouteFunctionMaterializer.transform,
@@ -1145,6 +1053,7 @@ export function product() {
1145
1053
  {
1146
1054
  permissions: nativeAuthority.permissions('api-machine-authorization-proof'),
1147
1055
  environment: {
1056
+ ${' ...keyValue.environment,\n'}\
1148
1057
  AUTH_CLIENT_ID: authClient.id,
1149
1058
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1150
1059
  machineAuthorization.acceptedClientIdsJson,
@@ -1154,7 +1063,7 @@ export function product() {
1154
1063
  },
1155
1064
  handler: 'api/machine-authorization.handler',
1156
1065
  link: [
1157
- database,
1066
+ ${'keyValue.link'},
1158
1067
  ...secretLinksFor('api-machine-authorization-proof'),
1159
1068
  ],
1160
1069
  ...lambdaLogging(machineAuthorizationProofTargetLogs.logGroup.name),
@@ -1177,6 +1086,7 @@ export function product() {
1177
1086
  routeInVpc(route.operation.method + ' ' + route.operation.path, {
1178
1087
  permissions: nativeAuthority.permissions('api-delegations'),
1179
1088
  environment: {
1089
+ ${' ...keyValue.environment,\n'}\
1180
1090
  AUTH_CLIENT_ID: authClient.id,
1181
1091
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1182
1092
  machineAuthorization.acceptedClientIdsJson,
@@ -1185,7 +1095,7 @@ export function product() {
1185
1095
  EBK_STAGE: $app.stage,
1186
1096
  },
1187
1097
  handler: route.handler,
1188
- link: [database, ...secretLinksFor('api-delegations')],
1098
+ link: [${'keyValue.link'}, ...secretLinksFor('api-delegations')],
1189
1099
  ...lambdaLogging(delegationLogs.logGroup.name),
1190
1100
  });
1191
1101
  }
@@ -1230,6 +1140,7 @@ export function product() {
1230
1140
  routeInVpc(route.operation.method + ' ' + route.operation.path, {
1231
1141
  permissions: nativeAuthority.permissions('api-data-rights'),
1232
1142
  environment: {
1143
+ ${' ...keyValue.environment,\n'}\
1233
1144
  AUTH_CLIENT_ID: authClient.id,
1234
1145
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1235
1146
  machineAuthorization.acceptedClientIdsJson,
@@ -1242,7 +1153,7 @@ export function product() {
1242
1153
  },
1243
1154
  handler: route.handler,
1244
1155
  link: [
1245
- database,
1156
+ ${'keyValue.link'},
1246
1157
  foundation.eventBus,
1247
1158
  ...secretLinksFor('api-data-rights'),
1248
1159
  ],
@@ -1262,6 +1173,7 @@ export function product() {
1262
1173
  routeInVpc(route.operation.method + ' ' + route.operation.path, {
1263
1174
  permissions: nativeAuthority.permissions('api-database-records'),
1264
1175
  environment: {
1176
+ ${' ...keyValue.environment,\n'}\
1265
1177
  AUTH_CLIENT_ID: authClient.id,
1266
1178
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1267
1179
  machineAuthorization.acceptedClientIdsJson,
@@ -1270,7 +1182,7 @@ export function product() {
1270
1182
  EBK_STAGE: $app.stage,
1271
1183
  },
1272
1184
  handler: route.handler,
1273
- link: [database, ...secretLinksFor('api-database-records')],
1185
+ link: [${'keyValue.link'}, ...secretLinksFor('api-database-records')],
1274
1186
  ...lambdaLogging(dataRetentionReviewLogs.logGroup.name),
1275
1187
  });
1276
1188
  }
@@ -1281,6 +1193,7 @@ export function product() {
1281
1193
  {
1282
1194
  permissions: nativeAuthority.permissions('api-protected'),
1283
1195
  environment: {
1196
+ ${' ...keyValue.environment,\n'}\
1284
1197
  AUTH_CLIENT_ID: authClient.id,
1285
1198
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1286
1199
  machineAuthorization.acceptedClientIdsJson,
@@ -1289,7 +1202,7 @@ export function product() {
1289
1202
  EBK_STAGE: $app.stage,
1290
1203
  },
1291
1204
  handler: 'api/protected.handler',
1292
- link: [database, ...secretLinksFor('api-protected')],
1205
+ link: [${'keyValue.link'}, ...secretLinksFor('api-protected')],
1293
1206
  ...lambdaLogging(protectedApiLogs.logGroup.name),
1294
1207
  },
1295
1208
  );
@@ -1300,6 +1213,7 @@ export function product() {
1300
1213
  {
1301
1214
  permissions: nativeAuthority.permissions('api-database-health'),
1302
1215
  environment: {
1216
+ ${' ...keyValue.environment,\n'}\
1303
1217
  AUTH_CLIENT_ID: authClient.id,
1304
1218
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1305
1219
  machineAuthorization.acceptedClientIdsJson,
@@ -1308,7 +1222,7 @@ export function product() {
1308
1222
  EBK_STAGE: $app.stage,
1309
1223
  },
1310
1224
  handler: 'database/runtime-health.handler',
1311
- link: [database, ...secretLinksFor('api-database-health')],
1225
+ link: [${'keyValue.link'}, ...secretLinksFor('api-database-health')],
1312
1226
  ...lambdaLogging(databaseHealthLogs.logGroup.name),
1313
1227
  },
1314
1228
  );
@@ -1329,6 +1243,7 @@ export function product() {
1329
1243
  routeInVpc(route.operation.method + ' ' + route.operation.path, {
1330
1244
  permissions: nativeAuthority.permissions('api-database-records'),
1331
1245
  environment: {
1246
+ ${' ...keyValue.environment,\n'}\
1332
1247
  AUTH_CLIENT_ID: authClient.id,
1333
1248
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1334
1249
  machineAuthorization.acceptedClientIdsJson,
@@ -1339,7 +1254,7 @@ export function product() {
1339
1254
  },
1340
1255
  handler: route.handler,
1341
1256
  link: [
1342
- database,
1257
+ ${'keyValue.link'},
1343
1258
  foundation.eventBus,
1344
1259
  ...secretLinksFor('api-database-records'),
1345
1260
  ],
@@ -1359,6 +1274,7 @@ export function product() {
1359
1274
  routeInVpc(route.operation.method + ' ' + route.operation.path, {
1360
1275
  permissions: nativeAuthority.permissions('api-database-records'),
1361
1276
  environment: {
1277
+ ${' ...keyValue.environment,\n'}\
1362
1278
  AUTH_CLIENT_ID: authClient.id,
1363
1279
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1364
1280
  machineAuthorization.acceptedClientIdsJson,
@@ -1367,7 +1283,7 @@ export function product() {
1367
1283
  EBK_STAGE: $app.stage,
1368
1284
  },
1369
1285
  handler: route.handler,
1370
- link: [database, ...secretLinksFor('api-database-records')],
1286
+ link: [${'keyValue.link'}, ...secretLinksFor('api-database-records')],
1371
1287
  ...lambdaLogging(databaseRecordsLogs.logGroup.name),
1372
1288
  });
1373
1289
  }
@@ -1378,6 +1294,7 @@ export function product() {
1378
1294
  {
1379
1295
  permissions: nativeAuthority.permissions('api-publish-created'),
1380
1296
  environment: {
1297
+ ${' ...keyValue.environment,\n'}\
1381
1298
  AUTH_CLIENT_ID: authClient.id,
1382
1299
  AUTH_MACHINE_ACCEPTED_CLIENT_IDS:
1383
1300
  machineAuthorization.acceptedClientIdsJson,
@@ -1388,7 +1305,7 @@ export function product() {
1388
1305
  },
1389
1306
  handler: 'api/publish-created.handler',
1390
1307
  link: [
1391
- database,
1308
+ ${'keyValue.link'},
1392
1309
  foundation.eventBus,
1393
1310
  ...secretLinksFor('api-publish-created'),
1394
1311
  ],
@@ -1415,6 +1332,7 @@ export function product() {
1415
1332
  {
1416
1333
  permissions: dataExportStore.cleanupPermissions,
1417
1334
  environment: {
1335
+ ${' ...keyValue.environment,\n'}\
1418
1336
  DATA_EXPORT_BUCKET_NAME: dataExportStore.bucket.bucket,
1419
1337
  DATA_EXPORT_KMS_KEY_ARN: dataExportStore.encryptionKey.arn,
1420
1338
  EBK_STAGE: $app.stage,
@@ -1422,12 +1340,12 @@ export function product() {
1422
1340
  },
1423
1341
  handler: 'jobs/data-export-cleanup.handler',
1424
1342
  link: [
1425
- database,
1343
+ ${'keyValue.link'},
1426
1344
  ...secretLinksFor('data-export-cleanup'),
1427
1345
  ],
1428
1346
  ...lambdaLogging(dataExportCleanupLogs.logGroup.name),
1429
1347
  timeout: '5 minutes',
1430
- vpc: foundation.vpc,
1348
+ ${''}\
1431
1349
  },
1432
1350
  );
1433
1351
  const dataExportCleanupRule = new aws.cloudwatch.EventRule(
@@ -1517,15 +1435,16 @@ export function product() {
1517
1435
  );
1518
1436
  eventQueue.subscribe({
1519
1437
  environment: {
1438
+ ${' ...keyValue.environment,\n'}\
1520
1439
  EBK_STAGE: $app.stage,
1521
1440
  EBK_WORKLOAD_IDENTITY: '${name}:event-consumer',
1522
1441
  },
1523
1442
  handler: 'api/event-consumer.handler',
1524
- link: [database, ...secretLinksFor('event-consumer')],
1443
+ link: [${'keyValue.link'}, ...secretLinksFor('event-consumer')],
1525
1444
  permissions: nativeAuthority.permissions('event-consumer'),
1526
1445
  ...lambdaLogging(eventConsumerLogs.logGroup.name),
1527
1446
  timeout: '1 minute',
1528
- vpc: foundation.vpc,
1447
+ ${''}\
1529
1448
  }, {
1530
1449
  batch: { partialResponses: true },
1531
1450
  });
@@ -1535,7 +1454,7 @@ export function product() {
1535
1454
  {
1536
1455
  pattern: {
1537
1456
  detail: { meta: { stage: [$app.stage] } },
1538
- detailType: ['${pascalName}Created'],
1457
+ detailType: sameSliceEventDetailTypes(EventContractSchema),
1539
1458
  source: ['${name}'],
1540
1459
  },
1541
1460
  },
@@ -1630,7 +1549,7 @@ export function product() {
1630
1549
  (alertTopicArn: string) => alertTopicArn.split(':').at(-1) ?? '',
1631
1550
  ),
1632
1551
  apiId: api.id,
1633
- databaseClusterIdentifier: foundation.discovery.databaseClusterId,
1552
+ ${' databaseTableName: keyValue.table.name,\n'}\
1634
1553
  functionName: dataExportCleanup.name,
1635
1554
  providerQueueName: providerQueue.name,
1636
1555
  });
@@ -1847,6 +1766,7 @@ export function product() {
1847
1766
  providerQueue.subscribe(
1848
1767
  {
1849
1768
  environment: {
1769
+ ${' ...keyValue.environment,\n'}\
1850
1770
  EBK_STAGE: $app.stage,
1851
1771
  EBK_WORKLOAD_IDENTITY: '${name}:async-provider-worker',
1852
1772
  EBK_WORKSPACE: '${workspace}',
@@ -1854,14 +1774,14 @@ export function product() {
1854
1774
  },
1855
1775
  handler: 'async/provider-worker.handler',
1856
1776
  link: [
1857
- database,
1777
+ ${'keyValue.link'},
1858
1778
  providerQueue,
1859
1779
  ...secretLinksFor('async-provider-worker'),
1860
1780
  ],
1861
1781
  permissions: nativeAuthority.permissions('async-provider-worker'),
1862
1782
  ...lambdaLogging(asyncProviderWorkerLogs.logGroup.name),
1863
1783
  timeout: '1 minute',
1864
- vpc: foundation.vpc,
1784
+ ${''}\
1865
1785
  },
1866
1786
  {
1867
1787
  batch: { partialResponses: true },
@@ -1892,6 +1812,8 @@ export function product() {
1892
1812
  {
1893
1813
  permissions: nativeAuthority.permissions('async-outbox-relay'),
1894
1814
  environment: {
1815
+ ${' ...keyValue.environment,\n'}\
1816
+ ${''}\
1895
1817
  EBK_STAGE: $app.stage,
1896
1818
  EBK_WORKLOAD_IDENTITY: '${name}:async-outbox-relay',
1897
1819
  EBK_WORKSPACE: '${workspace}',
@@ -1899,32 +1821,45 @@ export function product() {
1899
1821
  },
1900
1822
  handler: 'async/outbox-relay.handler',
1901
1823
  link: [
1902
- database,
1824
+ ${'keyValue.link'},
1903
1825
  foundation.eventBus,
1904
1826
  ...secretLinksFor('async-outbox-relay'),
1905
1827
  ],
1906
1828
  ...lambdaLogging(asyncOutboxRelayLogs.logGroup.name),
1907
1829
  timeout: '1 minute',
1908
- vpc: foundation.vpc,
1830
+ ${''}\
1909
1831
  },
1910
1832
  );
1833
+ ${sql
1834
+ ? ` const sqlOutbox = createSqlOutboxInfrastructure({
1835
+ workspace: '${workspace}',
1836
+ database, eventBus: foundation.eventBus, eventBusName: foundation.discovery.eventBusName,
1837
+ secretLinks: secretLinksFor('async-outbox-relay'),
1838
+ vpc: foundation.vpc, schedule: backgroundSchedules.sqlOutboxRecovery,
1839
+ alertTopicArn: foundation.discovery.alertTopicArn,
1840
+ managedLogGroup, lambdaLogging,
1841
+ ${''}\
1842
+ });
1843
+ `
1844
+ : ''}\
1911
1845
  const asyncInboxCleanup = new sst.aws.Function(
1912
1846
  '${pascalName}AsyncInboxCleanup',
1913
1847
  {
1914
1848
  permissions: nativeAuthority.permissions('async-inbox-cleanup'),
1915
1849
  environment: {
1850
+ ${' ...keyValue.environment,\n'}\
1916
1851
  EBK_STAGE: $app.stage,
1917
1852
  EBK_WORKLOAD_IDENTITY: '${name}:async-inbox-cleanup',
1918
1853
  EBK_WORKSPACE: '${workspace}',
1919
1854
  },
1920
1855
  handler: 'async/inbox-cleanup.handler',
1921
1856
  link: [
1922
- database,
1857
+ ${'keyValue.link'},
1923
1858
  ...secretLinksFor('async-inbox-cleanup'),
1924
1859
  ],
1925
1860
  ...lambdaLogging(asyncInboxCleanupLogs.logGroup.name),
1926
1861
  timeout: '5 minutes',
1927
- vpc: foundation.vpc,
1862
+ ${''}\
1928
1863
  },
1929
1864
  );
1930
1865
  const asyncScheduleTarget = new sst.aws.Function(
@@ -1978,7 +1913,7 @@ export function product() {
1978
1913
  '${pascalName}OutboxRelaySchedule',
1979
1914
  {
1980
1915
  description:
1981
- 'Durable outbox relay; nonproduction cadence permits idle database auto-pause.',
1916
+ 'Durable DynamoDB outbox relay; cadence and pause are independent of SQL capacity.',
1982
1917
  ...backgroundSchedules.outbox,
1983
1918
  tags: {
1984
1919
  'ebk:slice': '${name}',
@@ -2257,15 +2192,18 @@ export function product() {
2257
2192
  );
2258
2193
  }
2259
2194
 
2195
+ const webServerLogging = lambdaLogging(nextServerLogs.logGroup.name);
2260
2196
  const web = new sst.aws.Nextjs('${pascalName}Web', {
2261
2197
  buildCommand: 'node ../tools/ebk-next-build-environment.mjs',
2198
+ invalidation: { wait: true },
2262
2199
  dev: {
2263
- command: \`pnpm exec next dev web --hostname 127.0.0.1 --port \${devPort}\`,
2200
+ command: 'node tools/ebk-next-dev.mjs',
2264
2201
  directory: '.',
2265
2202
  title: '${pascalName} web',
2266
2203
  url: \`http://127.0.0.1:\${devPort}/${name}\`,
2267
2204
  },
2268
2205
  environment: {
2206
+ ${' ...keyValue.environment,\n'}\
2269
2207
  AUTH_CLIENT_ID: authClient.id,
2270
2208
  AUTH_USER_POOL_ID: foundation.userPool.id,
2271
2209
  EBK_SOURCE_COMMIT: releaseSourceCommit,
@@ -2292,7 +2230,7 @@ export function product() {
2292
2230
  ...runtimeConfigurationEnvironment,
2293
2231
  NEXT_PUBLIC_API_URL: api.url,
2294
2232
  },
2295
- link: [database, foundation.userPool],
2233
+ link: [keyValue.link, ${sql ? 'database, foundation.eventBus, ' : ''}foundation.userPool],
2296
2234
  path: 'web',
2297
2235
  router: { instance: foundation.router, path: '/${name}' },
2298
2236
  transform: {
@@ -2323,23 +2261,38 @@ export function product() {
2323
2261
  link: secretLinksFor('web-revalidation-seeder'),
2324
2262
  ...lambdaLogging(nextRevalidationSeederLogs.logGroup.name),
2325
2263
  },
2326
- server: {
2327
- permissions: nativeAuthority.permissions('web-server'),
2328
- hook: {
2264
+ server(args: Record<string, unknown>) {
2265
+ args.permissions = $resolve({
2266
+ inherited: args.permissions,
2267
+ additional: nativeAuthority.permissions('web-server'),
2268
+ }).apply(({ inherited, additional }) => [
2269
+ ...((inherited ?? []) as unknown[]),
2270
+ ...additional,
2271
+ ]);
2272
+ args.hook = {
2329
2273
  async postbuild(directory: string) {
2330
2274
  removeFinderMetadataFromBuiltFunction(directory);
2331
2275
  },
2332
- },
2333
- link: secretLinksFor(
2334
- 'web-server',
2335
- performanceDeploymentBinding
2336
- ? []
2337
- : [performanceHmacLogicalName],
2338
- ),
2339
- ...lambdaLogging(nextServerLogs.logGroup.name),
2276
+ };
2277
+ // SST applies this transform to both its dev runtime and deployed
2278
+ // server. Preserve native/site links; secret links are additive.
2279
+ args.link = $output(args.link ?? []).apply((links: unknown[]) => [
2280
+ ...links,
2281
+ ...secretLinksFor(
2282
+ 'web-server',
2283
+ performanceDeploymentBinding
2284
+ ? []
2285
+ : [performanceHmacLogicalName],
2286
+ ),
2287
+ ]);
2288
+ Object.assign(args, webServerLogging);
2289
+ args.transform = {
2290
+ ...webServerLogging.transform,
2291
+ ...($dev ? { role: { tags: { 'ebk:dev-runtime': 'web' } } } : {}),
2292
+ };
2340
2293
  },
2341
2294
  },
2342
- vpc: foundation.vpc,
2295
+ ${sql ? ' vpc: foundation.vpc,\n' : ''}\
2343
2296
  }, configurationDeployment
2344
2297
  ? { dependsOn: [configurationDeployment] }
2345
2298
  : {});
@@ -2360,7 +2313,15 @@ export function product() {
2360
2313
  }
2361
2314
 
2362
2315
  const migrationControls: Record<string, any> = {};
2363
- if (!$dev) {
2316
+ ${` Object.assign(migrationControls, createKeyValueRetentionInfrastructure({
2317
+ keyValue, workspace: '${workspace}', eventBusArn: foundation.discovery.eventBusArn,
2318
+ alertTopicArn: foundation.discovery.alertTopicArn, schedule: backgroundSchedules.retention,
2319
+ scheduleName: runtimeResourceNames.dataRetentionMaintenanceRule,
2320
+ managedLogGroup, lambdaLogging, register: registerProductRetention,
2321
+ }));
2322
+ `}\
2323
+ ${sql
2324
+ ? ` if (!$dev) {
2364
2325
  const region = aws.getRegionOutput({}).name;
2365
2326
  const taskArguments = (task: any) => ({
2366
2327
  Cluster: task.cluster,
@@ -2447,316 +2408,7 @@ export function product() {
2447
2408
  });
2448
2409
  };
2449
2410
 
2450
- if (!databaseProvision.readwriteSecretArn) {
2451
- throw new Error(
2452
- 'The active primary database is missing its read/write credential reference.',
2453
- );
2454
- }
2455
- const retentionTaskLogs = managedLogContract('job-data-retention');
2456
- const retentionTask = new sst.aws.Task('${pascalName}DataRetentionTask', {
2457
- permissions: nativeAuthority.permissions('data-retention-job-task'),
2458
- cluster: foundation.cluster,
2459
- environment: {
2460
- ...dataRetentionContainer.environment,
2461
- AWS_REGION: region,
2462
- EBK_DATABASE_HOST: foundation.database.clusterEndpoint,
2463
- EBK_DATABASE_NAME: databaseProvision.databaseName,
2464
- EBK_DATABASE_PORT: $interpolate\`\${foundation.database.port}\`,
2465
- EBK_DATABASE_USERNAME: databaseProvision.readwriteRole,
2466
- EBK_RDS_CA_BUNDLE: '/app/rds-global-bundle.pem',
2467
- EBK_READWRITE_SECRET_ARN: databaseProvision.readwriteSecretArn,
2468
- EBK_SLICE: '${name}',
2469
- EBK_STAGE: $app.stage,
2470
- EBK_WORKLOAD_IDENTITY: '${name}:data-retention-job',
2471
- EBK_WORKSPACE: '${workspace}',
2472
- EVENT_BUS_NAME: foundation.eventBus.name,
2473
- },
2474
- image: dataRetentionContainer.image,
2475
- link: secretLinksFor('data-retention-job-task'),
2476
- logging: {
2477
- name: retentionTaskLogs.name,
2478
- retention: '1 month',
2479
- },
2480
- transform: {
2481
- logGroup: {
2482
- logGroupClass: retentionTaskLogs.logGroupClass,
2483
- tags: retentionTaskLogs.tags,
2484
- },
2485
- taskDefinition: {
2486
- family: runtimeResourceNames.dataRetentionTaskFamily,
2487
- },
2488
- },
2489
- });
2490
- const retentionTaskLogDataProtection = managedLogDataProtection(
2491
- '${pascalName}DataRetentionTaskLog',
2492
- retentionTaskLogs,
2493
- retentionTaskLogs.name,
2494
- [retentionTask.nodes.taskDefinition],
2495
- foundation.discovery.alertTopicArn,
2496
- );
2497
- const retentionWorkflowLogs = managedLogGroup(
2498
- '${pascalName}DataRetentionWorkflowLogs',
2499
- 'job-data-retention-orchestration',
2500
- foundation.discovery.alertTopicArn,
2501
- );
2502
- const retentionOverrides = retentionTask.containers.apply(
2503
- (containers: string[]) => ({
2504
- ContainerOverrides: containers.map((containerName) => ({
2505
- Environment: [
2506
- {
2507
- Name: 'EBK_RETENTION_APPROVAL_ID',
2508
- Value: '{% $states.input.approvalRequestId %}',
2509
- },
2510
- {
2511
- Name: 'EBK_RETENTION_CORRELATION_ID',
2512
- Value: '{% $states.input.correlationId %}',
2513
- },
2514
- {
2515
- Name: 'EBK_RETENTION_AS_OF',
2516
- Value: '{% $states.input.asOf %}',
2517
- },
2518
- {
2519
- Name: 'EBK_RETENTION_MODE',
2520
- Value: '{% $states.input.mode %}',
2521
- },
2522
- {
2523
- Name: 'EBK_RETENTION_RUN_ID',
2524
- Value: '{% $states.input.runId %}',
2525
- },
2526
- {
2527
- Name: 'EBK_STEP_FUNCTIONS_TASK_TOKEN',
2528
- Value: '{% $states.context.Task.Token %}',
2529
- },
2530
- ],
2531
- Name: containerName,
2532
- })),
2533
- }),
2534
- );
2535
- const retentionStateMachine = createRawStateMachine(
2536
- '${pascalName}DataRetention',
2537
- {
2538
- StartAt: 'RunDataRetention',
2539
- States: {
2540
- DataRetentionSucceeded: {
2541
- QueryLanguage: 'JSONata',
2542
- Type: 'Succeed',
2543
- },
2544
- RunDataRetention: {
2545
- Arguments: {
2546
- ...taskArguments(retentionTask),
2547
- Overrides: retentionOverrides,
2548
- },
2549
- Next: 'DataRetentionSucceeded',
2550
- QueryLanguage: 'JSONata',
2551
- Resource: 'arn:aws:states:::ecs:runTask.waitForTaskToken',
2552
- Retry: [
2553
- {
2554
- BackoffRate: 2,
2555
- ErrorEquals: [
2556
- 'ECS.AmazonECSException',
2557
- 'ECS.ECSException',
2558
- ],
2559
- IntervalSeconds: 10,
2560
- MaxAttempts: 2,
2561
- },
2562
- ],
2563
- TimeoutSeconds: 2700,
2564
- Type: 'Task',
2565
- },
2566
- },
2567
- },
2568
- retentionWorkflowLogs.logGroup,
2569
- 'data-retention-job-orchestration',
2570
- );
2571
- const retentionFailureAlarm = new aws.cloudwatch.MetricAlarm(
2572
- '${pascalName}DataRetentionFailure',
2573
- {
2574
- alarmActions: [foundation.discovery.alertTopicArn],
2575
- alarmDescription: operationalAlarmDescription({
2576
- businessSymptom:
2577
- 'The built-in retention Job terminated unsuccessfully.',
2578
- id: 'retention-job-failure',
2579
- runbook: 'docs/runbooks/database-recovery.md',
2580
- }),
2581
- comparisonOperator: 'GreaterThanOrEqualToThreshold',
2582
- evaluationPeriods: 1,
2583
- metricQueries: [
2584
- ...['ExecutionsFailed', 'ExecutionsTimedOut', 'ExecutionsAborted'].map(
2585
- (metricName, index) => ({
2586
- id: 'm' + index,
2587
- metric: {
2588
- dimensions: {
2589
- StateMachineArn: retentionStateMachine.arn,
2590
- },
2591
- metricName,
2592
- namespace: 'AWS/States',
2593
- period: 60,
2594
- stat: 'Sum',
2595
- },
2596
- returnData: false,
2597
- }),
2598
- ),
2599
- {
2600
- expression: 'm0+m1+m2',
2601
- id: 'failures',
2602
- label: 'Retention terminal execution failures',
2603
- returnData: true,
2604
- },
2605
- ],
2606
- name: '${name}-' + $app.stage + '-retention-job-failure',
2607
- threshold: 1,
2608
- treatMissingData: 'notBreaching',
2609
- },
2610
- );
2611
- const retentionRegistration = registerProductRetention(
2612
- retentionStateMachine.arn,
2613
- );
2614
- migrationControls.dataRetention = {
2615
- registration: retentionRegistration,
2616
- retentionFailureAlarm,
2617
- retentionStateMachine,
2618
- retentionTask,
2619
- retentionTaskLogDataProtection,
2620
- retentionWorkflowLogs,
2621
- };
2622
- const retentionMaintenanceTaskLogs = managedLogContract(
2623
- 'job-data-retention-maintenance',
2624
- );
2625
- const retentionMaintenanceTask = new sst.aws.Task(
2626
- '${pascalName}DataRetentionMaintenanceTask',
2627
- {
2628
- permissions: nativeAuthority.permissions(
2629
- 'data-retention-maintenance-job-task',
2630
- ),
2631
- cluster: foundation.cluster,
2632
- environment: {
2633
- ...dataRetentionContainer.environment,
2634
- AWS_REGION: region,
2635
- EBK_DATABASE_HOST: foundation.database.clusterEndpoint,
2636
- EBK_DATABASE_NAME: databaseProvision.databaseName,
2637
- EBK_DATABASE_PORT: $interpolate\`\${foundation.database.port}\`,
2638
- EBK_DATABASE_USERNAME: databaseProvision.readwriteRole,
2639
- EBK_RDS_CA_BUNDLE: '/app/rds-global-bundle.pem',
2640
- EBK_READWRITE_SECRET_ARN:
2641
- databaseProvision.readwriteSecretArn,
2642
- EBK_SLICE: '${name}',
2643
- EBK_STAGE: $app.stage,
2644
- EBK_WORKLOAD_IDENTITY: '${name}:data-retention-job',
2645
- EBK_WORKSPACE: '${workspace}',
2646
- },
2647
- image: dataRetentionContainer.image,
2648
- link: secretLinksFor(
2649
- 'data-retention-maintenance-job-task',
2650
- ),
2651
- logging: {
2652
- name: retentionMaintenanceTaskLogs.name,
2653
- retention: '1 month',
2654
- },
2655
- transform: {
2656
- logGroup: {
2657
- logGroupClass:
2658
- retentionMaintenanceTaskLogs.logGroupClass,
2659
- tags: retentionMaintenanceTaskLogs.tags,
2660
- },
2661
- taskDefinition: {
2662
- family: runtimeResourceNames.dataRetentionMaintenanceTaskFamily,
2663
- },
2664
- },
2665
- },
2666
- );
2667
- const retentionMaintenanceTaskLogDataProtection =
2668
- managedLogDataProtection(
2669
- '${pascalName}DataRetentionMaintenanceTaskLog',
2670
- retentionMaintenanceTaskLogs,
2671
- retentionMaintenanceTaskLogs.name,
2672
- [retentionMaintenanceTask.nodes.taskDefinition],
2673
- foundation.discovery.alertTopicArn,
2674
- );
2675
- const retentionMaintenanceLauncherLogs = managedLogGroup(
2676
- '${pascalName}DataRetentionMaintenanceLauncherLogs',
2677
- 'job-data-retention-maintenance-launcher',
2678
- foundation.discovery.alertTopicArn,
2679
- );
2680
- const retentionMaintenanceContainerName =
2681
- retentionMaintenanceTask.containers.apply(
2682
- (containers: string[]) => {
2683
- if (containers.length !== 1 || !containers[0]) {
2684
- throw new Error(
2685
- 'Retention maintenance requires exactly one task container.',
2686
- );
2687
- }
2688
- return containers[0];
2689
- },
2690
- );
2691
- const retentionMaintenanceLauncher = new sst.aws.Function(
2692
- '${pascalName}DataRetentionMaintenanceLauncher',
2693
- {
2694
- permissions: nativeAuthority.permissions(
2695
- 'data-retention-maintenance-launcher',
2696
- ),
2697
- environment: {
2698
- EBK_MAINTENANCE_ASSIGN_PUBLIC_IP:
2699
- retentionMaintenanceTask.assignPublicIp.apply(
2700
- (value: boolean) => String(value),
2701
- ),
2702
- EBK_MAINTENANCE_CLUSTER_ARN:
2703
- retentionMaintenanceTask.cluster,
2704
- EBK_MAINTENANCE_CONTAINER_NAME:
2705
- retentionMaintenanceContainerName,
2706
- EBK_MAINTENANCE_SECURITY_GROUP_IDS: $jsonStringify(
2707
- retentionMaintenanceTask.securityGroups,
2708
- ),
2709
- EBK_MAINTENANCE_SUBNET_IDS: $jsonStringify(
2710
- retentionMaintenanceTask.subnets,
2711
- ),
2712
- EBK_MAINTENANCE_TASK_DEFINITION_ARN:
2713
- retentionMaintenanceTask.taskDefinition,
2714
- EBK_STAGE: $app.stage,
2715
- EBK_WORKSPACE: '${workspace}',
2716
- },
2717
- handler: 'jobs/data-retention-maintenance-launcher.handler',
2718
- ...lambdaLogging(
2719
- retentionMaintenanceLauncherLogs.logGroup.name,
2720
- ),
2721
- timeout: '1 minute',
2722
- },
2723
- );
2724
- const retentionMaintenanceRule = new aws.cloudwatch.EventRule(
2725
- '${pascalName}DataRetentionMaintenanceSchedule',
2726
- {
2727
- name: runtimeResourceNames.dataRetentionMaintenanceRule,
2728
- ...backgroundSchedules.retention,
2729
- },
2730
- );
2731
- const retentionMaintenancePermission =
2732
- new aws.lambda.Permission(
2733
- '${pascalName}DataRetentionMaintenanceSchedulePermission',
2734
- {
2735
- action: 'lambda:InvokeFunction',
2736
- function: retentionMaintenanceLauncher.arn,
2737
- principal: 'events.amazonaws.com',
2738
- sourceArn: retentionMaintenanceRule.arn,
2739
- },
2740
- );
2741
- const retentionMaintenanceTarget =
2742
- new aws.cloudwatch.EventTarget(
2743
- '${pascalName}DataRetentionMaintenanceTarget',
2744
- {
2745
- arn: retentionMaintenanceLauncher.arn,
2746
- rule: retentionMaintenanceRule.name,
2747
- targetId: 'DataRetentionMaintenance',
2748
- },
2749
- { dependsOn: [retentionMaintenancePermission] },
2750
- );
2751
- migrationControls.dataRetentionMaintenance = {
2752
- retentionMaintenanceLauncher,
2753
- retentionMaintenanceLauncherLogs,
2754
- retentionMaintenanceRule,
2755
- retentionMaintenanceTarget,
2756
- retentionMaintenanceTask,
2757
- retentionMaintenanceTaskLogDataProtection,
2758
- };
2759
-
2411
+ ${''}\
2760
2412
  for (const [databaseIdentifier, target] of Object.entries(
2761
2413
  databaseProvisions.databases,
2762
2414
  )) {
@@ -3090,6 +2742,8 @@ export function product() {
3090
2742
  }
3091
2743
  }
3092
2744
 
2745
+ `
2746
+ : ''}\
3093
2747
  const outboxRelayAlarm = new aws.cloudwatch.MetricAlarm(
3094
2748
  '${pascalName}OutboxRelayErrors',
3095
2749
  {
@@ -3346,6 +3000,7 @@ export function product() {
3346
3000
  performanceLoadCleanupBacklogAlarm,
3347
3001
  performanceLoadCleanupDeadlineAlarm,
3348
3002
  asyncOutboxRelay,
3003
+ ${sql ? ' sqlOutbox,\n' : ''}\
3349
3004
  asyncRecoveryLedger,
3350
3005
  asyncScheduleTarget,
3351
3006
  asyncTargetDlq,
@@ -3365,7 +3020,8 @@ export function product() {
3365
3020
  dataExportCleanupRule,
3366
3021
  dataExportCleanupTarget,
3367
3022
  dataExportStore,
3368
- database,
3023
+ ${sql ? ' database,\n' : ''}\
3024
+ ${' keyValue,\n'}\
3369
3025
  dlqAlarm,
3370
3026
  eventDlq,
3371
3027
  eventQueue,
@@ -3393,5 +3049,7 @@ export function product() {
3393
3049
  }
3394
3050
  `,
3395
3051
  };
3052
+ Object.assign(files, (0, built_in_plan_key_value_retention_infrastructure_js_1.renderKeyValueRetentionInfrastructureFiles)(name, pascalName));
3053
+ return files;
3396
3054
  }
3397
3055
  //# sourceMappingURL=built-in-plan-infrastructure-files.js.map