@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
@@ -6,6 +6,15 @@ exports.postgresIdentifierByteLength = postgresIdentifierByteLength;
6
6
  exports.assertPostgresIdentifierLength = assertPostgresIdentifierLength;
7
7
  exports.resolveLogicalDatabaseIdentifiers = resolveLogicalDatabaseIdentifiers;
8
8
  exports.resolveLocalDatabaseContract = resolveLocalDatabaseContract;
9
+ exports.prepareLocalDatabaseContract = prepareLocalDatabaseContract;
10
+ exports.runLocalDatabaseLifecycle = runLocalDatabaseLifecycle;
11
+ const node_child_process_1 = require("node:child_process");
12
+ const node_crypto_1 = require("node:crypto");
13
+ const node_fs_1 = require("node:fs");
14
+ const node_path_1 = require("node:path");
15
+ const ports_js_1 = require("../local-dev/ports.js");
16
+ const private_state_js_1 = require("../local-dev/private-state.js");
17
+ const task_identity_js_1 = require("../local-dev/task-identity.js");
9
18
  exports.POSTGRES_IDENTIFIER_MAX_BYTES = 63;
10
19
  function normalizePostgresIdentifier(input) {
11
20
  const sanitized = input.replace(/[^A-Za-z0-9_]/g, '_');
@@ -22,7 +31,7 @@ function postgresIdentifierByteLength(identifier) {
22
31
  function assertPostgresIdentifierLength(identifier, label) {
23
32
  const bytes = postgresIdentifierByteLength(identifier);
24
33
  if (bytes > exports.POSTGRES_IDENTIFIER_MAX_BYTES) {
25
- throw new Error(`${label} "${identifier}" is ${bytes} UTF-8 bytes; PostgreSQL identifiers must be ${exports.POSTGRES_IDENTIFIER_MAX_BYTES} bytes or fewer. Choose a shorter stage, Slice, or database identifier. Identifiers are never truncated.`);
34
+ throw new Error(`${label} "${identifier}" is ${bytes} UTF-8 bytes; PostgreSQL identifiers must be ${exports.POSTGRES_IDENTIFIER_MAX_BYTES} bytes or fewer. Shorten a user-selected Slice or database identifier before deployment; framework task stages are not user-selectable. Identifiers are never truncated.`);
26
35
  }
27
36
  }
28
37
  function resolveLogicalDatabaseIdentifiers(options) {
@@ -54,25 +63,265 @@ function resolveLogicalDatabaseIdentifiers(options) {
54
63
  readwriteRole,
55
64
  };
56
65
  }
57
- function deterministicLocalDatabasePort(key) {
58
- let hash = 5381;
59
- for (let index = 0; index < key.length; index += 1) {
60
- hash = (hash * 33) ^ key.charCodeAt(index);
66
+ function databaseIdentity(options) {
67
+ if (!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(options.slice)) {
68
+ throw new Error('Local Slice must be a DNS-safe identifier.');
61
69
  }
62
- return 54320 + (Math.abs(hash) % 100);
63
- }
64
- function resolveLocalDatabaseContract(options) {
65
- const database = normalizePostgresIdentifier(`${options.slice}_${options.database}`);
70
+ if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/.test(options.database)) {
71
+ throw new Error('Local database must be a logical database identifier.');
72
+ }
73
+ const workspaceRoot = (0, node_fs_1.realpathSync)(options.workspaceRoot ??
74
+ (0, node_child_process_1.execFileSync)('git', [
75
+ '--no-optional-locks',
76
+ '-c',
77
+ 'core.fsmonitor=false',
78
+ 'rev-parse',
79
+ '--show-toplevel',
80
+ ], {
81
+ cwd: process.cwd(),
82
+ encoding: 'utf8',
83
+ timeout: 5_000,
84
+ env: Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('GIT_'))),
85
+ stdio: ['ignore', 'pipe', 'pipe'],
86
+ }).trim());
87
+ const { taskId } = (0, task_identity_js_1.resolveTaskIdentity)(workspaceRoot);
88
+ const stage = (0, task_identity_js_1.taskStage)(taskId);
89
+ if (options.stage !== undefined && options.stage !== stage) {
90
+ throw new Error(`Local database stage does not match this worktree's task (${stage}).`);
91
+ }
92
+ const readableDatabase = normalizePostgresIdentifier(`t_${taskId}_${options.slice.length}_${options.slice}_${options.database}`);
93
+ // Preserve every previously valid allocation. Overlength names were never
94
+ // accepted, so use a bounded task + tuple digest only for that new domain.
95
+ const database = postgresIdentifierByteLength(`${readableDatabase}_readwrite`) <=
96
+ exports.POSTGRES_IDENTIFIER_MAX_BYTES
97
+ ? readableDatabase
98
+ : `t_${taskId}_${(0, node_crypto_1.createHash)('sha256')
99
+ .update(JSON.stringify([options.slice, options.database]))
100
+ .digest('hex')
101
+ .slice(0, 24)}`;
66
102
  const username = `${database}_readwrite`;
67
103
  assertPostgresIdentifierLength(database, 'Local database identifier');
68
104
  assertPostgresIdentifierLength(username, 'Local read-write role identifier');
105
+ const directory = (0, node_path_1.join)((0, node_path_1.dirname)((0, task_identity_js_1.taskIdentityPath)(workspaceRoot)), 'databases', taskId);
69
106
  return {
107
+ taskId,
108
+ stage,
109
+ directory,
110
+ path: (0, node_path_1.join)(directory, `${options.slice.length}-${options.slice}-${options.database}.json`),
111
+ project: `ebk-${taskId}-${options.slice.length}-${options.slice}-${options.database}`,
70
112
  database,
71
- host: '127.0.0.1',
72
- password: options.password ?? `${options.slice}-local-dev`,
73
- port: options.port ??
74
- deterministicLocalDatabasePort(`${options.slice}_${options.database}`),
75
113
  username,
76
114
  };
77
115
  }
116
+ function readDatabaseContract(options, identity) {
117
+ if (!allocationExists(identity.path)) {
118
+ throw new Error(`Local database allocation is missing. Run the ${options.slice} local-database up target before connecting.`);
119
+ }
120
+ const record = JSON.parse((0, private_state_js_1.readPrivateFile)(identity.path).toString('utf8'));
121
+ if (record.schemaVersion !== 1 ||
122
+ record.taskId !== identity.taskId ||
123
+ record.slice !== options.slice ||
124
+ record.logicalDatabase !== options.database ||
125
+ record.database !== identity.database ||
126
+ record.username !== identity.username ||
127
+ record.host !== '127.0.0.1' ||
128
+ typeof record.password !== 'string' ||
129
+ !record.password ||
130
+ !Number.isSafeInteger(record.port) ||
131
+ record.port < 1024 ||
132
+ record.port > 65535 ||
133
+ (options.port !== undefined && options.port !== record.port) ||
134
+ (options.password !== undefined && options.password !== record.password)) {
135
+ throw new Error('Local database allocation ownership or connection coordinates do not match; refusing to connect.');
136
+ }
137
+ return {
138
+ database: record.database,
139
+ host: '127.0.0.1',
140
+ password: record.password,
141
+ port: record.port,
142
+ username: record.username,
143
+ };
144
+ }
145
+ function allocationExists(path) {
146
+ try {
147
+ (0, node_fs_1.lstatSync)(path);
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ if (error.code === 'ENOENT')
152
+ return false;
153
+ throw error;
154
+ }
155
+ }
156
+ /** Read the same private allocation used by Docker, Drizzle, and SST links. */
157
+ function resolveLocalDatabaseContract(options) {
158
+ return readDatabaseContract(options, databaseIdentity(options));
159
+ }
160
+ /** Prepare coordinates only; Docker's bind remains authoritative against races. */
161
+ async function prepareLocalDatabaseContract(options, isAvailable = ports_js_1.canBindLoopbackPort) {
162
+ const identity = databaseIdentity(options);
163
+ if (allocationExists(identity.path))
164
+ return readDatabaseContract(options, identity);
165
+ const reserved = new Set();
166
+ if ((0, node_fs_1.existsSync)(identity.directory)) {
167
+ for (const name of (0, node_fs_1.readdirSync)(identity.directory)) {
168
+ if (name.endsWith('.json')) {
169
+ const sibling = JSON.parse((0, private_state_js_1.readPrivateFile)((0, node_path_1.join)(identity.directory, name)).toString('utf8'));
170
+ if (Number.isSafeInteger(sibling.port))
171
+ reserved.add(sibling.port);
172
+ }
173
+ }
174
+ }
175
+ let port = options.port;
176
+ if (port !== undefined) {
177
+ if (!Number.isSafeInteger(port) ||
178
+ port < 1024 ||
179
+ port > 65535 ||
180
+ reserved.has(port) ||
181
+ !(await isAvailable(port))) {
182
+ throw new Error('Requested local database port is invalid, reserved, or occupied.');
183
+ }
184
+ }
185
+ else {
186
+ port = await (0, ports_js_1.allocateFleetPort)(identity.project, { isAvailable, reserved });
187
+ }
188
+ (0, private_state_js_1.publishPrivateFileExclusive)(identity.path, `${JSON.stringify({
189
+ schemaVersion: 1,
190
+ taskId: identity.taskId,
191
+ slice: options.slice,
192
+ logicalDatabase: options.database,
193
+ database: identity.database,
194
+ host: '127.0.0.1',
195
+ password: options.password ?? `${identity.taskId}-local-dev`,
196
+ port,
197
+ username: identity.username,
198
+ })}\n`);
199
+ return readDatabaseContract(options, identity);
200
+ }
201
+ /** Exact-owned local Docker lifecycle. Volumes and allocation survive down. */
202
+ async function runLocalDatabaseLifecycle(options, dependencies = {}) {
203
+ const environment = dependencies.environment ?? process.env;
204
+ const overrides = Object.keys(environment).filter((key) => key.startsWith('COMPOSE_') && environment[key] !== undefined);
205
+ if (overrides.length)
206
+ throw new Error(`Ambient Compose overrides are not allowed: ${overrides.join(', ')}.`);
207
+ const identity = databaseIdentity(options);
208
+ let local = allocationExists(identity.path)
209
+ ? readDatabaseContract(options, identity)
210
+ : undefined;
211
+ const env = {
212
+ ...environment,
213
+ ...(local
214
+ ? {
215
+ EBK_LOCAL_DATABASE: local.database,
216
+ EBK_LOCAL_DATABASE_PASSWORD: local.password,
217
+ EBK_LOCAL_DATABASE_PORT: String(local.port),
218
+ EBK_LOCAL_DATABASE_USERNAME: local.username,
219
+ }
220
+ : {}),
221
+ EBK_LOCAL_DATABASE_PROJECT: identity.project,
222
+ EBK_LOCAL_DATABASE_TASK: identity.taskId,
223
+ EBK_LOCAL_DATABASE_SLICE: options.slice,
224
+ EBK_LOCAL_DATABASE_LOGICAL: options.database,
225
+ };
226
+ const docker = dependencies.docker ??
227
+ ((args, childEnvironment) => (0, node_child_process_1.spawnSync)('docker', args, {
228
+ env: childEnvironment,
229
+ encoding: 'utf8',
230
+ timeout: 120_000,
231
+ windowsHide: true,
232
+ }));
233
+ const run = (args) => {
234
+ const result = docker(args, env);
235
+ if (result.error)
236
+ throw result.error;
237
+ return result;
238
+ };
239
+ const inspect = (kind, name) => {
240
+ const result = run([kind, 'inspect', name]);
241
+ if (result.status !== 0) {
242
+ if (/No such (?:object|container|volume|network)/i.test(result.stderr) ||
243
+ (kind === 'network' &&
244
+ result.stderr.includes(`network ${name} not found`)))
245
+ return undefined;
246
+ throw new Error(`Unable to inspect exact local database ${kind}; check Docker availability before retrying.`);
247
+ }
248
+ const records = JSON.parse(result.stdout);
249
+ if (!Array.isArray(records) || records.length !== 1)
250
+ throw new Error('Ambiguous local database Docker ownership.');
251
+ const record = records[0];
252
+ const labels = kind === 'container' ? record.Config?.Labels : record.Labels;
253
+ if (labels?.['dev.ebk.task'] !== identity.taskId ||
254
+ labels?.['dev.ebk.slice'] !== options.slice ||
255
+ labels?.['dev.ebk.database'] !== options.database ||
256
+ labels?.['com.docker.compose.project'] !== identity.project) {
257
+ throw new Error(`Local database ${kind} ownership mismatch; refusing creation or cleanup.`);
258
+ }
259
+ if (kind === 'container' && local) {
260
+ const bindings = record.HostConfig?.PortBindings?.['5432/tcp'];
261
+ if (!Array.isArray(bindings) ||
262
+ bindings.length !== 1 ||
263
+ bindings[0].HostIp !== '127.0.0.1' ||
264
+ bindings[0].HostPort !== String(local.port)) {
265
+ throw new Error('Local database container port ownership mismatch; refusing to connect.');
266
+ }
267
+ }
268
+ return record;
269
+ };
270
+ const container = inspect('container', `${identity.project}-database`);
271
+ const volume = inspect('volume', `${identity.project}-data`);
272
+ const network = inspect('network', `${identity.project}-network`);
273
+ if (!local) {
274
+ if (container || volume || network) {
275
+ throw new Error('Local database allocation is missing while exact Docker resources remain. Restore the original private allocation before up or down; no coordinates were created and no resources were removed.');
276
+ }
277
+ // Missing coordinates are not absence evidence; exact Docker inspection is.
278
+ if (options.action === 'down')
279
+ return;
280
+ local = await prepareLocalDatabaseContract(options, dependencies.isAvailable);
281
+ Object.assign(env, {
282
+ EBK_LOCAL_DATABASE: local.database,
283
+ EBK_LOCAL_DATABASE_PASSWORD: local.password,
284
+ EBK_LOCAL_DATABASE_PORT: String(local.port),
285
+ EBK_LOCAL_DATABASE_USERNAME: local.username,
286
+ });
287
+ }
288
+ if (options.action === 'down') {
289
+ // Never issue project-wide cleanup; use the verified immutable container ID.
290
+ if (container) {
291
+ if (typeof container.Id !== 'string' ||
292
+ !/^[a-f0-9]{64}$/.test(container.Id))
293
+ throw new Error('Invalid owned container ID.');
294
+ if (run(['container', 'rm', '--force', container.Id]).status !== 0)
295
+ throw new Error('Owned local database container cleanup failed; retry down.');
296
+ }
297
+ if (network) {
298
+ if (typeof network.Id !== 'string' || !/^[a-f0-9]{64}$/.test(network.Id))
299
+ throw new Error('Invalid owned network ID.');
300
+ if (run(['network', 'rm', network.Id]).status !== 0)
301
+ throw new Error('Owned local database network cleanup failed; inspect its remaining endpoints.');
302
+ }
303
+ return;
304
+ }
305
+ if (!container &&
306
+ !(await (dependencies.isAvailable ?? ports_js_1.canBindLoopbackPort)(local.port))) {
307
+ throw new Error(`Task database port ${local.port} is occupied by another service. Free that exact port and retry; no connection was made.`);
308
+ }
309
+ const result = run([
310
+ 'compose',
311
+ '--env-file',
312
+ process.platform === 'win32' ? 'NUL' : '/dev/null',
313
+ '--project-name',
314
+ identity.project,
315
+ '-f',
316
+ options.composeFile,
317
+ 'up',
318
+ '-d',
319
+ '--wait',
320
+ ]);
321
+ if (result.status !== 0) {
322
+ throw new Error(`Task database startup failed (possible port bind race). Run this task's local-database down, resolve the Docker/port conflict, then retry up.`);
323
+ }
324
+ if (!inspect('container', `${identity.project}-database`))
325
+ throw new Error('Docker reported success without the exact owned local database container.');
326
+ }
78
327
  //# sourceMappingURL=local-database-contract.js.map
@@ -0,0 +1,20 @@
1
+ import { type FleetProcessIdentity, type ProcessIdentityProbe } from '../local-dev/fleet-lock.js';
2
+ import { type PrivateStateSecurity } from '../local-dev/private-state.js';
3
+ import { openPrivateSmokeControlPlane } from './private-smoke-control-plane.js';
4
+ import type { GithubPrivateSmokeInput } from './private-smoke-access.js';
5
+ export interface LocalPrivateSmokeInput extends GithubPrivateSmokeInput {
6
+ /** Already verified invocation-private transport, never ambient credentials. */
7
+ credentialEnvironment: NodeJS.ProcessEnv;
8
+ }
9
+ interface Dependencies {
10
+ fetch?: typeof fetch;
11
+ open?: typeof openPrivateSmokeControlPlane;
12
+ capture?: () => FleetProcessIdentity;
13
+ probe?: (owner: FleetProcessIdentity) => ProcessIdentityProbe;
14
+ security?: PrivateStateSecurity;
15
+ wait?: (milliseconds: number) => Promise<void>;
16
+ }
17
+ /** Used after the local lifecycle verifies source, policy and federated role.
18
+ * A private process receipt proves recovery ownership, not deployment authority. */
19
+ export declare function runLocalPrivateSmoke(input: LocalPrivateSmokeInput, dependencies?: Dependencies): Promise<void>;
20
+ export {};
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runLocalPrivateSmoke = runLocalPrivateSmoke;
4
+ const client_cloudfront_1 = require("@aws-sdk/client-cloudfront");
5
+ const client_wafv2_1 = require("@aws-sdk/client-wafv2");
6
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
7
+ const node_crypto_1 = require("node:crypto");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const process_identity_js_1 = require("../local-dev/process-identity.js");
11
+ const fleet_lock_js_1 = require("../local-dev/fleet-lock.js");
12
+ const private_state_js_1 = require("../local-dev/private-state.js");
13
+ const index_js_1 = require("../repository-policy/index.js");
14
+ const federated_credential_transport_js_1 = require("../executors/local-deploy/federated-credential-transport.js");
15
+ const router_waf_js_1 = require("./router-waf.js");
16
+ const private_smoke_control_plane_js_1 = require("./private-smoke-control-plane.js");
17
+ const private_smoke_admission_js_1 = require("./private-smoke-admission.js");
18
+ function check(value, message) {
19
+ if (!value)
20
+ throw new Error(`Local private smoke: ${message}`);
21
+ }
22
+ /** Used after the local lifecycle verifies source, policy and federated role.
23
+ * A private process receipt proves recovery ownership, not deployment authority. */
24
+ async function runLocalPrivateSmoke(input, dependencies = {}) {
25
+ check(!(0, index_js_1.requiresGithubDeployment)(input.deploymentProfile, input.stage), 'stage requires protected GitHub authority');
26
+ const policy = (0, router_waf_js_1.normalizeRouterWafPolicy)(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(input.root, 'packages/foundation/security/router-waf.json'), 'utf8')));
27
+ check(policy.deploymentProfile === input.deploymentProfile, 'deployment profile differs');
28
+ const stagePolicy = policy.stages[input.stage];
29
+ check(stagePolicy, 'stage is inactive');
30
+ if (stagePolicy.access === 'public' || stagePolicy.mode === 'count') {
31
+ await input.run();
32
+ return;
33
+ }
34
+ const allowedCidrs = stagePolicy.allowedCidrs.filter((cidr) => !cidr.includes(':'));
35
+ // Temporary admission has its own empty set; never update the baseline.
36
+ const baseline = [];
37
+ check(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(input.source), 'source identity is invalid');
38
+ const policyDigest = (0, router_waf_js_1.routerWafPolicyDigest)(policy);
39
+ const identity = {
40
+ account: input.account,
41
+ stage: input.stage,
42
+ workspace: input.workspace,
43
+ policyDigest,
44
+ };
45
+ const open = dependencies.open ??
46
+ (async (resourceIdentity, url) => {
47
+ const environment = input.credentialEnvironment;
48
+ check(environment.AWS_PROFILE &&
49
+ environment.AWS_CONFIG_FILE &&
50
+ environment.AWS_SHARED_CREDENTIALS_FILE, 'verified private credential transport is missing');
51
+ const credentials = (0, credential_providers_1.fromIni)({
52
+ profile: environment.AWS_PROFILE,
53
+ configFilepath: environment.AWS_CONFIG_FILE,
54
+ filepath: environment.AWS_SHARED_CREDENTIALS_FILE,
55
+ // The invocation refreshes this same file before smoke. Ownership
56
+ // checks may already have populated Smithy's shared ini-file cache.
57
+ ignoreCache: true,
58
+ });
59
+ const options = {
60
+ credentials,
61
+ region: 'us-east-1',
62
+ maxAttempts: 3,
63
+ requestHandler: { connectionTimeout: 10_000, requestTimeout: 30_000 },
64
+ };
65
+ return (0, private_smoke_control_plane_js_1.openPrivateSmokeControlPlane)(resourceIdentity, url, {
66
+ waf: new client_wafv2_1.WAFV2Client({
67
+ ...options,
68
+ endpoint: 'https://wafv2.us-east-1.amazonaws.com',
69
+ }),
70
+ cloudfront: new client_cloudfront_1.CloudFrontClient({
71
+ ...options,
72
+ endpoint: 'https://cloudfront.amazonaws.com',
73
+ }),
74
+ });
75
+ });
76
+ const store = await open(identity, input.url);
77
+ const request = dependencies.fetch ?? fetch;
78
+ const wait = dependencies.wait ??
79
+ ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
80
+ const path = (0, node_path_1.join)((0, node_fs_1.realpathSync)(input.root), '.ebk/evidence/local-smoke', `${input.stage}.json`);
81
+ const security = dependencies.security;
82
+ const readOwner = () => {
83
+ const value = JSON.parse((0, private_state_js_1.readPrivateFile)(path, security).toString('utf8'));
84
+ check(value?.kind === 'ebk-local-smoke-owner' &&
85
+ value.schemaVersion === 1 &&
86
+ value.account === input.account &&
87
+ value.stage === input.stage &&
88
+ value.workspace === input.workspace &&
89
+ value.policyDigest === policyDigest, 'retained owner or policy differs; preserve recovery evidence');
90
+ (0, fleet_lock_js_1.validateFleetProcessIdentity)(value.owner);
91
+ check(value.context?.authority === 'local' &&
92
+ /^[a-f0-9]{32}$/.test(value.context.run) &&
93
+ /^[1-9]\d*$/.test(value.context.attempt) &&
94
+ /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value.context.source) &&
95
+ JSON.stringify(value.context.baseline) === JSON.stringify(baseline), 'retained admission context is invalid');
96
+ return value;
97
+ };
98
+ const releaseOwner = (expected) => {
99
+ check(JSON.stringify(readOwner()) === JSON.stringify(expected), 'private owner changed; cleanup not accepted');
100
+ const retired = `${path}.${expected.context.run}.completed`;
101
+ check(!(0, node_fs_1.existsSync)(retired), 'prior recovery completion is unresolved');
102
+ (0, node_fs_1.renameSync)(path, retired);
103
+ if ((0, private_state_js_1.readPrivateFile)(retired, security).toString('utf8') !==
104
+ JSON.stringify(expected)) {
105
+ if (!(0, node_fs_1.existsSync)(path))
106
+ (0, node_fs_1.renameSync)(retired, path);
107
+ throw new Error('Local private smoke: owner changed during retirement');
108
+ }
109
+ (0, node_fs_1.unlinkSync)(retired);
110
+ };
111
+ if ((0, node_fs_1.existsSync)(path)) {
112
+ (0, private_state_js_1.assertPrivatePath)((0, node_path_1.join)(input.root, '.ebk/evidence/local-smoke'), 'directory', security);
113
+ const previous = readOwner();
114
+ check((dependencies.probe ?? process_identity_js_1.probeProcessIdentity)(previous.owner) === 'absent', 'prior smoke process is active or ambiguous');
115
+ await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async (lease) => lease.authority === 'local' &&
116
+ lease.run === previous.context.run &&
117
+ lease.attempt === previous.context.attempt &&
118
+ lease.source === previous.context.source);
119
+ releaseOwner(previous);
120
+ }
121
+ else {
122
+ // Foreign/local-without-receipt and hosted leases must not be claimed.
123
+ await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async () => false);
124
+ }
125
+ const ipResponse = await request('https://checkip.amazonaws.com', {
126
+ redirect: 'error',
127
+ signal: AbortSignal.timeout(15_000),
128
+ });
129
+ check(ipResponse.ok, 'operator IPv4 lookup failed');
130
+ const address = await ipResponse.text();
131
+ check(address.length <= 64, 'operator IPv4 response exceeds bound');
132
+ const cidr = (0, private_smoke_admission_js_1.publicRunnerIpv4)(address.trim());
133
+ if ((0, private_smoke_admission_js_1.runnerAlreadyAllowed)(cidr, allowedCidrs)) {
134
+ await input.run();
135
+ return;
136
+ }
137
+ const owner = (dependencies.capture ?? process_identity_js_1.captureProcessIdentity)();
138
+ const context = {
139
+ authority: 'local',
140
+ run: (0, node_crypto_1.randomBytes)(16).toString('hex'),
141
+ attempt: String(owner.pid),
142
+ source: input.source,
143
+ baseline,
144
+ };
145
+ const record = {
146
+ kind: 'ebk-local-smoke-owner',
147
+ schemaVersion: 1,
148
+ ...identity,
149
+ owner,
150
+ context,
151
+ };
152
+ check((0, private_state_js_1.createPrivateFileExclusive)(path, JSON.stringify(record), security), 'another invocation owns local smoke');
153
+ async function observe(allowed, signal) {
154
+ for (let i = 0; i < 24; i++) {
155
+ signal?.throwIfAborted();
156
+ const response = await request(input.url, {
157
+ redirect: 'manual',
158
+ signal: signal
159
+ ? AbortSignal.any([signal, AbortSignal.timeout(15_000)])
160
+ : AbortSignal.timeout(15_000),
161
+ });
162
+ await response.body?.cancel();
163
+ if (allowed
164
+ ? response.status >= 200 && response.status < 400
165
+ : response.status === 403)
166
+ return;
167
+ if (i < 23)
168
+ await wait(5_000);
169
+ }
170
+ throw new Error(`Local private smoke: ${allowed ? 'admission' : 'revocation'} not observed; deployment acceptance prohibited`);
171
+ }
172
+ const unregister = (0, federated_credential_transport_js_1.registerGovernedSignalCleanup)(async () => {
173
+ await (0, private_smoke_admission_js_1.cleanupSmokeAdmission)(store, context);
174
+ }, 90);
175
+ try {
176
+ await (0, private_smoke_admission_js_1.withPrivateSmokeAdmission)({
177
+ store,
178
+ context,
179
+ cidr,
180
+ run: input.run,
181
+ awaitAdmission: (signal) => observe(true, signal),
182
+ awaitRevocation: () => observe(false),
183
+ });
184
+ }
185
+ finally {
186
+ try {
187
+ // A failed smoke may still have cleaned up correctly. Retain this receipt
188
+ // only when remote cleanup is unproved, for exact next-run recovery.
189
+ await (0, private_smoke_admission_js_1.cleanupSmokeAdmission)(store, context);
190
+ releaseOwner(record);
191
+ }
192
+ finally {
193
+ unregister();
194
+ }
195
+ }
196
+ }
197
+ //# sourceMappingURL=local-private-smoke-access.js.map
@@ -73,19 +73,34 @@ async function evaluateFoundationPreflight(options) {
73
73
  result.invalidNames.forEach((name) => invalidNames.add(name));
74
74
  result.values.forEach((value, name) => values.set(name, value));
75
75
  }
