@empire-builder-kit/nx 1.0.0-beta.9 → 1.0.0-rc.2

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 (824) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +113 -3
  3. package/executors.json +30 -0
  4. package/package.json +84 -6
  5. package/src/api-contract/baseline-update.d.ts +82 -0
  6. package/src/api-contract/baseline-update.js +225 -0
  7. package/src/api-contract/baseline-update.js.map +1 -0
  8. package/src/api-contract/compatibility.d.ts +30 -0
  9. package/src/api-contract/compatibility.js +643 -0
  10. package/src/api-contract/compatibility.js.map +1 -0
  11. package/src/api-contract/contract-graph.d.ts +35 -0
  12. package/src/api-contract/contract-graph.js +141 -0
  13. package/src/api-contract/contract-graph.js.map +1 -0
  14. package/src/api-contract/evidence.d.ts +23 -0
  15. package/src/api-contract/evidence.js +87 -0
  16. package/src/api-contract/evidence.js.map +1 -0
  17. package/src/api-contract/index.d.ts +6 -0
  18. package/src/api-contract/index.js +10 -0
  19. package/src/api-contract/index.js.map +1 -0
  20. package/src/api-contract/model.d.ts +144 -0
  21. package/src/api-contract/model.fixtures.d.ts +2 -0
  22. package/src/api-contract/model.fixtures.js +81 -0
  23. package/src/api-contract/model.fixtures.js.map +1 -0
  24. package/src/api-contract/model.js +993 -0
  25. package/src/api-contract/model.js.map +1 -0
  26. package/src/api-contract/rollout.d.ts +32 -0
  27. package/src/api-contract/rollout.js +88 -0
  28. package/src/api-contract/rollout.js.map +1 -0
  29. package/src/authorization/compatibility.d.ts +62 -0
  30. package/src/authorization/compatibility.js +175 -0
  31. package/src/authorization/compatibility.js.map +1 -0
  32. package/src/authorization/index.d.ts +1 -0
  33. package/src/authorization/index.js +5 -0
  34. package/src/authorization/index.js.map +1 -0
  35. package/src/blueprints/execution.d.ts +25 -1
  36. package/src/blueprints/execution.js +246 -83
  37. package/src/blueprints/execution.js.map +1 -1
  38. package/src/blueprints/external-sandbox.d.ts +53 -0
  39. package/src/blueprints/external-sandbox.js +1182 -0
  40. package/src/blueprints/external-sandbox.js.map +1 -0
  41. package/src/blueprints/manifest.d.ts +42 -2
  42. package/src/blueprints/manifest.js +82 -27
  43. package/src/blueprints/manifest.js.map +1 -1
  44. package/src/blueprints/resolver.d.ts +14 -5
  45. package/src/blueprints/resolver.js +228 -68
  46. package/src/blueprints/resolver.js.map +1 -1
  47. package/src/cli/agent-command.d.ts +30 -0
  48. package/src/cli/agent-command.js +204 -0
  49. package/src/cli/agent-command.js.map +1 -0
  50. package/src/cli/agent-runtime.d.ts +25 -0
  51. package/src/cli/agent-runtime.js +488 -0
  52. package/src/cli/agent-runtime.js.map +1 -0
  53. package/src/cli/blueprint-authority.d.ts +9 -0
  54. package/src/cli/blueprint-authority.js +43 -0
  55. package/src/cli/blueprint-authority.js.map +1 -0
  56. package/src/cli/blueprint-command.d.ts +24 -0
  57. package/src/cli/blueprint-command.js +63 -0
  58. package/src/cli/blueprint-command.js.map +1 -0
  59. package/src/cli/bootstrap.d.ts +31 -0
  60. package/src/cli/bootstrap.js +165 -0
  61. package/src/cli/bootstrap.js.map +1 -0
  62. package/src/cli/dev-command.d.ts +92 -0
  63. package/src/cli/dev-command.js +561 -0
  64. package/src/cli/dev-command.js.map +1 -0
  65. package/src/cli/main.d.ts +131 -0
  66. package/src/cli/main.js +1199 -0
  67. package/src/cli/main.js.map +1 -0
  68. package/src/cli/output.d.ts +19 -0
  69. package/src/cli/output.js +51 -0
  70. package/src/cli/output.js.map +1 -0
  71. package/src/cli/personal-secret-runtime.d.ts +81 -0
  72. package/src/cli/personal-secret-runtime.js +567 -0
  73. package/src/cli/personal-secret-runtime.js.map +1 -0
  74. package/src/cli/secret-terminal.d.ts +12 -0
  75. package/src/cli/secret-terminal.js +128 -0
  76. package/src/cli/secret-terminal.js.map +1 -0
  77. package/src/container-images.d.ts +1 -0
  78. package/src/container-images.js +5 -0
  79. package/src/container-images.js.map +1 -0
  80. package/src/data-lifecycle/index.d.ts +3 -0
  81. package/src/data-lifecycle/index.js +7 -0
  82. package/src/data-lifecycle/index.js.map +1 -0
  83. package/src/data-lifecycle/model.d.ts +172 -0
  84. package/src/data-lifecycle/model.fixtures.d.ts +2 -0
  85. package/src/data-lifecycle/model.fixtures.js +244 -0
  86. package/src/data-lifecycle/model.fixtures.js.map +1 -0
  87. package/src/data-lifecycle/model.js +95 -0
  88. package/src/data-lifecycle/model.js.map +1 -0
  89. package/src/data-lifecycle/sensitive-artifacts.d.ts +28 -0
  90. package/src/data-lifecycle/sensitive-artifacts.js +146 -0
  91. package/src/data-lifecycle/sensitive-artifacts.js.map +1 -0
  92. package/src/data-lifecycle/validation.d.ts +32 -0
  93. package/src/data-lifecycle/validation.js +837 -0
  94. package/src/data-lifecycle/validation.js.map +1 -0
  95. package/src/database-retirement/contract.d.ts +68 -0
  96. package/src/database-retirement/contract.js +166 -0
  97. package/src/database-retirement/contract.js.map +1 -0
  98. package/src/database-retirement/index.d.ts +1 -0
  99. package/src/database-retirement/index.js +5 -0
  100. package/src/database-retirement/index.js.map +1 -0
  101. package/src/deterministic-order.d.ts +2 -0
  102. package/src/deterministic-order.js +7 -0
  103. package/src/deterministic-order.js.map +1 -0
  104. package/src/developer-agent/context.d.ts +27 -0
  105. package/src/developer-agent/context.js +497 -0
  106. package/src/developer-agent/context.js.map +1 -0
  107. package/src/developer-agent/generator-planning.d.ts +34 -0
  108. package/src/developer-agent/generator-planning.js +645 -0
  109. package/src/developer-agent/generator-planning.js.map +1 -0
  110. package/src/developer-agent/generator-preview.d.ts +8 -0
  111. package/src/developer-agent/generator-preview.js +650 -0
  112. package/src/developer-agent/generator-preview.js.map +1 -0
  113. package/src/developer-agent/git-inspection.d.ts +108 -0
  114. package/src/developer-agent/git-inspection.js +815 -0
  115. package/src/developer-agent/git-inspection.js.map +1 -0
  116. package/src/developer-agent/handoff.d.ts +43 -0
  117. package/src/developer-agent/handoff.js +698 -0
  118. package/src/developer-agent/handoff.js.map +1 -0
  119. package/src/developer-agent/index.d.ts +10 -0
  120. package/src/developer-agent/index.js +14 -0
  121. package/src/developer-agent/index.js.map +1 -0
  122. package/src/developer-agent/model.d.ts +481 -0
  123. package/src/developer-agent/model.js +143 -0
  124. package/src/developer-agent/model.js.map +1 -0
  125. package/src/developer-agent/operation-registry.d.ts +45 -0
  126. package/src/developer-agent/operation-registry.js +1255 -0
  127. package/src/developer-agent/operation-registry.js.map +1 -0
  128. package/src/developer-agent/ordering.d.ts +9 -0
  129. package/src/developer-agent/ordering.js +15 -0
  130. package/src/developer-agent/ordering.js.map +1 -0
  131. package/src/developer-agent/planning.d.ts +18 -0
  132. package/src/developer-agent/planning.js +447 -0
  133. package/src/developer-agent/planning.js.map +1 -0
  134. package/src/developer-agent/preview-changes.d.ts +26 -0
  135. package/src/developer-agent/preview-changes.js +203 -0
  136. package/src/developer-agent/preview-changes.js.map +1 -0
  137. package/src/developer-agent/preview-source.d.ts +2 -0
  138. package/src/developer-agent/preview-source.js +16 -0
  139. package/src/developer-agent/preview-source.js.map +1 -0
  140. package/src/developer-agent/validation.d.ts +18 -0
  141. package/src/developer-agent/validation.js +2617 -0
  142. package/src/developer-agent/validation.js.map +1 -0
  143. package/src/developer-agent/workspace-inspection.d.ts +20 -0
  144. package/src/developer-agent/workspace-inspection.js +1134 -0
  145. package/src/developer-agent/workspace-inspection.js.map +1 -0
  146. package/src/developer-agent/workspace-path.d.ts +6 -0
  147. package/src/developer-agent/workspace-path.js +22 -0
  148. package/src/developer-agent/workspace-path.js.map +1 -0
  149. package/src/executors/blueprint-trust/blueprint-trust.d.ts +29 -0
  150. package/src/executors/blueprint-trust/blueprint-trust.js +115 -0
  151. package/src/executors/blueprint-trust/blueprint-trust.js.map +1 -0
  152. package/src/executors/blueprint-trust/schema.json +27 -0
  153. package/src/executors/blueprint-verification/blueprint-verification.d.ts +13 -0
  154. package/src/executors/blueprint-verification/blueprint-verification.js +110 -0
  155. package/src/executors/blueprint-verification/blueprint-verification.js.map +1 -0
  156. package/src/executors/blueprint-verification/schema.json +44 -0
  157. package/src/executors/deployment-plan/deployment-plan.js +1 -0
  158. package/src/executors/deployment-plan/deployment-plan.js.map +1 -1
  159. package/src/executors/dev-doctor/dev-doctor.d.ts +19 -5
  160. package/src/executors/dev-doctor/dev-doctor.js +186 -32
  161. package/src/executors/dev-doctor/dev-doctor.js.map +1 -1
  162. package/src/executors/dev-doctor/schema.json +1 -6
  163. package/src/executors/dev-setup/dev-setup.d.ts +7 -1
  164. package/src/executors/dev-setup/dev-setup.js +14 -3
  165. package/src/executors/dev-setup/dev-setup.js.map +1 -1
  166. package/src/executors/developer-context/developer-context.d.ts +38 -0
  167. package/src/executors/developer-context/developer-context.js +78 -0
  168. package/src/executors/developer-context/developer-context.js.map +1 -0
  169. package/src/executors/developer-context/schema.json +87 -0
  170. package/src/executors/fleet/fleet.d.ts +12 -43
  171. package/src/executors/fleet/fleet.js +120 -500
  172. package/src/executors/fleet/fleet.js.map +1 -1
  173. package/src/executors/fleet/schema.json +64 -14
  174. package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
  175. package/src/executors/github-bootstrap/github-bootstrap.js +1 -0
  176. package/src/executors/github-bootstrap/github-bootstrap.js.map +1 -1
  177. package/src/executors/github-bootstrap/schema.json +5 -0
  178. package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +144 -0
  179. package/src/executors/infrastructure-plan/infrastructure-plan.js +3320 -0
  180. package/src/executors/infrastructure-plan/infrastructure-plan.js.map +1 -0
  181. package/src/executors/infrastructure-plan/schema.json +78 -0
  182. package/src/executors/secret-guardrails/schema.json +6 -0
  183. package/src/executors/secret-guardrails/secret-guardrails.d.ts +3 -0
  184. package/src/executors/secret-guardrails/secret-guardrails.js +44 -0
  185. package/src/executors/secret-guardrails/secret-guardrails.js.map +1 -0
  186. package/src/executors/secret-metadata/schema.json +31 -0
  187. package/src/executors/secret-metadata/secret-metadata.d.ts +32 -0
  188. package/src/executors/secret-metadata/secret-metadata.js +131 -0
  189. package/src/executors/secret-metadata/secret-metadata.js.map +1 -0
  190. package/src/executors/sst-lifecycle/logging-preflight.d.ts +17 -0
  191. package/src/executors/sst-lifecycle/logging-preflight.js +196 -0
  192. package/src/executors/sst-lifecycle/logging-preflight.js.map +1 -0
  193. package/src/executors/sst-lifecycle/run-sst-command.d.ts +23 -3
  194. package/src/executors/sst-lifecycle/run-sst-command.js +113 -10
  195. package/src/executors/sst-lifecycle/run-sst-command.js.map +1 -1
  196. package/src/executors/sst-lifecycle/schema.json +9 -5
  197. package/src/executors/sst-lifecycle/secret-preflight.d.ts +25 -0
  198. package/src/executors/sst-lifecycle/secret-preflight.js +119 -0
  199. package/src/executors/sst-lifecycle/secret-preflight.js.map +1 -0
  200. package/src/foundation/discovery.d.ts +17 -1
  201. package/src/foundation/discovery.js +16 -1
  202. package/src/foundation/discovery.js.map +1 -1
  203. package/src/foundation/index.d.ts +3 -0
  204. package/src/foundation/index.js +3 -0
  205. package/src/foundation/index.js.map +1 -1
  206. package/src/foundation/local-database-contract.d.ts +1 -0
  207. package/src/foundation/local-database-contract.js +3 -0
  208. package/src/foundation/local-database-contract.js.map +1 -1
  209. package/src/foundation/logging-preflight.d.ts +30 -0
  210. package/src/foundation/logging-preflight.js +138 -0
  211. package/src/foundation/logging-preflight.js.map +1 -0
  212. package/src/foundation/logging.d.ts +70 -0
  213. package/src/foundation/logging.js +133 -0
  214. package/src/foundation/logging.js.map +1 -0
  215. package/src/foundation/preflight.d.ts +9 -0
  216. package/src/foundation/preflight.js +58 -2
  217. package/src/foundation/preflight.js.map +1 -1
  218. package/src/foundation/provision-database-bindings.d.ts +9 -1
  219. package/src/foundation/provision-database-bindings.js +25 -5
  220. package/src/foundation/provision-database-bindings.js.map +1 -1
  221. package/src/foundation/provision-logical-database.d.ts +10 -2
  222. package/src/foundation/provision-logical-database.js +68 -113
  223. package/src/foundation/provision-logical-database.js.map +1 -1
  224. package/src/foundation/router-origin-proof.d.ts +2 -0
  225. package/src/foundation/router-origin-proof.js +25 -0
  226. package/src/foundation/router-origin-proof.js.map +1 -0
  227. package/src/foundation/stages.d.ts +1 -0
  228. package/src/foundation/stages.js +9 -1
  229. package/src/foundation/stages.js.map +1 -1
  230. package/src/frontend-security/index.d.ts +1 -0
  231. package/src/frontend-security/index.js +5 -0
  232. package/src/frontend-security/index.js.map +1 -0
  233. package/src/frontend-security/security-headers.d.ts +50 -0
  234. package/src/frontend-security/security-headers.js +418 -0
  235. package/src/frontend-security/security-headers.js.map +1 -0
  236. package/src/generators/feature-registry.d.ts +13 -0
  237. package/src/generators/feature-registry.js +73 -0
  238. package/src/generators/feature-registry.js.map +1 -0
  239. package/src/generators/function/function.d.ts +1 -1
  240. package/src/generators/function/function.js +51 -6
  241. package/src/generators/function/function.js.map +1 -1
  242. package/src/generators/function/schema.d.ts +1 -0
  243. package/src/generators/function/schema.json +6 -1
  244. package/src/generators/logging-registry.d.ts +13 -0
  245. package/src/generators/logging-registry.js +62 -0
  246. package/src/generators/logging-registry.js.map +1 -0
  247. package/src/generators/post-generation-install.d.ts +67 -0
  248. package/src/generators/post-generation-install.js +3308 -0
  249. package/src/generators/post-generation-install.js.map +1 -0
  250. package/src/generators/preset/generator.js +3 -0
  251. package/src/generators/preset/generator.js.map +1 -1
  252. package/src/generators/preset/tool-versions.d.ts +18 -0
  253. package/src/generators/preset/tool-versions.js +22 -0
  254. package/src/generators/preset/tool-versions.js.map +1 -0
  255. package/src/generators/preset/workspace-files-developer-agent.d.ts +14 -0
  256. package/src/generators/preset/workspace-files-developer-agent.js +511 -0
  257. package/src/generators/preset/workspace-files-developer-agent.js.map +1 -0
  258. package/src/generators/preset/workspace-files-foundation-workload-roles.d.ts +6 -0
  259. package/src/generators/preset/workspace-files-foundation-workload-roles.js +406 -0
  260. package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +1 -0
  261. package/src/generators/preset/workspace-files-performance-cost.d.ts +66 -0
  262. package/src/generators/preset/workspace-files-performance-cost.js +866 -0
  263. package/src/generators/preset/workspace-files-performance-cost.js.map +1 -0
  264. package/src/generators/preset/workspace-files-performance-load.d.ts +73 -0
  265. package/src/generators/preset/workspace-files-performance-load.js +801 -0
  266. package/src/generators/preset/workspace-files-performance-load.js.map +1 -0
  267. package/src/generators/preset/workspace-files-workload-role-baseline.d.ts +9 -0
  268. package/src/generators/preset/workspace-files-workload-role-baseline.js +1102 -0
  269. package/src/generators/preset/workspace-files-workload-role-baseline.js.map +1 -0
  270. package/src/generators/preset/workspace-files.d.ts +14 -1
  271. package/src/generators/preset/workspace-files.js +8189 -245
  272. package/src/generators/preset/workspace-files.js.map +1 -1
  273. package/src/generators/repository-policy/repository-policy.js +3 -47
  274. package/src/generators/repository-policy/repository-policy.js.map +1 -1
  275. package/src/generators/slice/built-in-plan-api-contract-files.d.ts +2 -0
  276. package/src/generators/slice/built-in-plan-api-contract-files.js +2656 -0
  277. package/src/generators/slice/built-in-plan-api-contract-files.js.map +1 -0
  278. package/src/generators/slice/built-in-plan-api-files.d.ts +2 -0
  279. package/src/generators/slice/built-in-plan-api-files.js +1186 -0
  280. package/src/generators/slice/built-in-plan-api-files.js.map +1 -0
  281. package/src/generators/slice/built-in-plan-async-work-files.d.ts +2 -0
  282. package/src/generators/slice/built-in-plan-async-work-files.js +7903 -0
  283. package/src/generators/slice/built-in-plan-async-work-files.js.map +1 -0
  284. package/src/generators/slice/built-in-plan-authorization-files.d.ts +2 -0
  285. package/src/generators/slice/built-in-plan-authorization-files.js +2314 -0
  286. package/src/generators/slice/built-in-plan-authorization-files.js.map +1 -0
  287. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.d.ts +2 -0
  288. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +559 -0
  289. package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +1 -0
  290. package/src/generators/slice/built-in-plan-data-deletion-files.d.ts +2 -0
  291. package/src/generators/slice/built-in-plan-data-deletion-files.js +1101 -0
  292. package/src/generators/slice/built-in-plan-data-deletion-files.js.map +1 -0
  293. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.d.ts +2 -0
  294. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +249 -0
  295. package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +1 -0
  296. package/src/generators/slice/built-in-plan-data-files.d.ts +2 -0
  297. package/src/generators/slice/built-in-plan-data-files.js +1530 -0
  298. package/src/generators/slice/built-in-plan-data-files.js.map +1 -0
  299. package/src/generators/slice/built-in-plan-data-lifecycle-files.d.ts +2 -0
  300. package/src/generators/slice/built-in-plan-data-lifecycle-files.js +750 -0
  301. package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +1 -0
  302. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.d.ts +2 -0
  303. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +828 -0
  304. package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +1 -0
  305. package/src/generators/slice/built-in-plan-data-retention-job-files.d.ts +2 -0
  306. package/src/generators/slice/built-in-plan-data-retention-job-files.js +2604 -0
  307. package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +1 -0
  308. package/src/generators/slice/built-in-plan-data-retention-launcher-files.d.ts +2 -0
  309. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +144 -0
  310. package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +1 -0
  311. package/src/generators/slice/built-in-plan-data-rights-files.d.ts +2 -0
  312. package/src/generators/slice/built-in-plan-data-rights-files.js +4628 -0
  313. package/src/generators/slice/built-in-plan-data-rights-files.js.map +1 -0
  314. package/src/generators/slice/built-in-plan-database-lifecycle-files.d.ts +2 -0
  315. package/src/generators/slice/built-in-plan-database-lifecycle-files.js +1901 -0
  316. package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +1 -0
  317. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.d.ts +2 -0
  318. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +485 -0
  319. package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +1 -0
  320. package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -0
  321. package/src/generators/slice/built-in-plan-foundation-files.js +184 -0
  322. package/src/generators/slice/built-in-plan-foundation-files.js.map +1 -0
  323. package/src/generators/slice/built-in-plan-frontend-files.d.ts +2 -0
  324. package/src/generators/slice/built-in-plan-frontend-files.js +2233 -0
  325. package/src/generators/slice/built-in-plan-frontend-files.js.map +1 -0
  326. package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +2 -0
  327. package/src/generators/slice/built-in-plan-infrastructure-files.js +3038 -0
  328. package/src/generators/slice/built-in-plan-infrastructure-files.js.map +1 -0
  329. package/src/generators/slice/built-in-plan-infrastructure-safety-files.d.ts +2 -0
  330. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +312 -0
  331. package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +1 -0
  332. package/src/generators/slice/built-in-plan-metadata-files.d.ts +3 -0
  333. package/src/generators/slice/built-in-plan-metadata-files.js +219 -0
  334. package/src/generators/slice/built-in-plan-metadata-files.js.map +1 -0
  335. package/src/generators/slice/built-in-plan-operations-files.d.ts +2 -0
  336. package/src/generators/slice/built-in-plan-operations-files.js +630 -0
  337. package/src/generators/slice/built-in-plan-operations-files.js.map +1 -0
  338. package/src/generators/slice/built-in-plan-performance-files.d.ts +3 -0
  339. package/src/generators/slice/built-in-plan-performance-files.js +3293 -0
  340. package/src/generators/slice/built-in-plan-performance-files.js.map +1 -0
  341. package/src/generators/slice/built-in-plan-project-files.d.ts +3 -0
  342. package/src/generators/slice/built-in-plan-project-files.js +979 -0
  343. package/src/generators/slice/built-in-plan-project-files.js.map +1 -0
  344. package/src/generators/slice/built-in-plan-release-files.d.ts +2 -0
  345. package/src/generators/slice/built-in-plan-release-files.js +6387 -0
  346. package/src/generators/slice/built-in-plan-release-files.js.map +1 -0
  347. package/src/generators/slice/built-in-plan-reliability-files.d.ts +2 -0
  348. package/src/generators/slice/built-in-plan-reliability-files.js +4499 -0
  349. package/src/generators/slice/built-in-plan-reliability-files.js.map +1 -0
  350. package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +2 -0
  351. package/src/generators/slice/built-in-plan-secret-runtime-files.js +1004 -0
  352. package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +1 -0
  353. package/src/generators/slice/built-in-plan-shared.d.ts +53 -0
  354. package/src/generators/slice/built-in-plan-shared.js +113 -0
  355. package/src/generators/slice/built-in-plan-shared.js.map +1 -0
  356. package/src/generators/slice/built-in-plan-testing-files.d.ts +2 -0
  357. package/src/generators/slice/built-in-plan-testing-files.js +2356 -0
  358. package/src/generators/slice/built-in-plan-testing-files.js.map +1 -0
  359. package/src/generators/slice/built-in-plan-verification-files.d.ts +2 -0
  360. package/src/generators/slice/built-in-plan-verification-files.js +358 -0
  361. package/src/generators/slice/built-in-plan-verification-files.js.map +1 -0
  362. package/src/generators/slice/built-in-plan-web-files.d.ts +2 -0
  363. package/src/generators/slice/built-in-plan-web-files.js +430 -0
  364. package/src/generators/slice/built-in-plan-web-files.js.map +1 -0
  365. package/src/generators/slice/built-in-plan-workload-role-files.d.ts +2 -0
  366. package/src/generators/slice/built-in-plan-workload-role-files.js +2356 -0
  367. package/src/generators/slice/built-in-plan-workload-role-files.js.map +1 -0
  368. package/src/generators/slice/built-in-plan.d.ts +8 -0
  369. package/src/generators/slice/built-in-plan.js +264 -0
  370. package/src/generators/slice/built-in-plan.js.map +1 -0
  371. package/src/generators/slice/schema.json +1 -1
  372. package/src/generators/slice/slice.d.ts +1 -22
  373. package/src/generators/slice/slice.js +185 -1510
  374. package/src/generators/slice/slice.js.map +1 -1
  375. package/src/generators/upgrade/schema.d.ts +2 -0
  376. package/src/generators/upgrade/schema.json +11 -1
  377. package/src/generators/upgrade/upgrade.d.ts +51 -1
  378. package/src/generators/upgrade/upgrade.js +820 -82
  379. package/src/generators/upgrade/upgrade.js.map +1 -1
  380. package/src/generators/workload/frozen-container.d.ts +8 -0
  381. package/src/generators/workload/frozen-container.js +36 -0
  382. package/src/generators/workload/frozen-container.js.map +1 -0
  383. package/src/generators/workload/performance-registration.d.ts +32 -0
  384. package/src/generators/workload/performance-registration.js +226 -0
  385. package/src/generators/workload/performance-registration.js.map +1 -0
  386. package/src/generators/workload/reliability-registration.d.ts +16 -0
  387. package/src/generators/workload/reliability-registration.js +150 -0
  388. package/src/generators/workload/reliability-registration.js.map +1 -0
  389. package/src/generators/workload/schema.d.ts +1 -0
  390. package/src/generators/workload/schema.json +6 -1
  391. package/src/generators/workload/service-performance-files.d.ts +4 -0
  392. package/src/generators/workload/service-performance-files.js +1846 -0
  393. package/src/generators/workload/service-performance-files.js.map +1 -0
  394. package/src/generators/workload/workload.d.ts +3 -2
  395. package/src/generators/workload/workload.js +1083 -18
  396. package/src/generators/workload/workload.js.map +1 -1
  397. package/src/git-policy/action-pins.d.ts +10 -0
  398. package/src/git-policy/action-pins.js +10 -0
  399. package/src/git-policy/action-pins.js.map +1 -1
  400. package/src/git-policy/github-bootstrap.d.ts +14 -1
  401. package/src/git-policy/github-bootstrap.js +274 -46
  402. package/src/git-policy/github-bootstrap.js.map +1 -1
  403. package/src/index.d.ts +2 -0
  404. package/src/index.js +2 -0
  405. package/src/index.js.map +1 -1
  406. package/src/infrastructure-change/convergence.d.ts +13 -0
  407. package/src/infrastructure-change/convergence.js +85 -0
  408. package/src/infrastructure-change/convergence.js.map +1 -0
  409. package/src/infrastructure-change/drift.d.ts +13 -0
  410. package/src/infrastructure-change/drift.js +112 -0
  411. package/src/infrastructure-change/drift.js.map +1 -0
  412. package/src/infrastructure-change/index.d.ts +7 -0
  413. package/src/infrastructure-change/index.js +11 -0
  414. package/src/infrastructure-change/index.js.map +1 -0
  415. package/src/infrastructure-change/model.d.ts +253 -0
  416. package/src/infrastructure-change/model.js +28 -0
  417. package/src/infrastructure-change/model.js.map +1 -0
  418. package/src/infrastructure-change/normalize.d.ts +12 -0
  419. package/src/infrastructure-change/normalize.js +245 -0
  420. package/src/infrastructure-change/normalize.js.map +1 -0
  421. package/src/infrastructure-change/plan.d.ts +40 -0
  422. package/src/infrastructure-change/plan.js +361 -0
  423. package/src/infrastructure-change/plan.js.map +1 -0
  424. package/src/infrastructure-change/risk.d.ts +7 -0
  425. package/src/infrastructure-change/risk.js +269 -0
  426. package/src/infrastructure-change/risk.js.map +1 -0
  427. package/src/infrastructure-change/summary.d.ts +20 -0
  428. package/src/infrastructure-change/summary.js +130 -0
  429. package/src/infrastructure-change/summary.js.map +1 -0
  430. package/src/local-dev/context-discovery.d.ts +2 -0
  431. package/src/local-dev/context-discovery.js +59 -0
  432. package/src/local-dev/context-discovery.js.map +1 -0
  433. package/src/local-dev/contract-validation.d.ts +15 -0
  434. package/src/local-dev/contract-validation.js +84 -0
  435. package/src/local-dev/contract-validation.js.map +1 -0
  436. package/src/local-dev/contracts.d.ts +10 -1
  437. package/src/local-dev/contracts.js +57 -5
  438. package/src/local-dev/contracts.js.map +1 -1
  439. package/src/local-dev/control-contract.d.ts +67 -0
  440. package/src/local-dev/control-contract.js +180 -0
  441. package/src/local-dev/control-contract.js.map +1 -0
  442. package/src/local-dev/dev-command-core.d.ts +60 -0
  443. package/src/local-dev/dev-command-core.js +89 -0
  444. package/src/local-dev/dev-command-core.js.map +1 -0
  445. package/src/local-dev/effects.d.ts +16 -0
  446. package/src/local-dev/effects.js +63 -0
  447. package/src/local-dev/effects.js.map +1 -0
  448. package/src/local-dev/environment-inspector.d.ts +125 -0
  449. package/src/local-dev/environment-inspector.js +687 -0
  450. package/src/local-dev/environment-inspector.js.map +1 -0
  451. package/src/local-dev/environment-state.d.ts +113 -0
  452. package/src/local-dev/environment-state.js +463 -0
  453. package/src/local-dev/environment-state.js.map +1 -0
  454. package/src/local-dev/errors.d.ts +6 -0
  455. package/src/local-dev/errors.js +41 -0
  456. package/src/local-dev/errors.js.map +1 -0
  457. package/src/local-dev/fleet-client.d.ts +33 -0
  458. package/src/local-dev/fleet-client.js +156 -0
  459. package/src/local-dev/fleet-client.js.map +1 -0
  460. package/src/local-dev/fleet-configuration.d.ts +13 -0
  461. package/src/local-dev/fleet-configuration.js +71 -0
  462. package/src/local-dev/fleet-configuration.js.map +1 -0
  463. package/src/local-dev/fleet-inventory.d.ts +56 -0
  464. package/src/local-dev/fleet-inventory.js +469 -0
  465. package/src/local-dev/fleet-inventory.js.map +1 -0
  466. package/src/local-dev/fleet-ipc.d.ts +28 -0
  467. package/src/local-dev/fleet-ipc.js +267 -0
  468. package/src/local-dev/fleet-ipc.js.map +1 -0
  469. package/src/local-dev/fleet-launcher.d.ts +53 -0
  470. package/src/local-dev/fleet-launcher.js +379 -0
  471. package/src/local-dev/fleet-launcher.js.map +1 -0
  472. package/src/local-dev/fleet-lock.d.ts +41 -0
  473. package/src/local-dev/fleet-lock.js +135 -0
  474. package/src/local-dev/fleet-lock.js.map +1 -0
  475. package/src/local-dev/fleet-logs.d.ts +66 -0
  476. package/src/local-dev/fleet-logs.js +542 -0
  477. package/src/local-dev/fleet-logs.js.map +1 -0
  478. package/src/local-dev/fleet-process.d.ts +50 -0
  479. package/src/local-dev/fleet-process.js +289 -0
  480. package/src/local-dev/fleet-process.js.map +1 -0
  481. package/src/local-dev/fleet-runtime.d.ts +22 -0
  482. package/src/local-dev/fleet-runtime.js +368 -0
  483. package/src/local-dev/fleet-runtime.js.map +1 -0
  484. package/src/local-dev/fleet-session.d.ts +70 -0
  485. package/src/local-dev/fleet-session.js +301 -0
  486. package/src/local-dev/fleet-session.js.map +1 -0
  487. package/src/local-dev/fleet-slice-runner-daemon.d.ts +1 -0
  488. package/src/local-dev/fleet-slice-runner-daemon.js +21 -0
  489. package/src/local-dev/fleet-slice-runner-daemon.js.map +1 -0
  490. package/src/local-dev/fleet-startup.d.ts +22 -0
  491. package/src/local-dev/fleet-startup.js +114 -0
  492. package/src/local-dev/fleet-startup.js.map +1 -0
  493. package/src/local-dev/fleet-state.d.ts +62 -0
  494. package/src/local-dev/fleet-state.js +297 -0
  495. package/src/local-dev/fleet-state.js.map +1 -0
  496. package/src/local-dev/fleet-supervisor-daemon.d.ts +1 -0
  497. package/src/local-dev/fleet-supervisor-daemon.js +41 -0
  498. package/src/local-dev/fleet-supervisor-daemon.js.map +1 -0
  499. package/src/local-dev/fleet-supervisor.d.ts +52 -0
  500. package/src/local-dev/fleet-supervisor.js +384 -0
  501. package/src/local-dev/fleet-supervisor.js.map +1 -0
  502. package/src/local-dev/gateway.js +1 -1
  503. package/src/local-dev/gateway.js.map +1 -1
  504. package/src/local-dev/identity.js +4 -6
  505. package/src/local-dev/identity.js.map +1 -1
  506. package/src/local-dev/index.d.ts +1 -0
  507. package/src/local-dev/index.js +1 -0
  508. package/src/local-dev/index.js.map +1 -1
  509. package/src/local-dev/local-context.d.ts +62 -0
  510. package/src/local-dev/local-context.js +299 -0
  511. package/src/local-dev/local-context.js.map +1 -0
  512. package/src/local-dev/nx-workspace.d.ts +45 -0
  513. package/src/local-dev/nx-workspace.js +228 -0
  514. package/src/local-dev/nx-workspace.js.map +1 -0
  515. package/src/local-dev/personal-secret-ledger.d.ts +75 -0
  516. package/src/local-dev/personal-secret-ledger.js +391 -0
  517. package/src/local-dev/personal-secret-ledger.js.map +1 -0
  518. package/src/local-dev/personal-stage.d.ts +18 -0
  519. package/src/local-dev/personal-stage.js +129 -0
  520. package/src/local-dev/personal-stage.js.map +1 -0
  521. package/src/local-dev/private-state.d.ts +17 -0
  522. package/src/local-dev/private-state.js +254 -0
  523. package/src/local-dev/private-state.js.map +1 -0
  524. package/src/local-dev/process-identity.d.ts +9 -0
  525. package/src/local-dev/process-identity.js +79 -0
  526. package/src/local-dev/process-identity.js.map +1 -0
  527. package/src/local-dev/runtime-paths.d.ts +17 -0
  528. package/src/local-dev/runtime-paths.js +33 -0
  529. package/src/local-dev/runtime-paths.js.map +1 -0
  530. package/src/local-dev/secret-slice-claim.d.ts +17 -0
  531. package/src/local-dev/secret-slice-claim.js +75 -0
  532. package/src/local-dev/secret-slice-claim.js.map +1 -0
  533. package/src/local-dev/slice-claim.d.ts +36 -0
  534. package/src/local-dev/slice-claim.js +199 -0
  535. package/src/local-dev/slice-claim.js.map +1 -0
  536. package/src/local-dev/slice-runner.d.ts +121 -0
  537. package/src/local-dev/slice-runner.js +715 -0
  538. package/src/local-dev/slice-runner.js.map +1 -0
  539. package/src/local-dev/tls.js +51 -17
  540. package/src/local-dev/tls.js.map +1 -1
  541. package/src/ownership/composition.d.ts +5 -2
  542. package/src/ownership/composition.js +26 -3
  543. package/src/ownership/composition.js.map +1 -1
  544. package/src/ownership/hash.d.ts +1 -1
  545. package/src/ownership/hash.js +3 -1
  546. package/src/ownership/hash.js.map +1 -1
  547. package/src/ownership/record.d.ts +32 -1
  548. package/src/ownership/record.js +139 -2
  549. package/src/ownership/record.js.map +1 -1
  550. package/src/performance/cost-collection.d.ts +225 -0
  551. package/src/performance/cost-collection.js +825 -0
  552. package/src/performance/cost-collection.js.map +1 -0
  553. package/src/performance/cost-controls.d.ts +131 -0
  554. package/src/performance/cost-controls.js +336 -0
  555. package/src/performance/cost-controls.js.map +1 -0
  556. package/src/performance/evidence.d.ts +140 -0
  557. package/src/performance/evidence.js +599 -0
  558. package/src/performance/evidence.js.map +1 -0
  559. package/src/performance/index.d.ts +10 -0
  560. package/src/performance/index.js +14 -0
  561. package/src/performance/index.js.map +1 -0
  562. package/src/performance/load-safety.d.ts +84 -0
  563. package/src/performance/load-safety.js +346 -0
  564. package/src/performance/load-safety.js.map +1 -0
  565. package/src/performance/model.d.ts +129 -0
  566. package/src/performance/model.js +452 -0
  567. package/src/performance/model.js.map +1 -0
  568. package/src/performance/pr-artifact-budget.d.ts +42 -0
  569. package/src/performance/pr-artifact-budget.js +151 -0
  570. package/src/performance/pr-artifact-budget.js.map +1 -0
  571. package/src/performance/runner.d.ts +75 -0
  572. package/src/performance/runner.js +227 -0
  573. package/src/performance/runner.js.map +1 -0
  574. package/src/performance/scenario-endpoint.d.ts +1 -0
  575. package/src/performance/scenario-endpoint.js +5 -0
  576. package/src/performance/scenario-endpoint.js.map +1 -0
  577. package/src/performance/scenario.d.ts +193 -0
  578. package/src/performance/scenario.js +736 -0
  579. package/src/performance/scenario.js.map +1 -0
  580. package/src/performance/test-fixtures.d.ts +7 -0
  581. package/src/performance/test-fixtures.js +169 -0
  582. package/src/performance/test-fixtures.js.map +1 -0
  583. package/src/performance/unit-cost.d.ts +105 -0
  584. package/src/performance/unit-cost.js +364 -0
  585. package/src/performance/unit-cost.js.map +1 -0
  586. package/src/release/index.d.ts +4 -0
  587. package/src/release/index.js +8 -0
  588. package/src/release/index.js.map +1 -0
  589. package/src/release/lifecycle.d.ts +132 -0
  590. package/src/release/lifecycle.js +411 -0
  591. package/src/release/lifecycle.js.map +1 -0
  592. package/src/release/manifest.d.ts +148 -0
  593. package/src/release/manifest.js +503 -0
  594. package/src/release/manifest.js.map +1 -0
  595. package/src/release/rollout.d.ts +170 -0
  596. package/src/release/rollout.js +578 -0
  597. package/src/release/rollout.js.map +1 -0
  598. package/src/release/source-authority.d.ts +19 -0
  599. package/src/release/source-authority.js +195 -0
  600. package/src/release/source-authority.js.map +1 -0
  601. package/src/repository-policy/deployment-plan.d.ts +2 -1
  602. package/src/repository-policy/deployment-plan.js +2 -0
  603. package/src/repository-policy/deployment-plan.js.map +1 -1
  604. package/src/repository-policy/policy.d.ts +1 -1
  605. package/src/repository-policy/policy.js +29 -25
  606. package/src/repository-policy/policy.js.map +1 -1
  607. package/src/schemas/aggregate-count-evidence-v1.json +135 -0
  608. package/src/schemas/api-contract-baseline-v1.json +674 -0
  609. package/src/schemas/api-contract-compatibility-report-v1.json +126 -0
  610. package/src/schemas/aws-billing-actual-evidence-v1.json +407 -0
  611. package/src/schemas/blueprint-v1.json +18 -1
  612. package/src/schemas/data-lifecycle-policy-v1.json +517 -0
  613. package/src/schemas/generated-ownership-v2.json +22 -0
  614. package/src/schemas/performance-policy-v1.json +335 -0
  615. package/src/schemas/repository-policy-v1.json +1 -0
  616. package/src/schemas/testing-evidence-quarantine-v1.json +168 -0
  617. package/src/schemas/testing-evidence-result-v1.json +319 -0
  618. package/src/secrets/adapters.d.ts +49 -0
  619. package/src/secrets/adapters.js +184 -0
  620. package/src/secrets/adapters.js.map +1 -0
  621. package/src/secrets/aws-control-plane.d.ts +20 -0
  622. package/src/secrets/aws-control-plane.js +255 -0
  623. package/src/secrets/aws-control-plane.js.map +1 -0
  624. package/src/secrets/declaration-verification.d.ts +11 -0
  625. package/src/secrets/declaration-verification.js +68 -0
  626. package/src/secrets/declaration-verification.js.map +1 -0
  627. package/src/secrets/guardrails.d.ts +26 -0
  628. package/src/secrets/guardrails.js +328 -0
  629. package/src/secrets/guardrails.js.map +1 -0
  630. package/src/secrets/index.d.ts +12 -0
  631. package/src/secrets/index.js +16 -0
  632. package/src/secrets/index.js.map +1 -0
  633. package/src/secrets/metadata.d.ts +48 -0
  634. package/src/secrets/metadata.js +171 -0
  635. package/src/secrets/metadata.js.map +1 -0
  636. package/src/secrets/model.d.ts +49 -0
  637. package/src/secrets/model.js +125 -0
  638. package/src/secrets/model.js.map +1 -0
  639. package/src/secrets/operator.d.ts +101 -0
  640. package/src/secrets/operator.js +229 -0
  641. package/src/secrets/operator.js.map +1 -0
  642. package/src/secrets/permissions.d.ts +34 -0
  643. package/src/secrets/permissions.js +86 -0
  644. package/src/secrets/permissions.js.map +1 -0
  645. package/src/secrets/personal-command.d.ts +83 -0
  646. package/src/secrets/personal-command.js +197 -0
  647. package/src/secrets/personal-command.js.map +1 -0
  648. package/src/secrets/personal-ledger.d.ts +21 -0
  649. package/src/secrets/personal-ledger.js +135 -0
  650. package/src/secrets/personal-ledger.js.map +1 -0
  651. package/src/secrets/registry.d.ts +9 -0
  652. package/src/secrets/registry.js +86 -0
  653. package/src/secrets/registry.js.map +1 -0
  654. package/src/secrets/verification.d.ts +18 -0
  655. package/src/secrets/verification.js +139 -0
  656. package/src/secrets/verification.js.map +1 -0
  657. package/src/secrets/workload-access.d.ts +46 -0
  658. package/src/secrets/workload-access.js +163 -0
  659. package/src/secrets/workload-access.js.map +1 -0
  660. package/src/supply-chain/action-pins.d.ts +26 -0
  661. package/src/supply-chain/action-pins.js +208 -0
  662. package/src/supply-chain/action-pins.js.map +1 -0
  663. package/src/supply-chain/blueprint-trust-git.d.ts +130 -0
  664. package/src/supply-chain/blueprint-trust-git.js +1581 -0
  665. package/src/supply-chain/blueprint-trust-git.js.map +1 -0
  666. package/src/supply-chain/blueprint-trust-process.d.ts +4 -0
  667. package/src/supply-chain/blueprint-trust-process.js +88 -0
  668. package/src/supply-chain/blueprint-trust-process.js.map +1 -0
  669. package/src/supply-chain/blueprint-trust.d.ts +354 -0
  670. package/src/supply-chain/blueprint-trust.js +1558 -0
  671. package/src/supply-chain/blueprint-trust.js.map +1 -0
  672. package/src/supply-chain/blueprint-verification-authority.d.ts +62 -0
  673. package/src/supply-chain/blueprint-verification-authority.js +588 -0
  674. package/src/supply-chain/blueprint-verification-authority.js.map +1 -0
  675. package/src/supply-chain/blueprint-verification-execution.d.ts +68 -0
  676. package/src/supply-chain/blueprint-verification-execution.js +624 -0
  677. package/src/supply-chain/blueprint-verification-execution.js.map +1 -0
  678. package/src/supply-chain/build-output.d.ts +35 -0
  679. package/src/supply-chain/build-output.js +398 -0
  680. package/src/supply-chain/build-output.js.map +1 -0
  681. package/src/supply-chain/common.d.ts +21 -0
  682. package/src/supply-chain/common.js +107 -0
  683. package/src/supply-chain/common.js.map +1 -0
  684. package/src/supply-chain/container-artifact-contract.d.ts +23 -0
  685. package/src/supply-chain/container-artifact-contract.js +208 -0
  686. package/src/supply-chain/container-artifact-contract.js.map +1 -0
  687. package/src/supply-chain/container-release.d.ts +119 -0
  688. package/src/supply-chain/container-release.js +496 -0
  689. package/src/supply-chain/container-release.js.map +1 -0
  690. package/src/supply-chain/ecr-applicability.d.ts +19 -0
  691. package/src/supply-chain/ecr-applicability.js +103 -0
  692. package/src/supply-chain/ecr-applicability.js.map +1 -0
  693. package/src/supply-chain/ecr-scanning.d.ts +83 -0
  694. package/src/supply-chain/ecr-scanning.js +321 -0
  695. package/src/supply-chain/ecr-scanning.js.map +1 -0
  696. package/src/supply-chain/ecs-deployed-image.d.ts +85 -0
  697. package/src/supply-chain/ecs-deployed-image.js +300 -0
  698. package/src/supply-chain/ecs-deployed-image.js.map +1 -0
  699. package/src/supply-chain/errors.d.ts +6 -0
  700. package/src/supply-chain/errors.js +15 -0
  701. package/src/supply-chain/errors.js.map +1 -0
  702. package/src/supply-chain/generated-blueprint-trust-command.d.ts +4 -0
  703. package/src/supply-chain/generated-blueprint-trust-command.js +1362 -0
  704. package/src/supply-chain/generated-blueprint-trust-command.js.map +1 -0
  705. package/src/supply-chain/generated-command.d.ts +1 -0
  706. package/src/supply-chain/generated-command.js +687 -0
  707. package/src/supply-chain/generated-command.js.map +1 -0
  708. package/src/supply-chain/generated-container-release-command.d.ts +16 -0
  709. package/src/supply-chain/generated-container-release-command.js +2087 -0
  710. package/src/supply-chain/generated-container-release-command.js.map +1 -0
  711. package/src/supply-chain/generated-ecr-collector-command.d.ts +21 -0
  712. package/src/supply-chain/generated-ecr-collector-command.js +1338 -0
  713. package/src/supply-chain/generated-ecr-collector-command.js.map +1 -0
  714. package/src/supply-chain/generated-files.d.ts +13 -0
  715. package/src/supply-chain/generated-files.js +401 -0
  716. package/src/supply-chain/generated-files.js.map +1 -0
  717. package/src/supply-chain/generated-scanner-command.d.ts +1 -0
  718. package/src/supply-chain/generated-scanner-command.js +718 -0
  719. package/src/supply-chain/generated-scanner-command.js.map +1 -0
  720. package/src/supply-chain/index.d.ts +28 -0
  721. package/src/supply-chain/index.js +35 -0
  722. package/src/supply-chain/index.js.map +1 -0
  723. package/src/supply-chain/inventory.d.ts +79 -0
  724. package/src/supply-chain/inventory.js +717 -0
  725. package/src/supply-chain/inventory.js.map +1 -0
  726. package/src/supply-chain/license-expression.d.ts +7 -0
  727. package/src/supply-chain/license-expression.js +128 -0
  728. package/src/supply-chain/license-expression.js.map +1 -0
  729. package/src/supply-chain/pnpm-toolchain-authority.d.ts +31 -0
  730. package/src/supply-chain/pnpm-toolchain-authority.js +316 -0
  731. package/src/supply-chain/pnpm-toolchain-authority.js.map +1 -0
  732. package/src/supply-chain/policy.d.ts +105 -0
  733. package/src/supply-chain/policy.js +301 -0
  734. package/src/supply-chain/policy.js.map +1 -0
  735. package/src/supply-chain/publication.d.ts +48 -0
  736. package/src/supply-chain/publication.js +85 -0
  737. package/src/supply-chain/publication.js.map +1 -0
  738. package/src/supply-chain/sbom.d.ts +228 -0
  739. package/src/supply-chain/sbom.js +826 -0
  740. package/src/supply-chain/sbom.js.map +1 -0
  741. package/src/supply-chain/scanner.d.ts +77 -0
  742. package/src/supply-chain/scanner.js +502 -0
  743. package/src/supply-chain/scanner.js.map +1 -0
  744. package/src/supply-chain/vendored-source.d.ts +95 -0
  745. package/src/supply-chain/vendored-source.js +315 -0
  746. package/src/supply-chain/vendored-source.js.map +1 -0
  747. package/src/testing-evidence/fixture-scope.d.ts +52 -0
  748. package/src/testing-evidence/fixture-scope.js +140 -0
  749. package/src/testing-evidence/fixture-scope.js.map +1 -0
  750. package/src/testing-evidence/index.d.ts +5 -0
  751. package/src/testing-evidence/index.js +9 -0
  752. package/src/testing-evidence/index.js.map +1 -0
  753. package/src/testing-evidence/quarantine.d.ts +48 -0
  754. package/src/testing-evidence/quarantine.js +253 -0
  755. package/src/testing-evidence/quarantine.js.map +1 -0
  756. package/src/testing-evidence/result.d.ts +108 -0
  757. package/src/testing-evidence/result.js +571 -0
  758. package/src/testing-evidence/result.js.map +1 -0
  759. package/src/testing-evidence/runner-adapter.d.ts +51 -0
  760. package/src/testing-evidence/runner-adapter.js +288 -0
  761. package/src/testing-evidence/runner-adapter.js.map +1 -0
  762. package/src/testing-evidence/sensitive-artifacts.d.ts +13 -0
  763. package/src/testing-evidence/sensitive-artifacts.js +93 -0
  764. package/src/testing-evidence/sensitive-artifacts.js.map +1 -0
  765. package/src/work-markers/work-markers.js +4 -3
  766. package/src/work-markers/work-markers.js.map +1 -1
  767. package/src/workload-roles/account-baseline.d.ts +132 -0
  768. package/src/workload-roles/account-baseline.js +743 -0
  769. package/src/workload-roles/account-baseline.js.map +1 -0
  770. package/src/workload-roles/authority.d.ts +38 -0
  771. package/src/workload-roles/authority.js +156 -0
  772. package/src/workload-roles/authority.js.map +1 -0
  773. package/src/workload-roles/aws-adapter.d.ts +99 -0
  774. package/src/workload-roles/aws-adapter.js +416 -0
  775. package/src/workload-roles/aws-adapter.js.map +1 -0
  776. package/src/workload-roles/aws-internal-handler.d.ts +27 -0
  777. package/src/workload-roles/aws-internal-handler.js +58 -0
  778. package/src/workload-roles/aws-internal-handler.js.map +1 -0
  779. package/src/workload-roles/aws-s3-state.d.ts +52 -0
  780. package/src/workload-roles/aws-s3-state.js +164 -0
  781. package/src/workload-roles/aws-s3-state.js.map +1 -0
  782. package/src/workload-roles/aws-sdk-control-plane.d.ts +12 -0
  783. package/src/workload-roles/aws-sdk-control-plane.js +291 -0
  784. package/src/workload-roles/aws-sdk-control-plane.js.map +1 -0
  785. package/src/workload-roles/boundary.d.ts +33 -0
  786. package/src/workload-roles/boundary.js +130 -0
  787. package/src/workload-roles/boundary.js.map +1 -0
  788. package/src/workload-roles/convergence.d.ts +66 -0
  789. package/src/workload-roles/convergence.js +186 -0
  790. package/src/workload-roles/convergence.js.map +1 -0
  791. package/src/workload-roles/effective-policy.d.ts +51 -0
  792. package/src/workload-roles/effective-policy.js +183 -0
  793. package/src/workload-roles/effective-policy.js.map +1 -0
  794. package/src/workload-roles/handler.d.ts +43 -0
  795. package/src/workload-roles/handler.js +130 -0
  796. package/src/workload-roles/handler.js.map +1 -0
  797. package/src/workload-roles/history.d.ts +47 -0
  798. package/src/workload-roles/history.js +324 -0
  799. package/src/workload-roles/history.js.map +1 -0
  800. package/src/workload-roles/index.d.ts +17 -0
  801. package/src/workload-roles/index.js +21 -0
  802. package/src/workload-roles/index.js.map +1 -0
  803. package/src/workload-roles/injection.d.ts +119 -0
  804. package/src/workload-roles/injection.js +495 -0
  805. package/src/workload-roles/injection.js.map +1 -0
  806. package/src/workload-roles/manifest.d.ts +54 -0
  807. package/src/workload-roles/manifest.js +343 -0
  808. package/src/workload-roles/manifest.js.map +1 -0
  809. package/src/workload-roles/provisioner.d.ts +70 -0
  810. package/src/workload-roles/provisioner.js +231 -0
  811. package/src/workload-roles/provisioner.js.map +1 -0
  812. package/src/workload-roles/registration.d.ts +101 -0
  813. package/src/workload-roles/registration.js +457 -0
  814. package/src/workload-roles/registration.js.map +1 -0
  815. package/src/workload-roles/stage-boundary.d.ts +31 -0
  816. package/src/workload-roles/stage-boundary.js +208 -0
  817. package/src/workload-roles/stage-boundary.js.map +1 -0
  818. package/src/workload-roles/standard-slice.d.ts +54 -0
  819. package/src/workload-roles/standard-slice.js +252 -0
  820. package/src/workload-roles/standard-slice.js.map +1 -0
  821. package/migrations/standard-pre-v1-to-v1.md +0 -11
  822. package/src/foundation/aurora-logical-database.d.ts +0 -76
  823. package/src/foundation/aurora-logical-database.js +0 -419
  824. package/src/foundation/aurora-logical-database.js.map +0 -1
