@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.
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 +4 -2
  169. package/src/generators/slice/built-in-plan-shared.js +41 -19
  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 +206 -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
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValueDeletionFiles = renderKeyValueDeletionFiles;
4
+ const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
5
+ /** Same public deletion journey, backed by native item transactions and durable intents. */
6
+ function renderKeyValueDeletionFiles(name, pascalName, workspace) {
7
+ const prefix = (0, built_in_plan_shared_js_1.lowerCamelIdentifier)(pascalName);
8
+ return {
9
+ 'data/record-deletion.ts': `import {
10
+ assertAuthorizationAllowed, beginApprovalExecution, completeApprovalExecution,
11
+ createApprovalRequest, decideApprovalRequest, digestApprovalRequest,
12
+ type ApprovalRequest, type AuthorizationPrincipal,
13
+ } from '@empire-builder-kit/runtime/authorization';
14
+ import type { KeyValueChange } from '@empire-builder-kit/runtime/key-value';
15
+ import { createDataLifecycleDeletionRequest, createDataLifecycleLedgerEntry,
16
+ transitionDataLifecycleDeletion, type DataLifecycleDeletionRequestV1,
17
+ } from '@empire-builder-kit/runtime/data-lifecycle';
18
+ import { buildEventEntry } from '@empire-builder-kit/runtime/events';
19
+ import { RuntimeError } from '@empire-builder-kit/runtime/response';
20
+ import { ${prefix}AuthorizationPolicy } from '../authorization/policy.js';
21
+ import { ${pascalName}DataLifecycleChanged } from '../contracts/events.js';
22
+ import { dispatchEventIntent } from '../async/key-value-delivery.js';
23
+ import { create${pascalName}DataLifecycleChanged } from './lifecycle-event.js';
24
+ import { approvalReference, productRecordReference } from './pseudonymous-reference.js';
25
+ import { canonicalDataRightsNow, dataRightsAuditChange, dataRightsSubjectReference,
26
+ DATA_RIGHTS_POLICY_VERSION, plusDataRightsDays, requireDirectAdmin, requireDirectHuman,
27
+ } from './data-rights-shared.js';
28
+ import { loadActiveRecordHolds } from './record-holds.js';
29
+ import { readProductRecord } from './records.js';
30
+ import { dataStore } from './key-value.js';
31
+
32
+ const ACTION = '${name}:record-delete';
33
+ const COPY = 'event-contract';
34
+ const AUTHORIZATION_POLICY_VERSION = ${prefix}AuthorizationPolicy.version;
35
+ const COMPLETIONS = 'record-deletion-completions';
36
+ interface Workflow {
37
+ kind: 'record-deletion'; schemaVersion: 1;
38
+ approval: ApprovalRequest<typeof ACTION>;
39
+ lifecycle: DataLifecycleDeletionRequestV1;
40
+ }
41
+ interface Command {
42
+ principal: AuthorizationPrincipal; recordId: string; correlationId: string; now?: string;
43
+ }
44
+ interface Execution extends Command { approvalRequestId: string; reasonCode: string }
45
+ const command = (recordId: string, reasonCode: string) => ({ reasonCode, recordId });
46
+ const digestInput = (recordId: string, reasonCode: string) => ({ action: ACTION,
47
+ resource: { id: recordId, type: 'record' }, command: command(recordId, reasonCode) } as const);
48
+ function failure(code: string, message: string, status = 409): never {
49
+ throw new RuntimeError({ code, message, status, retryable: status === 503 || code === 'deletion_conflict' });
50
+ }
51
+ function validateInput(input: Command) {
52
+ requireDirectHuman(input.principal);
53
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(input.recordId) || !input.correlationId || input.correlationId.length > 128)
54
+ failure('deletion_input_invalid', 'Deletion identity is invalid.', 400);
55
+ }
56
+ function recordAuthority(value: unknown, input: Command) {
57
+ const record = readProductRecord(value, input.recordId);
58
+ if (input.principal.kind !== 'admin' && record.ownerId !== input.principal.actor.id)
59
+ failure('record_not_found', 'The record was not found.', 404);
60
+ }
61
+ async function loadWorkflow(input: { recordId: string; approvalRequestId: string },
62
+ snapshot?: Awaited<ReturnType<ReturnType<typeof dataStore>['get']>>) {
63
+ const row = snapshot ?? await dataStore().get('application', 'record-deletions', input.approvalRequestId);
64
+ const workflow = row?.value as Workflow | undefined;
65
+ if (!row || !workflow || workflow.kind !== 'record-deletion' || workflow.schemaVersion !== 1 ||
66
+ workflow.approval?.id !== input.approvalRequestId || workflow.approval.action !== ACTION ||
67
+ workflow.approval.resource?.id !== input.recordId || workflow.approval.resource.type !== 'record' ||
68
+ workflow.approval.slice !== '${name}' || workflow.approval.schemaVersion !== 1 ||
69
+ !Number.isInteger(workflow.approval.revision) || workflow.approval.revision < 0 ||
70
+ workflow.lifecycle?.kind !== 'data-deletion' || workflow.lifecycle.version !== 1 ||
71
+ workflow.lifecycle.scopeRef !== productRecordReference(input.recordId) ||
72
+ workflow.lifecycle.requestRef !== approvalReference(input.approvalRequestId) ||
73
+ typeof workflow.lifecycle.policyVersion !== 'string' || !/^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$/.test(workflow.lifecycle.policyVersion))
74
+ failure('deletion_workflow_invalid', 'The exact deletion workflow was not found or is malformed.', 404);
75
+ if (workflow.lifecycle.categoryId !== 'product-record' || workflow.lifecycle.primaryLocationId !== 'primary-database' ||
76
+ workflow.lifecycle.approvalRequirement !== 'required' || !Array.isArray(workflow.lifecycle.downstreamCopies) || workflow.lifecycle.downstreamCopies.length !== 1 ||
77
+ workflow.lifecycle.downstreamCopies[0]?.copyId !== COPY)
78
+ failure('deletion_workflow_invalid', 'The deletion workflow has an invalid resource or propagation contract.');
79
+ if (workflow.approval.status === 'executed' &&
80
+ (workflow.approval.execution?.executionId !== 'deletion:' + input.approvalRequestId ||
81
+ !workflow.approval.execution.completedAt || workflow.approval.decision?.outcome !== 'approved' ||
82
+ workflow.lifecycle.status !== 'completed' || workflow.lifecycle.primaryStatus !== 'completed' ||
83
+ workflow.lifecycle.downstreamCopies[0].status !== 'completed'))
84
+ failure('deletion_workflow_invalid', 'The deletion workflow lacks completed execution and propagation evidence.');
85
+ return { workflow, version: row.version };
86
+ }
87
+ async function load(input: Command & { approvalRequestId: string }) {
88
+ const retained = await loadWorkflow(input);
89
+ if (retained.workflow.lifecycle.primaryStatus !== 'completed' &&
90
+ (retained.workflow.approval.policyVersion !== AUTHORIZATION_POLICY_VERSION ||
91
+ retained.workflow.lifecycle.policyVersion !== DATA_RIGHTS_POLICY_VERSION))
92
+ failure('deletion_policy_stale', 'The deletion approval policy has changed.');
93
+ if (input.principal.kind !== 'admin' && retained.workflow.approval.author?.actorId !== input.principal.actor.id)
94
+ failure('deletion_workflow_invalid', 'The exact deletion workflow was not found or is malformed.', 404);
95
+ return retained;
96
+ }
97
+ function requireCommittedExecution(workflow: Workflow, approvalRequestId: string) {
98
+ if (workflow.approval.status !== 'executing' || workflow.lifecycle.primaryStatus !== 'completed' ||
99
+ workflow.approval.decision?.outcome !== 'approved' ||
100
+ workflow.approval.execution?.executionId !== 'deletion:' + approvalRequestId ||
101
+ typeof workflow.approval.policyVersion !== 'string' || !workflow.approval.policyVersion)
102
+ failure('deletion_workflow_invalid', 'Deletion completion lacks its exact approved execution.');
103
+ }
104
+ function workflowChange(workflow: Workflow, expectedVersion: number): KeyValueChange {
105
+ return { action: 'put', collection: 'record-deletions', id: workflow.approval.id, expectedVersion, value: workflow };
106
+ }
107
+ function audit(input: Command & { approvalRequestId: string }, now: string, purposeCode: string) {
108
+ return dataRightsAuditChange({ action: 'deletion', approvalRequestId: input.approvalRequestId,
109
+ principal: input.principal, recordId: input.recordId, correlationId: input.correlationId,
110
+ now, outcome: 'succeeded', purposeCode, summary: 'A bounded record deletion workflow transition was committed.' });
111
+ }
112
+ async function commit(input: Parameters<ReturnType<typeof dataStore>['commit']>[0]) {
113
+ try { await dataStore().commit(input); }
114
+ catch (error) {
115
+ if (error instanceof Error && error.name === 'TransactionCanceledException' &&
116
+ (error as Error & { CancellationReasons?: Array<{ Code?: string }> }).CancellationReasons?.some(reason => reason.Code === 'ConditionalCheckFailed'))
117
+ failure('deletion_conflict', 'The record, hold or approval changed concurrently; retry the exact request.');
118
+ throw error;
119
+ }
120
+ }
121
+
122
+ export async function requestRecordDeletion(input: Command & { reasonCode: string }) {
123
+ validateInput(input);
124
+ const now = canonicalDataRightsNow(input.now);
125
+ const row = await dataStore().get('application', 'records', input.recordId);
126
+ if (!row) failure('record_not_found', 'The record was not found.', 404);
127
+ recordAuthority(row.value, input);
128
+ const approval = createApprovalRequest({ ...digestInput(input.recordId, input.reasonCode),
129
+ author: input.principal, expiresAt: plusDataRightsDays(now, 1), now,
130
+ policyVersion: AUTHORIZATION_POLICY_VERSION, slice: '${name}' });
131
+ const lifecycle = createDataLifecycleDeletionRequest({ approvalRequirement: 'required',
132
+ categoryId: 'product-record', createdAt: now, downstreamCopyIds: [COPY],
133
+ policyVersion: DATA_RIGHTS_POLICY_VERSION, primaryLocationId: 'primary-database',
134
+ requestRef: approvalReference(approval.id), scopeRef: productRecordReference(input.recordId) });
135
+ await commit({ tenantId: 'application', changes: [
136
+ { action: 'check', collection: 'records', id: input.recordId, expectedVersion: row.version },
137
+ workflowChange({ kind: 'record-deletion', schemaVersion: 1, approval, lifecycle }, 0),
138
+ audit({ ...input, approvalRequestId: approval.id }, now, 'approval-pending'),
139
+ ] });
140
+ return { approvalRequestId: approval.id, expiresAt: approval.expiresAt, requestDigest: approval.requestDigest, status: 'pending' as const };
141
+ }
142
+
143
+ export async function decideRecordDeletion(input: Command & {
144
+ approvalRequestId: string; expectedRequestDigest: string; outcome: string; reasonReference: string;
145
+ }) {
146
+ validateInput(input); requireDirectAdmin(input.principal);
147
+ if (input.outcome !== 'approved' && input.outcome !== 'rejected')
148
+ failure('approval_outcome_invalid', 'The approval outcome is invalid.', 400);
149
+ const { workflow, version } = await load(input);
150
+ const now = canonicalDataRightsNow(input.now);
151
+ const decision = decideApprovalRequest(workflow.approval, { approver: input.principal,
152
+ expectedRequestDigest: input.expectedRequestDigest, now, outcome: input.outcome,
153
+ reasonReference: input.reasonReference, requiredPolicyVersion: AUTHORIZATION_POLICY_VERSION });
154
+ assertAuthorizationAllowed(decision.decision);
155
+ const next = { ...workflow, approval: decision.request,
156
+ lifecycle: decision.request.status === 'rejected'
157
+ ? transitionDataLifecycleDeletion(workflow.lifecycle, { at: now, reasonCode: 'approval-rejected', type: 'reject' })
158
+ : workflow.lifecycle };
159
+ await commit({ tenantId: 'application', changes: [workflowChange(next, version), audit(input, now, 'approval-' + input.outcome)] });
160
+ return { approvalRequestId: decision.request.id, status: decision.request.status as 'approved' | 'rejected' };
161
+ }
162
+
163
+ async function prepare(input: Execution) {
164
+ validateInput(input);
165
+ const now = canonicalDataRightsNow(input.now);
166
+ const { workflow, version } = await load(input);
167
+ if (digestApprovalRequest(digestInput(input.recordId, input.reasonCode)) !== workflow.approval.requestDigest)
168
+ failure('deletion_command_mismatch', 'The deletion command differs from the approved request.');
169
+ if (workflow.approval.status === 'executed' && workflow.lifecycle.status === 'completed') return 'completed';
170
+ if (workflow.lifecycle.primaryStatus === 'completed') {
171
+ requireCommittedExecution(workflow, input.approvalRequestId);
172
+ return 'pending';
173
+ }
174
+ const begun = beginApprovalExecution(workflow.approval, { ...digestInput(input.recordId, input.reasonCode),
175
+ executionId: 'deletion:' + input.approvalRequestId, now, requiredPolicyVersion: AUTHORIZATION_POLICY_VERSION });
176
+ assertAuthorizationAllowed(begun.decision);
177
+ const row = await dataStore().get('application', 'records', input.recordId);
178
+ if (!row) failure('record_not_found', 'The record was not found.', 404);
179
+ recordAuthority(row.value, input);
180
+ const holds = await loadActiveRecordHolds(input.recordId, now, 'deletion');
181
+ let lifecycle = transitionDataLifecycleDeletion(workflow.lifecycle, { type: 'verify', at: now,
182
+ authorityRef: dataRightsSubjectReference(input.principal.actor.id),
183
+ approvalRef: approvalReference(input.approvalRequestId), holds: holds.holds });
184
+ if (lifecycle.status === 'held') {
185
+ await commit({ tenantId: 'application', changes: [holds.check, workflowChange({ ...workflow, lifecycle }, version)] });
186
+ return 'held';
187
+ }
188
+ lifecycle = transitionDataLifecycleDeletion(lifecycle, { at: now, type: 'start-primary' });
189
+ lifecycle = transitionDataLifecycleDeletion(lifecycle, { at: now, type: 'complete-primary', outcomeCode: 'deleted' });
190
+ const ledger = createDataLifecycleLedgerEntry({ action: 'deletion', categoryId: 'product-record',
191
+ effectiveAt: now, expiresAt: plusDataRightsDays(now, 400), policyVersion: DATA_RIGHTS_POLICY_VERSION,
192
+ pseudonymousKey: productRecordReference(input.recordId) });
193
+ const entry = buildEventEntry(${pascalName}DataLifecycleChanged,
194
+ create${pascalName}DataLifecycleChanged({ action: 'deletion', occurredAt: now,
195
+ policyVersion: DATA_RIGHTS_POLICY_VERSION, recordId: input.recordId, requestRef: approvalReference(input.approvalRequestId) }),
196
+ { busName: process.env.EVENT_BUS_NAME ?? '', stage: process.env.EBK_STAGE ?? '',
197
+ context: { correlationId: input.correlationId, tenantId: 'application' },
198
+ eventId: input.approvalRequestId, occurredAt: now }).entry;
199
+ // No event can exist without its primary deletion, ledger and execution claim.
200
+ // The hold-set check covers both a changed hold and a concurrently inserted first hold.
201
+ await commit({ tenantId: 'application', changes: [
202
+ { action: 'delete', collection: 'records', id: input.recordId, expectedVersion: row.version },
203
+ holds.check,
204
+ workflowChange({ ...workflow, approval: begun.request, lifecycle }, version),
205
+ { action: 'put', collection: COMPLETIONS, id: input.approvalRequestId, expectedVersion: 0,
206
+ value: { kind: 'record-deletion-completion', schemaVersion: 1, recordId: input.recordId } },
207
+ { action: 'put', collection: 'data-lifecycle-ledger', id: input.approvalRequestId, expectedVersion: 0, value: ledger },
208
+ audit(input, now, 'primary-deleted'),
209
+ ], events: [entry], retainEventsUntilAcknowledged: true });
210
+ return 'pending';
211
+ }
212
+
213
+ async function finish(input: Execution, published: boolean) {
214
+ return finishRetained(input, await load(input), published);
215
+ }
216
+ async function finishRetained(input: Command & { approvalRequestId: string },
217
+ { workflow, version }: Awaited<ReturnType<typeof loadWorkflow>>, published: boolean) {
218
+ if (workflow.approval.status === 'executed' && workflow.lifecycle.status === 'completed') return;
219
+ requireCommittedExecution(workflow, input.approvalRequestId);
220
+ const completion = await dataStore().get('application', COMPLETIONS, input.approvalRequestId);
221
+ const pending = completion?.value as { kind?: string; schemaVersion?: number; recordId?: string } | undefined;
222
+ if (!completion || pending?.kind !== 'record-deletion-completion' || pending.schemaVersion !== 1 || pending.recordId !== input.recordId)
223
+ failure('deletion_workflow_invalid', 'Deletion completion lacks its atomic pending-work binding.');
224
+ const now = canonicalDataRightsNow(input.now);
225
+ let lifecycle = workflow.lifecycle;
226
+ if (lifecycle.status === 'failed') lifecycle = transitionDataLifecycleDeletion(lifecycle, { at: now, type: 'retry' });
227
+ lifecycle = transitionDataLifecycleDeletion(lifecycle, { at: now, copyId: COPY, type: 'start-copy' });
228
+ lifecycle = transitionDataLifecycleDeletion(lifecycle, published
229
+ ? { at: now, copyId: COPY, type: 'complete-copy', outcomeCode: 'acknowledged' }
230
+ : { at: now, copyId: COPY, type: 'fail-copy', errorCode: 'event-publication-failed' });
231
+ let approval = workflow.approval;
232
+ if (published) {
233
+ const completed = completeApprovalExecution(approval, { executionId: 'deletion:' + input.approvalRequestId,
234
+ now, requiredPolicyVersion: approval.policyVersion });
235
+ assertAuthorizationAllowed(completed.decision); approval = completed.request;
236
+ }
237
+ await commit({ tenantId: 'application', changes: [workflowChange({ ...workflow, approval, lifecycle }, version),
238
+ ...(published ? [audit(input, now, 'approval-executed'),
239
+ { action: 'delete' as const, collection: COMPLETIONS, id: input.approvalRequestId, expectedVersion: completion.version }] : []),
240
+ ], ...(published ? { acknowledgeEvents: [input.approvalRequestId] } : {}) });
241
+ }
242
+
243
+ /** Finish an already-authorized, committed primary deletion. This cannot begin
244
+ * a deletion or approve a request; delivery and the exact execution are re-read. */
245
+ export async function completePendingRecordDeletion(approvalRequestId: string, expectedRecordId?: string): Promise<boolean> {
246
+ const row = await dataStore().get('application', 'record-deletions', approvalRequestId);
247
+ if (!row) {
248
+ if (expectedRecordId !== undefined) failure('deletion_workflow_invalid', 'Pending deletion lacks its retained workflow.');
249
+ return true; // Other event kinds do not have deletion workflows.
250
+ }
251
+ const recordId = (row.value as Workflow)?.approval?.resource?.id;
252
+ if (typeof recordId !== 'string' || expectedRecordId !== undefined && recordId !== expectedRecordId)
253
+ failure('deletion_workflow_invalid', 'Deletion completion lacks its exact record identity.');
254
+ const retained = await loadWorkflow({ recordId, approvalRequestId }, row);
255
+ const { workflow } = retained;
256
+ if (workflow.approval.status === 'executed') return true;
257
+ if (expectedRecordId === undefined && (workflow.approval.status !== 'executing' || workflow.lifecycle.primaryStatus !== 'completed')) return false;
258
+ requireCommittedExecution(workflow, approvalRequestId);
259
+ if (await dispatchEventIntent(approvalRequestId) !== 'published') return false;
260
+ const identity = '${name}:event-delivery';
261
+ const principal: AuthorizationPrincipal = { kind: 'agent', actor: { id: identity, type: 'service' },
262
+ subject: { id: identity, type: 'service' }, authority: { mode: 'machine', machineIdentityId: identity },
263
+ audience: identity, roles: [], scopes: [] };
264
+ await finishRetained({ principal, recordId, approvalRequestId, correlationId: 'deletion:' + approvalRequestId }, retained, true);
265
+ return true;
266
+ }
267
+
268
+ /** Recover completion even if a worker died after acknowledging publication.
269
+ * Published intents leave the outbox index, so use a separate bounded cursor. */
270
+ export async function reconcileRecordDeletions() {
271
+ const store = dataStore(), id = 'deletion-completion';
272
+ const checkpoint = await store.get('system', 'event-reconciliation', id);
273
+ const afterId = (checkpoint?.value as { afterId?: string | null } | undefined)?.afterId;
274
+ if (checkpoint && afterId !== null && typeof afterId !== 'string') throw new Error('Deletion completion cursor is malformed.');
275
+ const page = await store.list('application', COMPLETIONS, { limit: 25, ...(afterId ? { afterId } : {}) });
276
+ const summary = { completed: 0, pending: 0, failed: 0, deferred: 0, remaining: false };
277
+ for (const row of page.records) {
278
+ try {
279
+ const pending = row.value as { kind?: string; schemaVersion?: number; recordId?: string;
280
+ failure?: { at: string; attempts: number; code: string; nextAttemptAt: string } };
281
+ if (pending.kind !== 'record-deletion-completion' || pending.schemaVersion !== 1 || typeof pending.recordId !== 'string')
282
+ failure('deletion_workflow_invalid', 'Deletion pending-work binding is malformed.');
283
+ if (pending.failure) {
284
+ if (pending.failure.code !== 'deletion-completion-failed' || !Number.isSafeInteger(pending.failure.attempts) ||
285
+ pending.failure.attempts < 1 || pending.failure.attempts > 16 ||
286
+ canonicalDataRightsNow(pending.failure.at) !== pending.failure.at ||
287
+ canonicalDataRightsNow(pending.failure.nextAttemptAt) !== pending.failure.nextAttemptAt ||
288
+ Date.parse(pending.failure.nextAttemptAt) <= Date.parse(pending.failure.at) ||
289
+ Date.parse(pending.failure.nextAttemptAt) - Date.parse(pending.failure.at) > 3_600_000)
290
+ failure('deletion_workflow_invalid', 'Deletion completion retry metadata is malformed.');
291
+ if (Date.parse(pending.failure.nextAttemptAt) > Date.now()) {
292
+ summary.pending++; summary.deferred++; continue;
293
+ }
294
+ }
295
+ if (await completePendingRecordDeletion(row.id, pending.recordId)) summary.completed++;
296
+ else summary.pending++;
297
+ } catch (error) {
298
+ // A concurrent caller may have atomically completed and removed this work.
299
+ // Re-read only on an optimistic conflict; never resurrect the old row or
300
+ // accept an unrelated/malformed terminal workflow as successful completion.
301
+ if (error instanceof RuntimeError && error.code === 'deletion_conflict') {
302
+ const pending = row.value as { recordId?: string };
303
+ if (typeof pending.recordId === 'string') {
304
+ const latest = await loadWorkflow({ recordId: pending.recordId, approvalRequestId: row.id });
305
+ if (latest.workflow.approval.status === 'executed' &&
306
+ !await store.get('application', COMPLETIONS, row.id)) {
307
+ summary.completed++;
308
+ continue;
309
+ }
310
+ }
311
+ }
312
+ summary.failed++;
313
+ // Durable, content-free operational evidence remains on the pending item.
314
+ // A failed conditional write also fails the invocation; never silently skip it.
315
+ const previousAttempts = (row.value as { failure?: { attempts?: number } }).failure?.attempts;
316
+ const attempts = Math.min(Number.isSafeInteger(previousAttempts) && previousAttempts! > 0 ? previousAttempts! + 1 : 1, 16);
317
+ const at = canonicalDataRightsNow();
318
+ const nextAttemptAt = new Date(Date.parse(at) + Math.min(60_000 * 2 ** (attempts - 1), 3_600_000)).toISOString();
319
+ await store.commit({ tenantId: 'application', changes: [{ action: 'put', collection: COMPLETIONS,
320
+ id: row.id, expectedVersion: row.version, value: { ...(row.value as object),
321
+ failure: { code: 'deletion-completion-failed', at, attempts, nextAttemptAt } } }] });
322
+ }
323
+ }
324
+ await store.commit({ tenantId: 'system', changes: [{ action: 'put', collection: 'event-reconciliation', id,
325
+ expectedVersion: checkpoint?.version ?? 0, value: { afterId: page.nextId ?? null } }] });
326
+ // Page counters are not global health. A one-row strongly consistent probe
327
+ // keeps earlier failed/deferred obligations visible after the cursor moves.
328
+ summary.remaining = (await store.list('application', COMPLETIONS, { limit: 1 })).records.length > 0;
329
+ if (summary.failed) failure('deletion_reconciliation_failed', 'Deletion completion failed; inspect the retained pending-work failure markers and retry reconciliation.', 503);
330
+ return summary;
331
+ }
332
+
333
+ export async function deleteRecord(input: Execution) {
334
+ const prepared = await prepare(input);
335
+ if (prepared === 'held') failure('data_deletion_held', 'Deletion is blocked by an active hold.');
336
+ if (prepared === 'completed') return { deleted: true, id: input.recordId };
337
+ let delivery: Awaited<ReturnType<typeof dispatchEventIntent>> = 'retry-required';
338
+ try { delivery = await dispatchEventIntent(input.approvalRequestId); } catch { /* durable intent remains retryable */ }
339
+ // The primary transaction is committed. A competing delivery owner is not a
340
+ // failed copy and cannot supply publication/completed-approval evidence.
341
+ if (delivery === 'delivery-pending') return { deleted: true, id: input.recordId, deliveryPending: true };
342
+ const published = delivery === 'published';
343
+ await finish(input, published);
344
+ if (!published) failure('data_deletion_retry_required', 'Deletion propagation requires retry.', 503);
345
+ return { deleted: true, id: input.recordId };
346
+ }
347
+ `,
348
+ 'database/deletions.ts': `import type { RuntimeHttpEvent } from '@empire-builder-kit/runtime';
349
+ import type { AuthorizationPrincipal } from '@empire-builder-kit/runtime/authorization';
350
+ import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
351
+ import { ${prefix}RequestRecordDeletion, ${prefix}DecideRecordDeletion, ${prefix}DeleteRecord } from '../api/contracts/protected.js';
352
+ import { authorize${pascalName}DataRightsOperation } from '../authorization/runtime.js';
353
+ import { requestRecordDeletion, decideRecordDeletion, deleteRecord } from '../data/record-deletion.js';
354
+
355
+ export const requestDeletionHandler = createContractHttpJsonHandler<typeof ${prefix}RequestRecordDeletion, RuntimeHttpEvent, AuthorizationPrincipal>({
356
+ component: 'database-records', operation: ${prefix}RequestRecordDeletion, workspace: '${workspace}',
357
+ authorize: authorize${pascalName}DataRightsOperation,
358
+ handle: ({ context, principal, request }) => requestRecordDeletion({ principal, correlationId: context.correlationId,
359
+ recordId: request.path.recordId, reasonCode: request.body.reasonCode }),
360
+ });
361
+ export const decideDeletionHandler = createContractHttpJsonHandler<typeof ${prefix}DecideRecordDeletion, RuntimeHttpEvent, AuthorizationPrincipal>({
362
+ component: 'database-records', operation: ${prefix}DecideRecordDeletion, workspace: '${workspace}',
363
+ authorize: authorize${pascalName}DataRightsOperation,
364
+ handle: ({ context, principal, request }) => decideRecordDeletion({ principal, correlationId: context.correlationId,
365
+ recordId: request.path.recordId, approvalRequestId: request.path.approvalRequestId,
366
+ expectedRequestDigest: request.body.expectedRequestDigest, outcome: request.body.outcome, reasonReference: request.body.reasonReference }),
367
+ });
368
+ export const deleteHandler = createContractHttpJsonHandler<typeof ${prefix}DeleteRecord, RuntimeHttpEvent, AuthorizationPrincipal>({
369
+ component: 'database-records', operation: ${prefix}DeleteRecord, workspace: '${workspace}',
370
+ authorize: authorize${pascalName}DataRightsOperation,
371
+ handle: ({ context, principal, request }) => deleteRecord({ principal, correlationId: context.correlationId,
372
+ recordId: request.path.recordId, approvalRequestId: request.query.approvalRequestId, reasonCode: request.query.reasonCode }),
373
+ });
374
+ `,
375
+ };
376
+ }
377
+ //# sourceMappingURL=built-in-plan-key-value-deletion.js.map
@@ -0,0 +1,2 @@
1
+ /** Streams are prompt delivery; retained intents and persisted cursors are the recovery path. */
2
+ export declare function renderKeyValueDeliverySource(name: string): string;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValueDeliverySource = renderKeyValueDeliverySource;
4
+ /** Streams are prompt delivery; retained intents and persisted cursors are the recovery path. */
5
+ function renderKeyValueDeliverySource(name) {
6
+ return `import { EventBridgeClient, PutEventsCommand } from '@aws-sdk/client-eventbridge';
7
+ import { DYNAMO_OUTBOX_SHARDS } from '@empire-builder-kit/runtime/key-value';
8
+ import type { PublishableEventEntry } from '@empire-builder-kit/runtime/events';
9
+ import { dataStore } from '../data/key-value.js';
10
+ import { reconcileRecordDeletions } from '../data/record-deletion.js';
11
+
12
+ const client = new EventBridgeClient({ maxAttempts: 2 });
13
+ type Store = ReturnType<typeof dataStore>;
14
+ type Cursor = NonNullable<Awaited<ReturnType<Store['listPending']>>['cursor']>;
15
+ // Only the provider fields consumed below are part of this handler's input.
16
+ // No ambient aws-lambda package is required by the generated application.
17
+ interface DynamoDBStreamEvent {
18
+ Records: Array<{
19
+ eventName?: string; eventSource?: string; eventSourceARN?: string;
20
+ dynamodb?: {
21
+ SequenceNumber?: string;
22
+ Keys?: Record<string, { S?: string }>;
23
+ NewImage?: Record<string, { S?: string }>;
24
+ };
25
+ }>;
26
+ }
27
+
28
+ async function publish(entry: PublishableEventEntry): Promise<void> {
29
+ const result = await client.send(new PutEventsCommand({ Entries: [{
30
+ Source: entry.source, DetailType: entry.detailType, Detail: entry.detail,
31
+ EventBusName: entry.eventBusName,
32
+ }] }), { abortSignal: AbortSignal.timeout(25_000) });
33
+ if (result.FailedEntryCount !== 0 || result.Entries?.length !== 1 ||
34
+ result.Entries[0]?.ErrorCode || !result.Entries[0]?.EventId)
35
+ throw new Error('EventBridge did not acknowledge this event intent.');
36
+ }
37
+
38
+ const delivered = (result: Awaited<ReturnType<Store['dispatch']>>) =>
39
+ result === 'published' || result === 'already-published';
40
+
41
+ /** The API and background workers share the same durable lease/acknowledgement path. */
42
+ export async function dispatchEventIntent(id: string): Promise<'published' | 'delivery-pending' | 'retry-required'> {
43
+ const result = await dataStore().dispatch(id, publish);
44
+ return delivered(result) ? 'published' : result === 'busy' ? 'delivery-pending' : 'retry-required';
45
+ }
46
+
47
+ export async function stream(event: DynamoDBStreamEvent) {
48
+ const streamArn = process.env.EBK_KEY_VALUE_STREAM_ARN;
49
+ if (!streamArn || !Array.isArray(event?.Records) || event.Records.length > 100 ||
50
+ event.Records.some((record) => record.eventSource !== 'aws:dynamodb' ||
51
+ record.eventSourceARN !== streamArn ||
52
+ !/^[0-9]{1,128}$/.test(record.dynamodb?.SequenceNumber ?? '')))
53
+ throw new Error('DynamoDB delivery requires the exact configured stream and bounded sequence records.');
54
+ const store = dataStore();
55
+ const batchItemFailures: Array<{ itemIdentifier: string }> = [];
56
+ for (const record of event.Records) {
57
+ const image = record.dynamodb?.NewImage;
58
+ // The provider filter is an efficiency aid, not an authorization boundary.
59
+ if (record.eventName !== 'INSERT' || image?.kind?.S !== 'outbox' || image.state?.S !== 'pending') continue;
60
+ try {
61
+ const id = image.sk?.S;
62
+ const scope = process.env.EBK_STAGE + '/${name}';
63
+ if (!id || image.scope?.S !== scope || record.dynamodb?.Keys?.sk?.S !== id ||
64
+ record.dynamodb.Keys.pk?.S !== image.pk?.S || !image.pk?.S?.startsWith(scope + '/outbox/'))
65
+ throw new Error('Stream intent identity differs from its table scope.');
66
+ // Re-read and validate the retained intent; never publish the untrusted stream image.
67
+ const result = await store.dispatch(id, publish);
68
+ // Another owner may be publishing the committed intent. Acknowledge this
69
+ // notification, not publication; the retained intent and sweep recover a
70
+ // dead owner after lease expiry.
71
+ if (!delivered(result) && result !== 'busy')
72
+ throw new Error('Durable intent needs another delivery attempt.');
73
+ } catch {
74
+ batchItemFailures.push({ itemIdentifier: record.dynamodb!.SequenceNumber! });
75
+ }
76
+ }
77
+ return { batchItemFailures };
78
+ }
79
+
80
+ export async function reconcile() {
81
+ const store = dataStore();
82
+ const summary = { kind: 'ebk-key-value-reconciliation', delivered: 0, deliveryPending: 0, retryRequired: 0, rejected: 0, shards: 0 };
83
+ // One page per shard per run bounds work and prevents a poison-filled first
84
+ // page from starving the remainder forever. Wrap after the final page.
85
+ for (let shard = 0; shard < DYNAMO_OUTBOX_SHARDS; shard++) {
86
+ const id = 'shard-' + shard;
87
+ const previous = await store.get('system', 'event-reconciliation', id);
88
+ const checkpoint = previous?.value as { cursor: Cursor | null } | undefined;
89
+ if (previous && (!checkpoint || typeof checkpoint !== 'object' || !Object.prototype.hasOwnProperty.call(checkpoint, 'cursor')))
90
+ throw new Error('Retained reconciliation checkpoint is malformed.');
91
+ const page = await store.listPending({ shard, limit: 25, cursor: checkpoint?.cursor ?? undefined });
92
+ summary.rejected += page.rejected.length;
93
+ if (page.rejected.length) console.warn(JSON.stringify({
94
+ kind: 'ebk-key-value-invalid-intents', shard, records: page.rejected,
95
+ }));
96
+ for (const intent of page.events) {
97
+ try {
98
+ const result = await store.dispatch(intent.id, publish);
99
+ if (delivered(result)) summary.delivered++;
100
+ else if (result === 'busy') summary.deliveryPending++;
101
+ else summary.retryRequired++;
102
+ } catch {
103
+ // Retain the row and advance the page. A later sweep retries it.
104
+ summary.retryRequired++;
105
+ }
106
+ }
107
+ await store.commit({ tenantId: 'system', changes: [{
108
+ action: 'put', collection: 'event-reconciliation', id,
109
+ expectedVersion: previous?.version ?? 0, value: { cursor: page.cursor ?? null },
110
+ }] });
111
+ summary.shards++;
112
+ }
113
+ const deletionCompletion = await reconcileRecordDeletions();
114
+ console.info(JSON.stringify({ ...summary, deletionCompletion }));
115
+ return { ...summary, deletionCompletion,
116
+ outcome: summary.rejected || summary.retryRequired || summary.deliveryPending || deletionCompletion.remaining || deletionCompletion.pending || deletionCompletion.failed ? 'partial' : 'completed' };
117
+ }
118
+ `;
119
+ }
120
+ //# sourceMappingURL=built-in-plan-key-value-delivery.js.map
@@ -0,0 +1,2 @@
1
+ /** Native export authority, publication and cleanup; no SQL compatibility adapter. */
2
+ export declare function renderKeyValueExportFiles(name: string, pascalName: string): Readonly<Record<string, string>>;