76
+ const value = (key) => values.get((0, discovery_js_1.foundationSsmPath)(foundationStage, key)) ?? '';
77
+ const capabilities = value('capabilities')
78
+ .split(',')
79
+ .map((capability) => capability.trim())
80
+ .filter(Boolean);
81
+ const hasPostgres = capabilities.includes('postgres');
82
+ const resourceNames = (0, discovery_js_1.foundationSsmKeysForCapabilities)(capabilities.filter(requirements_js_1.isStandardFoundationCapability))
83
+ .map((key) => (0, discovery_js_1.foundationSsmPath)(foundationStage, key))
84
+ .filter((name) => !names.includes(name));
85
+ for (const batch of chunks(resourceNames, 10)) {
86
+ const result = await options.readParameters(batch);
87
+ result.invalidNames.forEach((name) => invalidNames.add(name));
88
+ result.values.forEach((value, name) => values.set(name, value));
89
+ }
90
+ names.push(...resourceNames);
76
91
  const issues = names
77
92
  .filter((name) => invalidNames.has(name) || !values.get(name))
78
93
  .map((name) => `missing required parameter ${name}`);
79
94
  const allRequiredParametersMissing = names.every((name) => invalidNames.has(name) || !values.has(name));
80
- const value = (key) => values.get((0, discovery_js_1.foundationSsmPath)(foundationStage, key)) ?? '';
81
95
  const schemaVersion = Number(value('schemaVersion'));
