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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +18 -0
  2. package/executors.json +5 -0
  3. package/generators.json +10 -0
  4. package/package.json +20 -3
  5. package/src/aws-authority/index.d.ts +1 -0
  6. package/src/aws-authority/index.js +1 -0
  7. package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
  8. package/src/aws-authority/lambda-policy-ordering.js +56 -0
  9. package/src/aws-authority/stage-authority.d.ts +11 -3
  10. package/src/aws-authority/stage-authority.js +615 -29
  11. package/src/blueprints/external-sandbox.js +21 -9
  12. package/src/blueprints/manifest.d.ts +1 -1
  13. package/src/blueprints/resolver.js +28 -15
  14. package/src/cli/bootstrap.d.ts +1 -1
  15. package/src/cli/deploy-runtime.d.ts +6 -0
  16. package/src/cli/deploy-runtime.js +58 -0
  17. package/src/cli/dev-command.d.ts +16 -4
  18. package/src/cli/dev-command.js +63 -0
  19. package/src/cli/main.d.ts +7 -1
  20. package/src/cli/main.js +128 -20
  21. package/src/cli/output.d.ts +1 -1
  22. package/src/developer-agent/context.js +41 -9
  23. package/src/developer-agent/generator-planning.js +16 -2
  24. package/src/developer-agent/git-inspection.d.ts +6 -2
  25. package/src/developer-agent/git-inspection.js +78 -6
  26. package/src/developer-agent/model.d.ts +4 -2
  27. package/src/developer-agent/operation-registry.d.ts +5 -0
  28. package/src/developer-agent/operation-registry.js +179 -23
  29. package/src/developer-agent/preview-changes.d.ts +2 -0
  30. package/src/developer-agent/preview-changes.js +14 -2
  31. package/src/developer-agent/preview-source.js +3 -0
  32. package/src/developer-agent/validation.js +20 -8
  33. package/src/developer-agent/workspace-inspection.js +37 -3
  34. package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
  35. package/src/executors/deployment-plan/deployment-plan.js +51 -4
  36. package/src/executors/dev-doctor/dev-doctor.js +13 -6
  37. package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
  38. package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
  39. package/src/executors/dev-task-cleanup/schema.json +9 -0
  40. package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
  41. package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
  42. package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
  43. package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
  44. package/src/executors/fleet/fleet.js +1 -1
  45. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
  46. package/src/executors/local-deploy/local-deploy.d.ts +8 -1
  47. package/src/executors/local-deploy/local-deploy.js +97 -24
  48. package/src/executors/local-deploy/schema.json +8 -0
  49. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
  50. package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
  51. package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
  52. package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
  53. package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
  54. package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
  55. package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
  56. package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
  57. package/src/executors/sst-lifecycle/task-unlock.js +126 -0
  58. package/src/foundation/capability-plan.d.ts +43 -0
  59. package/src/foundation/capability-plan.js +168 -0
  60. package/src/foundation/discovery.d.ts +14 -11
  61. package/src/foundation/discovery.js +32 -6
  62. package/src/foundation/index.d.ts +1 -0
  63. package/src/foundation/index.js +1 -0
  64. package/src/foundation/local-database-contract.d.ts +20 -0
  65. package/src/foundation/local-database-contract.js +262 -13
  66. package/src/foundation/local-private-smoke-access.d.ts +20 -0
  67. package/src/foundation/local-private-smoke-access.js +197 -0
  68. package/src/foundation/preflight.js +37 -18
  69. package/src/foundation/private-smoke-access.js +10 -2
  70. package/src/foundation/private-smoke-admission.d.ts +3 -1
  71. package/src/foundation/private-smoke-admission.js +29 -8
  72. package/src/foundation/private-smoke-control-plane.js +17 -6
  73. package/src/foundation/provision-database-bindings.d.ts +5 -0
  74. package/src/foundation/provision-database-bindings.js +41 -8
  75. package/src/foundation/provision-logical-database.js +13 -8
  76. package/src/foundation/requirements.d.ts +3 -3
  77. package/src/foundation/requirements.js +24 -12
  78. package/src/foundation/router-waf.d.ts +1 -0
  79. package/src/foundation/router-waf.js +14 -1
  80. package/src/generators/blueprint/blueprint.d.ts +5 -0
  81. package/src/generators/blueprint/blueprint.js +102 -0
  82. package/src/generators/blueprint/files.d.ts +6 -0
  83. package/src/generators/blueprint/files.js +217 -0
  84. package/src/generators/blueprint/schema.d.ts +4 -0
  85. package/src/generators/blueprint/schema.json +18 -0
  86. package/src/generators/formatting.js +24 -1
  87. package/src/generators/logging-registry.d.ts +2 -0
  88. package/src/generators/logging-registry.js +22 -0
  89. package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
  90. package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
  91. package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
  92. package/src/generators/preset/workspace-files-ci-install.js +196 -0
  93. package/src/generators/preset/workspace-files-developer-agent.js +40 -13
  94. package/src/generators/preset/workspace-files-performance-load.js +8 -0
  95. package/src/generators/preset/workspace-files-stage-authority.js +40 -1
  96. package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
  97. package/src/generators/preset/workspace-files-thin-docs.js +64 -18
  98. package/src/generators/preset/workspace-files.d.ts +4 -0
  99. package/src/generators/preset/workspace-files.js +159 -91
  100. package/src/generators/repository-policy/repository-policy.js +37 -0
  101. package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
  102. package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
  103. package/src/generators/slice/built-in-plan-api-files.js +47 -389
  104. package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
  105. package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
  106. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
  107. package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
  108. package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
  109. package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
  110. package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
  111. package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
  112. package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
  113. package/src/generators/slice/built-in-plan-data-files.js +61 -1164
  114. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
  115. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
  116. package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
  117. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
  118. package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
  119. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
  120. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
  121. package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
  122. package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
  123. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
  124. package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
  125. package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
  126. package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
  127. package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
  128. package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
  129. package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
  130. package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
  131. package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
  132. package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
  133. package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
  134. package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
  135. package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
  136. package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
  137. package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
  138. package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
  139. package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
  140. package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
  141. package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
  142. package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
  143. package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
  144. package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
  145. package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
  146. package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
  147. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
  148. package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
  149. package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
  150. package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
  151. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
  152. package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
  153. package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
  154. package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
  155. package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
  156. package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
  157. package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
  158. package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
  159. package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
  160. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
  161. package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
  162. package/src/generators/slice/built-in-plan-operations-files.js +89 -50
  163. package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
  164. package/src/generators/slice/built-in-plan-project-files.js +116 -67
  165. package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
  166. package/src/generators/slice/built-in-plan-release-files.js +64 -15
  167. package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
  168. package/src/generators/slice/built-in-plan-shared.d.ts +3 -1
  169. package/src/generators/slice/built-in-plan-shared.js +40 -18
  170. package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
  171. package/src/generators/slice/built-in-plan-sql-events.js +257 -0
  172. package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
  173. package/src/generators/slice/built-in-plan-testing-files.js +184 -132
  174. package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
  175. package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
  176. package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
  177. package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
  178. package/src/generators/slice/built-in-plan-verification-files.js +70 -0
  179. package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
  180. package/src/generators/slice/built-in-plan-web-files.js +191 -14
  181. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
  182. package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
  183. package/src/generators/slice/built-in-plan.d.ts +9 -1
  184. package/src/generators/slice/built-in-plan.js +49 -21
  185. package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
  186. package/src/generators/slice/data-policy-review-seed.js +22 -0
  187. package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
  188. package/src/generators/slice/deployed-smoke-readiness.js +214 -0
  189. package/src/generators/slice/local-source-identity.d.ts +2 -0
  190. package/src/generators/slice/local-source-identity.js +31 -0
  191. package/src/generators/slice/persistence-contract.d.ts +14 -0
  192. package/src/generators/slice/persistence-contract.js +32 -0
  193. package/src/generators/slice/slice.js +29 -24
  194. package/src/generators/sql/schema.d.ts +7 -0
  195. package/src/generators/sql/schema.json +38 -0
  196. package/src/generators/sql/sql.d.ts +6 -0
  197. package/src/generators/sql/sql.js +53 -0
  198. package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
  199. package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
  200. package/src/generators/upgrade/upgrade.d.ts +2 -0
  201. package/src/generators/upgrade/upgrade.js +136 -9
  202. package/src/generators/workload/workload.js +51 -2
  203. package/src/local-dev/browser-verification.d.ts +37 -0
  204. package/src/local-dev/browser-verification.js +281 -0
  205. package/src/local-dev/contracts.d.ts +10 -1
  206. package/src/local-dev/contracts.js +114 -13
  207. package/src/local-dev/dev-command-core.js +24 -5
  208. package/src/local-dev/docker-credential-health.d.ts +14 -0
  209. package/src/local-dev/docker-credential-health.js +94 -0
  210. package/src/local-dev/environment-inspector.d.ts +7 -0
  211. package/src/local-dev/environment-inspector.js +42 -15
  212. package/src/local-dev/environment-state.js +2 -2
  213. package/src/local-dev/errors.d.ts +1 -1
  214. package/src/local-dev/errors.js +2 -0
  215. package/src/local-dev/fleet-client.js +2 -2
  216. package/src/local-dev/fleet-configuration.js +57 -25
  217. package/src/local-dev/fleet-inventory.js +46 -18
  218. package/src/local-dev/fleet-ipc.d.ts +7 -0
  219. package/src/local-dev/fleet-ipc.js +14 -2
  220. package/src/local-dev/fleet-launcher.d.ts +6 -0
  221. package/src/local-dev/fleet-launcher.js +14 -2
  222. package/src/local-dev/fleet-logs.js +50 -22
  223. package/src/local-dev/fleet-process.d.ts +20 -1
  224. package/src/local-dev/fleet-process.js +197 -41
  225. package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
  226. package/src/local-dev/fleet-runner-evidence.js +56 -0
  227. package/src/local-dev/fleet-runtime.js +268 -229
  228. package/src/local-dev/fleet-session.d.ts +2 -0
  229. package/src/local-dev/fleet-session.js +28 -11
  230. package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
  231. package/src/local-dev/fleet-state.d.ts +5 -2
  232. package/src/local-dev/fleet-state.js +25 -4
  233. package/src/local-dev/fleet-supervisor.d.ts +3 -0
  234. package/src/local-dev/fleet-supervisor.js +66 -11
  235. package/src/local-dev/fleet-web-start.d.ts +12 -0
  236. package/src/local-dev/fleet-web-start.js +48 -0
  237. package/src/local-dev/identity.js +3 -14
  238. package/src/local-dev/index.d.ts +1 -0
  239. package/src/local-dev/index.js +1 -0
  240. package/src/local-dev/native-completion.d.ts +9 -0
  241. package/src/local-dev/native-completion.js +130 -0
  242. package/src/local-dev/nx-workspace.d.ts +4 -2
  243. package/src/local-dev/nx-workspace.js +11 -6
  244. package/src/local-dev/personal-stage.d.ts +4 -5
  245. package/src/local-dev/personal-stage.js +6 -54
  246. package/src/local-dev/port-claims.d.ts +13 -0
  247. package/src/local-dev/port-claims.js +46 -0
  248. package/src/local-dev/ports.d.ts +14 -2
  249. package/src/local-dev/ports.js +78 -3
  250. package/src/local-dev/private-state.d.ts +6 -0
  251. package/src/local-dev/private-state.js +126 -34
  252. package/src/local-dev/process-group.d.ts +4 -0
  253. package/src/local-dev/process-group.js +29 -0
  254. package/src/local-dev/process-identity.d.ts +8 -0
  255. package/src/local-dev/process-identity.js +31 -1
  256. package/src/local-dev/proxy.js +11 -12
  257. package/src/local-dev/runtime-paths.js +1 -1
  258. package/src/local-dev/slice-claim.js +1 -1
  259. package/src/local-dev/slice-runner.d.ts +15 -6
  260. package/src/local-dev/slice-runner.js +189 -54
  261. package/src/local-dev/task-attachment.d.ts +17 -0
  262. package/src/local-dev/task-attachment.js +73 -0
  263. package/src/local-dev/task-authority.d.ts +10 -0
  264. package/src/local-dev/task-authority.js +27 -0
  265. package/src/local-dev/task-identity.d.ts +33 -0
  266. package/src/local-dev/task-identity.js +418 -0
  267. package/src/local-dev/task-native-writer.d.ts +18 -0
  268. package/src/local-dev/task-native-writer.js +329 -0
  269. package/src/local-dev/tls.js +3 -1
  270. package/src/local-dev/web-launch.d.ts +9 -0
  271. package/src/local-dev/web-launch.js +130 -0
  272. package/src/ownership/composition.d.ts +2 -1
  273. package/src/ownership/composition.js +1 -0
  274. package/src/performance/scenario.d.ts +22 -0
  275. package/src/performance/scenario.js +100 -92
  276. package/src/repository-policy/deployment-plan.d.ts +2 -2
  277. package/src/repository-policy/deployment-plan.js +2 -1
  278. package/src/repository-policy/policy.js +38 -3
  279. package/src/schemas/blueprint-v1.json +5 -4
  280. package/src/schemas/foundation-requirement-v1.json +5 -4
  281. package/src/schemas/testing-evidence-result-v1.json +1 -1
  282. package/src/secrets/operator.d.ts +3 -1
  283. package/src/secrets/operator.js +22 -3
  284. package/src/sst-environment-source-format.d.ts +3 -0
  285. package/src/sst-environment-source-format.js +20 -0
  286. package/src/supply-chain/blueprint-trust-git.js +13 -3
  287. package/src/supply-chain/build-output.js +15 -0
  288. package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
  289. package/src/testing-evidence/fixture-scope.d.ts +2 -1
  290. package/src/testing-evidence/fixture-scope.js +4 -2
  291. package/src/testing-evidence/result.d.ts +2 -1
  292. package/src/testing-evidence/result.js +18 -4
  293. package/src/workload-roles/standard-slice.js +2 -3
  294. package/src/api-contract/baseline-update.js.map +0 -1
  295. package/src/api-contract/compatibility.js.map +0 -1
  296. package/src/api-contract/contract-graph.js.map +0 -1
  297. package/src/api-contract/evidence.js.map +0 -1
  298. package/src/api-contract/index.js.map +0 -1
  299. package/src/api-contract/model.fixtures.d.ts +0 -2
  300. package/src/api-contract/model.fixtures.js +0 -81
  301. package/src/api-contract/model.fixtures.js.map +0 -1
  302. package/src/api-contract/model.js.map +0 -1
  303. package/src/api-contract/rollout.js.map +0 -1
  304. package/src/authorization/compatibility.js.map +0 -1
  305. package/src/authorization/index.js.map +0 -1
  306. package/src/aws/child-environment.js.map +0 -1
  307. package/src/aws/identity.js.map +0 -1
  308. package/src/aws-authority/index.js.map +0 -1
  309. package/src/aws-authority/stage-authority.js.map +0 -1
  310. package/src/blueprints/execution.js.map +0 -1
  311. package/src/blueprints/external-sandbox.js.map +0 -1
  312. package/src/blueprints/index.js.map +0 -1
  313. package/src/blueprints/inputs.js.map +0 -1
  314. package/src/blueprints/manifest.js.map +0 -1
  315. package/src/blueprints/resolver.js.map +0 -1
  316. package/src/blueprints/transitions.js.map +0 -1
  317. package/src/cli/agent-command.js.map +0 -1
  318. package/src/cli/agent-runtime.js.map +0 -1
  319. package/src/cli/blueprint-authority.js.map +0 -1
  320. package/src/cli/blueprint-command.js.map +0 -1
  321. package/src/cli/bootstrap.js.map +0 -1
  322. package/src/cli/dev-command.js.map +0 -1
  323. package/src/cli/main.js.map +0 -1
  324. package/src/cli/output.js.map +0 -1
  325. package/src/cli/personal-secret-runtime.js.map +0 -1
  326. package/src/cli/secret-terminal.js.map +0 -1
  327. package/src/container-images.js.map +0 -1
  328. package/src/data-lifecycle/index.js.map +0 -1
  329. package/src/data-lifecycle/model.fixtures.d.ts +0 -2
  330. package/src/data-lifecycle/model.fixtures.js +0 -244
  331. package/src/data-lifecycle/model.fixtures.js.map +0 -1
  332. package/src/data-lifecycle/model.js.map +0 -1
  333. package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
  334. package/src/data-lifecycle/validation.js.map +0 -1
  335. package/src/database-retirement/contract.js.map +0 -1
  336. package/src/database-retirement/index.js.map +0 -1
  337. package/src/deterministic-order.js.map +0 -1
  338. package/src/developer-agent/context.js.map +0 -1
  339. package/src/developer-agent/generator-planning.js.map +0 -1
  340. package/src/developer-agent/generator-preview.js.map +0 -1
  341. package/src/developer-agent/git-inspection.js.map +0 -1
  342. package/src/developer-agent/handoff.js.map +0 -1
  343. package/src/developer-agent/index.js.map +0 -1
  344. package/src/developer-agent/model.js.map +0 -1
  345. package/src/developer-agent/operation-registry.js.map +0 -1
  346. package/src/developer-agent/ordering.js.map +0 -1
  347. package/src/developer-agent/planning.js.map +0 -1
  348. package/src/developer-agent/preview-changes.js.map +0 -1
  349. package/src/developer-agent/preview-source.js.map +0 -1
  350. package/src/developer-agent/validation.js.map +0 -1
  351. package/src/developer-agent/workspace-inspection.js.map +0 -1
  352. package/src/developer-agent/workspace-path.js.map +0 -1
  353. package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
  354. package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
  355. package/src/executors/deploy/deploy.js.map +0 -1
  356. package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
  357. package/src/executors/dev/dev.js.map +0 -1
  358. package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
  359. package/src/executors/dev-setup/dev-setup.js.map +0 -1
  360. package/src/executors/developer-context/developer-context.js.map +0 -1
  361. package/src/executors/fleet/fleet.js.map +0 -1
  362. package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
  363. package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
  364. package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
  365. package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
  366. package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
  367. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
  368. package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
  369. package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
  370. package/src/executors/local-deploy/local-approval.js.map +0 -1
  371. package/src/executors/local-deploy/local-deploy.js.map +0 -1
  372. package/src/executors/refresh/refresh.js.map +0 -1
  373. package/src/executors/remove/remove.js.map +0 -1
  374. package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
  375. package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
  376. package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
  377. package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
  378. package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
  379. package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
  380. package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
  381. package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
  382. package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
  383. package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
  384. package/src/executors/unlock/unlock.js.map +0 -1
  385. package/src/executors/work-markers/work-markers.js.map +0 -1
  386. package/src/foundation/discovery.js.map +0 -1
  387. package/src/foundation/index.js.map +0 -1
  388. package/src/foundation/local-database-contract.js.map +0 -1
  389. package/src/foundation/logging-preflight.js.map +0 -1
  390. package/src/foundation/logging.js.map +0 -1
  391. package/src/foundation/partial-state.js.map +0 -1
  392. package/src/foundation/preflight.js.map +0 -1
  393. package/src/foundation/private-smoke-access.js.map +0 -1
  394. package/src/foundation/private-smoke-admission.js.map +0 -1
  395. package/src/foundation/private-smoke-control-plane.js.map +0 -1
  396. package/src/foundation/provision-database-bindings.js.map +0 -1
  397. package/src/foundation/provision-logical-database.js.map +0 -1
  398. package/src/foundation/requirements.js.map +0 -1
  399. package/src/foundation/router-origin-proof.js.map +0 -1
  400. package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
  401. package/src/foundation/router-waf.js.map +0 -1
  402. package/src/foundation/stages.js.map +0 -1
  403. package/src/frontend-security/index.js.map +0 -1
  404. package/src/frontend-security/security-headers.js.map +0 -1
  405. package/src/generators/feature-registry.js.map +0 -1
  406. package/src/generators/formatting.js.map +0 -1
  407. package/src/generators/function/function.js.map +0 -1
  408. package/src/generators/job/job.js.map +0 -1
  409. package/src/generators/logging-registry.js.map +0 -1
  410. package/src/generators/post-generation-install.js.map +0 -1
  411. package/src/generators/preset/dependency-overrides.js.map +0 -1
  412. package/src/generators/preset/generator.js.map +0 -1
  413. package/src/generators/preset/tool-versions.js.map +0 -1
  414. package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
  415. package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
  416. package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
  417. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
  418. package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
  419. package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
  420. package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
  421. package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
  422. package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
  423. package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
  424. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
  425. package/src/generators/preset/workspace-files.js.map +0 -1
  426. package/src/generators/repository-policy/repository-policy.js.map +0 -1
  427. package/src/generators/repository-policy/tree-policy.js.map +0 -1
  428. package/src/generators/service/service.js.map +0 -1
  429. package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
  430. package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
  431. package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
  432. package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
  433. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
  434. package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
  435. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
  436. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
  437. package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
  438. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
  439. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
  440. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
  441. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
  442. package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
  443. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
  444. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
  445. package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
  446. package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
  447. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
  448. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
  449. package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
  450. package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
  451. package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
  452. package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
  453. package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
  454. package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
  455. package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
  456. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
  457. package/src/generators/slice/built-in-plan-shared.js.map +0 -1
  458. package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
  459. package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
  460. package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
  461. package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
  462. package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
  463. package/src/generators/slice/built-in-plan.js.map +0 -1
  464. package/src/generators/slice/slice.js.map +0 -1
  465. package/src/generators/upgrade/upgrade.js.map +0 -1
  466. package/src/generators/workload/frozen-container.js.map +0 -1
  467. package/src/generators/workload/performance-registration.js.map +0 -1
  468. package/src/generators/workload/reliability-registration.js.map +0 -1
  469. package/src/generators/workload/service-performance-files.js.map +0 -1
  470. package/src/generators/workload/workload.js.map +0 -1
  471. package/src/git-policy/action-pins.js.map +0 -1
  472. package/src/git-policy/github-bootstrap.js.map +0 -1
  473. package/src/git-policy/index.js.map +0 -1
  474. package/src/git-policy/routing.js.map +0 -1
  475. package/src/index.js.map +0 -1
  476. package/src/infrastructure-change/convergence.js.map +0 -1
  477. package/src/infrastructure-change/drift.js.map +0 -1
  478. package/src/infrastructure-change/index.js.map +0 -1
  479. package/src/infrastructure-change/local-capability.js.map +0 -1
  480. package/src/infrastructure-change/model.js.map +0 -1
  481. package/src/infrastructure-change/normalize.js.map +0 -1
  482. package/src/infrastructure-change/plan.js.map +0 -1
  483. package/src/infrastructure-change/risk.js.map +0 -1
  484. package/src/infrastructure-change/summary.js.map +0 -1
  485. package/src/local-dev/context-discovery.js.map +0 -1
  486. package/src/local-dev/contract-validation.js.map +0 -1
  487. package/src/local-dev/contracts.js.map +0 -1
  488. package/src/local-dev/control-contract.js.map +0 -1
  489. package/src/local-dev/dev-command-core.js.map +0 -1
  490. package/src/local-dev/effects.js.map +0 -1
  491. package/src/local-dev/environment-inspector.js.map +0 -1
  492. package/src/local-dev/environment-state.js.map +0 -1
  493. package/src/local-dev/errors.js.map +0 -1
  494. package/src/local-dev/fleet-client.js.map +0 -1
  495. package/src/local-dev/fleet-configuration.js.map +0 -1
  496. package/src/local-dev/fleet-inventory.js.map +0 -1
  497. package/src/local-dev/fleet-ipc.js.map +0 -1
  498. package/src/local-dev/fleet-launcher.js.map +0 -1
  499. package/src/local-dev/fleet-lock.js.map +0 -1
  500. package/src/local-dev/fleet-logs.js.map +0 -1
  501. package/src/local-dev/fleet-process.js.map +0 -1
  502. package/src/local-dev/fleet-runtime.js.map +0 -1
  503. package/src/local-dev/fleet-session.js.map +0 -1
  504. package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
  505. package/src/local-dev/fleet-startup.js.map +0 -1
  506. package/src/local-dev/fleet-state.js.map +0 -1
  507. package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
  508. package/src/local-dev/fleet-supervisor.js.map +0 -1
  509. package/src/local-dev/gateway-daemon.js.map +0 -1
  510. package/src/local-dev/gateway.js.map +0 -1
  511. package/src/local-dev/identity.js.map +0 -1
  512. package/src/local-dev/index.js.map +0 -1
  513. package/src/local-dev/local-context.js.map +0 -1
  514. package/src/local-dev/nx-workspace.js.map +0 -1
  515. package/src/local-dev/personal-secret-ledger.js.map +0 -1
  516. package/src/local-dev/personal-stage.js.map +0 -1
  517. package/src/local-dev/portless.js.map +0 -1
  518. package/src/local-dev/ports.js.map +0 -1
  519. package/src/local-dev/private-state.js.map +0 -1
  520. package/src/local-dev/process-identity.js.map +0 -1
  521. package/src/local-dev/proxy.js.map +0 -1
  522. package/src/local-dev/runtime-paths.js.map +0 -1
  523. package/src/local-dev/secret-slice-claim.js.map +0 -1
  524. package/src/local-dev/slice-claim.js.map +0 -1
  525. package/src/local-dev/slice-runner.js.map +0 -1
  526. package/src/local-dev/tls.js.map +0 -1
  527. package/src/ownership/composition.js.map +0 -1
  528. package/src/ownership/foundation-record.js.map +0 -1
  529. package/src/ownership/hash.js.map +0 -1
  530. package/src/ownership/index.js.map +0 -1
  531. package/src/ownership/json-ownership.js.map +0 -1
  532. package/src/ownership/record.js.map +0 -1
  533. package/src/ownership/workspace-record.js.map +0 -1
  534. package/src/performance/cost-collection.js.map +0 -1
  535. package/src/performance/cost-controls.js.map +0 -1
  536. package/src/performance/evidence.js.map +0 -1
  537. package/src/performance/index.js.map +0 -1
  538. package/src/performance/load-safety.js.map +0 -1
  539. package/src/performance/model.js.map +0 -1
  540. package/src/performance/pr-artifact-budget.js.map +0 -1
  541. package/src/performance/runner.js.map +0 -1
  542. package/src/performance/scenario-endpoint.js.map +0 -1
  543. package/src/performance/scenario.js.map +0 -1
  544. package/src/performance/test-fixtures.d.ts +0 -7
  545. package/src/performance/test-fixtures.js +0 -167
  546. package/src/performance/test-fixtures.js.map +0 -1
  547. package/src/performance/unit-cost.js.map +0 -1
  548. package/src/release/index.js.map +0 -1
  549. package/src/release/lifecycle.js.map +0 -1
  550. package/src/release/manifest.js.map +0 -1
  551. package/src/release/rollout.js.map +0 -1
  552. package/src/release/source-authority.js.map +0 -1
  553. package/src/repository-policy/aurora-preflight.js.map +0 -1
  554. package/src/repository-policy/capacity-migration.js.map +0 -1
  555. package/src/repository-policy/deployment-plan.js.map +0 -1
  556. package/src/repository-policy/foundation-profile.js.map +0 -1
  557. package/src/repository-policy/index.js.map +0 -1
  558. package/src/repository-policy/policy.js.map +0 -1
  559. package/src/secrets/adapters.js.map +0 -1
  560. package/src/secrets/aws-control-plane.js.map +0 -1
  561. package/src/secrets/declaration-verification.js.map +0 -1
  562. package/src/secrets/generated-aws-control-plane.js.map +0 -1
  563. package/src/secrets/guardrails.js.map +0 -1
  564. package/src/secrets/index.js.map +0 -1
  565. package/src/secrets/metadata.js.map +0 -1
  566. package/src/secrets/model.js.map +0 -1
  567. package/src/secrets/operator.js.map +0 -1
  568. package/src/secrets/permissions.js.map +0 -1
  569. package/src/secrets/personal-command.js.map +0 -1
  570. package/src/secrets/personal-ledger.js.map +0 -1
  571. package/src/secrets/registry.js.map +0 -1
  572. package/src/secrets/verification.js.map +0 -1
  573. package/src/secrets/workload-access.js.map +0 -1
  574. package/src/sst-environment-source-format.js.map +0 -1
  575. package/src/supply-chain/action-pins.js.map +0 -1
  576. package/src/supply-chain/blueprint-trust-git.js.map +0 -1
  577. package/src/supply-chain/blueprint-trust-process.js.map +0 -1
  578. package/src/supply-chain/blueprint-trust.js.map +0 -1
  579. package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
  580. package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
  581. package/src/supply-chain/build-output-bounds.js.map +0 -1
  582. package/src/supply-chain/build-output.js.map +0 -1
  583. package/src/supply-chain/common.js.map +0 -1
  584. package/src/supply-chain/container-artifact-contract.js.map +0 -1
  585. package/src/supply-chain/container-release.js.map +0 -1
  586. package/src/supply-chain/ecr-applicability.js.map +0 -1
  587. package/src/supply-chain/ecr-scanning.js.map +0 -1
  588. package/src/supply-chain/ecs-deployed-image.js.map +0 -1
  589. package/src/supply-chain/errors.js.map +0 -1
  590. package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
  591. package/src/supply-chain/generated-command.js.map +0 -1
  592. package/src/supply-chain/generated-container-release-command.js.map +0 -1
  593. package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
  594. package/src/supply-chain/generated-files.js.map +0 -1
  595. package/src/supply-chain/generated-scanner-command.js.map +0 -1
  596. package/src/supply-chain/index.js.map +0 -1
  597. package/src/supply-chain/inventory.js.map +0 -1
  598. package/src/supply-chain/license-expression.js.map +0 -1
  599. package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
  600. package/src/supply-chain/policy.js.map +0 -1
  601. package/src/supply-chain/publication.js.map +0 -1
  602. package/src/supply-chain/sbom.js.map +0 -1
  603. package/src/supply-chain/scanner.js.map +0 -1
  604. package/src/supply-chain/vendored-source.js.map +0 -1
  605. package/src/testing-evidence/fixture-scope.js.map +0 -1
  606. package/src/testing-evidence/index.js.map +0 -1
  607. package/src/testing-evidence/quarantine.js.map +0 -1
  608. package/src/testing-evidence/result.js.map +0 -1
  609. package/src/testing-evidence/runner-adapter.js.map +0 -1
  610. package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
  611. package/src/validation.js.map +0 -1
  612. package/src/work-markers/index.js.map +0 -1
  613. package/src/work-markers/work-markers.js.map +0 -1
  614. package/src/workload-roles/account-baseline.js.map +0 -1
  615. package/src/workload-roles/authority.js.map +0 -1
  616. package/src/workload-roles/aws-adapter.js.map +0 -1
  617. package/src/workload-roles/aws-internal-handler.js.map +0 -1
  618. package/src/workload-roles/aws-s3-state.js.map +0 -1
  619. package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
  620. package/src/workload-roles/boundary.js.map +0 -1
  621. package/src/workload-roles/convergence.js.map +0 -1
  622. package/src/workload-roles/effective-policy.js.map +0 -1
  623. package/src/workload-roles/handler.js.map +0 -1
  624. package/src/workload-roles/history.js.map +0 -1
  625. package/src/workload-roles/index.js.map +0 -1
  626. package/src/workload-roles/injection.js.map +0 -1
  627. package/src/workload-roles/manifest.js.map +0 -1
  628. package/src/workload-roles/provisioner.js.map +0 -1
  629. package/src/workload-roles/registration.js.map +0 -1
  630. package/src/workload-roles/stage-boundary.js.map +0 -1
  631. package/src/workload-roles/standard-slice.js.map +0 -1
  632. package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
  633. package/src/workspace-deployment/identity.js.map +0 -1
  634. package/src/workspace-deployment/index.js.map +0 -1
  635. package/src/workspace-deployment/migration-evidence.js.map +0 -1
  636. package/src/workspace-deployment/migration.js.map +0 -1
  637. package/src/workspace-deployment/ownership.js.map +0 -1
