@empire-builder-kit/nx 1.0.0-rc.4 → 1.0.0-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (791) hide show
  1. package/README.md +18 -0
  2. package/executors.json +21 -1
  3. package/generators.json +10 -0
  4. package/package.json +31 -7
  5. package/src/aws/child-environment.d.ts +10 -0
  6. package/src/aws/child-environment.js +77 -0
  7. package/src/aws/identity.d.ts +13 -0
  8. package/src/aws/identity.js +41 -0
  9. package/src/aws-authority/index.d.ts +2 -0
  10. package/src/aws-authority/index.js +6 -0
  11. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  12. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  13. package/src/aws-authority/stage-authority.d.ts +248 -0
  14. package/src/aws-authority/stage-authority.js +3558 -0
  15. package/src/blueprints/external-sandbox.js +21 -9
  16. package/src/blueprints/manifest.d.ts +1 -1
  17. package/src/blueprints/resolver.js +28 -15
  18. package/src/cli/bootstrap.d.ts +1 -1
  19. package/src/cli/deploy-runtime.d.ts +6 -0
  20. package/src/cli/deploy-runtime.js +58 -0
  21. package/src/cli/dev-command.d.ts +16 -4
  22. package/src/cli/dev-command.js +63 -0
  23. package/src/cli/main.d.ts +9 -1
  24. package/src/cli/main.js +139 -20
  25. package/src/cli/output.d.ts +1 -1
  26. package/src/cli/output.js +1 -1
  27. package/src/developer-agent/context.js +41 -9
  28. package/src/developer-agent/generator-planning.js +20 -6
  29. package/src/developer-agent/git-inspection.d.ts +6 -2
  30. package/src/developer-agent/git-inspection.js +78 -6
  31. package/src/developer-agent/model.d.ts +5 -3
  32. package/src/developer-agent/model.js +4 -4
  33. package/src/developer-agent/operation-registry.d.ts +5 -0
  34. package/src/developer-agent/operation-registry.js +286 -40
  35. package/src/developer-agent/planning.js +16 -13
  36. package/src/developer-agent/preview-changes.d.ts +2 -0
  37. package/src/developer-agent/preview-changes.js +14 -2
  38. package/src/developer-agent/preview-source.js +3 -0
  39. package/src/developer-agent/validation.js +25 -9
  40. package/src/developer-agent/workspace-inspection.js +60 -5
  41. package/src/executors/blueprint-trust/blueprint-trust.js +6 -0
  42. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  43. package/src/executors/deployment-plan/deployment-plan.js +57 -2
  44. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  45. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  46. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  47. package/src/executors/dev-task-cleanup/schema.json +9 -0
  48. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  49. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  50. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  51. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  52. package/src/executors/fleet/fleet.js +1 -1
  53. package/src/executors/foundation-preflight/foundation-preflight.d.ts +1 -0
  54. package/src/executors/foundation-preflight/foundation-preflight.js +6 -2
  55. package/src/executors/foundation-preflight/schema.json +5 -0
  56. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +13 -2
  57. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -31
  58. package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +65 -0
  59. package/src/executors/foundation-profile-preflight/production-database-safeguard.js +223 -0
  60. package/src/executors/foundation-profile-preflight/schema.json +15 -4
  61. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
  62. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +70 -20
  63. package/src/executors/foundation-remove-preflight/schema.json +6 -1
  64. package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
  65. package/src/executors/github-bootstrap/github-bootstrap.js +3 -0
  66. package/src/executors/github-bootstrap/schema.json +7 -1
  67. package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +29 -136
  68. package/src/executors/infrastructure-plan/infrastructure-plan.js +230 -3282
  69. package/src/executors/infrastructure-plan/schema.json +12 -52
  70. package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
  71. package/src/executors/local-deploy/federated-credential-transport.js +252 -0
  72. package/src/executors/local-deploy/local-approval.d.ts +18 -0
  73. package/src/executors/local-deploy/local-approval.js +39 -0
  74. package/src/executors/local-deploy/local-deploy.d.ts +112 -0
  75. package/src/executors/local-deploy/local-deploy.js +1404 -0
  76. package/src/executors/local-deploy/schema.json +70 -0
  77. package/src/executors/refresh/refresh.js +2 -2
  78. package/src/executors/remove/remove.js +2 -2
  79. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +42 -0
  80. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +1229 -0
  81. package/src/executors/router-waf-rehearsal/schema.json +29 -0
  82. package/src/executors/secret-initialize/schema.json +42 -0
  83. package/src/executors/secret-initialize/secret-initialize.d.ts +34 -0
  84. package/src/executors/secret-initialize/secret-initialize.js +297 -0
  85. package/src/executors/secret-metadata/schema.json +5 -0
  86. package/src/executors/secret-metadata/secret-metadata.d.ts +16 -2
  87. package/src/executors/secret-metadata/secret-metadata.js +129 -30
  88. package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
  89. package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
  90. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +48 -0
  91. package/src/executors/sst-lifecycle/governed-native-operation.js +162 -0
  92. package/src/executors/sst-lifecycle/logging-preflight.d.ts +5 -0
  93. package/src/executors/sst-lifecycle/logging-preflight.js +23 -13
  94. package/src/executors/sst-lifecycle/run-sst-command.d.ts +40 -6
  95. package/src/executors/sst-lifecycle/run-sst-command.js +779 -70
  96. package/src/executors/sst-lifecycle/schema.json +8 -1
  97. package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
  98. package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
  99. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +33 -0
  100. package/src/executors/sst-lifecycle/sst-environment-source.js +267 -0
  101. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  102. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  103. package/src/executors/unlock/unlock.js +2 -2
  104. package/src/foundation/capability-plan.d.ts +43 -0
  105. package/src/foundation/capability-plan.js +168 -0
  106. package/src/foundation/discovery.d.ts +14 -11
  107. package/src/foundation/discovery.js +32 -6
  108. package/src/foundation/index.d.ts +4 -0
  109. package/src/foundation/index.js +11 -0
  110. package/src/foundation/local-database-contract.d.ts +20 -0
  111. package/src/foundation/local-database-contract.js +262 -13
  112. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  113. package/src/foundation/local-private-smoke-access.js +197 -0
  114. package/src/foundation/logging-preflight.js +1 -1
  115. package/src/foundation/logging.d.ts +3 -1
  116. package/src/foundation/logging.js +1 -1
  117. package/src/foundation/partial-state.d.ts +10 -0
  118. package/src/foundation/partial-state.js +21 -0
  119. package/src/foundation/preflight.js +37 -18
  120. package/src/foundation/private-smoke-access.d.ts +25 -0
  121. package/src/foundation/private-smoke-access.js +135 -0
  122. package/src/foundation/private-smoke-admission.d.ts +45 -0
  123. package/src/foundation/private-smoke-admission.js +180 -0
  124. package/src/foundation/private-smoke-control-plane.d.ts +18 -0
  125. package/src/foundation/private-smoke-control-plane.js +184 -0
  126. package/src/foundation/provision-database-bindings.d.ts +5 -0
  127. package/src/foundation/provision-database-bindings.js +41 -8
  128. package/src/foundation/provision-logical-database.js +15 -8
  129. package/src/foundation/requirements.d.ts +3 -3
  130. package/src/foundation/requirements.js +24 -12
  131. package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
  132. package/src/foundation/router-waf-rate-rehearsal.js +210 -0
  133. package/src/foundation/router-waf.d.ts +149 -0
  134. package/src/foundation/router-waf.js +809 -0
  135. package/src/foundation/stages.d.ts +1 -0
  136. package/src/foundation/stages.js +11 -0
  137. package/src/generators/blueprint/blueprint.d.ts +5 -0
  138. package/src/generators/blueprint/blueprint.js +102 -0
  139. package/src/generators/blueprint/files.d.ts +6 -0
  140. package/src/generators/blueprint/files.js +217 -0
  141. package/src/generators/blueprint/schema.d.ts +4 -0
  142. package/src/generators/blueprint/schema.json +18 -0
  143. package/src/generators/formatting.d.ts +8 -0
  144. package/src/generators/formatting.js +141 -0
  145. package/src/generators/function/function.js +38 -17
  146. package/src/generators/logging-registry.d.ts +2 -0
  147. package/src/generators/logging-registry.js +22 -0
  148. package/src/generators/post-generation-install.js +2 -2
  149. package/src/generators/preset/dependency-overrides.d.ts +8 -0
  150. package/src/generators/preset/dependency-overrides.js +55 -0
  151. package/src/generators/preset/generator.js +43 -3
  152. package/src/generators/preset/schema.d.ts +10 -0
  153. package/src/generators/preset/schema.json +47 -0
  154. package/src/generators/preset/tool-versions.d.ts +2 -0
  155. package/src/generators/preset/tool-versions.js +3 -1
  156. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  157. package/src/generators/preset/workspace-files-adopter-skills.js +303 -0
  158. package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
  159. package/src/generators/preset/workspace-files-ci-acceptance.js +791 -0
  160. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  161. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  162. package/src/generators/preset/workspace-files-developer-agent.d.ts +2 -0
  163. package/src/generators/preset/workspace-files-developer-agent.js +90 -28
  164. package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
  165. package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
  166. package/src/generators/preset/workspace-files-foundation-workload-roles.js +5 -2
  167. package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
  168. package/src/generators/preset/workspace-files-performance-cost.js +8 -8
  169. package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
  170. package/src/generators/preset/workspace-files-performance-load.js +39 -25
  171. package/src/generators/preset/workspace-files-stage-authority.d.ts +6 -0
  172. package/src/generators/preset/workspace-files-stage-authority.js +518 -0
  173. package/src/generators/preset/workspace-files-thin-deploy.d.ts +55 -0
  174. package/src/generators/preset/workspace-files-thin-deploy.js +2473 -0
  175. package/src/generators/preset/workspace-files-thin-docs.d.ts +7 -0
  176. package/src/generators/preset/workspace-files-thin-docs.js +352 -0
  177. package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
  178. package/src/generators/preset/workspace-files-thin-release.js +26 -0
  179. package/src/generators/preset/workspace-files-workload-role-baseline.js +254 -42
  180. package/src/generators/preset/workspace-files.d.ts +18 -2
  181. package/src/generators/preset/workspace-files.js +1504 -608
  182. package/src/generators/repository-policy/repository-policy.js +235 -5
  183. package/src/generators/repository-policy/schema.d.ts +10 -0
  184. package/src/generators/repository-policy/schema.json +80 -4
  185. package/src/generators/repository-policy/tree-policy.d.ts +3 -0
  186. package/src/generators/repository-policy/tree-policy.js +25 -0
  187. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  188. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  189. package/src/generators/slice/built-in-plan-api-files.js +130 -414
  190. package/src/generators/slice/built-in-plan-async-work-files.js +166 -1969
  191. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  192. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +60 -2
  193. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  194. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  195. package/src/generators/slice/built-in-plan-background-work-files.d.ts +2 -0
  196. package/src/generators/slice/built-in-plan-background-work-files.js +99 -0
  197. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  198. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
  199. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  200. package/src/generators/slice/built-in-plan-data-files.js +163 -1196
  201. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  202. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +37 -2
  203. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2443
  204. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +50 -8
  205. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  206. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +44 -25
  207. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +20 -1
  208. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  209. package/src/generators/slice/built-in-plan-foundation-files.js +39 -18
  210. package/src/generators/slice/built-in-plan-frontend-files.js +7 -3
  211. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  212. package/src/generators/slice/built-in-plan-infrastructure-files.js +933 -729
  213. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +67 -11
  214. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  215. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  216. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  217. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  218. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  219. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  220. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  221. package/src/generators/slice/built-in-plan-key-value-delivery.js +137 -0
  222. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  223. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  224. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  225. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  226. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  227. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  228. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  229. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  230. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  231. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  232. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  233. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  234. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  235. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  236. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  237. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  238. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  239. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  240. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  241. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  242. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  243. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  244. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  245. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  246. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  247. package/src/generators/slice/built-in-plan-metadata-files.js +157 -28
  248. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
  249. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +324 -0
  250. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  251. package/src/generators/slice/built-in-plan-operations-files.js +585 -97
  252. package/src/generators/slice/built-in-plan-performance-files.d.ts +2 -1
  253. package/src/generators/slice/built-in-plan-performance-files.js +220 -1074
  254. package/src/generators/slice/built-in-plan-project-files.js +141 -135
  255. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  256. package/src/generators/slice/built-in-plan-release-files.js +310 -70
  257. package/src/generators/slice/built-in-plan-reliability-files.d.ts +1 -1
  258. package/src/generators/slice/built-in-plan-reliability-files.js +279 -43
  259. package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
  260. package/src/generators/slice/built-in-plan-secret-runtime-files.js +87 -76
  261. package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
  262. package/src/generators/slice/built-in-plan-shared.js +41 -19
  263. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  264. package/src/generators/slice/built-in-plan-sql-events.js +276 -0
  265. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  266. package/src/generators/slice/built-in-plan-testing-files.js +304 -172
  267. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  268. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  269. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
  270. package/src/generators/slice/built-in-plan-thin-release-files.js +162 -0
  271. package/src/generators/slice/built-in-plan-verification-files.js +76 -2
  272. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  273. package/src/generators/slice/built-in-plan-web-files.js +223 -16
  274. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  275. package/src/generators/slice/built-in-plan-workload-role-files.js +143 -279
  276. package/src/generators/slice/built-in-plan.d.ts +11 -1
  277. package/src/generators/slice/built-in-plan.js +80 -29
  278. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  279. package/src/generators/slice/data-policy-review-seed.js +22 -0
  280. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  281. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  282. package/src/generators/slice/local-source-identity.d.ts +2 -0
  283. package/src/generators/slice/local-source-identity.js +31 -0
  284. package/src/generators/slice/persistence-contract.d.ts +14 -0
  285. package/src/generators/slice/persistence-contract.js +32 -0
  286. package/src/generators/slice/slice.js +61 -50
  287. package/src/generators/sql/schema.d.ts +7 -0
  288. package/src/generators/sql/schema.json +38 -0
  289. package/src/generators/sql/sql.d.ts +6 -0
  290. package/src/generators/sql/sql.js +53 -0
  291. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  292. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  293. package/src/generators/upgrade/upgrade.d.ts +15 -1
  294. package/src/generators/upgrade/upgrade.js +435 -44
  295. package/src/generators/workload/performance-registration.d.ts +1 -0
  296. package/src/generators/workload/performance-registration.js +9 -11
  297. package/src/generators/workload/service-performance-files.d.ts +1 -0
  298. package/src/generators/workload/service-performance-files.js +27 -7
  299. package/src/generators/workload/workload.d.ts +1 -1
  300. package/src/generators/workload/workload.js +105 -29
  301. package/src/git-policy/action-pins.d.ts +5 -0
  302. package/src/git-policy/action-pins.js +5 -0
  303. package/src/git-policy/github-bootstrap.d.ts +39 -8
  304. package/src/git-policy/github-bootstrap.js +329 -175
  305. package/src/git-policy/routing.d.ts +7 -1
  306. package/src/git-policy/routing.js +62 -1
  307. package/src/index.d.ts +1 -0
  308. package/src/index.js +1 -0
  309. package/src/infrastructure-change/local-capability.d.ts +73 -0
  310. package/src/infrastructure-change/local-capability.js +114 -0
  311. package/src/infrastructure-change/model.d.ts +25 -4
  312. package/src/infrastructure-change/model.js +1 -0
  313. package/src/infrastructure-change/normalize.d.ts +4 -0
  314. package/src/infrastructure-change/normalize.js +47 -7
  315. package/src/infrastructure-change/plan.d.ts +30 -3
  316. package/src/infrastructure-change/plan.js +323 -13
  317. package/src/infrastructure-change/risk.d.ts +3 -1
  318. package/src/infrastructure-change/risk.js +96 -16
  319. package/src/local-dev/browser-verification.d.ts +37 -0
  320. package/src/local-dev/browser-verification.js +281 -0
  321. package/src/local-dev/contracts.d.ts +10 -1
  322. package/src/local-dev/contracts.js +114 -13
  323. package/src/local-dev/dev-command-core.js +24 -5
  324. package/src/local-dev/docker-credential-health.d.ts +14 -0
  325. package/src/local-dev/docker-credential-health.js +94 -0
  326. package/src/local-dev/environment-inspector.d.ts +7 -0
  327. package/src/local-dev/environment-inspector.js +42 -15
  328. package/src/local-dev/environment-state.js +2 -2
  329. package/src/local-dev/errors.d.ts +1 -1
  330. package/src/local-dev/errors.js +2 -0
  331. package/src/local-dev/fleet-client.js +2 -2
  332. package/src/local-dev/fleet-configuration.js +57 -25
  333. package/src/local-dev/fleet-inventory.js +46 -18
  334. package/src/local-dev/fleet-ipc.d.ts +7 -0
  335. package/src/local-dev/fleet-ipc.js +14 -2
  336. package/src/local-dev/fleet-launcher.d.ts +6 -0
  337. package/src/local-dev/fleet-launcher.js +14 -2
  338. package/src/local-dev/fleet-logs.js +50 -22
  339. package/src/local-dev/fleet-process.d.ts +20 -1
  340. package/src/local-dev/fleet-process.js +197 -41
  341. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  342. package/src/local-dev/fleet-runner-evidence.js +56 -0
  343. package/src/local-dev/fleet-runtime.js +268 -229
  344. package/src/local-dev/fleet-session.d.ts +2 -0
  345. package/src/local-dev/fleet-session.js +28 -11
  346. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  347. package/src/local-dev/fleet-state.d.ts +5 -2
  348. package/src/local-dev/fleet-state.js +25 -4
  349. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  350. package/src/local-dev/fleet-supervisor.js +66 -11
  351. package/src/local-dev/fleet-web-start.d.ts +12 -0
  352. package/src/local-dev/fleet-web-start.js +48 -0
  353. package/src/local-dev/identity.js +3 -14
  354. package/src/local-dev/index.d.ts +1 -0
  355. package/src/local-dev/index.js +1 -0
  356. package/src/local-dev/native-completion.d.ts +9 -0
  357. package/src/local-dev/native-completion.js +130 -0
  358. package/src/local-dev/nx-workspace.d.ts +4 -2
  359. package/src/local-dev/nx-workspace.js +11 -6
  360. package/src/local-dev/personal-stage.d.ts +4 -5
  361. package/src/local-dev/personal-stage.js +6 -54
  362. package/src/local-dev/port-claims.d.ts +13 -0
  363. package/src/local-dev/port-claims.js +46 -0
  364. package/src/local-dev/ports.d.ts +14 -2
  365. package/src/local-dev/ports.js +78 -3
  366. package/src/local-dev/private-state.d.ts +11 -0
  367. package/src/local-dev/private-state.js +146 -40
  368. package/src/local-dev/process-group.d.ts +4 -0
  369. package/src/local-dev/process-group.js +29 -0
  370. package/src/local-dev/process-identity.d.ts +8 -0
  371. package/src/local-dev/process-identity.js +31 -1
  372. package/src/local-dev/proxy.js +11 -12
  373. package/src/local-dev/runtime-paths.js +1 -1
  374. package/src/local-dev/slice-claim.js +1 -1
  375. package/src/local-dev/slice-runner.d.ts +15 -6
  376. package/src/local-dev/slice-runner.js +189 -54
  377. package/src/local-dev/task-attachment.d.ts +17 -0
  378. package/src/local-dev/task-attachment.js +73 -0
  379. package/src/local-dev/task-authority.d.ts +10 -0
  380. package/src/local-dev/task-authority.js +27 -0
  381. package/src/local-dev/task-identity.d.ts +33 -0
  382. package/src/local-dev/task-identity.js +418 -0
  383. package/src/local-dev/task-native-writer.d.ts +18 -0
  384. package/src/local-dev/task-native-writer.js +329 -0
  385. package/src/local-dev/tls.js +8 -2
  386. package/src/local-dev/web-launch.d.ts +9 -0
  387. package/src/local-dev/web-launch.js +130 -0
  388. package/src/ownership/composition.d.ts +2 -1
  389. package/src/ownership/composition.js +1 -0
  390. package/src/performance/cost-collection.d.ts +1 -1
  391. package/src/performance/cost-collection.js +4 -2
  392. package/src/performance/cost-controls.d.ts +8 -4
  393. package/src/performance/cost-controls.js +39 -28
  394. package/src/performance/evidence.d.ts +1 -1
  395. package/src/performance/evidence.js +5 -3
  396. package/src/performance/load-safety.js +5 -3
  397. package/src/performance/model.d.ts +4 -4
  398. package/src/performance/model.js +4 -5
  399. package/src/performance/scenario.d.ts +22 -0
  400. package/src/performance/scenario.js +100 -92
  401. package/src/release/index.d.ts +0 -2
  402. package/src/release/index.js +0 -2
  403. package/src/release/source-authority.d.ts +5 -5
  404. package/src/release/source-authority.js +141 -124
  405. package/src/repository-policy/aurora-preflight.d.ts +1 -1
  406. package/src/repository-policy/aurora-preflight.js +4 -1
  407. package/src/repository-policy/capacity-migration.d.ts +3 -0
  408. package/src/repository-policy/capacity-migration.js +21 -0
  409. package/src/repository-policy/deployment-plan.d.ts +4 -1
  410. package/src/repository-policy/deployment-plan.js +9 -0
  411. package/src/repository-policy/foundation-profile.js +10 -1
  412. package/src/repository-policy/policy.d.ts +57 -3
  413. package/src/repository-policy/policy.js +497 -11
  414. package/src/schemas/blueprint-v1.json +5 -4
  415. package/src/schemas/foundation-requirement-v1.json +5 -4
  416. package/src/schemas/performance-policy-v1.json +3 -3
  417. package/src/schemas/repository-policy-v1.json +130 -6
  418. package/src/schemas/testing-evidence-result-v1.json +1 -1
  419. package/src/secrets/adapters.d.ts +7 -2
  420. package/src/secrets/adapters.js +34 -3
  421. package/src/secrets/aws-control-plane.d.ts +10 -1
  422. package/src/secrets/aws-control-plane.js +67 -0
  423. package/src/secrets/generated-aws-control-plane.d.ts +23 -0
  424. package/src/secrets/generated-aws-control-plane.js +259 -0
  425. package/src/secrets/metadata.js +38 -10
  426. package/src/secrets/model.d.ts +8 -1
  427. package/src/secrets/model.js +24 -3
  428. package/src/secrets/operator.d.ts +91 -3
  429. package/src/secrets/operator.js +463 -13
  430. package/src/secrets/registry.d.ts +2 -1
  431. package/src/secrets/registry.js +18 -1
  432. package/src/secrets/verification.js +9 -1
  433. package/src/secrets/workload-access.js +10 -2
  434. package/src/sst-environment-source-format.d.ts +6 -0
  435. package/src/sst-environment-source-format.js +199 -0
  436. package/src/supply-chain/action-pins.js +61 -7
  437. package/src/supply-chain/blueprint-trust-git.js +85 -24
  438. package/src/supply-chain/blueprint-verification-authority.js +55 -3
  439. package/src/supply-chain/build-output-bounds.d.ts +2 -0
  440. package/src/supply-chain/build-output-bounds.js +12 -0
  441. package/src/supply-chain/build-output.d.ts +7 -1
  442. package/src/supply-chain/build-output.js +177 -24
  443. package/src/supply-chain/ecr-scanning.d.ts +5 -3
  444. package/src/supply-chain/ecr-scanning.js +11 -7
  445. package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
  446. package/src/supply-chain/ecs-deployed-image.js +6 -4
  447. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  448. package/src/supply-chain/generated-command.js +1 -0
  449. package/src/supply-chain/generated-container-release-command.js +1285 -124
  450. package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
  451. package/src/supply-chain/generated-ecr-collector-command.js +200 -93
  452. package/src/supply-chain/generated-files.js +25 -14
  453. package/src/supply-chain/generated-scanner-command.js +2 -1
  454. package/src/supply-chain/index.d.ts +1 -1
  455. package/src/supply-chain/index.js +2 -1
  456. package/src/supply-chain/sbom.d.ts +1 -1
  457. package/src/supply-chain/sbom.js +30 -5
  458. package/src/supply-chain/scanner.js +3 -0
  459. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  460. package/src/testing-evidence/fixture-scope.js +4 -2
  461. package/src/testing-evidence/result.d.ts +2 -1
  462. package/src/testing-evidence/result.js +18 -4
  463. package/src/workload-roles/account-baseline.d.ts +11 -0
  464. package/src/workload-roles/account-baseline.js +253 -16
  465. package/src/workload-roles/authority.d.ts +3 -1
  466. package/src/workload-roles/authority.js +48 -2
  467. package/src/workload-roles/aws-s3-state.js +27 -0
  468. package/src/workload-roles/boundary.d.ts +2 -1
  469. package/src/workload-roles/boundary.js +9 -2
  470. package/src/workload-roles/handler.js +52 -24
  471. package/src/workload-roles/index.d.ts +10 -17
  472. package/src/workload-roles/index.js +5 -18
  473. package/src/workload-roles/injection.js +1 -1
  474. package/src/workload-roles/provisioner.js +12 -4
  475. package/src/workload-roles/registration.d.ts +1 -0
  476. package/src/workload-roles/registration.js +5 -0
  477. package/src/workload-roles/stage-boundary.js +1 -1
  478. package/src/workload-roles/standard-slice.js +3 -3
  479. package/src/workspace-deployment/affected-lifecycle.d.ts +53 -0
  480. package/src/workspace-deployment/affected-lifecycle.js +84 -0
  481. package/src/workspace-deployment/identity.d.ts +3 -0
  482. package/src/workspace-deployment/identity.js +22 -0
  483. package/src/workspace-deployment/index.d.ts +4 -0
  484. package/src/workspace-deployment/index.js +8 -0
  485. package/src/workspace-deployment/migration-evidence.d.ts +29 -0
  486. package/src/workspace-deployment/migration-evidence.js +83 -0
  487. package/src/workspace-deployment/migration.d.ts +27 -0
  488. package/src/workspace-deployment/migration.js +109 -0
  489. package/src/workspace-deployment/ownership.d.ts +81 -0
  490. package/src/workspace-deployment/ownership.js +381 -0
  491. package/src/api-contract/baseline-update.js.map +0 -1
  492. package/src/api-contract/compatibility.js.map +0 -1
  493. package/src/api-contract/contract-graph.js.map +0 -1
  494. package/src/api-contract/evidence.js.map +0 -1
  495. package/src/api-contract/index.js.map +0 -1
  496. package/src/api-contract/model.fixtures.d.ts +0 -2
  497. package/src/api-contract/model.fixtures.js +0 -81
  498. package/src/api-contract/model.fixtures.js.map +0 -1
  499. package/src/api-contract/model.js.map +0 -1
  500. package/src/api-contract/rollout.js.map +0 -1
  501. package/src/authorization/compatibility.js.map +0 -1
  502. package/src/authorization/index.js.map +0 -1
  503. package/src/blueprints/execution.js.map +0 -1
  504. package/src/blueprints/external-sandbox.js.map +0 -1
  505. package/src/blueprints/index.js.map +0 -1
  506. package/src/blueprints/inputs.js.map +0 -1
  507. package/src/blueprints/manifest.js.map +0 -1
  508. package/src/blueprints/resolver.js.map +0 -1
  509. package/src/blueprints/transitions.js.map +0 -1
  510. package/src/cli/agent-command.js.map +0 -1
  511. package/src/cli/agent-runtime.js.map +0 -1
  512. package/src/cli/blueprint-authority.js.map +0 -1
  513. package/src/cli/blueprint-command.js.map +0 -1
  514. package/src/cli/bootstrap.js.map +0 -1
  515. package/src/cli/dev-command.js.map +0 -1
  516. package/src/cli/main.js.map +0 -1
  517. package/src/cli/output.js.map +0 -1
  518. package/src/cli/personal-secret-runtime.js.map +0 -1
  519. package/src/cli/secret-terminal.js.map +0 -1
  520. package/src/container-images.js.map +0 -1
  521. package/src/data-lifecycle/index.js.map +0 -1
  522. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  523. package/src/data-lifecycle/model.fixtures.js +0 -244
  524. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  525. package/src/data-lifecycle/model.js.map +0 -1
  526. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  527. package/src/data-lifecycle/validation.js.map +0 -1
  528. package/src/database-retirement/contract.js.map +0 -1
  529. package/src/database-retirement/index.js.map +0 -1
  530. package/src/deterministic-order.js.map +0 -1
  531. package/src/developer-agent/context.js.map +0 -1
  532. package/src/developer-agent/generator-planning.js.map +0 -1
  533. package/src/developer-agent/generator-preview.js.map +0 -1
  534. package/src/developer-agent/git-inspection.js.map +0 -1
  535. package/src/developer-agent/handoff.js.map +0 -1
  536. package/src/developer-agent/index.js.map +0 -1
  537. package/src/developer-agent/model.js.map +0 -1
  538. package/src/developer-agent/operation-registry.js.map +0 -1
  539. package/src/developer-agent/ordering.js.map +0 -1
  540. package/src/developer-agent/planning.js.map +0 -1
  541. package/src/developer-agent/preview-changes.js.map +0 -1
  542. package/src/developer-agent/preview-source.js.map +0 -1
  543. package/src/developer-agent/validation.js.map +0 -1
  544. package/src/developer-agent/workspace-inspection.js.map +0 -1
  545. package/src/developer-agent/workspace-path.js.map +0 -1
  546. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  547. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  548. package/src/executors/deploy/deploy.js.map +0 -1
  549. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  550. package/src/executors/dev/dev.js.map +0 -1
  551. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  552. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  553. package/src/executors/developer-context/developer-context.js.map +0 -1
  554. package/src/executors/fleet/fleet.js.map +0 -1
  555. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  556. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  557. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  558. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  559. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  560. package/src/executors/refresh/refresh.js.map +0 -1
  561. package/src/executors/remove/remove.js.map +0 -1
  562. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  563. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  564. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  565. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  566. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  567. package/src/executors/unlock/unlock.js.map +0 -1
  568. package/src/executors/work-markers/work-markers.js.map +0 -1
  569. package/src/foundation/discovery.js.map +0 -1
  570. package/src/foundation/index.js.map +0 -1
  571. package/src/foundation/local-database-contract.js.map +0 -1
  572. package/src/foundation/logging-preflight.js.map +0 -1
  573. package/src/foundation/logging.js.map +0 -1
  574. package/src/foundation/preflight.js.map +0 -1
  575. package/src/foundation/provision-database-bindings.js.map +0 -1
  576. package/src/foundation/provision-logical-database.js.map +0 -1
  577. package/src/foundation/requirements.js.map +0 -1
  578. package/src/foundation/router-origin-proof.js.map +0 -1
  579. package/src/foundation/stages.js.map +0 -1
  580. package/src/frontend-security/index.js.map +0 -1
  581. package/src/frontend-security/security-headers.js.map +0 -1
  582. package/src/generators/feature-registry.js.map +0 -1
  583. package/src/generators/function/function.js.map +0 -1
  584. package/src/generators/job/job.js.map +0 -1
  585. package/src/generators/logging-registry.js.map +0 -1
  586. package/src/generators/post-generation-install.js.map +0 -1
  587. package/src/generators/preset/generator.js.map +0 -1
  588. package/src/generators/preset/tool-versions.js.map +0 -1
  589. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  590. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  591. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  592. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  593. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  594. package/src/generators/preset/workspace-files.js.map +0 -1
  595. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  596. package/src/generators/service/service.js.map +0 -1
  597. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  598. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  599. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  600. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  601. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  602. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  603. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  604. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  605. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  606. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  607. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  608. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  609. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  610. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  611. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  612. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  613. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  614. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  615. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  616. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  617. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  618. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  619. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  620. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  621. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  622. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  623. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  624. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  625. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  626. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  627. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  628. package/src/generators/slice/built-in-plan.js.map +0 -1
  629. package/src/generators/slice/slice.js.map +0 -1
  630. package/src/generators/upgrade/upgrade.js.map +0 -1
  631. package/src/generators/workload/frozen-container.js.map +0 -1
  632. package/src/generators/workload/performance-registration.js.map +0 -1
  633. package/src/generators/workload/reliability-registration.js.map +0 -1
  634. package/src/generators/workload/service-performance-files.js.map +0 -1
  635. package/src/generators/workload/workload.js.map +0 -1
  636. package/src/git-policy/action-pins.js.map +0 -1
  637. package/src/git-policy/github-bootstrap.js.map +0 -1
  638. package/src/git-policy/index.js.map +0 -1
  639. package/src/git-policy/routing.js.map +0 -1
  640. package/src/index.js.map +0 -1
  641. package/src/infrastructure-change/convergence.js.map +0 -1
  642. package/src/infrastructure-change/drift.js.map +0 -1
  643. package/src/infrastructure-change/index.js.map +0 -1
  644. package/src/infrastructure-change/model.js.map +0 -1
  645. package/src/infrastructure-change/normalize.js.map +0 -1
  646. package/src/infrastructure-change/plan.js.map +0 -1
  647. package/src/infrastructure-change/risk.js.map +0 -1
  648. package/src/infrastructure-change/summary.js.map +0 -1
  649. package/src/local-dev/context-discovery.js.map +0 -1
  650. package/src/local-dev/contract-validation.js.map +0 -1
  651. package/src/local-dev/contracts.js.map +0 -1
  652. package/src/local-dev/control-contract.js.map +0 -1
  653. package/src/local-dev/dev-command-core.js.map +0 -1
  654. package/src/local-dev/effects.js.map +0 -1
  655. package/src/local-dev/environment-inspector.js.map +0 -1
  656. package/src/local-dev/environment-state.js.map +0 -1
  657. package/src/local-dev/errors.js.map +0 -1
  658. package/src/local-dev/fleet-client.js.map +0 -1
  659. package/src/local-dev/fleet-configuration.js.map +0 -1
  660. package/src/local-dev/fleet-inventory.js.map +0 -1
  661. package/src/local-dev/fleet-ipc.js.map +0 -1
  662. package/src/local-dev/fleet-launcher.js.map +0 -1
  663. package/src/local-dev/fleet-lock.js.map +0 -1
  664. package/src/local-dev/fleet-logs.js.map +0 -1
  665. package/src/local-dev/fleet-process.js.map +0 -1
  666. package/src/local-dev/fleet-runtime.js.map +0 -1
  667. package/src/local-dev/fleet-session.js.map +0 -1
  668. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  669. package/src/local-dev/fleet-startup.js.map +0 -1
  670. package/src/local-dev/fleet-state.js.map +0 -1
  671. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  672. package/src/local-dev/fleet-supervisor.js.map +0 -1
  673. package/src/local-dev/gateway-daemon.js.map +0 -1
  674. package/src/local-dev/gateway.js.map +0 -1
  675. package/src/local-dev/identity.js.map +0 -1
  676. package/src/local-dev/index.js.map +0 -1
  677. package/src/local-dev/local-context.js.map +0 -1
  678. package/src/local-dev/nx-workspace.js.map +0 -1
  679. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  680. package/src/local-dev/personal-stage.js.map +0 -1
  681. package/src/local-dev/portless.js.map +0 -1
  682. package/src/local-dev/ports.js.map +0 -1
  683. package/src/local-dev/private-state.js.map +0 -1
  684. package/src/local-dev/process-identity.js.map +0 -1
  685. package/src/local-dev/proxy.js.map +0 -1
  686. package/src/local-dev/runtime-paths.js.map +0 -1
  687. package/src/local-dev/secret-slice-claim.js.map +0 -1
  688. package/src/local-dev/slice-claim.js.map +0 -1
  689. package/src/local-dev/slice-runner.js.map +0 -1
  690. package/src/local-dev/tls.js.map +0 -1
  691. package/src/ownership/composition.js.map +0 -1
  692. package/src/ownership/foundation-record.js.map +0 -1
  693. package/src/ownership/hash.js.map +0 -1
  694. package/src/ownership/index.js.map +0 -1
  695. package/src/ownership/json-ownership.js.map +0 -1
  696. package/src/ownership/record.js.map +0 -1
  697. package/src/ownership/workspace-record.js.map +0 -1
  698. package/src/performance/cost-collection.js.map +0 -1
  699. package/src/performance/cost-controls.js.map +0 -1
  700. package/src/performance/evidence.js.map +0 -1
  701. package/src/performance/index.js.map +0 -1
  702. package/src/performance/load-safety.js.map +0 -1
  703. package/src/performance/model.js.map +0 -1
  704. package/src/performance/pr-artifact-budget.js.map +0 -1
  705. package/src/performance/runner.js.map +0 -1
  706. package/src/performance/scenario-endpoint.js.map +0 -1
  707. package/src/performance/scenario.js.map +0 -1
  708. package/src/performance/test-fixtures.d.ts +0 -7
  709. package/src/performance/test-fixtures.js +0 -169
  710. package/src/performance/test-fixtures.js.map +0 -1
  711. package/src/performance/unit-cost.js.map +0 -1
  712. package/src/release/index.js.map +0 -1
  713. package/src/release/lifecycle.js.map +0 -1
  714. package/src/release/manifest.js.map +0 -1
  715. package/src/release/rollout.js.map +0 -1
  716. package/src/release/source-authority.js.map +0 -1
  717. package/src/repository-policy/aurora-preflight.js.map +0 -1
  718. package/src/repository-policy/deployment-plan.js.map +0 -1
  719. package/src/repository-policy/foundation-profile.js.map +0 -1
  720. package/src/repository-policy/index.js.map +0 -1
  721. package/src/repository-policy/policy.js.map +0 -1
  722. package/src/secrets/adapters.js.map +0 -1
  723. package/src/secrets/aws-control-plane.js.map +0 -1
  724. package/src/secrets/declaration-verification.js.map +0 -1
  725. package/src/secrets/guardrails.js.map +0 -1
  726. package/src/secrets/index.js.map +0 -1
  727. package/src/secrets/metadata.js.map +0 -1
  728. package/src/secrets/model.js.map +0 -1
  729. package/src/secrets/operator.js.map +0 -1
  730. package/src/secrets/permissions.js.map +0 -1
  731. package/src/secrets/personal-command.js.map +0 -1
  732. package/src/secrets/personal-ledger.js.map +0 -1
  733. package/src/secrets/registry.js.map +0 -1
  734. package/src/secrets/verification.js.map +0 -1
  735. package/src/secrets/workload-access.js.map +0 -1
  736. package/src/supply-chain/action-pins.js.map +0 -1
  737. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  738. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  739. package/src/supply-chain/blueprint-trust.js.map +0 -1
  740. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  741. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  742. package/src/supply-chain/build-output.js.map +0 -1
  743. package/src/supply-chain/common.js.map +0 -1
  744. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  745. package/src/supply-chain/container-release.js.map +0 -1
  746. package/src/supply-chain/ecr-applicability.js.map +0 -1
  747. package/src/supply-chain/ecr-scanning.js.map +0 -1
  748. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  749. package/src/supply-chain/errors.js.map +0 -1
  750. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  751. package/src/supply-chain/generated-command.js.map +0 -1
  752. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  753. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  754. package/src/supply-chain/generated-files.js.map +0 -1
  755. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  756. package/src/supply-chain/index.js.map +0 -1
  757. package/src/supply-chain/inventory.js.map +0 -1
  758. package/src/supply-chain/license-expression.js.map +0 -1
  759. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  760. package/src/supply-chain/policy.js.map +0 -1
  761. package/src/supply-chain/publication.js.map +0 -1
  762. package/src/supply-chain/sbom.js.map +0 -1
  763. package/src/supply-chain/scanner.js.map +0 -1
  764. package/src/supply-chain/vendored-source.js.map +0 -1
  765. package/src/testing-evidence/fixture-scope.js.map +0 -1
  766. package/src/testing-evidence/index.js.map +0 -1
  767. package/src/testing-evidence/quarantine.js.map +0 -1
  768. package/src/testing-evidence/result.js.map +0 -1
  769. package/src/testing-evidence/runner-adapter.js.map +0 -1
  770. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  771. package/src/validation.js.map +0 -1
  772. package/src/work-markers/index.js.map +0 -1
  773. package/src/work-markers/work-markers.js.map +0 -1
  774. package/src/workload-roles/account-baseline.js.map +0 -1
  775. package/src/workload-roles/authority.js.map +0 -1
  776. package/src/workload-roles/aws-adapter.js.map +0 -1
  777. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  778. package/src/workload-roles/aws-s3-state.js.map +0 -1
  779. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  780. package/src/workload-roles/boundary.js.map +0 -1
  781. package/src/workload-roles/convergence.js.map +0 -1
  782. package/src/workload-roles/effective-policy.js.map +0 -1
  783. package/src/workload-roles/handler.js.map +0 -1
  784. package/src/workload-roles/history.js.map +0 -1
  785. package/src/workload-roles/index.js.map +0 -1
  786. package/src/workload-roles/injection.js.map +0 -1
  787. package/src/workload-roles/manifest.js.map +0 -1
  788. package/src/workload-roles/provisioner.js.map +0 -1
  789. package/src/workload-roles/registration.js.map +0 -1
  790. package/src/workload-roles/stage-boundary.js.map +0 -1
  791. package/src/workload-roles/standard-slice.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,137 @@
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 { createMetricEmitter } from '@empire-builder-kit/runtime/observability';
9
+ import type { PublishableEventEntry } from '@empire-builder-kit/runtime/events';
10
+ import { dataStore } from '../data/key-value.js';
11
+ import { reconcileRecordDeletions } from '../data/record-deletion.js';
12
+
13
+ const client = new EventBridgeClient({ maxAttempts: 2 });
14
+ const metrics = createMetricEmitter();
15
+ type Store = ReturnType<typeof dataStore>;
16
+ type Cursor = NonNullable<Awaited<ReturnType<Store['listPending']>>['cursor']>;
17
+ // Only the provider fields consumed below are part of this handler's input.
18
+ // No ambient aws-lambda package is required by the generated application.
19
+ interface DynamoDBStreamEvent {
20
+ Records: Array<{
21
+ eventName?: string; eventSource?: string; eventSourceARN?: string;
22
+ dynamodb?: {
23
+ SequenceNumber?: string;
24
+ Keys?: Record<string, { S?: string }>;
25
+ NewImage?: Record<string, { S?: string }>;
26
+ };
27
+ }>;
28
+ }
29
+
30
+ async function publish(entry: PublishableEventEntry): Promise<void> {
31
+ const result = await client.send(new PutEventsCommand({ Entries: [{
32
+ Source: entry.source, DetailType: entry.detailType, Detail: entry.detail,
33
+ EventBusName: entry.eventBusName,
34
+ }] }), { abortSignal: AbortSignal.timeout(25_000) });
35
+ if (result.FailedEntryCount !== 0 || result.Entries?.length !== 1 ||
36
+ result.Entries[0]?.ErrorCode || !result.Entries[0]?.EventId)
37
+ throw new Error('EventBridge did not acknowledge this event intent.');
38
+ }
39
+
40
+ const delivered = (result: Awaited<ReturnType<Store['dispatch']>>) =>
41
+ result === 'published' || result === 'already-published';
42
+
43
+ /** The API and background workers share the same durable lease/acknowledgement path. */
44
+ export async function dispatchEventIntent(id: string): Promise<'published' | 'delivery-pending' | 'retry-required'> {
45
+ const result = await dataStore().dispatch(id, publish);
46
+ return delivered(result) ? 'published' : result === 'busy' ? 'delivery-pending' : 'retry-required';
47
+ }
48
+
49
+ export async function stream(event: DynamoDBStreamEvent) {
50
+ const streamArn = process.env.EBK_KEY_VALUE_STREAM_ARN;
51
+ if (!streamArn || !Array.isArray(event?.Records) || event.Records.length > 100 ||
52
+ event.Records.some((record) => record.eventSource !== 'aws:dynamodb' ||
53
+ record.eventSourceARN !== streamArn ||
54
+ !/^[0-9]{1,128}$/.test(record.dynamodb?.SequenceNumber ?? '')))
55
+ throw new Error('DynamoDB delivery requires the exact configured stream and bounded sequence records.');
56
+ const store = dataStore();
57
+ const batchItemFailures: Array<{ itemIdentifier: string }> = [];
58
+ for (const record of event.Records) {
59
+ const image = record.dynamodb?.NewImage;
60
+ // The provider filter is an efficiency aid, not an authorization boundary.
61
+ if (record.eventName !== 'INSERT' || image?.kind?.S !== 'outbox' || image.state?.S !== 'pending') continue;
62
+ try {
63
+ const id = image.sk?.S;
64
+ const scope = process.env.EBK_STAGE + '/${name}';
65
+ if (!id || image.scope?.S !== scope || record.dynamodb?.Keys?.sk?.S !== id ||
66
+ record.dynamodb.Keys.pk?.S !== image.pk?.S || !image.pk?.S?.startsWith(scope + '/outbox/'))
67
+ throw new Error('Stream intent identity differs from its table scope.');
68
+ // Re-read and validate the retained intent; never publish the untrusted stream image.
69
+ const result = await store.dispatch(id, publish);
70
+ // Another owner may be publishing the committed intent. Acknowledge this
71
+ // notification, not publication; the retained intent and sweep recover a
72
+ // dead owner after lease expiry.
73
+ if (!delivered(result) && result !== 'busy')
74
+ throw new Error('Durable intent needs another delivery attempt.');
75
+ } catch {
76
+ batchItemFailures.push({ itemIdentifier: record.dynamodb!.SequenceNumber! });
77
+ }
78
+ }
79
+ return { batchItemFailures };
80
+ }
81
+
82
+ // EMF gauges are observational. A lost metric returns undefined and never
83
+ // changes delivery, checkpoints, or the reconciliation outcome.
84
+ function observe(metricName: string, value: number) {
85
+ metrics.emit({ namespace: 'EBK/Async', metricName, unit: 'Count', value,
86
+ dimensions: { slice: '${name}', stage: process.env.EBK_STAGE ?? 'local' } });
87
+ }
88
+
89
+ export async function reconcile() {
90
+ const store = dataStore();
91
+ const summary = { kind: 'ebk-key-value-reconciliation', delivered: 0, deliveryPending: 0, retryRequired: 0, rejected: 0, maxAttempts: 0, shards: 0 };
92
+ // One page per shard per run bounds work and prevents a poison-filled first
93
+ // page from starving the remainder forever. Wrap after the final page.
94
+ for (let shard = 0; shard < DYNAMO_OUTBOX_SHARDS; shard++) {
95
+ const id = 'shard-' + shard;
96
+ const previous = await store.get('system', 'event-reconciliation', id);
97
+ const checkpoint = previous?.value as { cursor: Cursor | null } | undefined;
98
+ if (previous && (!checkpoint || typeof checkpoint !== 'object' || !Object.prototype.hasOwnProperty.call(checkpoint, 'cursor')))
99
+ throw new Error('Retained reconciliation checkpoint is malformed.');
100
+ const page = await store.listPending({ shard, limit: 25, cursor: checkpoint?.cursor ?? undefined });
101
+ summary.rejected += page.rejected.length;
102
+ if (page.rejected.length) console.warn(JSON.stringify({
103
+ kind: 'ebk-key-value-invalid-intents', shard, records: page.rejected,
104
+ }));
105
+ for (const intent of page.events) {
106
+ summary.maxAttempts = Math.max(summary.maxAttempts, intent.attempts);
107
+ try {
108
+ const result = await store.dispatch(intent.id, publish);
109
+ if (delivered(result)) summary.delivered++;
110
+ else if (result === 'busy') summary.deliveryPending++;
111
+ else summary.retryRequired++;
112
+ } catch {
113
+ // Retain the row and advance the page. A later sweep retries it.
114
+ summary.retryRequired++;
115
+ }
116
+ }
117
+ await store.commit({ tenantId: 'system', changes: [{
118
+ action: 'put', collection: 'event-reconciliation', id,
119
+ expectedVersion: previous?.version ?? 0, value: { cursor: page.cursor ?? null },
120
+ }] });
121
+ summary.shards++;
122
+ }
123
+ // One page per shard is a bounded sample, not a global count: each gauge is a
124
+ // lower bound for this run. Intents leased by another owner are in flight and
125
+ // excluded; a dead owner's intent is due again after its lease expires.
126
+ observe('OutboxBacklog', summary.retryRequired + summary.rejected);
127
+ observe('EventReconciliationRetryRequired', summary.retryRequired);
128
+ observe('EventReconciliationRejected', summary.rejected);
129
+ observe('EventDeliveryMaxAttempts', summary.maxAttempts);
130
+ const deletionCompletion = await reconcileRecordDeletions();
131
+ console.info(JSON.stringify({ ...summary, deletionCompletion }));
132
+ return { ...summary, deletionCompletion,
133
+ outcome: summary.rejected || summary.retryRequired || summary.deliveryPending || deletionCompletion.remaining || deletionCompletion.pending || deletionCompletion.failed ? 'partial' : 'completed' };
134
+ }
135
+ `;
136
+ }
137
+ //# 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>>;