82
96
  if (schemaVersion !== discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION) {
83
97
  issues.push(`Foundation discovery schema ${value('schemaVersion') || 'missing'} does not match ${discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION}`);
84
98
  }
85
99
  const databasePort = Number(value('databasePort'));
86
- if (!Number.isSafeInteger(databasePort) ||
87
- databasePort < 1 ||
88
- databasePort > 65535) {
100
+ if (hasPostgres &&
101
+ (!Number.isSafeInteger(databasePort) ||
102
+ databasePort < 1 ||
103
+ databasePort > 65535)) {
89
104
  issues.push('Foundation discovery databasePort must be from 1 through 65535');
90
105
  }
91
106
  const accountMonthlyMaximumUsd = Number(value('accountMonthlyMaximumUsd'));
@@ -103,10 +118,6 @@ async function evaluateFoundationPreflight(options) {
103
118
  if (!isExactCognitoTokenEndpoint(value('identityTokenEndpoint'), options.region)) {
104
119
  issues.push('Foundation discovery identityTokenEndpoint must be the exact Cognito HTTPS token endpoint for the selected AWS Region');
105
120
  }
106
- const capabilities = value('capabilities')
107
- .split(',')
108
- .map((capability) => capability.trim())
109
- .filter(Boolean);
110
121
  const compatibility = (0, requirements_js_1.validateFoundationCompatibility)(options.requirement, {
111
122
  capabilities,
112
123
  contractVersion: value('contractVersion'),
@@ -128,15 +139,21 @@ async function evaluateFoundationPreflight(options) {
128
139
  accountMonthlyMaximumUsd,
129
140
  alertTopicArn: value('alertTopicArn'),
130
141
  capabilities: compatibility.value.capabilities,
131
- clusterId: value('clusterId'),
142
+ ...(capabilities.includes('container-compute')
143
+ ? { clusterId: value('clusterId') }
144
+ : {}),
132
145
  contractVersion: compatibility.value.contractVersion,
133
- databaseClusterArn: value('databaseClusterArn'),
134
- databaseClusterEndpoint: value('databaseClusterEndpoint'),
135
- databaseClusterId: value('databaseClusterId'),
136
- databaseClusterResourceId: value('databaseClusterResourceId'),
137
- databaseHost: value('databaseHost'),
138
- databaseMasterSecretArn: value('databaseMasterSecretArn'),
139
- databasePort,
146
+ ...(hasPostgres
147
+ ? {
148
+ databaseClusterArn: value('databaseClusterArn'),
149
+ databaseClusterEndpoint: value('databaseClusterEndpoint'),
150
+ databaseClusterId: value('databaseClusterId'),
151
+ databaseClusterResourceId: value('databaseClusterResourceId'),
152
+ databaseHost: value('databaseHost'),
153
+ databaseMasterSecretArn: value('databaseMasterSecretArn'),
154
+ databasePort,
155
+ }
156
+ : {}),
140
157
  eventBusArn: value('eventBusArn'),
141
158
  eventBusName: value('eventBusName'),
142
159
  hasPublicDomain: value('hasPublicDomain') === 'true',
@@ -147,7 +164,7 @@ async function evaluateFoundationPreflight(options) {
147
164
  routerDistributionId: value('routerDistributionId'),
148
165
  routerUrl: value('routerUrl'),
149
166
  schemaVersion: discovery_js_1.FOUNDATION_SSM_SCHEMA_VERSION,
150
- vpcId: value('vpcId'),
167
+ ...(capabilities.includes('network') ? { vpcId: value('vpcId') } : {}),
151
168
  },
152
169
  consumerStage,
153
170
  foundationStage,
@@ -163,7 +180,9 @@ function formatFoundationPreflightReport(report) {
163
180
  ];
164
181
  report.issues.forEach((issue) => lines.push(` - ${issue}`));
165
182
  if (!report.ok) {
166
- lines.push(` Deploy the Foundation first: pnpm nx run foundation:deploy --stage=${report.foundationStage}`);
183
+ lines.push(report.foundationStage === 'development'
184
+ ? ' Establish Foundation through ebk deploy development --profile=<approved-profile> --expectedRoleArn=<approved-development-role>; the governed stage lifecycle deploys Foundation before eligible Slices.'
185
+ : ` Establish Foundation through the governed ${report.foundationStage} stage lifecycle under the repository deployment profile; follow its protected deployment runbook.`);
167
186
  }
168
187
  return lines.join('\n');
169
188
  }
@@ -30,8 +30,9 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
30
30
  await input.run();
31
31
  return;
32
32
  }
33
- const baseline = stagePolicy.allowedCidrs.filter((cidr) => !cidr.includes(':'));
34
- check(baseline.length > 0, 'private hosted smoke requires a committed IPv4 baseline');
33
+ const allowedCidrs = stagePolicy.allowedCidrs.filter((cidr) => !cidr.includes(':'));
34
+ // Temporary admission has its own empty set; never update the baseline.
35
+ const baseline = [];
35
36
  const repository = environment.GITHUB_REPOSITORY ?? '';
36
37
  const ref = `refs/heads/${input.stage === 'production' ? 'main' : 'develop'}`;
37
38
  const workflow = `${repository}/.github/workflows/deploy.yml@${ref}`;
@@ -58,6 +59,9 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
58
59
  policyDigest: (0, router_waf_js_1.routerWafPolicyDigest)(policy),
59
60
  }, cleanupOnly ? undefined : input.url);
60
61
  await (0, private_smoke_admission_js_1.recoverSmokeAdmission)(store, baseline, async (lease) => {
62
+ // A local process lease has no GitHub run authority; never infer one.
63
+ if (lease.authority === 'local')
64
+ return false;
61
65
  // An old attempt of this run can be recovered only after GitHub confirms it ended.
62
66
  if (lease.run === run && lease.attempt === attempt)
63
67
  return cleanupOnly && lease.source === input.source;
@@ -96,6 +100,10 @@ async function privateSmokeOperation(input, dependencies, cleanupOnly) {
96
100
  const address = await ipResponse.text();
97
101
  check(address.length <= 64, 'runner IPv4 response exceeds bound');
98
102
  const cidr = (0, private_smoke_admission_js_1.publicRunnerIpv4)(address.trim());
103
+ if ((0, private_smoke_admission_js_1.runnerAlreadyAllowed)(cidr, allowedCidrs)) {
104
+ await input.run();
105
+ return;
106
+ }
99
107
  const wait = dependencies.wait ??
100
108
  ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
101
109
  async function observe(allowed) {