@@ -0,0 +1,1338 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SYFT_COLLECTOR_RELEASES = exports.SYFT_VERSION = void 0;
4
+ exports.renderEcrInspectorCollectorCommand = renderEcrInspectorCollectorCommand;
5
+ const common_js_1 = require("./common.js");
6
+ const safe_reference_1 = require("@empire-builder-kit/runtime/safe-reference");
7
+ exports.SYFT_VERSION = '1.50.0';
8
+ exports.SYFT_COLLECTOR_RELEASES = Object.freeze({
9
+ 'linux-arm64': {
10
+ archiveFormat: 'tar-gzip',
11
+ sha256: '887c57cbcc2d0e8c5c110a4571a3fc7150058b24d74f993ee4663516e5c8ce86',
12
+ source: 'https://github.com/anchore/syft/releases/download/v1.50.0/syft_1.50.0_linux_arm64.tar.gz',
13
+ },
14
+ 'linux-x64': {
15
+ archiveFormat: 'tar-gzip',
16
+ sha256: 'bf7b29ff57f06da30918266a0e1c2885a8f99784798d1bdb1628886aa015d788',
17
+ source: 'https://github.com/anchore/syft/releases/download/v1.50.0/syft_1.50.0_linux_amd64.tar.gz',
18
+ },
19
+ });
20
+ function validatedReleases(releases) {
21
+ if (Object.keys(releases).length === 0 ||
22
+ Object.entries(releases).some(([platform, release]) => !/^[a-z0-9]+-(?:arm64|x64)$/.test(platform) ||
23
+ !['binary', 'tar-gzip'].includes(release.archiveFormat) ||
24
+ !common_js_1.SUPPLY_CHAIN_SHA256.test(release.sha256) ||
25
+ !/^https:\/\/github\.com\/anchore\/syft\/releases\/download\/v\d+\.\d+\.\d+\/[A-Za-z0-9._-]+$/.test(release.source))) {
26
+ throw new Error('Syft collector releases must be exact official integrity-bound assets.');
27
+ }
28
+ return releases;
29
+ }
30
+ /**
31
+ * Render the protected postdeploy collector.
32
+ *
33
+ * The current generated SST context-build path is intentionally not accepted:
34
+ * collection begins only when the release registry declares exact
35
+ * digest-qualified OCI consumption, and the deployed ECS task definition
36
+ * itself carries the exact release binding.
37
+ */
38
+ function renderEcrInspectorCollectorCommand(options = {}) {
39
+ const moduleSpecifier = options.moduleSpecifier ?? '@empire-builder-kit/nx/supply-chain';
40
+ const releaseModuleSpecifier = options.releaseModuleSpecifier ?? '@empire-builder-kit/nx/release';
41
+ const releases = validatedReleases(options.releases ?? exports.SYFT_COLLECTOR_RELEASES);
42
+ const syftVersion = options.syftVersion ?? exports.SYFT_VERSION;
43
+ if (!/^(?:@empire-builder-kit\/nx\/supply-chain|file:\/\/\/[^'"\n]+)$/.test(moduleSpecifier) ||
44
+ !/^(?:@empire-builder-kit\/nx\/release|file:\/\/\/[^'"\n]+)$/.test(releaseModuleSpecifier) ||
45
+ !/^\d+\.\d+\.\d+$/.test(syftVersion)) {
46
+ throw new Error('The generated ECR collector configuration is invalid.');
47
+ }
48
+ return `import { createHash } from 'node:crypto';
49
+ import { execFileSync } from 'node:child_process';
50
+ import {
51
+ chmodSync,
52
+ existsSync,
53
+ lstatSync,
54
+ mkdirSync,
55
+ mkdtempSync,
56
+ readFileSync,
57
+ realpathSync,
58
+ rmSync,
59
+ writeFileSync,
60
+ } from 'node:fs';
61
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
62
+ import { tmpdir } from 'node:os';
63
+ import {
64
+ assessEcrScanApplicability,
65
+ collectEcrInspectorScanEvidence,
66
+ collectEcsDeployedImageBinding,
67
+ createCycloneDxPlatformSbomUnion,
68
+ resolveContainerReleaseArtifact,
69
+ validateContainerReleaseBinding,
70
+ verifyEcrInspectorScanEvidence,
71
+ verifyEcsDeployedImageBinding,
72
+ } from '${moduleSpecifier}';
73
+ import { validateReleaseManifest } from '${releaseModuleSpecifier}';
74
+
75
+ const SYFT_VERSION = ${JSON.stringify(syftVersion)};
76
+ const SYFT_RELEASES = Object.freeze(${JSON.stringify(releases)});
77
+ const SHA256 = /^[a-f0-9]{64}$/;
78
+ const COMMIT = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
79
+ const REFERENCE = new RegExp(${JSON.stringify((0, safe_reference_1.safeReferencePatternSource)('supply-chain'))});
80
+ const IMAGE_DIGEST = /^sha256:[a-f0-9]{64}$/;
81
+ const MAX_TOOL_BYTES = 100 * 1024 * 1024;
82
+ const MAX_INPUT_BYTES = 5 * 1024 * 1024;
83
+ const MAX_AWS_RESPONSE_BYTES = 8 * 1024 * 1024;
84
+ const MAX_TOTAL_PAGE_BYTES = 64 * 1024 * 1024;
85
+ const MAX_SBOM_BYTES = 64 * 1024 * 1024;
86
+ const MAX_OUTPUT_BYTES = 64 * 1024 * 1024;
87
+ const MAX_PAGES = 100;
88
+
89
+ const digestBytes = (value) =>
90
+ createHash('sha256').update(value).digest('hex');
91
+ const canonical = (value) => {
92
+ if (value === null || typeof value !== 'object') return JSON.stringify(value);
93
+ if (Array.isArray(value)) return '[' + value.map(canonical).join(',') + ']';
94
+ return '{' + Object.entries(value)
95
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
96
+ .map(([key, child]) => JSON.stringify(key) + ':' + canonical(child))
97
+ .join(',') + '}';
98
+ };
99
+ const digestValue = (value) => digestBytes(Buffer.from(canonical(value), 'utf8'));
100
+ const requireRecord = (value, message) => {
101
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
102
+ throw new Error(message);
103
+ }
104
+ return value;
105
+ };
106
+ const repositoryRoot = realpathSync(
107
+ execFileSync('git', ['rev-parse', '--show-toplevel'], {
108
+ encoding: 'utf8',
109
+ }).trim(),
110
+ );
111
+ const assertNoSymlinkTraversal = (absolute, label, allowMissing = false) => {
112
+ const fromRoot = relative(repositoryRoot, absolute);
113
+ if (
114
+ fromRoot === '..' ||
115
+ fromRoot.startsWith('..' + sep) ||
116
+ isAbsolute(fromRoot)
117
+ ) {
118
+ throw new Error(label + ' escapes the repository.');
119
+ }
120
+ let current = repositoryRoot;
121
+ for (const segment of fromRoot.split(sep).filter(Boolean)) {
122
+ current = join(current, segment);
123
+ if (!existsSync(current)) {
124
+ if (allowMissing) return;
125
+ throw new Error(label + ' is absent.');
126
+ }
127
+ if (lstatSync(current).isSymbolicLink()) {
128
+ throw new Error(label + ' may not traverse symbolic links.');
129
+ }
130
+ }
131
+ };
132
+ const safePath = (candidate, label, options = {}) => {
133
+ if (typeof candidate !== 'string' || candidate.trim() !== candidate || candidate === '') {
134
+ throw new Error(label + ' must identify one exact path.');
135
+ }
136
+ const absolute = resolve(process.cwd(), candidate);
137
+ if (!options.output && !existsSync(absolute)) {
138
+ throw new Error(label + ' is absent.');
139
+ }
140
+ if (!options.output) {
141
+ if (lstatSync(absolute).isSymbolicLink()) {
142
+ throw new Error(label + ' may not be a symbolic link.');
143
+ }
144
+ const real = realpathSync(absolute);
145
+ const realFromRoot = relative(repositoryRoot, real);
146
+ if (
147
+ realFromRoot === '..' ||
148
+ realFromRoot.startsWith('..' + sep) ||
149
+ isAbsolute(realFromRoot)
150
+ ) {
151
+ throw new Error(label + ' resolves outside the repository.');
152
+ }
153
+ assertNoSymlinkTraversal(real, label);
154
+ if (!lstatSync(real).isFile()) {
155
+ throw new Error(label + ' must identify one regular file.');
156
+ }
157
+ return real;
158
+ }
159
+ const fromRoot = relative(repositoryRoot, absolute);
160
+ if (
161
+ fromRoot === '' ||
162
+ fromRoot === '..' ||
163
+ fromRoot.startsWith('..' + sep) ||
164
+ isAbsolute(fromRoot)
165
+ ) {
166
+ throw new Error(label + ' must stay inside the repository.');
167
+ }
168
+ assertNoSymlinkTraversal(absolute, label, true);
169
+ if (
170
+ options.directory &&
171
+ existsSync(absolute) &&
172
+ !lstatSync(absolute).isDirectory()
173
+ ) {
174
+ throw new Error(label + ' must identify one output directory.');
175
+ }
176
+ return absolute;
177
+ };
178
+ const readBoundedFile = (path, maximum, message) => {
179
+ const metadata = lstatSync(path);
180
+ if (
181
+ !metadata.isFile() ||
182
+ metadata.isSymbolicLink() ||
183
+ metadata.size === 0 ||
184
+ metadata.size > maximum
185
+ ) {
186
+ throw new Error(message);
187
+ }
188
+ const bytes = readFileSync(path);
189
+ if (bytes.byteLength === 0 || bytes.byteLength > maximum) {
190
+ throw new Error(message);
191
+ }
192
+ return bytes;
193
+ };
194
+ const readJson = (path, message, maximum = MAX_INPUT_BYTES) => {
195
+ try {
196
+ return JSON.parse(readBoundedFile(path, maximum, message).toString('utf8'));
197
+ } catch (error) {
198
+ if (error instanceof Error && error.message === message) throw error;
199
+ throw new Error(message);
200
+ }
201
+ };
202
+ const immutableWrite = (path, value) => {
203
+ const target = safePath(path, 'Evidence output', { output: true });
204
+ const serialized = Buffer.from(
205
+ typeof value === 'string' ? value : JSON.stringify(value, null, 2) + '\\n',
206
+ 'utf8',
207
+ );
208
+ if (serialized.byteLength === 0 || serialized.byteLength > MAX_OUTPUT_BYTES) {
209
+ throw new Error('Evidence output exceeds its bounded size.');
210
+ }
211
+ mkdirSync(dirname(target), { recursive: true, mode: 0o700 });
212
+ safePath(dirname(target), 'Evidence output directory', {
213
+ directory: true,
214
+ output: true,
215
+ });
216
+ writeFileSync(target, serialized, {
217
+ flag: 'wx',
218
+ mode: 0o600,
219
+ });
220
+ };
221
+ const stableName = (maxLength, ...parts) => {
222
+ const value = parts.join('-').toLowerCase();
223
+ if (value.length <= maxLength) return value;
224
+ const suffix = digestBytes(Buffer.from(value, 'utf8')).slice(0, 12);
225
+ return value.slice(0, maxLength - suffix.length - 1) + '-' + suffix;
226
+ };
227
+
228
+ const mode = process.argv[2];
229
+ if (mode === 'assess') {
230
+ const controlsPath = safePath(
231
+ process.env.EBK_RELEASE_CONTROLS_PATH ?? 'operations/release.json',
232
+ 'EBK_RELEASE_CONTROLS_PATH',
233
+ );
234
+ const slice =
235
+ process.env.EBK_SLICE?.trim() ??
236
+ basename(process.cwd());
237
+ const report = assessEcrScanApplicability(
238
+ readJson(controlsPath, 'Release controls are invalid.'),
239
+ slice,
240
+ );
241
+ const output = safePath(
242
+ process.env.EBK_ECR_APPLICABILITY_OUTPUT_PATH ??
243
+ '.ebk/evidence/supply-chain/ecr-applicability.json',
244
+ 'EBK_ECR_APPLICABILITY_OUTPUT_PATH',
245
+ { output: true },
246
+ );
247
+ immutableWrite(output, report);
248
+ process.stdout.write(JSON.stringify({
249
+ materialDigest: report.materialDigest,
250
+ output,
251
+ unit7Obligation: report.unit7Obligation,
252
+ }) + '\\n');
253
+ process.exit(0);
254
+ }
255
+ if (mode !== 'collect') {
256
+ throw new Error('Usage: ecr-inspector-collect.mjs <assess|collect>');
257
+ }
258
+
259
+ const inputPath = safePath(
260
+ process.env.EBK_ECR_SCAN_INPUT_PATH ?? '',
261
+ 'EBK_ECR_SCAN_INPUT_PATH',
262
+ );
263
+ const input = requireRecord(
264
+ readJson(inputPath, 'ECR collector input is invalid.'),
265
+ 'ECR collector input must be an object.',
266
+ );
267
+ if (
268
+ input.schemaVersion !== 1 ||
269
+ Object.keys(input).some(
270
+ (key) =>
271
+ ![
272
+ 'accountId',
273
+ 'artifactId',
274
+ 'deployment',
275
+ 'outputDirectory',
276
+ 'region',
277
+ 'releaseManifestPath',
278
+ 'schemaVersion',
279
+ 'stage',
280
+ 'taskDefinitionFamily',
281
+ ].includes(key),
282
+ ) ||
283
+ !/^\\d{12}$/.test(input.accountId ?? '') ||
284
+ !/^[a-z]{2}(?:-gov)?-[a-z]+(?:-[a-z]+)*-\\d$/.test(input.region ?? '') ||
285
+ !['production', 'staging'].includes(input.stage) ||
286
+ typeof input.artifactId !== 'string' ||
287
+ !REFERENCE.test(input.artifactId) ||
288
+ typeof input.taskDefinitionFamily !== 'string' ||
289
+ !/^[A-Za-z0-9][A-Za-z0-9_-]{0,254}$/.test(input.taskDefinitionFamily) ||
290
+ !input.deployment ||
291
+ typeof input.deployment !== 'object' ||
292
+ Array.isArray(input.deployment)
293
+ ) {
294
+ throw new Error('ECR collector input does not match the exact v1 shape.');
295
+ }
296
+ const clusterArnPattern = new RegExp(
297
+ '^arn:aws(?:-us-gov|-iso(?:-[a-z]+)?)?:ecs:' +
298
+ input.region +
299
+ ':' +
300
+ input.accountId +
301
+ ':cluster/[A-Za-z0-9_./-]{1,255}$',
302
+ );
303
+ const serviceArnPattern = new RegExp(
304
+ '^arn:aws(?:-us-gov|-iso(?:-[a-z]+)?)?:ecs:' +
305
+ input.region +
306
+ ':' +
307
+ input.accountId +
308
+ ':service/[A-Za-z0-9_./-]{1,511}$',
309
+ );
310
+ const taskArnPattern = new RegExp(
311
+ '^arn:aws(?:-us-gov|-iso(?:-[a-z]+)?)?:ecs:' +
312
+ input.region +
313
+ ':' +
314
+ input.accountId +
315
+ ':task/[A-Za-z0-9_./-]{1,511}$',
316
+ );
317
+ if (
318
+ !clusterArnPattern.test(input.deployment.clusterArn ?? '') ||
319
+ !(
320
+ (input.deployment.kind === 'service' &&
321
+ Object.keys(input.deployment).sort().join('\\0') ===
322
+ ['clusterArn', 'kind', 'serviceArn'].join('\\0') &&
323
+ serviceArnPattern.test(input.deployment.serviceArn ?? '')) ||
324
+ (input.deployment.kind === 'task' &&
325
+ Object.keys(input.deployment).sort().join('\\0') ===
326
+ ['clusterArn', 'kind', 'taskArn'].join('\\0') &&
327
+ taskArnPattern.test(input.deployment.taskArn ?? ''))
328
+ )
329
+ ) {
330
+ throw new Error(
331
+ 'ECR collector deployment must identify one exact ECS service or task.',
332
+ );
333
+ }
334
+ const manifestPath = safePath(
335
+ input.releaseManifestPath,
336
+ 'releaseManifestPath',
337
+ );
338
+ const outputDirectory = safePath(
339
+ input.outputDirectory ??
340
+ '.ebk/evidence/supply-chain/ecr-scans',
341
+ 'outputDirectory',
342
+ { directory: true, output: true },
343
+ );
344
+ const manifestBytes = readBoundedFile(
345
+ manifestPath,
346
+ MAX_INPUT_BYTES,
347
+ 'Release manifest exceeds its bounded input size.',
348
+ );
349
+ const parsedManifest = requireRecord(
350
+ JSON.parse(manifestBytes.toString('utf8')),
351
+ 'Release manifest must be an object.',
352
+ );
353
+ const manifest = validateReleaseManifest(parsedManifest, {
354
+ materialDigest: parsedManifest.materialDigest,
355
+ sourceCommit: parsedManifest.source?.commit,
356
+ });
357
+ const sliceRoot = realpathSync(process.cwd());
358
+ const slice = basename(sliceRoot);
359
+ if (
360
+ manifest.kind !== 'ebk-release-manifest' ||
361
+ manifest.schemaVersion !== 1 ||
362
+ typeof manifest.releaseId !== 'string' ||
363
+ !REFERENCE.test(manifest.releaseId) ||
364
+ typeof manifest.materialDigest !== 'string' ||
365
+ !SHA256.test(manifest.materialDigest) ||
366
+ !manifest.source ||
367
+ !COMMIT.test(manifest.source.commit ?? '') ||
368
+ !Array.isArray(manifest.projects) ||
369
+ !manifest.projects.includes(slice) ||
370
+ relative(repositoryRoot, sliceRoot).split(sep).join('/') !==
371
+ 'packages/' + slice
372
+ ) {
373
+ throw new Error('Release manifest is invalid for the current Slice.');
374
+ }
375
+ if (
376
+ relative(sliceRoot, manifestPath).split(sep).join('/') !==
377
+ '.ebk/evidence/release-manifests/' + manifest.releaseId + '.json'
378
+ ) {
379
+ throw new Error(
380
+ 'Release manifest must use its canonical immutable evidence path.',
381
+ );
382
+ }
383
+ const controlsPath = realpathSync(
384
+ join(sliceRoot, 'operations/release.json'),
385
+ );
386
+ const releaseControls = requireRecord(
387
+ readJson(controlsPath, 'Release controls are invalid.'),
388
+ 'Release controls must be an object.',
389
+ );
390
+ const artifactEvidencePath = realpathSync(
391
+ join(
392
+ sliceRoot,
393
+ '.ebk/evidence/release-artifacts',
394
+ manifest.source.commit + '.json',
395
+ ),
396
+ );
397
+ const artifacts = requireRecord(
398
+ readJson(
399
+ artifactEvidencePath,
400
+ 'Release artifact evidence is invalid.',
401
+ ),
402
+ 'Release artifact evidence must be an object.',
403
+ );
404
+ if (
405
+ artifacts.kind !== 'ebk-release-artifact-evidence' ||
406
+ artifacts.schemaVersion !== 1 ||
407
+ artifacts.sourceCommit !== manifest.source.commit ||
408
+ !artifacts.provenance ||
409
+ !/^[1-9]\\d*$/.test(artifacts.provenance.runAttempt ?? '') ||
410
+ !/^[1-9]\\d*$/.test(artifacts.provenance.runId ?? '') ||
411
+ typeof artifacts.provenance.workflow !== 'string' ||
412
+ artifacts.provenance.runId !== manifest.build?.runId ||
413
+ artifacts.provenance.workflow !== manifest.build?.workflow ||
414
+ !Array.isArray(artifacts.artifacts) ||
415
+ !Array.isArray(manifest.artifacts) ||
416
+ !Array.isArray(releaseControls.artifactInventory)
417
+ ) {
418
+ throw new Error(
419
+ 'Release manifest and candidate artifact evidence are not exactly bound.',
420
+ );
421
+ }
422
+ const inventoryDigest = digestBytes(
423
+ Buffer.from(JSON.stringify(releaseControls.artifactInventory), 'utf8'),
424
+ );
425
+ const capturedByName = new Map(
426
+ artifacts.artifacts.map((artifact) => [artifact?.name, artifact]),
427
+ );
428
+ const manifestByName = new Map(
429
+ manifest.artifacts.map((artifact) => [artifact?.name, artifact]),
430
+ );
431
+ if (
432
+ artifacts.inventoryDigest !== inventoryDigest ||
433
+ artifacts.artifacts.length !== releaseControls.artifactInventory.length ||
434
+ manifest.artifacts.length !== releaseControls.artifactInventory.length ||
435
+ capturedByName.size !== artifacts.artifacts.length ||
436
+ manifestByName.size !== manifest.artifacts.length ||
437
+ releaseControls.artifactInventory.some((registered) => {
438
+ const captured = capturedByName.get(registered.name);
439
+ const retained = manifestByName.get(registered.name);
440
+ const capturedDigest =
441
+ captured?.classification === 'stage-neutral'
442
+ ? captured.digest
443
+ : captured?.candidateDigest;
444
+ const retainedDigest =
445
+ retained?.classification === 'stage-neutral'
446
+ ? retained.digest
447
+ : retained?.candidateDigest;
448
+ return (
449
+ !captured ||
450
+ !retained ||
451
+ captured.name !== registered.name ||
452
+ captured.workload !== registered.workload ||
453
+ captured.classification !== registered.classification ||
454
+ retained.workload !== registered.workload ||
455
+ retained.classification !== registered.classification ||
456
+ capturedDigest !== retainedDigest ||
457
+ !SHA256.test(capturedDigest ?? '') ||
458
+ (registered.classification === 'stage-specific' &&
459
+ (captured.reason !== registered.reason ||
460
+ captured.providerEvidence !== registered.providerEvidence ||
461
+ retained.reason !== registered.reason ||
462
+ retained.providerEvidence !== registered.providerEvidence))
463
+ );
464
+ })
465
+ ) {
466
+ throw new Error(
467
+ 'Release controls, candidate evidence, and manifest artifacts do not reconcile exactly.',
468
+ );
469
+ }
470
+ const applicability = assessEcrScanApplicability(
471
+ releaseControls,
472
+ slice,
473
+ );
474
+ const applicable = applicability.artifacts.find(
475
+ ({ artifactId }) => artifactId === input.artifactId,
476
+ );
477
+ if (!applicable || applicable.status !== 'applicable') {
478
+ throw new Error(
479
+ 'Artifact is not ECR-scan applicable: ' +
480
+ (applicable?.status ?? 'unregistered') +
481
+ '. Current SST context builds remain unsupported.',
482
+ );
483
+ }
484
+ const declared = releaseControls.artifactInventory.find(
485
+ ({ id }) => id === input.artifactId,
486
+ );
487
+ if (
488
+ !declared ||
489
+ declared.name !== applicable.artifactName ||
490
+ !['job', 'service'].includes(declared.workload) ||
491
+ (declared.workload === 'service' && input.deployment.kind !== 'service') ||
492
+ (declared.workload === 'job' && input.deployment.kind !== 'task')
493
+ ) {
494
+ throw new Error('Applicable OCI artifact registration is inconsistent.');
495
+ }
496
+ const idParts = input.artifactId.split('.');
497
+ if (
498
+ idParts.length !== 3 ||
499
+ idParts[0] !== slice ||
500
+ idParts[1] !== declared.workload ||
501
+ !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(idParts[2])
502
+ ) {
503
+ throw new Error(
504
+ 'OCI artifacts must use the exact <slice>.<kind>.<workload> identity.',
505
+ );
506
+ }
507
+ const candidate = capturedByName.get(declared.name);
508
+ const candidateArtifactDigest =
509
+ candidate?.classification === 'stage-neutral'
510
+ ? candidate.digest
511
+ : candidate?.candidateDigest;
512
+ if (
513
+ !candidate ||
514
+ !SHA256.test(candidateArtifactDigest ?? '') ||
515
+ artifacts.artifacts.filter(({ name }) => name === declared.name).length !== 1
516
+ ) {
517
+ throw new Error('Exact release candidate artifact digest is absent.');
518
+ }
519
+ const containerCandidateDigests = Object.fromEntries(
520
+ releaseControls.artifactInventory.flatMap((registered) => {
521
+ if (
522
+ registered?.finalArtifact?.support !== 'supported' ||
523
+ registered.finalArtifact.family !== 'oci-image'
524
+ ) {
525
+ return [];
526
+ }
527
+ const captured = capturedByName.get(registered.name);
528
+ const digest =
529
+ captured?.classification === 'stage-neutral'
530
+ ? captured.digest
531
+ : captured?.candidateDigest;
532
+ if (typeof registered.id !== 'string' || !SHA256.test(digest ?? '')) {
533
+ throw new Error('Container release candidate inventory is incomplete.');
534
+ }
535
+ return [[registered.id, digest]];
536
+ }),
537
+ );
538
+ const containerBindingPath = safePath(
539
+ '../../.ebk/evidence/container-release/' + input.stage +
540
+ '/packages/' + slice + '/binding.json',
541
+ 'Container release binding',
542
+ );
543
+ const containerBinding = validateContainerReleaseBinding(
544
+ readJson(containerBindingPath, 'Container release binding is invalid.'),
545
+ {
546
+ accountId: input.accountId,
547
+ candidateDigests: containerCandidateDigests,
548
+ region: input.region,
549
+ slice,
550
+ sourceCommit: manifest.source.commit,
551
+ stage: input.stage,
552
+ },
553
+ );
554
+ const containerArtifact = resolveContainerReleaseArtifact(containerBinding, {
555
+ artifactId: input.artifactId,
556
+ candidateArtifactDigest,
557
+ });
558
+ const releaseManifestDigest = digestBytes(manifestBytes);
559
+ const expected = {
560
+ accountId: input.accountId,
561
+ artifactId: input.artifactId,
562
+ candidateArtifactDigest,
563
+ containerBindingDigest: containerBinding.materialDigest,
564
+ containerImageDigest: containerArtifact.imageDigest,
565
+ imageReference: containerArtifact.imageReference,
566
+ region: input.region,
567
+ releaseId: manifest.releaseId,
568
+ releaseManifestDigest,
569
+ releaseManifestMaterialDigest: manifest.materialDigest,
570
+ repositoryName: containerArtifact.repositoryName,
571
+ sourceCommit: manifest.source.commit,
572
+ stage: input.stage,
573
+ taskDefinitionFamily: input.taskDefinitionFamily,
574
+ deployment: input.deployment,
575
+ };
576
+
577
+ const transcriptEntries = [];
578
+ const execute = (command, args, purpose, options = {}) => {
579
+ const maximumBytes = options.maximumBytes ?? MAX_AWS_RESPONSE_BYTES;
580
+ let stdout;
581
+ try {
582
+ stdout = execFileSync(command, args, {
583
+ encoding: options.encoding ?? 'utf8',
584
+ env: { ...process.env, ...(options.env ?? {}) },
585
+ input: options.input,
586
+ maxBuffer: maximumBytes,
587
+ stdio: ['pipe', 'pipe', 'pipe'],
588
+ });
589
+ } catch (error) {
590
+ throw new Error(
591
+ purpose + ' failed without complete evidence: ' +
592
+ String(error?.stderr ?? error?.message ?? error).slice(0, 2_000),
593
+ );
594
+ }
595
+ const bytes =
596
+ typeof stdout === 'string' ? Buffer.from(stdout, 'utf8') : stdout;
597
+ if (bytes.byteLength > maximumBytes) {
598
+ throw new Error(purpose + ' exceeded its response-size bound.');
599
+ }
600
+ transcriptEntries.push({
601
+ args,
602
+ command: basename(command),
603
+ purpose,
604
+ responseBytes: bytes.byteLength,
605
+ responseSha256: digestBytes(bytes),
606
+ });
607
+ return stdout;
608
+ };
609
+ const awsJson = (args, purpose) => {
610
+ const raw = execute('aws', args, purpose);
611
+ try {
612
+ return { raw, value: JSON.parse(raw) };
613
+ } catch {
614
+ throw new Error(purpose + ' returned invalid JSON.');
615
+ }
616
+ };
617
+ const toolVersion = String(
618
+ execute('aws', ['--version'], 'aws-cli-version'),
619
+ ).trim();
620
+ const caller = awsJson(
621
+ ['sts', 'get-caller-identity', '--output', 'json'],
622
+ 'sts-caller-identity',
623
+ );
624
+ if (caller.value?.Account !== input.accountId) {
625
+ throw new Error('AWS caller account differs from the collector target.');
626
+ }
627
+ const provenance = {
628
+ runAttempt: process.env.GITHUB_RUN_ATTEMPT?.trim() ?? '1',
629
+ runId: process.env.GITHUB_RUN_ID?.trim() ?? '1',
630
+ tool: 'aws-cli',
631
+ toolVersion,
632
+ workflow:
633
+ process.env.GITHUB_WORKFLOW_REF?.trim() ??
634
+ 'local/ecr-inspector-collector@manual',
635
+ };
636
+ const deploymentRequest = {
637
+ ...input.deployment,
638
+ region: input.region,
639
+ };
640
+ const deploymentArgs =
641
+ input.deployment.kind === 'service'
642
+ ? [
643
+ 'ecs',
644
+ 'describe-services',
645
+ '--cluster',
646
+ input.deployment.clusterArn,
647
+ '--services',
648
+ input.deployment.serviceArn,
649
+ '--region',
650
+ input.region,
651
+ '--output',
652
+ 'json',
653
+ ]
654
+ : [
655
+ 'ecs',
656
+ 'describe-tasks',
657
+ '--cluster',
658
+ input.deployment.clusterArn,
659
+ '--tasks',
660
+ input.deployment.taskArn,
661
+ '--region',
662
+ input.region,
663
+ '--output',
664
+ 'json',
665
+ ];
666
+ const deployedTaskDefinitionArn = (response, label) => {
667
+ if (!Array.isArray(response?.failures) || response.failures.length !== 0) {
668
+ throw new Error(label + ' returned deployment failures.');
669
+ }
670
+ if (input.deployment.kind === 'service') {
671
+ if (
672
+ !Array.isArray(response.services) ||
673
+ response.services.length !== 1 ||
674
+ response.services[0]?.clusterArn !== input.deployment.clusterArn ||
675
+ response.services[0]?.serviceArn !== input.deployment.serviceArn ||
676
+ response.services[0]?.status !== 'ACTIVE' ||
677
+ typeof response.services[0]?.taskDefinition !== 'string' ||
678
+ !Array.isArray(response.services[0]?.deployments) ||
679
+ response.services[0].deployments.length !== 1 ||
680
+ response.services[0].deployments[0]?.status !== 'PRIMARY' ||
681
+ response.services[0].deployments[0]?.rolloutState !== 'COMPLETED' ||
682
+ response.services[0].deployments[0]?.taskDefinition !==
683
+ response.services[0].taskDefinition
684
+ ) {
685
+ throw new Error(
686
+ label + ' did not resolve one stable completed primary service deployment.',
687
+ );
688
+ }
689
+ return response.services[0].taskDefinition;
690
+ }
691
+ if (
692
+ !Array.isArray(response.tasks) ||
693
+ response.tasks.length !== 1 ||
694
+ response.tasks[0]?.clusterArn !== input.deployment.clusterArn ||
695
+ response.tasks[0]?.taskArn !== input.deployment.taskArn ||
696
+ !['RUNNING', 'STOPPED'].includes(response.tasks[0]?.lastStatus) ||
697
+ typeof response.tasks[0]?.taskDefinitionArn !== 'string'
698
+ ) {
699
+ throw new Error(label + ' did not resolve one exact ECS task execution.');
700
+ }
701
+ return response.tasks[0].taskDefinitionArn;
702
+ };
703
+ const firstDeployment = awsJson(
704
+ deploymentArgs,
705
+ 'ecs-deployment-first',
706
+ );
707
+ const taskDefinitionArn = deployedTaskDefinitionArn(
708
+ firstDeployment.value,
709
+ 'First ECS deployment lookup',
710
+ );
711
+ const taskRequest = {
712
+ include: ['TAGS'],
713
+ region: input.region,
714
+ taskDefinition: taskDefinitionArn,
715
+ };
716
+ const taskArgs = [
717
+ 'ecs',
718
+ 'describe-task-definition',
719
+ '--task-definition',
720
+ taskDefinitionArn,
721
+ '--include',
722
+ 'TAGS',
723
+ '--region',
724
+ input.region,
725
+ '--output',
726
+ 'json',
727
+ ];
728
+ const firstTask = awsJson(taskArgs, 'ecs-task-definition-first');
729
+ const firstCall = {
730
+ request: taskRequest,
731
+ response: firstTask.value,
732
+ };
733
+
734
+ const platformKey = process.platform + '-' + process.arch;
735
+ const syftRelease = SYFT_RELEASES[platformKey];
736
+ if (!syftRelease) {
737
+ throw new Error('No reviewed Syft release exists for ' + platformKey + '.');
738
+ }
739
+ const temporaryDirectory = mkdtempSync(join(tmpdir(), 'ebk-syft-'));
740
+ let syftPath;
741
+ try {
742
+ const suppliedArchive = process.env.EBK_SYFT_ARCHIVE_PATH?.trim();
743
+ const archivePath = suppliedArchive
744
+ ? resolve(process.cwd(), suppliedArchive)
745
+ : join(temporaryDirectory, 'syft-archive');
746
+ if (suppliedArchive) {
747
+ const suppliedMetadata = lstatSync(archivePath);
748
+ if (
749
+ !suppliedMetadata.isFile() ||
750
+ suppliedMetadata.isSymbolicLink() ||
751
+ suppliedMetadata.size === 0 ||
752
+ suppliedMetadata.size > MAX_TOOL_BYTES
753
+ ) {
754
+ throw new Error('Supplied Syft archive must be one bounded regular file.');
755
+ }
756
+ }
757
+ if (!suppliedArchive) {
758
+ const response = await fetch(syftRelease.source, {
759
+ redirect: 'follow',
760
+ signal: AbortSignal.timeout(120_000),
761
+ });
762
+ if (
763
+ !response.ok ||
764
+ Number(response.headers.get('content-length') ?? 0) > MAX_TOOL_BYTES
765
+ ) {
766
+ throw new Error('Pinned Syft archive download failed or was oversized.');
767
+ }
768
+ const bytes = Buffer.from(await response.arrayBuffer());
769
+ if (bytes.byteLength === 0 || bytes.byteLength > MAX_TOOL_BYTES) {
770
+ throw new Error('Pinned Syft archive is empty or oversized.');
771
+ }
772
+ writeFileSync(archivePath, bytes, { mode: 0o600 });
773
+ }
774
+ const archiveBytes = readBoundedFile(
775
+ archivePath,
776
+ MAX_TOOL_BYTES,
777
+ 'Pinned Syft archive is empty or oversized.',
778
+ );
779
+ if (digestBytes(archiveBytes) !== syftRelease.sha256) {
780
+ throw new Error('Pinned Syft archive integrity does not match policy.');
781
+ }
782
+ if (syftRelease.archiveFormat === 'binary') {
783
+ syftPath = join(temporaryDirectory, 'syft');
784
+ writeFileSync(syftPath, archiveBytes, { mode: 0o700 });
785
+ } else {
786
+ execute(
787
+ 'tar',
788
+ ['-xzf', archivePath, '-C', temporaryDirectory, 'syft'],
789
+ 'extract-pinned-syft',
790
+ );
791
+ syftPath = join(temporaryDirectory, 'syft');
792
+ chmodSync(syftPath, 0o700);
793
+ }
794
+ const firstTaskDefinition = requireRecord(
795
+ firstTask.value.taskDefinition,
796
+ 'First ECS task definition is absent.',
797
+ );
798
+ const firstContainer = Array.isArray(firstTaskDefinition.containerDefinitions)
799
+ ? firstTaskDefinition.containerDefinitions[0]
800
+ : undefined;
801
+ if (
802
+ !firstContainer ||
803
+ typeof firstContainer.image !== 'string' ||
804
+ !firstContainer.image.includes('@sha256:')
805
+ ) {
806
+ throw new Error(
807
+ 'Task definition is tag-only; current SST context builds are unsupported.',
808
+ );
809
+ }
810
+ const imageMatch =
811
+ /^(\\d{12})\\.dkr\\.ecr\\.([a-z0-9-]+)\\.amazonaws\\.com(?:\\.cn)?\\/([a-z0-9][a-z0-9._/-]*)@(sha256:[a-f0-9]{64})$/.exec(
812
+ firstContainer.image,
813
+ );
814
+ if (
815
+ !imageMatch ||
816
+ imageMatch[1] !== input.accountId ||
817
+ imageMatch[2] !== input.region ||
818
+ !IMAGE_DIGEST.test(imageMatch[4] ?? '')
819
+ ) {
820
+ throw new Error('ECS image is not an exact target-registry digest.');
821
+ }
822
+ const repositoryName = imageMatch[3];
823
+ const imageDigest = imageMatch[4];
824
+ if (
825
+ firstContainer.image !== containerArtifact.imageReference ||
826
+ repositoryName !== containerArtifact.repositoryName ||
827
+ imageDigest !== containerArtifact.imageDigest
828
+ ) {
829
+ throw new Error(
830
+ 'Deployed ECS image differs from the exact predeploy ECR repository and image reference.',
831
+ );
832
+ }
833
+ const describeExactImage = (digest, label) => {
834
+ const details = awsJson(
835
+ [
836
+ 'ecr',
837
+ 'describe-images',
838
+ '--registry-id',
839
+ input.accountId,
840
+ '--repository-name',
841
+ repositoryName,
842
+ '--image-ids',
843
+ 'imageDigest=' + digest,
844
+ '--region',
845
+ input.region,
846
+ '--output',
847
+ 'json',
848
+ ],
849
+ label,
850
+ );
851
+ if (
852
+ !Array.isArray(details.value?.imageDetails) ||
853
+ details.value.imageDetails.length !== 1 ||
854
+ details.value.imageDetails[0]?.registryId !== input.accountId ||
855
+ details.value.imageDetails[0]?.repositoryName !== repositoryName ||
856
+ details.value.imageDetails[0]?.imageDigest !== digest
857
+ ) {
858
+ throw new Error('Exact bound ECR image is absent or ambiguous.');
859
+ }
860
+ };
861
+ describeExactImage(imageDigest, 'ecr-exact-index-image');
862
+ for (const platform of containerArtifact.platforms) {
863
+ describeExactImage(
864
+ platform.imageDigest,
865
+ 'ecr-exact-platform-image-' + platform.platform.replace('/', '-'),
866
+ );
867
+ }
868
+ const registryAuthority = imageMatch[1] + '.dkr.ecr.' + imageMatch[2] +
869
+ '.amazonaws.com' + (imageMatch[2].startsWith('cn-') ? '.cn' : '');
870
+ const registryToken = String(
871
+ execute(
872
+ 'aws',
873
+ ['ecr', 'get-login-password', '--region', input.region],
874
+ 'ecr-registry-auth-token',
875
+ { maximumBytes: 64 * 1024 },
876
+ ),
877
+ );
878
+ if (registryToken.trim().length === 0) {
879
+ throw new Error('ECR registry authentication returned an empty token.');
880
+ }
881
+ const dockerConfig = join(temporaryDirectory, 'docker-config');
882
+ mkdirSync(dockerConfig, { mode: 0o700 });
883
+ execute(
884
+ 'docker',
885
+ ['login', '--username', 'AWS', '--password-stdin', registryAuthority],
886
+ 'ecr-registry-authentication',
887
+ {
888
+ env: { DOCKER_CONFIG: dockerConfig },
889
+ input: registryToken,
890
+ maximumBytes: 1024 * 1024,
891
+ },
892
+ );
893
+ const syftVersionOutput = String(
894
+ execute(syftPath, ['version'], 'syft-version'),
895
+ );
896
+ if (
897
+ !new RegExp('(?:Version|version):?\\\\s*' + SYFT_VERSION.replaceAll('.', '\\\\.')).test(
898
+ syftVersionOutput,
899
+ )
900
+ ) {
901
+ throw new Error('Syft runtime version differs from reviewed policy.');
902
+ }
903
+ const platformSboms = [...containerArtifact.platforms]
904
+ .sort((left, right) =>
905
+ left.platform < right.platform
906
+ ? -1
907
+ : left.platform > right.platform
908
+ ? 1
909
+ : 0,
910
+ )
911
+ .map((platform) => {
912
+ const platformToken = platform.platform.replace('/', '-');
913
+ const raw = String(
914
+ execute(
915
+ syftPath,
916
+ ['scan', platform.imageReference, '--output', 'cyclonedx-json'],
917
+ 'syft-platform-' + platformToken + '-scan',
918
+ {
919
+ env: {
920
+ DOCKER_CONFIG: dockerConfig,
921
+ SYFT_CHECK_FOR_APP_UPDATE: 'false',
922
+ },
923
+ maximumBytes: MAX_SBOM_BYTES,
924
+ },
925
+ ),
926
+ );
927
+ let sbom;
928
+ try {
929
+ sbom = JSON.parse(raw);
930
+ } catch {
931
+ throw new Error(
932
+ 'Syft returned invalid CycloneDX JSON for ' + platform.platform + '.',
933
+ );
934
+ }
935
+ if (
936
+ sbom?.bomFormat !== 'CycloneDX' ||
937
+ sbom.specVersion !== '1.6' ||
938
+ sbom.version !== 1 ||
939
+ typeof sbom.serialNumber !== 'string' ||
940
+ !/^urn:uuid:[a-fA-F0-9-]{36}$/.test(sbom.serialNumber) ||
941
+ !Array.isArray(sbom.components) ||
942
+ sbom.components.length === 0 ||
943
+ !Array.isArray(sbom.dependencies) ||
944
+ !sbom.metadata ||
945
+ typeof sbom.metadata !== 'object'
946
+ ) {
947
+ throw new Error(
948
+ 'Syft output is not complete CycloneDX 1.6 evidence for ' +
949
+ platform.platform + '.',
950
+ );
951
+ }
952
+ const serialized = JSON.stringify(sbom, null, 2) + '\\n';
953
+ return {
954
+ binding: platform,
955
+ digest: digestBytes(Buffer.from(serialized, 'utf8')),
956
+ platform: platform.platform,
957
+ sbom,
958
+ serialized,
959
+ };
960
+ });
961
+ const configuration = awsJson(
962
+ [
963
+ 'ecr',
964
+ 'get-registry-scanning-configuration',
965
+ '--region',
966
+ input.region,
967
+ '--output',
968
+ 'json',
969
+ ],
970
+ 'ecr-enhanced-scan-configuration',
971
+ );
972
+ const platformPages = [];
973
+ let totalPageBytes = 0;
974
+ for (const platform of [...containerArtifact.platforms].sort((left, right) =>
975
+ left.platform < right.platform
976
+ ? -1
977
+ : left.platform > right.platform
978
+ ? 1
979
+ : 0,
980
+ )) {
981
+ const pages = [];
982
+ let nextToken;
983
+ for (let page = 0; page < MAX_PAGES; page += 1) {
984
+ const request = {
985
+ imageId: { imageDigest: platform.imageDigest },
986
+ maxResults: 1000,
987
+ ...(nextToken === undefined ? {} : { nextToken }),
988
+ region: input.region,
989
+ registryId: input.accountId,
990
+ repositoryName,
991
+ };
992
+ const apiInput = {
993
+ imageId: request.imageId,
994
+ maxResults: request.maxResults,
995
+ ...(nextToken === undefined ? {} : { nextToken }),
996
+ registryId: request.registryId,
997
+ repositoryName: request.repositoryName,
998
+ };
999
+ const args = [
1000
+ 'ecr',
1001
+ 'describe-image-scan-findings',
1002
+ '--cli-input-json',
1003
+ JSON.stringify(apiInput),
1004
+ '--no-paginate',
1005
+ '--region',
1006
+ input.region,
1007
+ '--output',
1008
+ 'json',
1009
+ ];
1010
+ const platformToken = platform.platform.replace('/', '-');
1011
+ const response = awsJson(
1012
+ args,
1013
+ 'ecr-enhanced-findings-' + platformToken + '-page-' + String(page + 1),
1014
+ );
1015
+ totalPageBytes += Buffer.byteLength(response.raw, 'utf8');
1016
+ if (totalPageBytes > MAX_TOTAL_PAGE_BYTES) {
1017
+ throw new Error('ECR findings exceeded the cumulative response-size bound.');
1018
+ }
1019
+ pages.push({ request, response: response.value });
1020
+ nextToken =
1021
+ typeof response.value?.nextToken === 'string' &&
1022
+ response.value.nextToken.length > 0
1023
+ ? response.value.nextToken
1024
+ : undefined;
1025
+ if (
1026
+ nextToken !== undefined &&
1027
+ (nextToken.length > 2_048 ||
1028
+ !/^[A-Za-z0-9._:/+=-]+$/.test(nextToken))
1029
+ ) {
1030
+ throw new Error('ECR findings returned an invalid bounded pagination token.');
1031
+ }
1032
+ if (nextToken === undefined) break;
1033
+ }
1034
+ if (nextToken !== undefined) {
1035
+ throw new Error('ECR findings exceeded the bounded pagination limit.');
1036
+ }
1037
+ platformPages.push({ pages, platform });
1038
+ }
1039
+ const revalidatedDeployment = awsJson(
1040
+ deploymentArgs,
1041
+ 'ecs-deployment-revalidated',
1042
+ );
1043
+ if (
1044
+ deployedTaskDefinitionArn(
1045
+ revalidatedDeployment.value,
1046
+ 'Revalidated ECS deployment lookup',
1047
+ ) !== taskDefinitionArn
1048
+ ) {
1049
+ throw new Error(
1050
+ 'ECS deployment changed while the image identity was being collected.',
1051
+ );
1052
+ }
1053
+ const revalidatedTask = awsJson(
1054
+ taskArgs,
1055
+ 'ecs-task-definition-revalidated',
1056
+ );
1057
+ const collectedAt = new Date().toISOString();
1058
+ const deploymentBinding = collectEcsDeployedImageBinding({
1059
+ collectedAt,
1060
+ deployment: {
1061
+ request: deploymentRequest,
1062
+ response: firstDeployment.value,
1063
+ },
1064
+ expected,
1065
+ first: firstCall,
1066
+ provenance,
1067
+ revalidatedDeployment: {
1068
+ request: deploymentRequest,
1069
+ response: revalidatedDeployment.value,
1070
+ },
1071
+ revalidated: {
1072
+ request: taskRequest,
1073
+ response: revalidatedTask.value,
1074
+ },
1075
+ });
1076
+ verifyEcsDeployedImageBinding(deploymentBinding, expected);
1077
+ if (
1078
+ deploymentBinding.imageDigest !== imageDigest ||
1079
+ deploymentBinding.repositoryName !== repositoryName
1080
+ ) {
1081
+ throw new Error('ECS and ECR image discovery produced different identities.');
1082
+ }
1083
+
1084
+ const prefix =
1085
+ manifest.releaseId + '-' + declared.name.replaceAll('/', '-');
1086
+ const sbom = createCycloneDxPlatformSbomUnion({
1087
+ artifact: {
1088
+ 'bom-ref': deploymentBinding.imageReference,
1089
+ hashes: [{ alg: 'SHA-256', content: imageDigest.slice(7) }],
1090
+ name: declared.name,
1091
+ type: 'container',
1092
+ version: imageDigest,
1093
+ },
1094
+ generatedAt: collectedAt,
1095
+ platforms: platformSboms.map(({ platform, sbom: platformSbom }) => ({
1096
+ platform,
1097
+ sbom: platformSbom,
1098
+ })),
1099
+ properties: [
1100
+ { name: 'ebk:artifact:candidate-digest', value: candidateArtifactDigest },
1101
+ { name: 'ebk:artifact:id', value: declared.name },
1102
+ {
1103
+ name: 'ebk:container:binding-digest',
1104
+ value: containerBinding.materialDigest,
1105
+ },
1106
+ {
1107
+ name: 'ebk:container:platform-parity-digest',
1108
+ value: containerArtifact.sbomParityDigest,
1109
+ },
1110
+ ...platformSboms.flatMap(({ binding, digest, platform, sbom: child }) => {
1111
+ const token = platform.replace('/', '-');
1112
+ return [
1113
+ {
1114
+ name: 'ebk:container:platform:' + token + ':image-digest',
1115
+ value: binding.imageDigest,
1116
+ },
1117
+ {
1118
+ name: 'ebk:container:platform:' + token + ':image-reference',
1119
+ value: binding.imageReference,
1120
+ },
1121
+ {
1122
+ name: 'ebk:container:platform:' + token + ':predeploy-sbom-sha256',
1123
+ value: binding.sbom.sha256,
1124
+ },
1125
+ {
1126
+ name: 'ebk:container:platform:' + token + ':sbom-path',
1127
+ value: prefix + '.sbom-' + token + '.cdx.json',
1128
+ },
1129
+ {
1130
+ name: 'ebk:container:platform:' + token + ':sbom-serial-number',
1131
+ value: child.serialNumber.toLowerCase(),
1132
+ },
1133
+ {
1134
+ name: 'ebk:container:platform:' + token + ':sbom-sha256',
1135
+ value: digest,
1136
+ },
1137
+ ];
1138
+ }),
1139
+ { name: 'ebk:deployment:coverage', value: 'deployed-artifact' },
1140
+ { name: 'ebk:image:digest', value: imageDigest },
1141
+ { name: 'ebk:image:reference', value: deploymentBinding.imageReference },
1142
+ { name: 'ebk:inventory:scope', value: 'final-oci-contents' },
1143
+ { name: 'ebk:release:id', value: manifest.releaseId },
1144
+ { name: 'ebk:release:manifest-digest', value: releaseManifestDigest },
1145
+ { name: 'ebk:source:commit', value: manifest.source.commit },
1146
+ ],
1147
+ });
1148
+ const serializedSbom = JSON.stringify(sbom, null, 2) + '\\n';
1149
+ const sbomDigest = digestBytes(Buffer.from(serializedSbom, 'utf8'));
1150
+
1151
+ const transcriptUnsigned = {
1152
+ entries: transcriptEntries,
1153
+ kind: 'ebk-ecr-collector-raw-transcript',
1154
+ schemaVersion: 1,
1155
+ target: {
1156
+ accountId: input.accountId,
1157
+ artifactId: declared.name,
1158
+ region: input.region,
1159
+ releaseId: manifest.releaseId,
1160
+ sourceCommit: manifest.source.commit,
1161
+ stage: input.stage,
1162
+ },
1163
+ };
1164
+ const transcript = {
1165
+ ...transcriptUnsigned,
1166
+ materialDigest: digestValue(transcriptUnsigned),
1167
+ };
1168
+ const sharedTarget = {
1169
+ accountId: input.accountId,
1170
+ artifactId: declared.name,
1171
+ candidateArtifactDigest,
1172
+ collectorTranscriptDigest: transcript.materialDigest,
1173
+ deploymentBindingDigest: deploymentBinding.materialDigest,
1174
+ region: input.region,
1175
+ releaseId: manifest.releaseId,
1176
+ releaseManifestDigest,
1177
+ releaseManifestMaterialDigest: manifest.materialDigest,
1178
+ repositoryName,
1179
+ sbomInventoryScope: 'final-oci-contents',
1180
+ sourceCommit: manifest.source.commit,
1181
+ stage: input.stage,
1182
+ };
1183
+ const target = {
1184
+ ...sharedTarget,
1185
+ imageDigest,
1186
+ sbomDigest,
1187
+ sbomSerialNumber: sbom.serialNumber.toLowerCase(),
1188
+ };
1189
+ const platformScans = platformPages.map(({ pages, platform }) => {
1190
+ const platformSbom = platformSboms.find(
1191
+ (candidate) => candidate.platform === platform.platform,
1192
+ );
1193
+ if (!platformSbom || platformSbom.binding.imageDigest !== platform.imageDigest) {
1194
+ throw new Error('Platform SBOM scan is absent or cross-paired.');
1195
+ }
1196
+ const platformTarget = {
1197
+ ...sharedTarget,
1198
+ imageDigest: platform.imageDigest,
1199
+ sbomDigest: platformSbom.digest,
1200
+ sbomSerialNumber: platformSbom.sbom.serialNumber.toLowerCase(),
1201
+ };
1202
+ const evidence = collectEcrInspectorScanEvidence({
1203
+ collectedAt,
1204
+ configuration: {
1205
+ request: { region: input.region },
1206
+ response: configuration.value,
1207
+ },
1208
+ pages,
1209
+ provenance,
1210
+ target: platformTarget,
1211
+ });
1212
+ verifyEcrInspectorScanEvidence(evidence, platformTarget);
1213
+ return {
1214
+ evidence,
1215
+ platform: platform.platform,
1216
+ sbom: platformSbom,
1217
+ target: platformTarget,
1218
+ };
1219
+ });
1220
+ if (
1221
+ platformScans.length !== 2 ||
1222
+ platformScans[0]?.platform !== 'linux/amd64' ||
1223
+ platformScans[1]?.platform !== 'linux/arm64'
1224
+ ) {
1225
+ throw new Error('Inspector evidence must cover both bound OCI child manifests.');
1226
+ }
1227
+ const scanEvidenceUnsigned = {
1228
+ collectedAt,
1229
+ kind: 'ebk-ecr-inspector-platform-scan-set',
1230
+ platformScans: platformScans.map(({ evidence, platform, sbom: child, target }) => ({
1231
+ imageDigest: target.imageDigest,
1232
+ platform,
1233
+ predeploySbomDigest: child.binding.sbom.sha256,
1234
+ sbomDigest: target.sbomDigest,
1235
+ sbomPath: prefix + '.sbom-' + platform.replace('/', '-') + '.cdx.json',
1236
+ scanEvidenceDigest: evidence.materialDigest,
1237
+ })),
1238
+ schemaVersion: 1,
1239
+ status: 'complete',
1240
+ target,
1241
+ };
1242
+ const scanEvidence = {
1243
+ ...scanEvidenceUnsigned,
1244
+ materialDigest: digestValue(scanEvidenceUnsigned),
1245
+ };
1246
+ const impactUnsigned = {
1247
+ artifact: {
1248
+ candidateDigest: candidateArtifactDigest,
1249
+ id: declared.name,
1250
+ imageDigest,
1251
+ repositoryName,
1252
+ },
1253
+ components: sbom.components
1254
+ .map((component) => ({
1255
+ name: component.name,
1256
+ purl: component.purl,
1257
+ type: component.type,
1258
+ version: component.version,
1259
+ }))
1260
+ .sort((left, right) =>
1261
+ String(left.purl ?? left.name) < String(right.purl ?? right.name)
1262
+ ? -1
1263
+ : String(left.purl ?? left.name) > String(right.purl ?? right.name)
1264
+ ? 1
1265
+ : 0,
1266
+ ),
1267
+ findings: platformScans.flatMap(({ evidence, platform }) =>
1268
+ evidence.findings.map((finding) => ({
1269
+ findingArn: finding.findingArn,
1270
+ packageNames: finding.packageNames,
1271
+ platform,
1272
+ severity: finding.severity,
1273
+ status: finding.status,
1274
+ vulnerabilityId: finding.vulnerabilityId,
1275
+ })),
1276
+ ),
1277
+ kind: 'ebk-production-release-component-impact',
1278
+ release: {
1279
+ id: manifest.releaseId,
1280
+ manifestDigest: releaseManifestDigest,
1281
+ manifestMaterialDigest: manifest.materialDigest,
1282
+ sourceCommit: manifest.source.commit,
1283
+ stage: input.stage,
1284
+ },
1285
+ sbom: {
1286
+ digest: sbomDigest,
1287
+ inventoryScope: 'final-oci-contents',
1288
+ serialNumber: sbom.serialNumber.toLowerCase(),
1289
+ },
1290
+ schemaVersion: 1,
1291
+ };
1292
+ const impact = {
1293
+ ...impactUnsigned,
1294
+ materialDigest: digestValue(impactUnsigned),
1295
+ };
1296
+ immutableWrite(join(outputDirectory, prefix + '.raw.json'), transcript);
1297
+ immutableWrite(
1298
+ join(outputDirectory, prefix + '.deployment.json'),
1299
+ deploymentBinding,
1300
+ );
1301
+ immutableWrite(join(outputDirectory, prefix + '.cdx.json'), serializedSbom);
1302
+ for (const child of platformSboms) {
1303
+ immutableWrite(
1304
+ join(
1305
+ outputDirectory,
1306
+ prefix + '.sbom-' + child.platform.replace('/', '-') + '.cdx.json',
1307
+ ),
1308
+ child.serialized,
1309
+ );
1310
+ }
1311
+ for (const { evidence, platform } of platformScans) {
1312
+ immutableWrite(
1313
+ join(
1314
+ outputDirectory,
1315
+ prefix + '.scan-' + platform.replace('/', '-') + '.json',
1316
+ ),
1317
+ evidence,
1318
+ );
1319
+ }
1320
+ immutableWrite(join(outputDirectory, prefix + '.scan.json'), scanEvidence);
1321
+ immutableWrite(join(outputDirectory, prefix + '.impact.json'), impact);
1322
+ process.stdout.write(JSON.stringify({
1323
+ artifactId: declared.name,
1324
+ deploymentBindingDigest: deploymentBinding.materialDigest,
1325
+ imageDigest,
1326
+ impactDigest: impact.materialDigest,
1327
+ releaseId: manifest.releaseId,
1328
+ platformScanEvidenceDigests: scanEvidence.platformScans,
1329
+ scanEvidenceDigest: scanEvidence.materialDigest,
1330
+ sbomDigest,
1331
+ transcriptDigest: transcript.materialDigest,
1332
+ }) + '\\n');
1333
+ } finally {
1334
+ rmSync(temporaryDirectory, { force: true, recursive: true });
1335
+ }
1336
+ `;
1337
+ }
1338
+ //# sourceMappingURL=generated-ecr-collector-command.js.map