@@ -0,0 +1,530 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderKeyValuePerformanceFiles = renderKeyValuePerformanceFiles;
4
+ exports.renderKeyValueOutboxTests = renderKeyValueOutboxTests;
5
+ exports.renderKeyValuePerformanceEndpointFunctions = renderKeyValuePerformanceEndpointFunctions;
6
+ /** Protected test effects use native collections, never the application's records. */
7
+ function renderKeyValuePerformanceFiles(name) {
8
+ return {
9
+ 'performance/persistence.ts': `import { createHash } from 'node:crypto';
10
+ import type { KeyValueChange } from '@empire-builder-kit/runtime/key-value';
11
+ import type { ProtectedLoadRequestAuthorizationV1 } from '@empire-builder-kit/runtime/performance';
12
+ import { dataStore } from '../data/key-value.js';
13
+
14
+ type Authorization = ProtectedLoadRequestAuthorizationV1;
15
+ type Store = ReturnType<typeof dataStore>;
16
+ const RUNS = 'performance-runs';
17
+ const TENANT = 'system';
18
+ const EFFECT_RETENTION_MS = 24 * 60 * 60 * 1_000;
19
+ const MAXIMUM_CLEANUP_EFFECTS = 1_000;
20
+ const AUDIT_RETENTION_MS = 30 * 24 * 60 * 60 * 1_000;
21
+ const CLEANUP_DEADLINE_MS = 24 * 60 * 60 * 1_000;
22
+ const REPORTS = 'performance-cleanup-reports';
23
+ interface Run {
24
+ schemaVersion: 1; planDigest: string; binding: string; runId: string;
25
+ adapterId: Authorization['adapterId']; createdAt: string; expiresAt: string;
26
+ cleanupStartedAt: string | null;
27
+ }
28
+ interface Claim { schemaVersion: 1; planDigest: string; ordinal: number; effectId: string | null }
29
+ interface Effect {
30
+ schemaVersion: 1; planDigest: string; runId: string; effectId: string;
31
+ ordinal: number; kind: 'async' | 'database'; createdAt: string;
32
+ expiresAt: string; processedAt: string | null;
33
+ }
34
+ // Saturation is a bounded operational sample, never admission authority.
35
+ // Share at most one in-flight/sample read per exact run in this warm process.
36
+ const backlogSamples = new Map<string, { expiresAt: number; value: Promise<{ pendingEffects: number }> }>();
37
+ function sampleKey(run: Run) { return JSON.stringify([process.env.EBK_KEY_VALUE_TABLE, process.env.EBK_STAGE, run.planDigest, run.binding]); }
38
+ function timestamp(value: string): number {
39
+ const time = Date.parse(value);
40
+ if (!Number.isFinite(time) || new Date(time).toISOString() !== value)
41
+ throw new Error('protected-performance-timestamp-invalid');
42
+ return time;
43
+ }
44
+ function digest(value: unknown): string {
45
+ return createHash('sha256').update(JSON.stringify(value)).digest('hex');
46
+ }
47
+ function conditionFailed(error: unknown): boolean {
48
+ return error instanceof Error && error.name === 'TransactionCanceledException' &&
49
+ (error as Error & { CancellationReasons?: { Code?: string }[] }).CancellationReasons?.some(
50
+ ({ Code }) => Code === 'ConditionalCheckFailed') === true;
51
+ }
52
+ function requests(plan: string) { return 'performance-requests-' + plan; }
53
+ function effects(plan: string) { return 'performance-effects-' + plan; }
54
+ function pendingEffects(plan: string) { return 'performance-pending-' + plan; }
55
+ function runBinding(auth: Authorization): string {
56
+ return digest({ adapterId: auth.adapterId, configuredMaximum: auth.configuredMaximum,
57
+ createdAt: auth.createdAt, durationSeconds: auth.durationSeconds, expiresAt: auth.expiresAt,
58
+ maximumRequests: auth.maximumRequests, planDigest: auth.planMaterialDigest,
59
+ release: { candidateDigest: auth.release.candidateDigest, releaseId: auth.release.releaseId,
60
+ releaseMaterialDigest: auth.release.releaseMaterialDigest, sourceCommit: auth.release.sourceCommit },
61
+ runId: auth.runId, saturationSignalRef: auth.saturationSignalRef, scenarioId: auth.scenarioId,
62
+ stage: auth.stage, target: { accountFingerprint: auth.target.accountFingerprint,
63
+ endpoint: auth.operation === 'cleanup' ? auth.target.endpoint.replace(/\\/cleanup$/, '') : auth.target.endpoint,
64
+ region: auth.target.region, slice: auth.target.slice }, workload: auth.workload });
65
+ }
66
+ function validateAuthorization(auth: Authorization, now: number, operation: 'execute' | 'cleanup') {
67
+ // The endpoint authenticates the HMAC and complete deployment binding before
68
+ // calling this module. Keep lifetime, ordinal and operation checks here too:
69
+ // an invocation may cross expiry while awaiting a database response.
70
+ if (auth.operation !== operation || auth.stage !== process.env.EBK_STAGE ||
71
+ !/^[a-f0-9]{64}$/.test(auth.planMaterialDigest) ||
72
+ !Number.isSafeInteger(auth.maximumRequests) || auth.maximumRequests < 1 ||
73
+ !Number.isSafeInteger(auth.requestOrdinal) || auth.requestOrdinal < 1 ||
74
+ auth.requestOrdinal > auth.maximumRequests ||
75
+ !Number.isFinite(auth.configuredMaximum) || auth.configuredMaximum <= 0 ||
76
+ timestamp(auth.createdAt) > now || timestamp(auth.expiresAt) <= timestamp(auth.createdAt) ||
77
+ (operation === 'execute' && now >= timestamp(auth.expiresAt)))
78
+ throw new Error('protected-performance-authorization-invalid');
79
+ }
80
+ function readRun(value: unknown, plan: string): Run {
81
+ const run = value as Run;
82
+ if (!run || run.schemaVersion !== 1 || run.planDigest !== plan ||
83
+ !/^[a-f0-9]{64}$/.test(run.binding) || typeof run.runId !== 'string' ||
84
+ !['ebk-api-lambda-v1', 'ebk-dynamodb-async-v1', 'ebk-dynamodb-v1', 'ebk-service-v1'].includes(run.adapterId) ||
85
+ timestamp(run.expiresAt) <= timestamp(run.createdAt) ||
86
+ (run.cleanupStartedAt !== null && timestamp(run.cleanupStartedAt) < timestamp(run.createdAt)))
87
+ throw new Error('protected-performance-run-invalid');
88
+ return run;
89
+ }
90
+ function readEffect(value: unknown, id: string, run: Run): Effect {
91
+ const effect = value as Effect;
92
+ if (!effect || effect.schemaVersion !== 1 || effect.effectId !== id ||
93
+ !/^[a-f0-9]{64}$/.test(id) || effect.planDigest !== run.planDigest || effect.runId !== run.runId ||
94
+ !Number.isSafeInteger(effect.ordinal) || effect.ordinal < 1 ||
95
+ effect.kind !== (run.adapterId === 'ebk-dynamodb-async-v1' ? 'async' : 'database') ||
96
+ timestamp(effect.expiresAt) !== timestamp(effect.createdAt) + EFFECT_RETENTION_MS ||
97
+ timestamp(effect.createdAt) < timestamp(run.createdAt) ||
98
+ timestamp(effect.createdAt) >= timestamp(run.expiresAt) ||
99
+ (effect.processedAt !== null && timestamp(effect.processedAt) < timestamp(effect.createdAt)))
100
+ throw new Error('protected-performance-effect-collision');
101
+ return effect;
102
+ }
103
+ function checkRun(run: Run, version: number): KeyValueChange {
104
+ return { action: 'check', collection: RUNS, id: run.planDigest, expectedVersion: version };
105
+ }
106
+
107
+ export function createPerformancePersistence(store: Store, clock: () => number = Date.now) {
108
+ async function pendingDelete(effect: Effect, run: Run): Promise<KeyValueChange[]> {
109
+ if (effect.kind !== 'async' || effect.processedAt !== null) return [];
110
+ const row = await store.get(TENANT, pendingEffects(run.planDigest), effect.effectId);
111
+ if (!row || digest(readEffect(row.value, effect.effectId, run)) !== digest(effect))
112
+ throw new Error('protected-performance-backlog-invalid');
113
+ return [{ action: 'delete', collection: pendingEffects(run.planDigest), id: effect.effectId, expectedVersion: row.version }];
114
+ }
115
+ async function authorizedRun(auth: Authorization, closed: boolean) {
116
+ const row = await store.get(TENANT, RUNS, auth.planMaterialDigest);
117
+ const run = row ? readRun(row.value, auth.planMaterialDigest) : null;
118
+ if (!row || !run || run.binding !== runBinding(auth) || (!closed && run.cleanupStartedAt !== null))
119
+ throw new Error('protected-performance-run-collision');
120
+ return { run, version: row.version };
121
+ }
122
+ async function reserve(auth: Authorization): Promise<'claimed'> {
123
+ for (let retry = 0; retry < 3; retry++) {
124
+ validateAuthorization(auth, clock(), 'execute');
125
+ const row = await store.get(TENANT, RUNS, auth.planMaterialDigest);
126
+ const previous = row ? readRun(row.value, auth.planMaterialDigest) : null;
127
+ if (previous && (previous.binding !== runBinding(auth) || previous.cleanupStartedAt !== null))
128
+ throw new Error('protected-performance-run-collision');
129
+ const claim = await store.get(TENANT, requests(auth.planMaterialDigest), String(auth.requestOrdinal));
130
+ if (claim) throw new Error('protected-performance-request-replayed');
131
+ const run: Run = previous ?? { schemaVersion: 1, planDigest: auth.planMaterialDigest,
132
+ binding: runBinding(auth), runId: auth.runId, adapterId: auth.adapterId,
133
+ createdAt: auth.createdAt, expiresAt: auth.expiresAt, cleanupStartedAt: null };
134
+ validateAuthorization(auth, clock(), 'execute');
135
+ try {
136
+ await store.commit({ tenantId: TENANT, changes: [
137
+ previous ? checkRun(previous, row!.version) : { action: 'put', collection: RUNS,
138
+ id: run.planDigest, expectedVersion: 0, value: run },
139
+ { action: 'put', collection: requests(run.planDigest), id: String(auth.requestOrdinal),
140
+ expectedVersion: 0, value: { schemaVersion: 1, planDigest: run.planDigest,
141
+ ordinal: auth.requestOrdinal, effectId: auth.effectId } satisfies Claim },
142
+ ] });
143
+ return 'claimed';
144
+ } catch (error) { if (!conditionFailed(error)) throw error; }
145
+ }
146
+ throw new Error('protected-performance-request-conflict');
147
+ }
148
+ async function executeOnce(adapterId: 'ebk-dynamodb-async-v1' | 'ebk-dynamodb-v1',
149
+ effectId: string, auth: Authorization) {
150
+ validateAuthorization(auth, clock(), 'execute');
151
+ if (adapterId !== auth.adapterId || effectId !== auth.effectId || !/^[a-f0-9]{64}$/.test(effectId))
152
+ throw new Error('protected-performance-effect-collision');
153
+ const { run, version } = await authorizedRun(auth, false);
154
+ const claim = await store.get(TENANT, requests(run.planDigest), String(auth.requestOrdinal));
155
+ const claimed = claim?.value as Claim | undefined;
156
+ if (!claim || !claimed || claimed.schemaVersion !== 1 || claimed.planDigest !== run.planDigest ||
157
+ claimed.ordinal !== auth.requestOrdinal || claimed.effectId !== effectId)
158
+ throw new Error('protected-performance-request-unclaimed');
159
+ const previous = await store.get(TENANT, effects(run.planDigest), effectId);
160
+ if (previous) {
161
+ if (readEffect(previous.value, effectId, run).ordinal !== auth.requestOrdinal)
162
+ throw new Error('protected-performance-effect-collision');
163
+ // Even idempotent success must race safely with cleanup and a substituted claim.
164
+ validateAuthorization(auth, clock(), 'execute');
165
+ await store.commit({ tenantId: TENANT, changes: [checkRun(run, version),
166
+ { action: 'check', collection: requests(run.planDigest), id: String(auth.requestOrdinal), expectedVersion: claim.version },
167
+ { action: 'check', collection: effects(run.planDigest), id: effectId, expectedVersion: previous.version }] });
168
+ return { effectState: 'already-existed' as const };
169
+ }
170
+ const now = clock();
171
+ validateAuthorization(auth, now, 'execute');
172
+ const effect: Effect = { schemaVersion: 1, planDigest: run.planDigest, runId: run.runId,
173
+ effectId, ordinal: auth.requestOrdinal, kind: adapterId === 'ebk-dynamodb-async-v1' ? 'async' : 'database',
174
+ createdAt: new Date(now).toISOString(), expiresAt: new Date(now + EFFECT_RETENTION_MS).toISOString(), processedAt: null };
175
+ await store.commit({ tenantId: TENANT, changes: [
176
+ checkRun(run, version),
177
+ { action: 'check', collection: requests(run.planDigest), id: String(auth.requestOrdinal), expectedVersion: claim.version },
178
+ { action: 'put', collection: effects(run.planDigest), id: effectId, expectedVersion: 0, value: effect },
179
+ ...(effect.kind === 'async' ? [{ action: 'put' as const, collection: pendingEffects(run.planDigest), id: effectId, expectedVersion: 0, value: effect }] : [])] });
180
+ return { effectState: 'created' as const };
181
+ }
182
+ async function execute(adapterId: 'ebk-dynamodb-async-v1' | 'ebk-dynamodb-v1', effectId: string, auth: Authorization) {
183
+ for (let retry = 0; retry < 3; retry++) {
184
+ try { return await executeOnce(adapterId, effectId, auth); }
185
+ catch (error) { if (!conditionFailed(error)) throw error; }
186
+ }
187
+ throw new Error('protected-performance-effect-conflict');
188
+ }
189
+ async function observe(auth: Authorization) {
190
+ validateAuthorization(auth, clock(), 'execute');
191
+ const { run } = await authorizedRun(auth, false);
192
+ if (!auth.effectId) throw new Error('protected-performance-effect-collision');
193
+ const row = await store.get(TENANT, effects(run.planDigest), auth.effectId);
194
+ if (!row || readEffect(row.value, auth.effectId, run).ordinal !== auth.requestOrdinal)
195
+ throw new Error('protected-performance-effect-collision');
196
+ if (run.adapterId !== 'ebk-dynamodb-async-v1') return { pendingEffects: 0 };
197
+ // Pending markers are written/deleted atomically with their individual
198
+ // effects. Requests never rewrite the shared run admission/cleanup guard.
199
+ // The operational saturation sample stops at its configured 100% threshold;
200
+ // it is not a cross-page transactional count or mutation authority.
201
+ const key = sampleKey(run), cached = backlogSamples.get(key), now = clock();
202
+ if (cached && cached.expiresAt > now && cached.expiresAt <= now + 1000) return cached.value;
203
+ while (backlogSamples.size >= 32) backlogSamples.delete(backlogSamples.keys().next().value!);
204
+ const sample = { expiresAt: now + 1000, value: (async () => {
205
+ let count = 0, afterId: string | undefined;
206
+ do {
207
+ const page = await store.list(TENANT, pendingEffects(run.planDigest), { limit: 50, afterId });
208
+ for (const row of page.records) {
209
+ if (readEffect(row.value, row.id, run).processedAt !== null) throw new Error('protected-performance-backlog-invalid');
210
+ count++;
211
+ }
212
+ afterId = page.nextId;
213
+ } while (afterId && count < auth.configuredMaximum);
214
+ return { pendingEffects: count };
215
+ })() };
216
+ backlogSamples.set(key, sample);
217
+ try { return await sample.value; }
218
+ catch (error) { if (backlogSamples.get(key) === sample) backlogSamples.delete(key); throw error; }
219
+ }
220
+ async function close(auth: Authorization) {
221
+ validateAuthorization(auth, clock(), 'cleanup');
222
+ const row = await store.get(TENANT, RUNS, auth.planMaterialDigest);
223
+ const run = row ? readRun(row.value, auth.planMaterialDigest) : null;
224
+ if (run && run.binding !== runBinding(auth)) throw new Error('protected-performance-run-collision');
225
+ if (run && run.cleanupStartedAt !== null) return { run, version: row!.version };
226
+ const closed: Run = { schemaVersion: 1, planDigest: auth.planMaterialDigest,
227
+ binding: runBinding(auth), runId: auth.runId, adapterId: auth.adapterId,
228
+ createdAt: auth.createdAt, expiresAt: auth.expiresAt, cleanupStartedAt: new Date(clock()).toISOString() };
229
+ await store.commit({ tenantId: TENANT, changes: [{ action: 'put', collection: RUNS,
230
+ id: closed.planDigest, expectedVersion: row?.version ?? 0, value: closed }] });
231
+ return { run: closed, version: (row?.version ?? 0) + 1 };
232
+ }
233
+ async function cleanup(auth: Authorization) {
234
+ const { run, version } = await close(auth);
235
+ backlogSamples.delete(sampleKey(run));
236
+ const deadline = clock() + 5_000;
237
+ let removedEffectCount = 0;
238
+ for (;;) {
239
+ // Always consume the first remaining page: successful deletions shrink it.
240
+ const page = await store.list(TENANT, effects(run.planDigest), { limit: 10 });
241
+ if (page.records.length === 0) {
242
+ if ((await store.list(TENANT, pendingEffects(run.planDigest), { limit: 1 })).records.length)
243
+ throw new Error('protected-performance-backlog-invalid');
244
+ return { removedEffectCount, remainingEffectCount: 0 };
245
+ }
246
+ if (removedEffectCount + page.records.length > MAXIMUM_CLEANUP_EFFECTS || removedEffectCount > 0 && clock() >= deadline)
247
+ return { removedEffectCount, remainingEffectCount: null, complete: false as const };
248
+ const pending = (await Promise.all(page.records.map(row => pendingDelete(readEffect(row.value, row.id, run), run)))).flat();
249
+ await store.commit({ tenantId: TENANT, changes: [
250
+ checkRun(run, version), ...pending,
251
+ ...page.records.map((row): KeyValueChange => ({ action: 'delete', collection: effects(run.planDigest),
252
+ id: row.id, expectedVersion: row.version }))] });
253
+ removedEffectCount += page.records.length;
254
+ }
255
+ }
256
+ async function processAsync() {
257
+ const state = await store.get(TENANT, 'performance-maintenance', 'async-runs');
258
+ const value = state?.value as { afterId: string | null } | undefined;
259
+ if (state && (!value || (value.afterId !== null && !/^[a-f0-9]{64}$/.test(value.afterId))))
260
+ throw new Error('protected-performance-cursor-invalid');
261
+ const runs = await store.list(TENANT, RUNS, { limit: 10, afterId: value?.afterId ?? undefined });
262
+ let processed = 0;
263
+ let continuationRequired = runs.nextId !== undefined;
264
+ for (const row of runs.records) {
265
+ const run = readRun(row.value, row.id);
266
+ if (run.adapterId !== 'ebk-dynamodb-async-v1' || run.cleanupStartedAt !== null) continue;
267
+ const cursorId = 'async-' + row.id;
268
+ const cursor = await store.get(TENANT, 'performance-maintenance', cursorId);
269
+ const saved = cursor?.value as { afterId: string | null } | undefined;
270
+ if (cursor && (!saved || (saved.afterId !== null && !/^[a-f0-9]{64}$/.test(saved.afterId))))
271
+ throw new Error('protected-performance-cursor-invalid');
272
+ const page = await store.list(TENANT, effects(run.planDigest), { limit: 20, afterId: saved?.afterId ?? undefined });
273
+ continuationRequired ||= page.nextId !== undefined;
274
+ for (const effectRow of page.records) {
275
+ const effect = readEffect(effectRow.value, effectRow.id, run);
276
+ const now = clock();
277
+ if (effect.processedAt !== null || timestamp(effect.expiresAt) <= now) continue;
278
+ const current = await store.get(TENANT, RUNS, run.planDigest);
279
+ const active = current ? readRun(current.value, run.planDigest) : null;
280
+ if (!current || !active || active.binding !== run.binding || active.cleanupStartedAt !== null)
281
+ throw new Error('protected-performance-run-collision');
282
+ const pending = await pendingDelete(effect, active);
283
+ await store.commit({ tenantId: TENANT, changes: [
284
+ checkRun(active, current.version), ...pending,
285
+ { action: 'put', collection: effects(run.planDigest), id: effect.effectId, expectedVersion: effectRow.version,
286
+ value: { ...effect, processedAt: new Date(now).toISOString() } }] });
287
+ processed++;
288
+ backlogSamples.delete(sampleKey(run));
289
+ }
290
+ const checkpointRow = await store.get(TENANT, RUNS, run.planDigest);
291
+ if (!checkpointRow) continue;
292
+ const checkpoint = readRun(checkpointRow.value, run.planDigest);
293
+ if (checkpoint.cleanupStartedAt !== null) continue;
294
+ await store.commit({ tenantId: TENANT, changes: [checkRun(checkpoint, checkpointRow.version),
295
+ { action: 'put', collection: 'performance-maintenance',
296
+ id: cursorId, expectedVersion: cursor?.version ?? 0, value: { afterId: page.nextId ?? null } }] });
297
+ }
298
+ await store.commit({ tenantId: TENANT, changes: [{ action: 'put', collection: 'performance-maintenance',
299
+ id: 'async-runs', expectedVersion: state?.version ?? 0, value: { afterId: runs.nextId ?? null } }] });
300
+ return { processed, runs: runs.records.length, continuationRequired };
301
+ }
302
+ async function expire(options: { deadline?: number } = {}) {
303
+ const now = clock();
304
+ if (!Number.isFinite(now)) throw new Error('protected-performance-clock-invalid');
305
+ const state = await store.get(TENANT, 'performance-maintenance', 'expiry-runs');
306
+ const saved = state?.value as { afterId: string | null } | undefined;
307
+ if (state && (!saved || (saved.afterId !== null && !/^[a-f0-9]{64}$/.test(saved.afterId))))
308
+ throw new Error('protected-performance-cursor-invalid');
309
+ let removedEffects = 0, removedRequests = 0, removedRuns = 0;
310
+ let inspected = 0, inspectedRuns = 0, stateVersion = state?.version ?? 0;
311
+ let afterId = saved?.afterId ?? undefined, sawBeginning = afterId === undefined;
312
+ const deadline = Math.min(options.deadline ?? Infinity, now + 4 * 60_000);
313
+ if (!Number.isFinite(deadline)) throw new Error('protected-performance-clock-invalid');
314
+ const withinBudget = () => {
315
+ const current = clock();
316
+ if (!Number.isFinite(current) || current < now) throw new Error('protected-performance-clock-invalid');
317
+ return inspected < 5_000 && current < deadline;
318
+ };
319
+ const result = (completeScan: boolean) => ({ removedEffects, removedRequests, removedRuns,
320
+ inspectedRuns, inspected, continuationRequired: !completeScan, completeScan });
321
+ const savePosition = async (position: string | undefined) => {
322
+ await store.commit({ tenantId: TENANT, changes: [{ action: 'put', collection: 'performance-maintenance',
323
+ id: 'expiry-runs', expectedVersion: stateVersion, value: { afterId: position ?? null } }] });
324
+ stateVersion++; afterId = position;
325
+ };
326
+ while (withinBudget()) {
327
+ const page = await store.list(TENANT, RUNS, { limit: 10, afterId });
328
+ for (const row of page.records) {
329
+ if (!withinBudget()) return result(false);
330
+ inspected++; inspectedRuns++;
331
+ let run = readRun(row.value, row.id), version = row.version;
332
+ if (now < timestamp(run.expiresAt)) { await savePosition(row.id); continue; }
333
+ if (run.cleanupStartedAt === null) {
334
+ run = { ...run, cleanupStartedAt: new Date(now).toISOString() };
335
+ await store.commit({ tenantId: TENANT, changes: [{ action: 'put', collection: RUNS,
336
+ id: run.planDigest, expectedVersion: version, value: run }] });
337
+ version++;
338
+ }
339
+ const cursorId = 'expiry-' + run.planDigest;
340
+ const cursor = await store.get(TENANT, 'performance-maintenance', cursorId);
341
+ const position = cursor?.value as { afterId: string | null } | undefined;
342
+ if (cursor && (!position || (position.afterId !== null && !/^[a-f0-9]{64}$/.test(position.afterId))))
343
+ throw new Error('protected-performance-cursor-invalid');
344
+ let effectAfter = position?.afterId ?? undefined;
345
+ let effectBeginning = effectAfter === undefined, cursorVersion = cursor?.version ?? 0;
346
+ for (;;) {
347
+ if (!withinBudget()) return result(false);
348
+ // Seven effects leave room for exact effect/pending deletes, durable
349
+ // deadline reports and the run guard (at most 22 domain changes).
350
+ const selected = await store.list(TENANT, effects(run.planDigest), { limit: Math.min(7, 5_000 - inspected), afterId: effectAfter });
351
+ if (!withinBudget()) return result(false);
352
+ inspected += selected.records.length;
353
+ const changes: KeyValueChange[] = [];
354
+ let removed = 0;
355
+ for (const candidate of selected.records) {
356
+ const effect = readEffect(candidate.value, candidate.id, run);
357
+ if (timestamp(effect.expiresAt) > now) continue;
358
+ removed++;
359
+ changes.push(...await pendingDelete(effect, run));
360
+ changes.push({ action: 'delete', collection: effects(run.planDigest), id: effect.effectId,
361
+ expectedVersion: candidate.version });
362
+ const deadline = timestamp(effect.expiresAt) + CLEANUP_DEADLINE_MS;
363
+ if (now >= deadline) changes.push({ action: 'put', collection: REPORTS,
364
+ id: digest({ plan: run.planDigest, effect: effect.effectId }), expectedVersion: 0,
365
+ value: { schemaVersion: 1, planDigest: run.planDigest, effectId: effect.effectId,
366
+ deadlineAt: new Date(deadline).toISOString() } });
367
+ }
368
+ if (changes.length) {
369
+ changes.push(checkRun(run, version));
370
+ await store.commit({ tenantId: TENANT, changes });
371
+ removedEffects += removed;
372
+ }
373
+ await store.commit({ tenantId: TENANT, changes: [checkRun(run, version),
374
+ { action: 'put', collection: 'performance-maintenance', id: cursorId,
375
+ expectedVersion: cursorVersion, value: { afterId: selected.nextId ?? null } }] });
376
+ cursorVersion++; effectAfter = selected.nextId;
377
+ if (effectAfter !== undefined) continue;
378
+ if (!effectBeginning) { effectBeginning = true; continue; }
379
+ break;
380
+ }
381
+ if (now < timestamp(run.expiresAt) + AUDIT_RETENTION_MS) { await savePosition(row.id); continue; }
382
+ const remaining = await store.list(TENANT, effects(run.planDigest), { limit: 1 });
383
+ if (remaining.records.length) throw new Error('protected-performance-cleanup-incomplete');
384
+ if ((await store.list(TENANT, pendingEffects(run.planDigest), { limit: 1 })).records.length)
385
+ throw new Error('protected-performance-backlog-invalid');
386
+ for (;;) {
387
+ if (!withinBudget()) return result(false);
388
+ const claims = await store.list(TENANT, requests(run.planDigest), { limit: Math.min(20, 5_000 - inspected) });
389
+ inspected += claims.records.length;
390
+ if (claims.records.length) {
391
+ const deletes = claims.records.map((claim): KeyValueChange => {
392
+ const value = claim.value as Claim;
393
+ if (!value || value.schemaVersion !== 1 || value.planDigest !== run.planDigest ||
394
+ !Number.isSafeInteger(value.ordinal) || value.ordinal < 1 || String(value.ordinal) !== claim.id ||
395
+ (value.effectId !== null && !/^[a-f0-9]{64}$/.test(value.effectId)))
396
+ throw new Error('protected-performance-request-invalid');
397
+ return { action: 'delete', collection: requests(run.planDigest), id: claim.id, expectedVersion: claim.version };
398
+ });
399
+ await store.commit({ tenantId: TENANT, changes: [checkRun(run, version), ...deletes] });
400
+ removedRequests += deletes.length;
401
+ continue;
402
+ }
403
+ break;
404
+ }
405
+ const asyncCursor = await store.get(TENANT, 'performance-maintenance', 'async-' + run.planDigest);
406
+ await store.commit({ tenantId: TENANT, changes: [
407
+ { action: 'delete', collection: RUNS, id: run.planDigest, expectedVersion: version },
408
+ { action: 'delete', collection: 'performance-maintenance', id: cursorId, expectedVersion: cursorVersion },
409
+ ...(asyncCursor ? [{ action: 'delete' as const, collection: 'performance-maintenance',
410
+ id: 'async-' + run.planDigest, expectedVersion: asyncCursor.version }] : [])] });
411
+ removedRuns++;
412
+ await savePosition(row.id);
413
+ }
414
+ if (page.nextId === undefined) {
415
+ await savePosition(undefined);
416
+ if (sawBeginning) return result(true);
417
+ // A resumed sweep also covers the earlier prefix at this cutoff before
418
+ // it may emit a global zero. This is pagination, not TTL authority.
419
+ sawBeginning = true;
420
+ }
421
+ }
422
+ return result(false);
423
+ }
424
+ async function reportDeadlines(emit: (count: number) => void | Promise<void>) {
425
+ const page = await store.list(TENANT, REPORTS, { limit: 20 });
426
+ for (const row of page.records) {
427
+ const value = row.value as { schemaVersion: number; planDigest: string; effectId: string; deadlineAt: string };
428
+ if (!value || value.schemaVersion !== 1 || !/^[a-f0-9]{64}$/.test(value.planDigest) ||
429
+ !/^[a-f0-9]{64}$/.test(value.effectId) || timestamp(value.deadlineAt) > clock() ||
430
+ row.id !== digest({ plan: value.planDigest, effect: value.effectId }))
431
+ throw new Error('protected-performance-cleanup-report-invalid');
432
+ }
433
+ // At-least-once reporting: lost acknowledgement may repeat a metric, never
434
+ // erase an unreported breach or prevent physical cleanup on the next run.
435
+ await emit(page.records.length);
436
+ if (page.records.length) await store.commit({ tenantId: TENANT, changes: page.records.map(row => ({
437
+ action: 'delete' as const, collection: REPORTS, id: row.id, expectedVersion: row.version })) });
438
+ return { reported: page.records.length, continuationRequired: page.nextId !== undefined };
439
+ }
440
+ return { reserve, execute, observe, cleanup, processAsync, expire, reportDeadlines };
441
+ }
442
+ `,
443
+ 'async/outbox-relay.ts': `import { randomUUID } from 'node:crypto';
444
+ import { createLogger, type Logger } from '@empire-builder-kit/runtime/logging';
445
+ import { dataStore } from '../data/key-value.js';
446
+ import { createPerformancePersistence } from '../performance/persistence.js';
447
+
448
+ // Domain intents use Streams and durable key-value reconciliation under the
449
+ // same explicit outbox pause policy. This schedule owns the isolated test sink.
450
+ export function createOutboxRelayHandler(dependencies: {
451
+ logger: Logger;
452
+ processPerformance: () => ReturnType<ReturnType<typeof createPerformancePersistence>['processAsync']>;
453
+ }) {
454
+ return async function outboxRelay(event: { id?: string } = {}) {
455
+ const correlationId = event.id ?? randomUUID();
456
+ try {
457
+ const result = await dependencies.processPerformance();
458
+ dependencies.logger.info('Native async performance processing completed', {
459
+ context: { correlationId }, attributes: result,
460
+ outcome: result.continuationRequired ? 'unknown' : 'success',
461
+ });
462
+ return { failed: 0, published: 0, processedPerformance: result.processed,
463
+ outcome: result.continuationRequired ? 'continuation-required' : 'converged',
464
+ domainDelivery: 'key-value-stream-and-reconciliation' };
465
+ } catch (error) {
466
+ dependencies.logger.error('Native async performance processing failed', {
467
+ context: { correlationId }, error, outcome: 'failure',
468
+ });
469
+ throw error;
470
+ }
471
+ };
472
+ }
473
+ export const handler = createOutboxRelayHandler({
474
+ logger: createLogger({ component: 'outbox-relay', feature: 'async-work', operation: 'outbox-relay',
475
+ slice: '${name}', stage: process.env.EBK_STAGE ?? 'local', workspace: process.env.EBK_WORKSPACE ?? '${name}' }),
476
+ processPerformance: () => createPerformancePersistence(dataStore()).processAsync(),
477
+ });
478
+ `,
479
+ };
480
+ }
481
+ function renderKeyValueOutboxTests() {
482
+ return ` it('processes native protected effects without claiming to publish domain events', async () => {
483
+ const processPerformance = vi.fn().mockResolvedValue({ processed: 1, runs: 1, continuationRequired: false });
484
+ const handler = createOutboxRelayHandler({ logger: logger as never, processPerformance });
485
+ await expect(handler({ id: 'native-outbox' })).resolves.toMatchObject({
486
+ failed: 0, outcome: 'converged', processedPerformance: 1, published: 0,
487
+ domainDelivery: 'key-value-stream-and-reconciliation',
488
+ });
489
+ expect(processPerformance).toHaveBeenCalledTimes(1);
490
+ });
491
+ it('does not report complete processing after a partial page or a failed transaction', async () => {
492
+ const processPerformance = vi.fn().mockResolvedValue({ processed: 20, runs: 1, continuationRequired: true });
493
+ const handler = createOutboxRelayHandler({ logger: logger as never, processPerformance });
494
+ await expect(handler()).resolves.toMatchObject({ outcome: 'continuation-required' });
495
+ processPerformance.mockRejectedValueOnce(new Error('native transaction failed'));
496
+ await expect(handler()).rejects.toThrow('native transaction failed');
497
+ expect(logger.error).toHaveBeenCalledWith('Native async performance processing failed', expect.objectContaining({ outcome: 'failure' }));
498
+ });
499
+ `;
500
+ }
501
+ /** The common protected HTTP shell owns HMAC, release, target and body limits. */
502
+ function renderKeyValuePerformanceEndpointFunctions() {
503
+ return `function persistence() { return createPerformancePersistence(dataStore()); }
504
+ export async function reserveRequest(authorization: ProtectedLoadRequestAuthorizationV1) {
505
+ return persistence().reserve(authorization);
506
+ }
507
+ export async function databaseExecution(
508
+ adapterId: 'ebk-dynamodb-async-v1' | 'ebk-dynamodb-v1', effectId: string,
509
+ authorization: ProtectedLoadRequestAuthorizationV1,
510
+ ) {
511
+ const started = performance.now();
512
+ const repository = persistence();
513
+ const result = await repository.execute(adapterId, effectId, authorization);
514
+ const observation = await repository.observe(authorization);
515
+ const elapsed = performance.now() - started;
516
+ if (!Number.isFinite(elapsed) || elapsed < 0) throw new Error('protected-performance-clock-invalid');
517
+ return { ...result, saturationPercent: Math.min(100, adapterId === 'ebk-dynamodb-async-v1'
518
+ ? observation.pendingEffects / authorization.configuredMaximum * 100
519
+ : elapsed / DYNAMODB_PROTECTED_REQUEST_BUDGET_MS * 100) };
520
+ }
521
+ export async function cleanupRun(
522
+ adapterId: 'ebk-dynamodb-async-v1' | 'ebk-dynamodb-v1',
523
+ authorization: ProtectedLoadRequestAuthorizationV1,
524
+ ) {
525
+ if (adapterId !== authorization.adapterId) throw new Error('protected-performance-adapter-invalid');
526
+ return persistence().cleanup(authorization);
527
+ }
528
+ `;
529
+ }
530
+ //# sourceMappingURL=built-in-plan-key-value-performance.js.map
@@ -0,0 +1,4 @@
1
+ /** Native provider inbox. External effects remain at-least-once or require reconciliation. */
2
+ export declare function renderKeyValueProviderFiles(name: string): Readonly<Record<string, string>>;
3
+ /** Replace only the SQL-specific provider cases; other async acceptance stays mandatory. */
4
+ export declare function renderKeyValueProviderTestCases(name: string): string;