@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
@@ -4,6 +4,38 @@ exports.renderProductApiContractFiles = renderProductApiContractFiles;
4
4
  const api_contract_1 = require("@empire-builder-kit/runtime/api-contract");
5
5
  const index_js_1 = require("../../api-contract/index.js");
6
6
  const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
7
+ const local_source_identity_js_1 = require("./local-source-identity.js");
8
+ // Shared by the machine-readable contract and the generated operation source.
9
+ const KEY_VALUE_RECORD_PROBLEMS = [
10
+ {
11
+ code: 'record_input_invalid',
12
+ message: 'Record input is invalid.',
13
+ retryable: false,
14
+ status: 400,
15
+ type: 'https://empirebuilderkit.dev/problems/records/input-invalid',
16
+ },
17
+ {
18
+ code: 'record_idempotency_conflict',
19
+ message: 'The mutation receipt does not match this exact request.',
20
+ retryable: false,
21
+ status: 409,
22
+ type: 'https://empirebuilderkit.dev/problems/records/idempotency-conflict',
23
+ },
24
+ {
25
+ code: 'record_write_conflict',
26
+ message: 'The record changed concurrently; retry the request.',
27
+ retryable: true,
28
+ status: 409,
29
+ type: 'https://empirebuilderkit.dev/problems/records/write-conflict',
30
+ },
31
+ {
32
+ code: 'record_not_found',
33
+ message: 'The record was not found.',
34
+ retryable: false,
35
+ status: 404,
36
+ type: 'https://empirebuilderkit.dev/problems/records/not-found',
37
+ },
38
+ ];
7
39
  function createStandardApiContract(name, pascalName) {
8
40
  const authenticationProblems = [
9
41
  {
@@ -68,6 +100,7 @@ function createStandardApiContract(name, pascalName) {
68
100
  ];
69
101
  const recordConflictProblems = [
70
102
  ...authorizationProblems,
103
+ ...KEY_VALUE_RECORD_PROBLEMS,
71
104
  {
72
105
  code: 'record_conflict',
73
106
  message: 'The record identifier is owned by another principal.',
@@ -232,6 +265,7 @@ function createStandardApiContract(name, pascalName) {
232
265
  },
233
266
  ];
234
267
  const retentionProblems = [
268
+ ...authorizationProblems,
235
269
  {
236
270
  code: 'data_retention_approval_invalid',
237
271
  message: 'The retention approval is invalid for this report.',
@@ -782,6 +816,7 @@ function createStandardApiContract(name, pascalName) {
782
816
  body: (0, api_contract_1.apiObject)({
783
817
  deleted: (0, api_contract_1.apiBoolean)(),
784
818
  id: (0, api_contract_1.apiString)({ format: 'uuid' }),
819
+ deliveryPending: (0, api_contract_1.apiOptional)((0, api_contract_1.apiBoolean)()),
785
820
  }),
786
821
  status: 200,
787
822
  },
@@ -995,6 +1030,7 @@ const authorizationProblems = [
995
1030
 
996
1031
  const recordConflictProblems = [
997
1032
  ...authorizationProblems,
1033
+ ...${JSON.stringify(KEY_VALUE_RECORD_PROBLEMS, null, 2)},
998
1034
  {
999
1035
  code: 'record_conflict',
1000
1036
  message: 'The record identifier is owned by another principal.',
@@ -1166,6 +1202,7 @@ const dataRightsProblems = [
1166
1202
  ] as const;
1167
1203
 
1168
1204
  const retentionProblems = [
1205
+ ...authorizationProblems,
1169
1206
  {
1170
1207
  code: 'data_retention_approval_invalid',
1171
1208
  message: 'The retention approval is invalid for this report.',
@@ -1766,6 +1803,7 @@ export const ${identifierPrefix}DeleteRecord = defineApiOperation({
1766
1803
  body: apiObject({
1767
1804
  deleted: apiBoolean(),
1768
1805
  id: apiString({ format: 'uuid' }),
1806
+ deliveryPending: apiOptional(apiBoolean()),
1769
1807
  }),
1770
1808
  status: 200,
1771
1809
  },
@@ -2349,7 +2387,7 @@ if (action === 'check') {
2349
2387
  }
2350
2388
  `,
2351
2389
  'scripts/api-contract.mjs': `import { createHash } from 'node:crypto';
2352
- import { execFileSync } from 'node:child_process';
2390
+ import { spawnSync } from 'node:child_process';
2353
2391
  import {
2354
2392
  mkdirSync,
2355
2393
  readFileSync,
@@ -2395,13 +2433,10 @@ const action = process.argv[2] ?? 'check';
2395
2433
  const digest = (contents) =>
2396
2434
  'sha256:' + createHash('sha256').update(contents).digest('hex');
2397
2435
 
2436
+ ${local_source_identity_js_1.localSourceCommitFunction}
2437
+
2398
2438
  function sourceIdentity() {
2399
- const commit =
2400
- process.env.EBK_SOURCE_COMMIT ??
2401
- execFileSync('git', ['rev-parse', 'HEAD'], {
2402
- cwd: workspaceRoot,
2403
- encoding: 'utf8',
2404
- }).trim();
2439
+ const commit = localSourceCommit();
2405
2440
  const frameworkCandidate =
2406
2441
  workspacePackage.dependencies?.['@empire-builder-kit/runtime'];
2407
2442
  if (typeof frameworkCandidate !== 'string' || !frameworkCandidate) {
@@ -1,2 +1,2 @@
1
1
  /** @internal */
2
- export declare function renderProductApiFiles(name: string, pascalName: string, workspace: string): Readonly<Record<string, string>>;
2
+ export declare function renderProductApiFiles(name: string, pascalName: string, workspace: string, sql?: boolean): Readonly<Record<string, string>>;
@@ -2,10 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderProductApiFiles = renderProductApiFiles;
4
4
  const built_in_plan_shared_js_1 = require("./built-in-plan-shared.js");
5
+ const built_in_plan_key_value_records_js_1 = require("./built-in-plan-key-value-records.js");
6
+ const built_in_plan_key_value_consumer_js_1 = require("./built-in-plan-key-value-consumer.js");
5
7
  /** @internal */
6
- function renderProductApiFiles(name, pascalName, workspace) {
8
+ function renderProductApiFiles(name, pascalName, workspace, sql = false) {
7
9
  const identifierPrefix = (0, built_in_plan_shared_js_1.lowerCamelIdentifier)(pascalName);
8
- return {
10
+ const files = {
9
11
  'api/health.ts': `import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
10
12
  import { ${identifierPrefix}Health } from './contracts/protected.js';
11
13
 
@@ -206,7 +208,7 @@ async function retentionReview<Result>(
206
208
  404,
207
209
  );
208
210
  }
209
- if (/direct admin/i.test(detail)) {
211
+ if (/^Data-rights (?:request requires a direct human principal|administration requires a direct admin)[.]$/.test(detail)) {
210
212
  mappedError(
211
213
  'authorization_denied',
212
214
  'Authorization was denied.',
@@ -367,6 +369,18 @@ function holdPurpose(
367
369
  );
368
370
  }
369
371
 
372
+ function holdEffects(values: readonly string[]) {
373
+ if (values.length === 0 || new Set(values).size !== values.length)
374
+ return mappedError('data_rights_input_invalid', 'Hold effects must be unique.', 400);
375
+ return values.map(holdEffect);
376
+ }
377
+
378
+ function holdTimestamp(value: string) {
379
+ if (!Number.isFinite(Date.parse(value)) || new Date(value).toISOString() !== value)
380
+ return mappedError('data_rights_input_invalid', 'Hold times must be canonical ISO-8601 timestamps.', 400);
381
+ return value;
382
+ }
383
+
370
384
  async function dataRights<Result>(
371
385
  kind: 'export' | 'hold',
372
386
  operation: () => Promise<Result>,
@@ -375,6 +389,12 @@ async function dataRights<Result>(
375
389
  return await operation();
376
390
  } catch (error) {
377
391
  if (error instanceof RuntimeError) throw error;
392
+ const provider = error as { name?: string; $metadata?: unknown; CancellationReasons?: Array<{ Code?: string }> } | null;
393
+ if (provider?.name === 'ConditionalCheckFailedException' || provider?.name === 'TransactionConflictException' ||
394
+ provider?.name === 'TransactionCanceledException' && provider.CancellationReasons?.some(reason => reason.Code === 'ConditionalCheckFailed' || reason.Code === 'TransactionConflict'))
395
+ mappedError('data_rights_conflict', 'The data-rights state changed concurrently; retry the exact request.', 409, true);
396
+ if (provider?.$metadata || provider?.name?.endsWith('Exception'))
397
+ mappedError('data_rights_retry_required', 'Data-rights processing requires retry.', 503, true);
378
398
  const detail = error instanceof Error ? error.message : '';
379
399
  if (/not found/i.test(detail)) {
380
400
  mappedError('record_not_found', 'The record was not found.', 404);
@@ -410,14 +430,14 @@ async function dataRights<Result>(
410
430
  409,
411
431
  );
412
432
  }
413
- if (kind === 'hold') {
433
+ if (kind === 'hold' && /Only an unexpired active hold|Use explicit expiry|not due for expiry|64 active holds/.test(detail)) {
414
434
  mappedError(
415
435
  'record_hold_invalid',
416
436
  'The record hold cannot make the requested transition.',
417
437
  409,
418
438
  );
419
439
  }
420
- if (/invalid|requires|bounded|future/i.test(detail)) {
440
+ if (/requires|bounded|future/i.test(detail)) {
421
441
  mappedError(
422
442
  'data_rights_input_invalid',
423
443
  'The data-rights request is invalid.',
@@ -425,8 +445,8 @@ async function dataRights<Result>(
425
445
  );
426
446
  }
427
447
  mappedError(
428
- 'data_export_retry_required',
429
- 'Confidential export processing requires retry.',
448
+ 'data_rights_retry_required',
449
+ 'Data-rights processing requires retry.',
430
450
  503,
431
451
  true,
432
452
  );
@@ -567,12 +587,12 @@ export const issueHoldHandler = createContractHttpJsonHandler<
567
587
  const hold = await dataRights('hold', () =>
568
588
  issueRecordHold({
569
589
  correlationId: context.correlationId,
570
- effects: request.body.effects.map(holdEffect),
571
- expiresAt: request.body.expiresAt,
590
+ effects: holdEffects(request.body.effects),
591
+ expiresAt: holdTimestamp(request.body.expiresAt),
572
592
  principal,
573
593
  purpose: holdPurpose(request.body.purpose),
574
594
  recordId: request.path.recordId,
575
- reviewAt: request.body.reviewAt,
595
+ reviewAt: holdTimestamp(request.body.reviewAt),
576
596
  }),
577
597
  );
578
598
  return holdResponse(hold);
@@ -592,11 +612,11 @@ export const reviewHoldHandler = createContractHttpJsonHandler<
592
612
  const hold = await dataRights('hold', () =>
593
613
  reviewRecordHold({
594
614
  correlationId: context.correlationId,
595
- expiresAt: request.body.expiresAt,
615
+ expiresAt: holdTimestamp(request.body.expiresAt),
596
616
  holdId: request.path.holdId,
597
617
  principal,
598
618
  recordId: request.path.recordId,
599
- reviewAt: request.body.reviewAt,
619
+ reviewAt: holdTimestamp(request.body.reviewAt),
600
620
  }),
601
621
  );
602
622
  return holdResponse(hold);
@@ -760,7 +780,7 @@ import type { Principal } from '@empire-builder-kit/runtime/auth';
760
780
  import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
761
781
  import { ${identifierPrefix}DatabaseHealth } from '../api/contracts/protected.js';
762
782
  import { authorize${pascalName}Operation } from '../authorization/runtime.js';
763
- import { withPrimaryDatabase } from './runtime-client.js';
783
+ ${"import { dataStore } from '../data/key-value.js';"}
764
784
 
765
785
  export const handler = createContractHttpJsonHandler<
766
786
  typeof ${identifierPrefix}DatabaseHealth,
@@ -772,351 +792,21 @@ export const handler = createContractHttpJsonHandler<
772
792
  workspace: '${workspace}',
773
793
  authorize: authorize${pascalName}Operation,
774
794
  async handle({ context }) {
775
- await withPrimaryDatabase(
776
- context,
777
- 'api-database-health',
778
- (client) => client.query('SELECT 1'),
779
- );
795
+ ${` void context;
796
+ await dataStore().get('application', 'health', 'connectivity-probe');
797
+ `}\
780
798
  return { service: '${name}', status: 'ok' };
781
799
  },
782
800
  });
783
801
  `,
784
- 'database/records.ts': `import type { RuntimeHttpEvent } from '@empire-builder-kit/runtime';
785
- import type { Principal } from '@empire-builder-kit/runtime/auth';
786
- import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
787
- import type { AuthorizationPrincipal } from '@empire-builder-kit/runtime/authorization';
788
- import { RuntimeError } from '@empire-builder-kit/runtime/response';
789
- import {
790
- ${identifierPrefix}GetRecord,
791
- ${identifierPrefix}PutRecord,
792
- } from '../api/contracts/protected.js';
793
- import {
794
- authorize${pascalName}DataRightsOperation,
795
- authorize${pascalName}Operation,
796
- } from '../authorization/runtime.js';
797
- import {
798
- correctRecordWithLifecycle,
799
- publishRecordCorrection,
800
- } from '../data/record-correction.js';
801
- import { effectiveRecordOwner } from '../data/data-rights-shared.js';
802
- import { withPrimaryDatabase } from './runtime-client.js';
803
-
804
- function canonicalTestExpiresAt(value: string | undefined): string | undefined {
805
- if (value === undefined) return undefined;
806
- const expiresAt = Date.parse(value);
807
- const now = Date.now();
808
- if (
809
- !Number.isFinite(expiresAt) ||
810
- new Date(expiresAt).toISOString() !== value ||
811
- expiresAt <= now ||
812
- expiresAt - now > 48 * 60 * 60 * 1_000
813
- ) {
814
- throw new RuntimeError({
815
- code: 'test_data_expiry_invalid',
816
- message:
817
- 'Test data expiry must be a canonical future timestamp within 48 hours.',
818
- retryable: false,
819
- status: 400,
820
- });
821
- }
822
- return value;
823
- }
824
-
825
- function notFound(): never {
826
- throw new RuntimeError({
827
- code: 'record_not_found',
828
- message: 'The record was not found.',
829
- retryable: false,
830
- status: 404,
831
- });
832
- }
833
-
834
- export const putHandler = createContractHttpJsonHandler<
835
- typeof ${identifierPrefix}PutRecord,
836
- RuntimeHttpEvent,
837
- AuthorizationPrincipal
838
- >({
839
- component: 'database-records',
840
- operation: ${identifierPrefix}PutRecord,
841
- workspace: '${workspace}',
842
- authorize: authorize${pascalName}DataRightsOperation,
843
- async handle({ context, principal, request }) {
844
- const testExpiresAt = canonicalTestExpiresAt(request.body.testExpiresAt);
845
- const ownerId = effectiveRecordOwner(principal);
846
- const result = await withPrimaryDatabase(context, 'api-database-records', (client) =>
847
- client.query<{
848
- id: string;
849
- name: string;
850
- runScope: string;
851
- }>(
852
- \`INSERT INTO records
853
- (id, name, owner_id, run_scope, test_expires_at)
854
- VALUES ($1::uuid, $2, $3, $4, $5::timestamptz)
855
- ON CONFLICT (id) DO NOTHING
856
- RETURNING id::text, name, run_scope AS "runScope"\`,
857
- [
858
- request.path.recordId,
859
- request.body.name,
860
- ownerId,
861
- request.body.runScope,
862
- testExpiresAt ?? null,
863
- ],
864
- ),
865
- );
866
- const created = result.rows[0];
867
- if (created) return created;
868
- const ownership = await withPrimaryDatabase(
869
- context,
870
- 'api-database-records',
871
- (client) =>
872
- client.query<{ ownerId: string }>(
873
- \`SELECT owner_id AS "ownerId"
874
- FROM records
875
- WHERE id = $1::uuid\`,
876
- [request.path.recordId],
877
- ),
878
- );
879
- if (ownership.rows[0]?.ownerId !== ownerId) {
880
- throw new RuntimeError({
881
- code: 'record_conflict',
882
- message: 'The record identifier is owned by another principal.',
883
- retryable: false,
884
- status: 409,
885
- });
886
- }
887
- const corrected = await correctRecordWithLifecycle({
888
- correlationId: context.correlationId,
889
- name: request.body.name,
890
- principal,
891
- recordId: request.path.recordId,
892
- runScope: request.body.runScope,
893
- testExpiresAt,
894
- });
895
- const propagation = await publishRecordCorrection(
896
- context.correlationId,
897
- corrected.requestRef,
898
- );
899
- if (propagation === 'retry-required') {
900
- throw new RuntimeError({
901
- code: 'record_correction_retry_required',
902
- message: 'Record correction propagation requires retry.',
903
- retryable: true,
904
- status: 503,
905
- });
906
- }
907
- return {
908
- id: corrected.id,
909
- name: corrected.name,
910
- runScope: corrected.runScope,
911
- };
912
- },
913
- });
914
-
915
- export const getHandler = createContractHttpJsonHandler<
916
- typeof ${identifierPrefix}GetRecord,
917
- RuntimeHttpEvent,
918
- Principal
919
- >({
920
- component: 'database-records',
921
- operation: ${identifierPrefix}GetRecord,
922
- workspace: '${workspace}',
923
- authorize: authorize${pascalName}Operation,
924
- async handle({ context, principal, request }) {
925
- const result = await withPrimaryDatabase(context, 'api-database-records', (client) =>
926
- client.query<{ id: string; name: string; runScope: string }>(
927
- \`SELECT id::text, name, run_scope AS "runScope"
928
- FROM records
929
- WHERE id = $1::uuid AND owner_id = $2\`,
930
- [request.path.recordId, principal.id],
931
- ),
932
- );
933
- return result.rows[0] ?? notFound();
934
- },
935
- });
936
-
937
- `,
938
- 'api/event-consumer.ts': `import { parseDataLifecycleChangeEvent } from '@empire-builder-kit/runtime/data-lifecycle';
939
- import { parseSqsEventBridgeRecords, toEventLogContext } from '@empire-builder-kit/runtime/events';
940
- import { createLogger } from '@empire-builder-kit/runtime/logging';
941
- import type {
942
- ${pascalName}CreatedData,
943
- ${pascalName}DataLifecycleChangedData,
944
- } from '../contracts/events.js';
945
- import {
946
- ${identifierPrefix}AuthorizationActions,
947
- } from '../authorization/policy.js';
948
- import {
949
- authorize${pascalName}InternalOperation,
950
- } from '../authorization/runtime.js';
951
- import lifecycleConsumers from '../data/lifecycle-consumers.json';
952
- import { withPrimaryDatabase } from '../database/runtime-client.js';
953
-
954
- interface QueueRecord { body: string; messageId: string }
955
- interface QueueEvent { Records: QueueRecord[] }
956
-
957
- function acceptedLifecycleSources(): Set<string> {
958
- const sources = lifecycleConsumers.acceptedSources;
959
- if (
960
- lifecycleConsumers.schemaVersion !== 1 ||
961
- !Array.isArray(sources) ||
962
- sources.length === 0 ||
963
- sources.length > 32 ||
964
- new Set(sources).size !== sources.length ||
965
- sources.some((source) => !/^[a-z][a-z0-9-]{0,62}$/.test(source))
966
- ) {
967
- throw new Error(
968
- 'Lifecycle consumer configuration must contain unique bounded Slice sources.',
969
- );
970
- }
971
- return new Set(sources);
972
- }
973
-
974
- const lifecycleSources = acceptedLifecycleSources();
975
-
976
- function requiredEventConsumerWorkloadIdentity(): string {
977
- const configured = process.env.EBK_WORKLOAD_IDENTITY?.trim();
978
- if (configured !== '${name}:event-consumer') {
979
- throw new Error('Event consumer workload identity is invalid.');
980
- }
981
- return configured;
982
- }
983
-
984
- function lifecycleReconciliationExpiresAt(occurredAt: string): string {
985
- const expiresAt = new Date(occurredAt);
986
- expiresAt.setUTCDate(expiresAt.getUTCDate() + 400);
987
- return expiresAt.toISOString();
988
- }
989
-
990
- export async function handler(event: QueueEvent) {
991
- const workloadIdentity = requiredEventConsumerWorkloadIdentity();
992
- const logger = createLogger({
993
- component: 'event-consumer',
994
- feature: 'events',
995
- operation: 'consume-created',
996
- slice: '${name}',
997
- stage: process.env.EBK_STAGE ?? '',
998
- workspace: '${workspace}',
999
- });
1000
- const batch = parseSqsEventBridgeRecords<
1001
- ${pascalName}CreatedData | ${pascalName}DataLifecycleChangedData
1002
- >(event.Records);
1003
- const failures = [...batch.failures];
1004
- for (const { detailType, envelope, messageId, source } of batch.events) {
1005
- if (messageId === undefined) {
1006
- failures.push({
1007
- error: 'Event processing failed without retaining payload data.',
1008
- messageId: 'missing-message-id',
1009
- });
1010
- continue;
1011
- }
1012
- try {
1013
- if (detailType === 'DataLifecycleChanged') {
1014
- const lifecycle = parseDataLifecycleChangeEvent(envelope.data);
1015
- if (
1016
- source === undefined ||
1017
- lifecycle.sourceSlice !== source ||
1018
- !lifecycleSources.has(source)
1019
- ) {
1020
- throw new Error(
1021
- 'Lifecycle event source is not declared by this consumer.',
1022
- );
1023
- }
1024
- await authorize${pascalName}InternalOperation({
1025
- action: ${identifierPrefix}AuthorizationActions.lifecycleConsume,
1026
- correlationId: envelope.meta.correlationId,
1027
- operationId: messageId,
1028
- workloadIdentity,
1029
- });
1030
- await withPrimaryDatabase(
1031
- { correlationId: envelope.meta.correlationId },
1032
- 'event-consumer',
1033
- async (client) => {
1034
- await client.query('BEGIN');
1035
- try {
1036
- await client.query(
1037
- \`INSERT INTO data_lifecycle_receipts
1038
- (source_slice, pseudonymous_key, action, request_ref,
1039
- policy_version, occurred_at)
1040
- VALUES ($1, $2, $3, $4, $5, $6)
1041
- ON CONFLICT
1042
- (source_slice, pseudonymous_key, action, request_ref)
1043
- DO NOTHING\`,
1044
- [
1045
- lifecycle.sourceSlice,
1046
- lifecycle.pseudonymousKey,
1047
- lifecycle.action,
1048
- lifecycle.requestRef,
1049
- lifecycle.policyVersion,
1050
- lifecycle.occurredAt,
1051
- ],
1052
- );
1053
- await client.query(
1054
- \`INSERT INTO data_lifecycle_downstream_copies
1055
- (source_slice, pseudonymous_key, copy_id, recipient,
1056
- purpose, expires_at, action, hold_refs, status,
1057
- updated_at)
1058
- VALUES ($1, $2, $3, $4, 'lifecycle-reconciliation', $5,
1059
- $6, '[]'::jsonb, $7, $8)
1060
- ON CONFLICT (source_slice, pseudonymous_key, copy_id)
1061
- DO UPDATE SET
1062
- action = EXCLUDED.action,
1063
- expires_at = EXCLUDED.expires_at,
1064
- hold_refs = EXCLUDED.hold_refs,
1065
- status = EXCLUDED.status,
1066
- updated_at = EXCLUDED.updated_at
1067
- WHERE data_lifecycle_downstream_copies.updated_at
1068
- <= EXCLUDED.updated_at\`,
1069
- [
1070
- lifecycle.sourceSlice,
1071
- lifecycle.pseudonymousKey,
1072
- '${name}-lifecycle-consumer',
1073
- '${name}',
1074
- lifecycleReconciliationExpiresAt(lifecycle.occurredAt),
1075
- lifecycle.action,
1076
- lifecycle.action === 'deletion'
1077
- ? 'deleted'
1078
- : 'reconciled',
1079
- lifecycle.occurredAt,
1080
- ],
1081
- );
1082
- await client.query('COMMIT');
1083
- } catch (error) {
1084
- await client.query('ROLLBACK').catch(() => undefined);
1085
- throw error;
1086
- }
1087
- },
1088
- );
1089
- }
1090
- logger.info('${name} event consumed', {
1091
- context: toEventLogContext(envelope.meta, detailType),
1092
- outcome: 'success',
1093
- });
1094
- } catch {
1095
- failures.push({
1096
- error: 'Event processing failed without retaining payload data.',
1097
- messageId,
1098
- });
1099
- }
1100
- }
1101
- logger.info('${name} event batch completed', {
1102
- attributes: {
1103
- eventCount: batch.events.length,
1104
- failureCount: failures.length,
1105
- },
1106
- outcome: failures.length === 0 ? 'success' : 'failure',
1107
- });
1108
- return {
1109
- batchItemFailures: failures.map(({ messageId }) => ({
1110
- itemIdentifier: messageId ?? '',
1111
- })),
1112
- };
1113
- }
1114
- `,
802
+ 'database/records.ts': (0, built_in_plan_key_value_records_js_1.renderKeyValueRecordApi)(pascalName, workspace),
803
+ 'api/event-consumer.ts': (0, built_in_plan_key_value_consumer_js_1.renderKeyValueEventConsumer)(name, pascalName, workspace),
1115
804
  'testing/event-consumer-identity.spec.ts': `import { afterEach, describe, expect, it } from 'vitest';
1116
805
  import { handler } from '../api/event-consumer.js';
1117
806
 
1118
807
  afterEach(() => {
1119
808
  delete process.env.EBK_WORKLOAD_IDENTITY;
809
+ delete process.env.EBK_STAGE;
1120
810
  });
1121
811
 
1122
812
  describe('${pascalName} event-consumer identity', () => {
@@ -1135,54 +825,22 @@ describe('${pascalName} event-consumer identity', () => {
1135
825
 
1136
826
  it('accepts only the exact generated identity', async () => {
1137
827
  process.env.EBK_WORKLOAD_IDENTITY = '${name}:event-consumer';
828
+ process.env.EBK_STAGE = 'development';
1138
829
  await expect(handler({ Records: [] })).resolves.toEqual({
1139
830
  batchItemFailures: [],
1140
831
  });
1141
832
  });
1142
- });
1143
- `,
1144
- 'api/publish-created.ts': `import { EventBridgeClient, PutEventsCommand } from '@aws-sdk/client-eventbridge';
1145
- import type { RuntimeHttpEvent } from '@empire-builder-kit/runtime';
1146
- import type { Principal } from '@empire-builder-kit/runtime/auth';
1147
- import { createContractHttpJsonHandler } from '@empire-builder-kit/runtime/api-server';
1148
- import { createEventPublisher } from '@empire-builder-kit/runtime/events';
1149
- import { authorize${pascalName}Operation } from '../authorization/runtime.js';
1150
- import { ${identifierPrefix}PublishCreated } from './contracts/protected.js';
1151
- import { ${pascalName}Created } from '../contracts/events.js';
1152
833
 
1153
- const client = new EventBridgeClient({});
1154
- let publish: ReturnType<typeof createEventPublisher> | undefined;
1155
- function getPublisher() {
1156
- return publish ??= createEventPublisher({
1157
- busName: process.env.EVENT_BUS_NAME ?? '',
1158
- stage: process.env.EBK_STAGE ?? '',
1159
- send: (entry) => client.send(new PutEventsCommand({ Entries: [{
1160
- Detail: entry.detail,
1161
- DetailType: entry.detailType,
1162
- EventBusName: entry.eventBusName,
1163
- Source: entry.source,
1164
- }] })),
834
+ it('fails closed without an exact receiver stage', async () => {
835
+ process.env.EBK_WORKLOAD_IDENTITY = '${name}:event-consumer';
836
+ await expect(handler({ Records: [] })).rejects.toThrow(
837
+ 'Event consumer stage is required and must be exact.',
838
+ );
1165
839
  });
1166
- }
1167
-
1168
- export const handler = createContractHttpJsonHandler<
1169
- typeof ${identifierPrefix}PublishCreated,
1170
- RuntimeHttpEvent,
1171
- Principal
1172
- >({
1173
- component: 'event-publisher',
1174
- operation: ${identifierPrefix}PublishCreated,
1175
- workspace: '${workspace}',
1176
- authorize: authorize${pascalName}Operation,
1177
- async handle({ context, principal }) {
1178
- const publishedEvent = await getPublisher()(${pascalName}Created, {
1179
- id: crypto.randomUUID(),
1180
- occurredBy: principal.id,
1181
- }, { context });
1182
- return { eventId: publishedEvent.meta.eventId };
1183
- },
1184
840
  });
1185
841
  `,
842
+ 'api/publish-created.ts': (0, built_in_plan_key_value_consumer_js_1.renderKeyValueCreatedPublisher)(pascalName, workspace),
1186
843
  };
844
+ return Object.fromEntries(Object.entries(files).filter(([path]) => sql || path !== 'database/runtime-client.ts'));
1187
845
  }
1188
846
  //# sourceMappingURL=built-in-plan-api-files.js.map