@xemahq/xema 0.59.1 → 0.60.1

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 (850) hide show
  1. package/README.md +1 -2
  2. package/dist/appliance-owner.d.ts.map +1 -1
  3. package/dist/appliance-owner.js +6 -6
  4. package/dist/appliance-owner.js.map +1 -1
  5. package/dist/assets/appliance-base/authorization.lock.json +5186 -0
  6. package/dist/assets/appliance-base/distribution.lock.json +760 -279
  7. package/dist/assets/appliance-base/images.lock.json +576 -513
  8. package/dist/assets/appliance-lean/authorization.lock.json +4648 -0
  9. package/dist/assets/appliance-lean/distribution.lock.json +641 -186
  10. package/dist/assets/appliance-lean/images.lock.json +574 -512
  11. package/dist/assets/boot-graph.json +33 -14
  12. package/dist/assets/distribution-assets.manifest.json +23 -20
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +7 -9
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/biome-dev.d.ts.map +1 -1
  17. package/dist/commands/biome-dev.js +41 -137
  18. package/dist/commands/biome-dev.js.map +1 -1
  19. package/dist/commands/biome-lifecycle.d.ts +24 -0
  20. package/dist/commands/biome-lifecycle.d.ts.map +1 -0
  21. package/dist/commands/biome-lifecycle.js +253 -0
  22. package/dist/commands/biome-lifecycle.js.map +1 -0
  23. package/dist/commands/biome.d.ts +2 -4
  24. package/dist/commands/biome.d.ts.map +1 -1
  25. package/dist/commands/biome.js +61 -46
  26. package/dist/commands/biome.js.map +1 -1
  27. package/dist/commands/config.d.ts.map +1 -1
  28. package/dist/commands/config.js +96 -8
  29. package/dist/commands/config.js.map +1 -1
  30. package/dist/commands/doctor.d.ts.map +1 -1
  31. package/dist/commands/doctor.js +13 -20
  32. package/dist/commands/doctor.js.map +1 -1
  33. package/dist/commands/down.d.ts.map +1 -1
  34. package/dist/commands/down.js +14 -21
  35. package/dist/commands/down.js.map +1 -1
  36. package/dist/commands/init.d.ts.map +1 -1
  37. package/dist/commands/init.js +6 -3
  38. package/dist/commands/init.js.map +1 -1
  39. package/dist/commands/installation-tenancy.d.ts +11 -0
  40. package/dist/commands/installation-tenancy.d.ts.map +1 -0
  41. package/dist/commands/installation-tenancy.js +308 -0
  42. package/dist/commands/installation-tenancy.js.map +1 -0
  43. package/dist/commands/installation.d.ts.map +1 -1
  44. package/dist/commands/installation.js +19 -5
  45. package/dist/commands/installation.js.map +1 -1
  46. package/dist/commands/logs.d.ts +2 -0
  47. package/dist/commands/logs.d.ts.map +1 -1
  48. package/dist/commands/logs.js +41 -8
  49. package/dist/commands/logs.js.map +1 -1
  50. package/dist/commands/{dev.d.ts → mirror.d.ts} +1 -1
  51. package/dist/commands/mirror.d.ts.map +1 -0
  52. package/dist/commands/mirror.js +132 -0
  53. package/dist/commands/mirror.js.map +1 -0
  54. package/dist/commands/source.d.ts.map +1 -1
  55. package/dist/commands/source.js +3 -2
  56. package/dist/commands/source.js.map +1 -1
  57. package/dist/commands/status.d.ts.map +1 -1
  58. package/dist/commands/status.js +40 -21
  59. package/dist/commands/status.js.map +1 -1
  60. package/dist/commands/up.d.ts.map +1 -1
  61. package/dist/commands/up.js +36 -4
  62. package/dist/commands/up.js.map +1 -1
  63. package/dist/dev/infra-preflight.d.ts.map +1 -1
  64. package/dist/dev/infra-preflight.js +0 -4
  65. package/dist/dev/infra-preflight.js.map +1 -1
  66. package/dist/lib/confirm.d.ts +3 -0
  67. package/dist/lib/confirm.d.ts.map +1 -0
  68. package/dist/lib/confirm.js +19 -0
  69. package/dist/lib/confirm.js.map +1 -0
  70. package/dist/lib/output-format.d.ts +6 -0
  71. package/dist/lib/output-format.d.ts.map +1 -0
  72. package/dist/lib/output-format.js +20 -0
  73. package/dist/lib/output-format.js.map +1 -0
  74. package/dist/mirror/config/mirror-config-document.d.ts +18 -0
  75. package/dist/mirror/config/mirror-config-document.d.ts.map +1 -0
  76. package/dist/mirror/config/mirror-config-document.js +57 -0
  77. package/dist/mirror/config/mirror-config-document.js.map +1 -0
  78. package/dist/mirror/config/mirror-config-schema.d.ts +54 -0
  79. package/dist/mirror/config/mirror-config-schema.d.ts.map +1 -0
  80. package/dist/mirror/config/mirror-config-schema.js +80 -0
  81. package/dist/mirror/config/mirror-config-schema.js.map +1 -0
  82. package/dist/mirror/kit/delta.d.ts +4 -0
  83. package/dist/mirror/kit/delta.d.ts.map +1 -0
  84. package/dist/mirror/kit/delta.js +41 -0
  85. package/dist/mirror/kit/delta.js.map +1 -0
  86. package/dist/mirror/kit/export-kit.d.ts +16 -0
  87. package/dist/mirror/kit/export-kit.d.ts.map +1 -0
  88. package/dist/mirror/kit/export-kit.js +112 -0
  89. package/dist/mirror/kit/export-kit.js.map +1 -0
  90. package/dist/mirror/kit/import-kit.d.ts +9 -0
  91. package/dist/mirror/kit/import-kit.d.ts.map +1 -0
  92. package/dist/mirror/kit/import-kit.js +166 -0
  93. package/dist/mirror/kit/import-kit.js.map +1 -0
  94. package/dist/mirror/kit/kit-archive.d.ts +4 -0
  95. package/dist/mirror/kit/kit-archive.d.ts.map +1 -0
  96. package/dist/mirror/kit/kit-archive.js +38 -0
  97. package/dist/mirror/kit/kit-archive.js.map +1 -0
  98. package/dist/mirror/kit/kit-layout.d.ts +10 -0
  99. package/dist/mirror/kit/kit-layout.d.ts.map +1 -0
  100. package/dist/mirror/kit/kit-layout.js +19 -0
  101. package/dist/mirror/kit/kit-layout.js.map +1 -0
  102. package/dist/mirror/kit/kit-sums.d.ts +5 -0
  103. package/dist/mirror/kit/kit-sums.d.ts.map +1 -0
  104. package/dist/mirror/kit/kit-sums.js +63 -0
  105. package/dist/mirror/kit/kit-sums.js.map +1 -0
  106. package/dist/mirror/kit/layout-sync.d.ts +8 -0
  107. package/dist/mirror/kit/layout-sync.d.ts.map +1 -0
  108. package/dist/mirror/kit/layout-sync.js +58 -0
  109. package/dist/mirror/kit/layout-sync.js.map +1 -0
  110. package/dist/mirror/plan/bundle-content.d.ts +10 -0
  111. package/dist/mirror/plan/bundle-content.d.ts.map +1 -0
  112. package/dist/mirror/plan/bundle-content.js +61 -0
  113. package/dist/mirror/plan/bundle-content.js.map +1 -0
  114. package/dist/mirror/plan/declaration-file.d.ts +9 -0
  115. package/dist/mirror/plan/declaration-file.d.ts.map +1 -0
  116. package/dist/mirror/plan/declaration-file.js +27 -0
  117. package/dist/mirror/plan/declaration-file.js.map +1 -0
  118. package/dist/mirror/plan/edition-inputs.d.ts +57 -0
  119. package/dist/mirror/plan/edition-inputs.d.ts.map +1 -0
  120. package/dist/mirror/plan/edition-inputs.js +44 -0
  121. package/dist/mirror/plan/edition-inputs.js.map +1 -0
  122. package/dist/mirror/plan/edition-reader.d.ts +9 -0
  123. package/dist/mirror/plan/edition-reader.d.ts.map +1 -0
  124. package/dist/mirror/plan/edition-reader.js +47 -0
  125. package/dist/mirror/plan/edition-reader.js.map +1 -0
  126. package/dist/mirror/plan/image-content.d.ts +30 -0
  127. package/dist/mirror/plan/image-content.d.ts.map +1 -0
  128. package/dist/mirror/plan/image-content.js +120 -0
  129. package/dist/mirror/plan/image-content.js.map +1 -0
  130. package/dist/mirror/plan/npm-lockfile.d.ts +12 -0
  131. package/dist/mirror/plan/npm-lockfile.d.ts.map +1 -0
  132. package/dist/mirror/plan/npm-lockfile.js +106 -0
  133. package/dist/mirror/plan/npm-lockfile.js.map +1 -0
  134. package/dist/mirror/plan/oci-reads.d.ts +22 -0
  135. package/dist/mirror/plan/oci-reads.d.ts.map +1 -0
  136. package/dist/mirror/plan/oci-reads.js +43 -0
  137. package/dist/mirror/plan/oci-reads.js.map +1 -0
  138. package/dist/mirror/plan/plan-command.d.ts +22 -0
  139. package/dist/mirror/plan/plan-command.d.ts.map +1 -0
  140. package/dist/mirror/plan/plan-command.js +81 -0
  141. package/dist/mirror/plan/plan-command.js.map +1 -0
  142. package/dist/mirror/plan/plan-file.d.ts +13 -0
  143. package/dist/mirror/plan/plan-file.d.ts.map +1 -0
  144. package/dist/mirror/plan/plan-file.js +63 -0
  145. package/dist/mirror/plan/plan-file.js.map +1 -0
  146. package/dist/mirror/plan/resolve-content-set.d.ts +16 -0
  147. package/dist/mirror/plan/resolve-content-set.d.ts.map +1 -0
  148. package/dist/mirror/plan/resolve-content-set.js +90 -0
  149. package/dist/mirror/plan/resolve-content-set.js.map +1 -0
  150. package/dist/mirror/preflight/glob.d.ts +2 -0
  151. package/dist/mirror/preflight/glob.d.ts.map +1 -0
  152. package/dist/mirror/preflight/glob.js +59 -0
  153. package/dist/mirror/preflight/glob.js.map +1 -0
  154. package/dist/mirror/preflight/harbor-api.d.ts +27 -0
  155. package/dist/mirror/preflight/harbor-api.d.ts.map +1 -0
  156. package/dist/mirror/preflight/harbor-api.js +39 -0
  157. package/dist/mirror/preflight/harbor-api.js.map +1 -0
  158. package/dist/mirror/preflight/preflight.d.ts +18 -0
  159. package/dist/mirror/preflight/preflight.d.ts.map +1 -0
  160. package/dist/mirror/preflight/preflight.js +41 -0
  161. package/dist/mirror/preflight/preflight.js.map +1 -0
  162. package/dist/mirror/preflight/tag-moves.d.ts +16 -0
  163. package/dist/mirror/preflight/tag-moves.d.ts.map +1 -0
  164. package/dist/mirror/preflight/tag-moves.js +28 -0
  165. package/dist/mirror/preflight/tag-moves.js.map +1 -0
  166. package/dist/mirror/preflight/write-probe.d.ts +10 -0
  167. package/dist/mirror/preflight/write-probe.d.ts.map +1 -0
  168. package/dist/mirror/preflight/write-probe.js +36 -0
  169. package/dist/mirror/preflight/write-probe.js.map +1 -0
  170. package/dist/mirror/target/extras.d.ts +16 -0
  171. package/dist/mirror/target/extras.d.ts.map +1 -0
  172. package/dist/mirror/target/extras.js +47 -0
  173. package/dist/mirror/target/extras.js.map +1 -0
  174. package/dist/mirror/target/npm-registry.d.ts +20 -0
  175. package/dist/mirror/target/npm-registry.d.ts.map +1 -0
  176. package/dist/mirror/target/npm-registry.js +67 -0
  177. package/dist/mirror/target/npm-registry.js.map +1 -0
  178. package/dist/mirror/target/npm-sync.d.ts +15 -0
  179. package/dist/mirror/target/npm-sync.d.ts.map +1 -0
  180. package/dist/mirror/target/npm-sync.js +44 -0
  181. package/dist/mirror/target/npm-sync.js.map +1 -0
  182. package/dist/mirror/target/oci-items.d.ts +27 -0
  183. package/dist/mirror/target/oci-items.d.ts.map +1 -0
  184. package/dist/mirror/target/oci-items.js +79 -0
  185. package/dist/mirror/target/oci-items.js.map +1 -0
  186. package/dist/mirror/target/oci-sync.d.ts +20 -0
  187. package/dist/mirror/target/oci-sync.d.ts.map +1 -0
  188. package/dist/mirror/target/oci-sync.js +93 -0
  189. package/dist/mirror/target/oci-sync.js.map +1 -0
  190. package/dist/mirror/target/receipt-store.d.ts +13 -0
  191. package/dist/mirror/target/receipt-store.d.ts.map +1 -0
  192. package/dist/mirror/target/receipt-store.js +61 -0
  193. package/dist/mirror/target/receipt-store.js.map +1 -0
  194. package/dist/mirror/target/receipt.d.ts +13 -0
  195. package/dist/mirror/target/receipt.d.ts.map +1 -0
  196. package/dist/mirror/target/receipt.js +25 -0
  197. package/dist/mirror/target/receipt.js.map +1 -0
  198. package/dist/mirror/target/seed-push.d.ts +15 -0
  199. package/dist/mirror/target/seed-push.d.ts.map +1 -0
  200. package/dist/mirror/target/seed-push.js +20 -0
  201. package/dist/mirror/target/seed-push.js.map +1 -0
  202. package/dist/mirror/target/target-access.d.ts +7 -0
  203. package/dist/mirror/target/target-access.d.ts.map +1 -0
  204. package/dist/mirror/target/target-access.js +17 -0
  205. package/dist/mirror/target/target-access.js.map +1 -0
  206. package/dist/mirror/target/target-commands.d.ts +21 -0
  207. package/dist/mirror/target/target-commands.d.ts.map +1 -0
  208. package/dist/mirror/target/target-commands.js +134 -0
  209. package/dist/mirror/target/target-commands.js.map +1 -0
  210. package/dist/mirror/target/target-context.d.ts +11 -0
  211. package/dist/mirror/target/target-context.d.ts.map +1 -0
  212. package/dist/mirror/target/target-context.js +31 -0
  213. package/dist/mirror/target/target-context.js.map +1 -0
  214. package/dist/mirror/target/target-ports.d.ts +18 -0
  215. package/dist/mirror/target/target-ports.d.ts.map +1 -0
  216. package/dist/mirror/target/target-ports.js +49 -0
  217. package/dist/mirror/target/target-ports.js.map +1 -0
  218. package/dist/mirror/target/target-state.d.ts +22 -0
  219. package/dist/mirror/target/target-state.d.ts.map +1 -0
  220. package/dist/mirror/target/target-state.js +41 -0
  221. package/dist/mirror/target/target-state.js.map +1 -0
  222. package/dist/runtime/biome-dev.d.ts +0 -16
  223. package/dist/runtime/biome-dev.d.ts.map +1 -1
  224. package/dist/runtime/biome-dev.js +0 -53
  225. package/dist/runtime/biome-dev.js.map +1 -1
  226. package/dist/runtime/biome-host/biome-directory-packer.d.ts +3 -0
  227. package/dist/runtime/biome-host/biome-directory-packer.d.ts.map +1 -0
  228. package/dist/runtime/biome-host/biome-directory-packer.js +12 -0
  229. package/dist/runtime/biome-host/biome-directory-packer.js.map +1 -0
  230. package/dist/runtime/biome-host/bundle-packer.d.ts +8 -0
  231. package/dist/runtime/biome-host/bundle-packer.d.ts.map +1 -0
  232. package/dist/runtime/biome-host/bundle-packer.js +3 -0
  233. package/dist/runtime/biome-host/bundle-packer.js.map +1 -0
  234. package/dist/runtime/biome-host/from-spec.d.ts +33 -0
  235. package/dist/runtime/biome-host/from-spec.d.ts.map +1 -0
  236. package/dist/runtime/biome-host/from-spec.js +70 -0
  237. package/dist/runtime/biome-host/from-spec.js.map +1 -0
  238. package/dist/runtime/biome-host/lifecycle-client.d.ts +20 -0
  239. package/dist/runtime/biome-host/lifecycle-client.d.ts.map +1 -0
  240. package/dist/runtime/biome-host/lifecycle-client.js +197 -0
  241. package/dist/runtime/biome-host/lifecycle-client.js.map +1 -0
  242. package/dist/runtime/biome-host/lifecycle-contract.d.ts +95 -0
  243. package/dist/runtime/biome-host/lifecycle-contract.d.ts.map +1 -0
  244. package/dist/runtime/biome-host/lifecycle-contract.js +61 -0
  245. package/dist/runtime/biome-host/lifecycle-contract.js.map +1 -0
  246. package/dist/runtime/biome-host/lifecycle-flow.d.ts +29 -0
  247. package/dist/runtime/biome-host/lifecycle-flow.d.ts.map +1 -0
  248. package/dist/runtime/biome-host/lifecycle-flow.js +106 -0
  249. package/dist/runtime/biome-host/lifecycle-flow.js.map +1 -0
  250. package/dist/runtime/biome-host/plan-sources.d.ts +4 -0
  251. package/dist/runtime/biome-host/plan-sources.d.ts.map +1 -0
  252. package/dist/runtime/biome-host/plan-sources.js +26 -0
  253. package/dist/runtime/biome-host/plan-sources.js.map +1 -0
  254. package/dist/runtime/biome-host/relay/bundle-fetch.d.ts +12 -0
  255. package/dist/runtime/biome-host/relay/bundle-fetch.d.ts.map +1 -0
  256. package/dist/runtime/biome-host/relay/bundle-fetch.js +76 -0
  257. package/dist/runtime/biome-host/relay/bundle-fetch.js.map +1 -0
  258. package/dist/runtime/biome-host/relay/declared-scheme.d.ts +3 -0
  259. package/dist/runtime/biome-host/relay/declared-scheme.d.ts.map +1 -0
  260. package/dist/runtime/biome-host/relay/declared-scheme.js +14 -0
  261. package/dist/runtime/biome-host/relay/declared-scheme.js.map +1 -0
  262. package/dist/runtime/biome-host/relay/npm-token.d.ts +4 -0
  263. package/dist/runtime/biome-host/relay/npm-token.d.ts.map +1 -0
  264. package/dist/runtime/biome-host/relay/npm-token.js +16 -0
  265. package/dist/runtime/biome-host/relay/npm-token.js.map +1 -0
  266. package/dist/runtime/biome-host/relay/relay-flow.d.ts +16 -0
  267. package/dist/runtime/biome-host/relay/relay-flow.d.ts.map +1 -0
  268. package/dist/runtime/biome-host/relay/relay-flow.js +48 -0
  269. package/dist/runtime/biome-host/relay/relay-flow.js.map +1 -0
  270. package/dist/runtime/biome-host/source-staging.d.ts +17 -0
  271. package/dist/runtime/biome-host/source-staging.d.ts.map +1 -0
  272. package/dist/runtime/biome-host/source-staging.js +80 -0
  273. package/dist/runtime/biome-host/source-staging.js.map +1 -0
  274. package/dist/runtime/biome-host/sse.d.ts +2 -0
  275. package/dist/runtime/biome-host/sse.d.ts.map +1 -0
  276. package/dist/runtime/biome-host/sse.js +33 -0
  277. package/dist/runtime/biome-host/sse.js.map +1 -0
  278. package/dist/runtime/biome-local-install.js +1 -1
  279. package/dist/runtime/biome-local-install.js.map +1 -1
  280. package/dist/runtime/browser-origins.d.ts +9 -0
  281. package/dist/runtime/browser-origins.d.ts.map +1 -1
  282. package/dist/runtime/browser-origins.js +10 -0
  283. package/dist/runtime/browser-origins.js.map +1 -1
  284. package/dist/runtime/config/config-document.d.ts +10 -0
  285. package/dist/runtime/config/config-document.d.ts.map +1 -0
  286. package/dist/runtime/config/config-document.js +56 -0
  287. package/dist/runtime/config/config-document.js.map +1 -0
  288. package/dist/runtime/config/config-migrations.d.ts +21 -0
  289. package/dist/runtime/config/config-migrations.d.ts.map +1 -0
  290. package/dist/runtime/config/config-migrations.js +102 -0
  291. package/dist/runtime/config/config-migrations.js.map +1 -0
  292. package/dist/runtime/config/config-paths.d.ts +3 -0
  293. package/dist/runtime/config/config-paths.d.ts.map +1 -0
  294. package/dist/runtime/config/config-paths.js +9 -0
  295. package/dist/runtime/config/config-paths.js.map +1 -0
  296. package/dist/runtime/config/dev-mode.d.ts +0 -1
  297. package/dist/runtime/config/dev-mode.d.ts.map +1 -1
  298. package/dist/runtime/config/dev-mode.js +11 -27
  299. package/dist/runtime/config/dev-mode.js.map +1 -1
  300. package/dist/runtime/config/init-presets.js +5 -9
  301. package/dist/runtime/config/init-presets.js.map +1 -1
  302. package/dist/runtime/config/launch-config-help.d.ts +4 -0
  303. package/dist/runtime/config/launch-config-help.d.ts.map +1 -0
  304. package/dist/runtime/config/launch-config-help.js +42 -0
  305. package/dist/runtime/config/launch-config-help.js.map +1 -0
  306. package/dist/runtime/config/launch-config.d.ts +60 -0
  307. package/dist/runtime/config/launch-config.d.ts.map +1 -0
  308. package/dist/runtime/config/launch-config.js +123 -0
  309. package/dist/runtime/config/launch-config.js.map +1 -0
  310. package/dist/runtime/config/launch-schema.d.ts +18 -0
  311. package/dist/runtime/config/launch-schema.d.ts.map +1 -0
  312. package/dist/runtime/config/launch-schema.js +31 -0
  313. package/dist/runtime/config/launch-schema.js.map +1 -0
  314. package/dist/runtime/config/loader.d.ts.map +1 -1
  315. package/dist/runtime/config/loader.js +4 -14
  316. package/dist/runtime/config/loader.js.map +1 -1
  317. package/dist/runtime/config/schema.d.ts +43 -38
  318. package/dist/runtime/config/schema.d.ts.map +1 -1
  319. package/dist/runtime/config/schema.js +17 -46
  320. package/dist/runtime/config/schema.js.map +1 -1
  321. package/dist/runtime/config/sources-config.d.ts +0 -2
  322. package/dist/runtime/config/sources-config.d.ts.map +1 -1
  323. package/dist/runtime/config/sources-config.js +10 -29
  324. package/dist/runtime/config/sources-config.js.map +1 -1
  325. package/dist/runtime/config/versioned-document.d.ts +26 -0
  326. package/dist/runtime/config/versioned-document.d.ts.map +1 -0
  327. package/dist/runtime/config/versioned-document.js +87 -0
  328. package/dist/runtime/config/versioned-document.js.map +1 -0
  329. package/dist/runtime/directory-changes.d.ts +12 -0
  330. package/dist/runtime/directory-changes.d.ts.map +1 -0
  331. package/dist/runtime/directory-changes.js +62 -0
  332. package/dist/runtime/directory-changes.js.map +1 -0
  333. package/dist/runtime/foreground.d.ts +2 -0
  334. package/dist/runtime/foreground.d.ts.map +1 -1
  335. package/dist/runtime/foreground.js +5 -20
  336. package/dist/runtime/foreground.js.map +1 -1
  337. package/dist/runtime/infra/infra-runner.js +5 -5
  338. package/dist/runtime/infra/infra-runner.js.map +1 -1
  339. package/dist/runtime/infra/keycloak-realm.d.ts +3 -19
  340. package/dist/runtime/infra/keycloak-realm.d.ts.map +1 -1
  341. package/dist/runtime/infra/keycloak-realm.js +12 -133
  342. package/dist/runtime/infra/keycloak-realm.js.map +1 -1
  343. package/dist/runtime/installation/current-launcher-renderer.js.map +1 -1
  344. package/dist/runtime/installation/from-current-config.d.ts.map +1 -1
  345. package/dist/runtime/installation/from-current-config.js +24 -47
  346. package/dist/runtime/installation/from-current-config.js.map +1 -1
  347. package/dist/runtime/installation/index.d.ts +1 -0
  348. package/dist/runtime/installation/index.d.ts.map +1 -1
  349. package/dist/runtime/installation/index.js +1 -0
  350. package/dist/runtime/installation/index.js.map +1 -1
  351. package/dist/runtime/installation/installation-file.d.ts +3 -0
  352. package/dist/runtime/installation/installation-file.d.ts.map +1 -0
  353. package/dist/runtime/installation/installation-file.js +9 -0
  354. package/dist/runtime/installation/installation-file.js.map +1 -0
  355. package/dist/runtime/installation/readiness.d.ts +6 -7
  356. package/dist/runtime/installation/readiness.d.ts.map +1 -1
  357. package/dist/runtime/installation/readiness.js +82 -132
  358. package/dist/runtime/installation/readiness.js.map +1 -1
  359. package/dist/runtime/installation/state-store.d.ts +4 -0
  360. package/dist/runtime/installation/state-store.d.ts.map +1 -1
  361. package/dist/runtime/installation/state-store.js +22 -1
  362. package/dist/runtime/installation/state-store.js.map +1 -1
  363. package/dist/runtime/installation/to-current-config.d.ts +4 -1
  364. package/dist/runtime/installation/to-current-config.d.ts.map +1 -1
  365. package/dist/runtime/installation/to-current-config.js +10 -36
  366. package/dist/runtime/installation/to-current-config.js.map +1 -1
  367. package/dist/runtime/launch-plan-format.d.ts.map +1 -1
  368. package/dist/runtime/launch-plan-format.js +31 -6
  369. package/dist/runtime/launch-plan-format.js.map +1 -1
  370. package/dist/runtime/launch-result.d.ts +15 -0
  371. package/dist/runtime/launch-result.d.ts.map +1 -0
  372. package/dist/runtime/launch-result.js +3 -0
  373. package/dist/runtime/launch-result.js.map +1 -0
  374. package/dist/runtime/launch.d.ts +16 -5
  375. package/dist/runtime/launch.d.ts.map +1 -1
  376. package/dist/runtime/launch.js +151 -315
  377. package/dist/runtime/launch.js.map +1 -1
  378. package/dist/runtime/license/helm-pull-secret.d.ts +1 -1
  379. package/dist/runtime/license/helm-pull-secret.d.ts.map +1 -1
  380. package/dist/runtime/license/helm-pull-secret.js +2 -2
  381. package/dist/runtime/license/helm-pull-secret.js.map +1 -1
  382. package/dist/runtime/lifecycle-progress/index.d.ts +9 -0
  383. package/dist/runtime/lifecycle-progress/index.d.ts.map +1 -0
  384. package/dist/runtime/lifecycle-progress/index.js +30 -0
  385. package/dist/runtime/lifecycle-progress/index.js.map +1 -0
  386. package/dist/runtime/lifecycle-progress/json-renderer.d.ts +3 -0
  387. package/dist/runtime/lifecycle-progress/json-renderer.d.ts.map +1 -0
  388. package/dist/runtime/lifecycle-progress/json-renderer.js +27 -0
  389. package/dist/runtime/lifecycle-progress/json-renderer.js.map +1 -0
  390. package/dist/runtime/lifecycle-progress/text-renderer.d.ts +5 -0
  391. package/dist/runtime/lifecycle-progress/text-renderer.d.ts.map +1 -0
  392. package/dist/runtime/lifecycle-progress/text-renderer.js +83 -0
  393. package/dist/runtime/lifecycle-progress/text-renderer.js.map +1 -0
  394. package/dist/runtime/lifecycle-progress/types.d.ts +79 -0
  395. package/dist/runtime/lifecycle-progress/types.d.ts.map +1 -0
  396. package/dist/runtime/lifecycle-progress/types.js +32 -0
  397. package/dist/runtime/lifecycle-progress/types.js.map +1 -0
  398. package/dist/runtime/lock-loader.d.ts +13 -3
  399. package/dist/runtime/lock-loader.d.ts.map +1 -1
  400. package/dist/runtime/lock-loader.js +28 -8
  401. package/dist/runtime/lock-loader.js.map +1 -1
  402. package/dist/runtime/paths.d.ts +2 -0
  403. package/dist/runtime/paths.d.ts.map +1 -1
  404. package/dist/runtime/paths.js +17 -4
  405. package/dist/runtime/paths.js.map +1 -1
  406. package/dist/runtime/roster.d.ts +6 -5
  407. package/dist/runtime/roster.d.ts.map +1 -1
  408. package/dist/runtime/roster.js +0 -21
  409. package/dist/runtime/roster.js.map +1 -1
  410. package/dist/runtime/runner/container-preflight.d.ts +3 -2
  411. package/dist/runtime/runner/container-preflight.d.ts.map +1 -1
  412. package/dist/runtime/runner/container-preflight.js +5 -5
  413. package/dist/runtime/runner/container-preflight.js.map +1 -1
  414. package/dist/runtime/runner/container-runner.d.ts +0 -22
  415. package/dist/runtime/runner/container-runner.d.ts.map +1 -1
  416. package/dist/runtime/runner/container-runner.js +0 -112
  417. package/dist/runtime/runner/container-runner.js.map +1 -1
  418. package/dist/runtime/runner/docker-cli.d.ts +1 -0
  419. package/dist/runtime/runner/docker-cli.d.ts.map +1 -1
  420. package/dist/runtime/runner/docker-cli.js +19 -0
  421. package/dist/runtime/runner/docker-cli.js.map +1 -1
  422. package/dist/runtime/runner/helm-cli.d.ts +1 -0
  423. package/dist/runtime/runner/helm-cli.d.ts.map +1 -1
  424. package/dist/runtime/runner/helm-cli.js +5 -1
  425. package/dist/runtime/runner/helm-cli.js.map +1 -1
  426. package/dist/runtime/runner/helm-pre-install.d.ts +3 -2
  427. package/dist/runtime/runner/helm-pre-install.d.ts.map +1 -1
  428. package/dist/runtime/runner/helm-pre-install.js +3 -3
  429. package/dist/runtime/runner/helm-pre-install.js.map +1 -1
  430. package/dist/runtime/runner/helm-runner.d.ts +29 -4
  431. package/dist/runtime/runner/helm-runner.d.ts.map +1 -1
  432. package/dist/runtime/runner/helm-runner.js +44 -14
  433. package/dist/runtime/runner/helm-runner.js.map +1 -1
  434. package/dist/runtime/runner/kube-cli.d.ts +1 -0
  435. package/dist/runtime/runner/kube-cli.d.ts.map +1 -1
  436. package/dist/runtime/runner/kube-cli.js +24 -2
  437. package/dist/runtime/runner/kube-cli.js.map +1 -1
  438. package/dist/runtime/secrets/managed-local-key-provider.d.ts +2 -0
  439. package/dist/runtime/secrets/managed-local-key-provider.d.ts.map +1 -1
  440. package/dist/runtime/secrets/managed-local-key-provider.js +17 -8
  441. package/dist/runtime/secrets/managed-local-key-provider.js.map +1 -1
  442. package/dist/runtime/seed/closure-container.d.ts +8 -0
  443. package/dist/runtime/seed/closure-container.d.ts.map +1 -0
  444. package/dist/runtime/seed/closure-container.js +23 -0
  445. package/dist/runtime/seed/closure-container.js.map +1 -0
  446. package/dist/runtime/seed/closure-helm.d.ts +9 -0
  447. package/dist/runtime/seed/closure-helm.d.ts.map +1 -0
  448. package/dist/runtime/seed/closure-helm.js +16 -0
  449. package/dist/runtime/seed/closure-helm.js.map +1 -0
  450. package/dist/runtime/seed/closure-names.d.ts +4 -0
  451. package/dist/runtime/seed/closure-names.d.ts.map +1 -0
  452. package/dist/runtime/seed/closure-names.js +29 -0
  453. package/dist/runtime/seed/closure-names.js.map +1 -0
  454. package/dist/runtime/seed/closure-native.d.ts +3 -0
  455. package/dist/runtime/seed/closure-native.d.ts.map +1 -0
  456. package/dist/runtime/seed/closure-native.js +18 -0
  457. package/dist/runtime/seed/closure-native.js.map +1 -0
  458. package/dist/runtime/seed/installation-tar.d.ts +5 -0
  459. package/dist/runtime/seed/installation-tar.d.ts.map +1 -0
  460. package/dist/runtime/seed/installation-tar.js +30 -0
  461. package/dist/runtime/seed/installation-tar.js.map +1 -0
  462. package/dist/runtime/seed/launch-env.d.ts +42 -0
  463. package/dist/runtime/seed/launch-env.d.ts.map +1 -0
  464. package/dist/runtime/seed/launch-env.js +150 -0
  465. package/dist/runtime/seed/launch-env.js.map +1 -0
  466. package/dist/runtime/seed/seed-container.d.ts +13 -0
  467. package/dist/runtime/seed/seed-container.d.ts.map +1 -0
  468. package/dist/runtime/seed/seed-container.js +175 -0
  469. package/dist/runtime/seed/seed-container.js.map +1 -0
  470. package/dist/runtime/seed/seed-delivery-env.d.ts +39 -0
  471. package/dist/runtime/seed/seed-delivery-env.d.ts.map +1 -0
  472. package/dist/runtime/seed/seed-delivery-env.js +47 -0
  473. package/dist/runtime/seed/seed-delivery-env.js.map +1 -0
  474. package/dist/runtime/seed/seed-down.d.ts +2 -0
  475. package/dist/runtime/seed/seed-down.d.ts.map +1 -0
  476. package/dist/runtime/seed/seed-down.js +52 -0
  477. package/dist/runtime/seed/seed-down.js.map +1 -0
  478. package/dist/runtime/seed/seed-env-file.d.ts +3 -0
  479. package/dist/runtime/seed/seed-env-file.d.ts.map +1 -0
  480. package/dist/runtime/seed/seed-env-file.js +24 -0
  481. package/dist/runtime/seed/seed-env-file.js.map +1 -0
  482. package/dist/runtime/seed/seed-env-secret.d.ts +18 -0
  483. package/dist/runtime/seed/seed-env-secret.d.ts.map +1 -0
  484. package/dist/runtime/seed/seed-env-secret.js +62 -0
  485. package/dist/runtime/seed/seed-env-secret.js.map +1 -0
  486. package/dist/runtime/seed/seed-environment.d.ts +12 -0
  487. package/dist/runtime/seed/seed-environment.d.ts.map +1 -0
  488. package/dist/runtime/seed/seed-environment.js +66 -0
  489. package/dist/runtime/seed/seed-environment.js.map +1 -0
  490. package/dist/runtime/seed/seed-facts.d.ts +22 -0
  491. package/dist/runtime/seed/seed-facts.d.ts.map +1 -0
  492. package/dist/runtime/seed/seed-facts.js +40 -0
  493. package/dist/runtime/seed/seed-facts.js.map +1 -0
  494. package/dist/runtime/seed/seed-helm.d.ts +10 -0
  495. package/dist/runtime/seed/seed-helm.d.ts.map +1 -0
  496. package/dist/runtime/seed/seed-helm.js +74 -0
  497. package/dist/runtime/seed/seed-helm.js.map +1 -0
  498. package/dist/runtime/seed/seed-image-user.d.ts +6 -0
  499. package/dist/runtime/seed/seed-image-user.d.ts.map +1 -0
  500. package/dist/runtime/seed/seed-image-user.js +14 -0
  501. package/dist/runtime/seed/seed-image-user.js.map +1 -0
  502. package/dist/runtime/seed/seed-installation-files.d.ts +23 -0
  503. package/dist/runtime/seed/seed-installation-files.d.ts.map +1 -0
  504. package/dist/runtime/seed/seed-installation-files.js +51 -0
  505. package/dist/runtime/seed/seed-installation-files.js.map +1 -0
  506. package/dist/runtime/seed/seed-installation.d.ts +20 -0
  507. package/dist/runtime/seed/seed-installation.d.ts.map +1 -0
  508. package/dist/runtime/seed/seed-installation.js +36 -0
  509. package/dist/runtime/seed/seed-installation.js.map +1 -0
  510. package/dist/runtime/seed/seed-launcher.d.ts +14 -0
  511. package/dist/runtime/seed/seed-launcher.d.ts.map +1 -0
  512. package/dist/runtime/seed/seed-launcher.js +155 -0
  513. package/dist/runtime/seed/seed-launcher.js.map +1 -0
  514. package/dist/runtime/seed/seed-options.d.ts +22 -0
  515. package/dist/runtime/seed/seed-options.d.ts.map +1 -0
  516. package/dist/runtime/seed/seed-options.js +57 -0
  517. package/dist/runtime/seed/seed-options.js.map +1 -0
  518. package/dist/runtime/seed/seed-platform-endpoints.d.ts +8 -0
  519. package/dist/runtime/seed/seed-platform-endpoints.d.ts.map +1 -0
  520. package/dist/runtime/seed/seed-platform-endpoints.js +55 -0
  521. package/dist/runtime/seed/seed-platform-endpoints.js.map +1 -0
  522. package/dist/runtime/seed/seed-process.d.ts +22 -0
  523. package/dist/runtime/seed/seed-process.d.ts.map +1 -0
  524. package/dist/runtime/seed/seed-process.js +79 -0
  525. package/dist/runtime/seed/seed-process.js.map +1 -0
  526. package/dist/runtime/seed/seed-record.d.ts +101 -0
  527. package/dist/runtime/seed/seed-record.d.ts.map +1 -0
  528. package/dist/runtime/seed/seed-record.js +141 -0
  529. package/dist/runtime/seed/seed-record.js.map +1 -0
  530. package/dist/runtime/seed/seed-resolved-deployment.d.ts +14 -0
  531. package/dist/runtime/seed/seed-resolved-deployment.d.ts.map +1 -0
  532. package/dist/runtime/seed/seed-resolved-deployment.js +52 -0
  533. package/dist/runtime/seed/seed-resolved-deployment.js.map +1 -0
  534. package/dist/runtime/seed/substrate-facts.d.ts +52 -0
  535. package/dist/runtime/seed/substrate-facts.d.ts.map +1 -0
  536. package/dist/runtime/seed/substrate-facts.js +92 -0
  537. package/dist/runtime/seed/substrate-facts.js.map +1 -0
  538. package/dist/runtime/seed/supervisor-contract.d.ts +9 -0
  539. package/dist/runtime/seed/supervisor-contract.d.ts.map +1 -0
  540. package/dist/runtime/seed/supervisor-contract.js +68 -0
  541. package/dist/runtime/seed/supervisor-contract.js.map +1 -0
  542. package/dist/runtime/seed/workload-identity-facts.d.ts +17 -0
  543. package/dist/runtime/seed/workload-identity-facts.d.ts.map +1 -0
  544. package/dist/runtime/seed/workload-identity-facts.js +53 -0
  545. package/dist/runtime/seed/workload-identity-facts.js.map +1 -0
  546. package/dist/runtime/sources/schema.d.ts +2 -0
  547. package/dist/runtime/sources/schema.d.ts.map +1 -1
  548. package/dist/runtime/sources/schema.js +10 -9
  549. package/dist/runtime/sources/schema.js.map +1 -1
  550. package/dist/runtime/store-client.d.ts +0 -10
  551. package/dist/runtime/store-client.d.ts.map +1 -1
  552. package/dist/runtime/store-client.js +0 -5
  553. package/dist/runtime/store-client.js.map +1 -1
  554. package/dist/runtime/tenancy/identity-installer.d.ts +11 -0
  555. package/dist/runtime/tenancy/identity-installer.d.ts.map +1 -0
  556. package/dist/runtime/tenancy/identity-installer.js +39 -0
  557. package/dist/runtime/tenancy/identity-installer.js.map +1 -0
  558. package/dist/runtime/tenancy/import-cache.d.ts +5 -0
  559. package/dist/runtime/tenancy/import-cache.d.ts.map +1 -0
  560. package/dist/runtime/tenancy/import-cache.js +27 -0
  561. package/dist/runtime/tenancy/import-cache.js.map +1 -0
  562. package/dist/runtime/tenancy/openfga.d.ts +4 -0
  563. package/dist/runtime/tenancy/openfga.d.ts.map +1 -0
  564. package/dist/runtime/tenancy/openfga.js +29 -0
  565. package/dist/runtime/tenancy/openfga.js.map +1 -0
  566. package/dist/runtime/tenancy/servers.d.ts +18 -0
  567. package/dist/runtime/tenancy/servers.d.ts.map +1 -0
  568. package/dist/runtime/tenancy/servers.js +102 -0
  569. package/dist/runtime/tenancy/servers.js.map +1 -0
  570. package/dist/runtime/tenancy/session.d.ts +19 -0
  571. package/dist/runtime/tenancy/session.d.ts.map +1 -0
  572. package/dist/runtime/tenancy/session.js +79 -0
  573. package/dist/runtime/tenancy/session.js.map +1 -0
  574. package/dist/runtime/tenancy/specs.d.ts +27 -0
  575. package/dist/runtime/tenancy/specs.d.ts.map +1 -0
  576. package/dist/runtime/tenancy/specs.js +129 -0
  577. package/dist/runtime/tenancy/specs.js.map +1 -0
  578. package/examples/01-local-native.yaml +1 -3
  579. package/examples/02-local-container-full.yaml +0 -2
  580. package/examples/03-byo-infra.yaml +1 -5
  581. package/examples/06-biome-sources.yaml +1 -3
  582. package/package.json +32 -37
  583. package/xema.config.example.yaml +1 -10
  584. package/dist/assets/keycloak/realm-xema.json +0 -397
  585. package/dist/commands/dev.d.ts.map +0 -1
  586. package/dist/commands/dev.js +0 -196
  587. package/dist/commands/dev.js.map +0 -1
  588. package/dist/commands/edition.d.ts +0 -3
  589. package/dist/commands/edition.d.ts.map +0 -1
  590. package/dist/commands/edition.js +0 -54
  591. package/dist/commands/edition.js.map +0 -1
  592. package/dist/commands/serve.d.ts +0 -3
  593. package/dist/commands/serve.d.ts.map +0 -1
  594. package/dist/commands/serve.js +0 -114
  595. package/dist/commands/serve.js.map +0 -1
  596. package/dist/dev/carved-installs.d.ts +0 -3
  597. package/dist/dev/carved-installs.d.ts.map +0 -1
  598. package/dist/dev/carved-installs.js +0 -63
  599. package/dist/dev/carved-installs.js.map +0 -1
  600. package/dist/dev/env-defaults.d.ts +0 -15
  601. package/dist/dev/env-defaults.d.ts.map +0 -1
  602. package/dist/dev/env-defaults.js +0 -178
  603. package/dist/dev/env-defaults.js.map +0 -1
  604. package/dist/dev/forked-worker-bootstrap-protocol.d.ts +0 -17
  605. package/dist/dev/forked-worker-bootstrap-protocol.d.ts.map +0 -1
  606. package/dist/dev/forked-worker-bootstrap-protocol.js +0 -35
  607. package/dist/dev/forked-worker-bootstrap-protocol.js.map +0 -1
  608. package/dist/dev/forked-worker-bootstrap.d.ts +0 -18
  609. package/dist/dev/forked-worker-bootstrap.d.ts.map +0 -1
  610. package/dist/dev/forked-worker-bootstrap.js +0 -84
  611. package/dist/dev/forked-worker-bootstrap.js.map +0 -1
  612. package/dist/dev/forked-worker.d.ts +0 -43
  613. package/dist/dev/forked-worker.d.ts.map +0 -1
  614. package/dist/dev/forked-worker.js +0 -358
  615. package/dist/dev/forked-worker.js.map +0 -1
  616. package/dist/edition/verify-image-evidence.bundle.mjs +0 -70456
  617. package/dist/edition/verify-image-evidence.bundle.provenance.json +0 -3957
  618. package/dist/runtime/backing-registration.d.ts +0 -11
  619. package/dist/runtime/backing-registration.d.ts.map +0 -1
  620. package/dist/runtime/backing-registration.js +0 -94
  621. package/dist/runtime/backing-registration.js.map +0 -1
  622. package/dist/runtime/edition/run-entry.d.ts +0 -9
  623. package/dist/runtime/edition/run-entry.d.ts.map +0 -1
  624. package/dist/runtime/edition/run-entry.js +0 -36
  625. package/dist/runtime/edition/run-entry.js.map +0 -1
  626. package/dist/runtime/edition/verb-map.d.ts +0 -70
  627. package/dist/runtime/edition/verb-map.d.ts.map +0 -1
  628. package/dist/runtime/edition/verb-map.js +0 -166
  629. package/dist/runtime/edition/verb-map.js.map +0 -1
  630. package/dist/runtime/env-seeder.d.ts +0 -26
  631. package/dist/runtime/env-seeder.d.ts.map +0 -1
  632. package/dist/runtime/env-seeder.js +0 -340
  633. package/dist/runtime/env-seeder.js.map +0 -1
  634. package/dist/runtime/port-map.d.ts +0 -3
  635. package/dist/runtime/port-map.d.ts.map +0 -1
  636. package/dist/runtime/port-map.js +0 -25
  637. package/dist/runtime/port-map.js.map +0 -1
  638. package/dist/runtime/run-manifest.d.ts +0 -52
  639. package/dist/runtime/run-manifest.d.ts.map +0 -1
  640. package/dist/runtime/run-manifest.js +0 -585
  641. package/dist/runtime/run-manifest.js.map +0 -1
  642. package/dist/runtime/runner/native-runner.d.ts +0 -13
  643. package/dist/runtime/runner/native-runner.d.ts.map +0 -1
  644. package/dist/runtime/runner/native-runner.js +0 -94
  645. package/dist/runtime/runner/native-runner.js.map +0 -1
  646. package/dist/runtime/runner/service-runner.d.ts +0 -28
  647. package/dist/runtime/runner/service-runner.d.ts.map +0 -1
  648. package/dist/runtime/runner/service-runner.js +0 -10
  649. package/dist/runtime/runner/service-runner.js.map +0 -1
  650. package/dist/runtime/secrets/generated-platform-secrets.d.ts +0 -16
  651. package/dist/runtime/secrets/generated-platform-secrets.d.ts.map +0 -1
  652. package/dist/runtime/secrets/generated-platform-secrets.js +0 -115
  653. package/dist/runtime/secrets/generated-platform-secrets.js.map +0 -1
  654. package/dist/runtime/secrets/resolver.d.ts +0 -23
  655. package/dist/runtime/secrets/resolver.d.ts.map +0 -1
  656. package/dist/runtime/secrets/resolver.js +0 -266
  657. package/dist/runtime/secrets/resolver.js.map +0 -1
  658. package/dist/runtime/supervisor.d.ts +0 -67
  659. package/dist/runtime/supervisor.d.ts.map +0 -1
  660. package/dist/runtime/supervisor.js +0 -227
  661. package/dist/runtime/supervisor.js.map +0 -1
  662. package/edition/README.md +0 -293
  663. package/edition/adapter-bundled-versions.mjs +0 -108
  664. package/edition/adapter-host-versions.mjs +0 -41
  665. package/edition/assemble-producer-input.mjs +0 -1423
  666. package/edition/assemble-third-party-input.mjs +0 -336
  667. package/edition/authored-source-check.mjs +0 -135
  668. package/edition/authorization-base.mjs +0 -357
  669. package/edition/biome-content.mjs +0 -327
  670. package/edition/build-biome-index.mjs +0 -180
  671. package/edition/build-ledger-completeness.mjs +0 -67
  672. package/edition/build-ledger.mjs +0 -107
  673. package/edition/build-platform-service-index.mjs +0 -292
  674. package/edition/build-runtime-image-source-index.mjs +0 -1187
  675. package/edition/built-verifier.mjs +0 -55
  676. package/edition/candidate-edition.mjs +0 -697
  677. package/edition/canonical-evidence-json.mjs +0 -82
  678. package/edition/canonical-repository-url.mjs +0 -47
  679. package/edition/catalogue-edition.mjs +0 -49
  680. package/edition/catalogue-evidence.mjs +0 -228
  681. package/edition/catalogue-fetch.mjs +0 -124
  682. package/edition/catalogue-lock-field.mjs +0 -41
  683. package/edition/catalogue-pin.mjs +0 -71
  684. package/edition/catalogue.mjs +0 -223
  685. package/edition/chart-set-source-commit.mjs +0 -97
  686. package/edition/check-committed-image-evidence.mjs +0 -412
  687. package/edition/checkout-indexed-source-repositories.mjs +0 -283
  688. package/edition/collected-refusals.mjs +0 -59
  689. package/edition/comment-blanker.mjs +0 -75
  690. package/edition/connector-source-authority.mjs +0 -60
  691. package/edition/contract-authority.mjs +0 -122
  692. package/edition/cosign-certificate-constraints.mjs +0 -50
  693. package/edition/cross-repo-build-inputs.mjs +0 -158
  694. package/edition/customer-definition.mjs +0 -174
  695. package/edition/customer-edition-verbs.mjs +0 -617
  696. package/edition/customer-flags.mjs +0 -15
  697. package/edition/develop-catalogue-free-resolve.mjs +0 -280
  698. package/edition/develop-chart-roster.mjs +0 -96
  699. package/edition/develop-chart-set.mjs +0 -147
  700. package/edition/develop-coverage-readers.mjs +0 -217
  701. package/edition/develop-coverage-run.mjs +0 -50
  702. package/edition/develop-coverage-verdict.mjs +0 -153
  703. package/edition/develop-coverage.mjs +0 -131
  704. package/edition/develop-current-resolution.mjs +0 -29
  705. package/edition/develop-edition-invariants.mjs +0 -142
  706. package/edition/develop-edition-resolve.mjs +0 -211
  707. package/edition/develop-edition.mjs +0 -379
  708. package/edition/develop-engine-image.mjs +0 -95
  709. package/edition/develop-follow.mjs +0 -491
  710. package/edition/develop-freeze.mjs +0 -289
  711. package/edition/develop-git-bundles.mjs +0 -255
  712. package/edition/develop-graph.mjs +0 -28
  713. package/edition/develop-image-coordinate.mjs +0 -54
  714. package/edition/develop-image-probe.mjs +0 -120
  715. package/edition/develop-image-record.mjs +0 -194
  716. package/edition/develop-record-ancestry.mjs +0 -144
  717. package/edition/develop-record-verify.mjs +0 -216
  718. package/edition/develop-resolve-report.mjs +0 -159
  719. package/edition/develop-select-records.mjs +0 -172
  720. package/edition/develop-selection-line.mjs +0 -30
  721. package/edition/develop-selection-pins.mjs +0 -36
  722. package/edition/develop-snapshot-inputs.mjs +0 -93
  723. package/edition/develop-verify-image-record.mjs +0 -109
  724. package/edition/dispatched-runtime-components.mjs +0 -172
  725. package/edition/dist-check.mjs +0 -1137
  726. package/edition/distribution-evidence-set.mjs +0 -1064
  727. package/edition/distribution-paths.mjs +0 -191
  728. package/edition/edition-artifact.mjs +0 -529
  729. package/edition/edition-biome-manifests.mjs +0 -85
  730. package/edition/edition-ceiling.mjs +0 -180
  731. package/edition/edition-channel.mjs +0 -20
  732. package/edition/edition-chart-set.mjs +0 -104
  733. package/edition/edition-config.mjs +0 -374
  734. package/edition/edition-constants.mjs +0 -110
  735. package/edition/edition-contract-parse.mjs +0 -179
  736. package/edition/edition-contract.json +0 -100
  737. package/edition/edition-image-seal.mjs +0 -110
  738. package/edition/edition-kind.mjs +0 -10
  739. package/edition/edition-list.mjs +0 -35
  740. package/edition/edition-locks.mjs +0 -79
  741. package/edition/edition-pin-verbs.mjs +0 -183
  742. package/edition/edition-pin.mjs +0 -17
  743. package/edition/edition-pinned-inputs.mjs +0 -116
  744. package/edition/edition-protocol.mjs +0 -277
  745. package/edition/edition-publisher.mjs +0 -21
  746. package/edition/edition-seal.mjs +0 -257
  747. package/edition/edition-source-pins.mjs +0 -211
  748. package/edition/edition-unpin.mjs +0 -16
  749. package/edition/edition-workspace.mjs +0 -204
  750. package/edition/evidence-checkout.mjs +0 -439
  751. package/edition/evidence-grammars.mjs +0 -18
  752. package/edition/evidence-input-mode.mjs +0 -136
  753. package/edition/evidence-trust-pin.mjs +0 -380
  754. package/edition/evidence-trust-policy.mjs +0 -374
  755. package/edition/external-source-walk.mjs +0 -485
  756. package/edition/first-party-source-ids.mjs +0 -62
  757. package/edition/fleet-coordinate-finality.mjs +0 -363
  758. package/edition/fulcio-certificate-extensions.mjs +0 -231
  759. package/edition/git-json.mjs +0 -54
  760. package/edition/git-source-auth.mjs +0 -131
  761. package/edition/image-delivery-entitlement-descriptor.mjs +0 -106
  762. package/edition/image-evidence-replay-state.mjs +0 -242
  763. package/edition/image-evidence.mjs +0 -1404
  764. package/edition/image-lock-service-rows.mjs +0 -26
  765. package/edition/image-subject-identity.mjs +0 -24
  766. package/edition/images-from-record.mjs +0 -298
  767. package/edition/indexes-at-pins.mjs +0 -13
  768. package/edition/kernel-capability-domain.mjs +0 -30
  769. package/edition/kernel-contract-authority.mjs +0 -517
  770. package/edition/kernel-contract-source-path-set.mjs +0 -94
  771. package/edition/kernel-package.mjs +0 -206
  772. package/edition/kernel-protocol-choice.mjs +0 -239
  773. package/edition/kernel-signer-kind.mjs +0 -23
  774. package/edition/lib.mjs +0 -3303
  775. package/edition/locked-bundle-signer.mjs +0 -297
  776. package/edition/map-with-concurrency.mjs +0 -19
  777. package/edition/no-follow-file.mjs +0 -94
  778. package/edition/oci-evidence-verbs.mjs +0 -419
  779. package/edition/oci-image-source-evidence.mjs +0 -364
  780. package/edition/operation-grant-admission.mjs +0 -285
  781. package/edition/operation-requirements.mjs +0 -282
  782. package/edition/oras-process.mjs +0 -35
  783. package/edition/oras.mjs +0 -742
  784. package/edition/pin-source.mjs +0 -242
  785. package/edition/pinned-cosign.mjs +0 -70
  786. package/edition/plan-image-evidence-refresh.mjs +0 -427
  787. package/edition/platform-lock-readability.mjs +0 -901
  788. package/edition/platform-service-class.mjs +0 -85
  789. package/edition/platform-service-ownership.mjs +0 -88
  790. package/edition/platform-service-source-authority.mjs +0 -105
  791. package/edition/positive-closure.mjs +0 -162
  792. package/edition/previous-seal-registry.mjs +0 -149
  793. package/edition/produce-distribution-completeness-evidence.mjs +0 -318
  794. package/edition/produce-edition-catalogue-evidence.mjs +0 -252
  795. package/edition/produce-image-delivery-entitlement-evidence.mjs +0 -304
  796. package/edition/produce-image-source-evidence.mjs +0 -788
  797. package/edition/producer-evidence-bundle.mjs +0 -201
  798. package/edition/producer-evidence-index-file.mjs +0 -4
  799. package/edition/record-refused.mjs +0 -12
  800. package/edition/registry-credentials.mjs +0 -225
  801. package/edition/release-catalogue.mjs +0 -47
  802. package/edition/release-channel-guard.mjs +0 -108
  803. package/edition/release-edition-artifact.mjs +0 -152
  804. package/edition/release-edition.mjs +0 -54
  805. package/edition/remedy-command.mjs +0 -89
  806. package/edition/repin-evidence-trust.mjs +0 -109
  807. package/edition/required-resource-provider.mjs +0 -58
  808. package/edition/resolve-chart-set.mjs +0 -376
  809. package/edition/resolve-customer-edition.mjs +0 -374
  810. package/edition/resolve-distribution.mjs +0 -2639
  811. package/edition/resolve-edition.mjs +0 -192
  812. package/edition/resolve-images.mjs +0 -2351
  813. package/edition/seal-image-digests.mjs +0 -954
  814. package/edition/sealed-distribution-lock.mjs +0 -22
  815. package/edition/sealed-evidence-accept.mjs +0 -82
  816. package/edition/shallow-checkout.mjs +0 -18
  817. package/edition/sigstore-bundle-media-type.mjs +0 -4
  818. package/edition/source-authority.mjs +0 -713
  819. package/edition/source-closure.mjs +0 -115
  820. package/edition/store-publisher-trust.mjs +0 -40
  821. package/edition/strict-json.mjs +0 -121
  822. package/edition/string-order.mjs +0 -5
  823. package/edition/third-party-admission.mjs +0 -91
  824. package/edition/third-party-bundle-registry.mjs +0 -242
  825. package/edition/third-party-certificate-extensions.mjs +0 -21
  826. package/edition/third-party-image-pins.mjs +0 -41
  827. package/edition/third-party-pins-trusted.mjs +0 -24
  828. package/edition/third-party-producer-evidence.mjs +0 -76
  829. package/edition/third-party-source-check.mjs +0 -28
  830. package/edition/third-party-source-context.mjs +0 -41
  831. package/edition/third-party-source-evidence.mjs +0 -287
  832. package/edition/third-party-source-flags.mjs +0 -134
  833. package/edition/third-party-source-pins.mjs +0 -259
  834. package/edition/third-party-source-uniqueness.mjs +0 -54
  835. package/edition/third-party-source-walk.mjs +0 -115
  836. package/edition/third-party-source-writer.mjs +0 -213
  837. package/edition/third-party-subjects.mjs +0 -128
  838. package/edition/trust-policy-arming-verb.mjs +0 -60
  839. package/edition/trust-policy-arming.mjs +0 -144
  840. package/edition/trust-policy-image-ownership.mjs +0 -85
  841. package/edition/trusted-executable.mjs +0 -166
  842. package/edition/verifier-binding.mjs +0 -45
  843. package/edition/verifier-files.mjs +0 -8
  844. package/edition/verifier-kernel-schemas.mjs +0 -22
  845. package/edition/verifier-provenance.mjs +0 -64
  846. package/edition/verify-catalogue-evidence.mjs +0 -247
  847. package/edition/verify-image-evidence.mjs +0 -475
  848. package/edition/verify-image-platforms.mjs +0 -523
  849. package/edition/why.mjs +0 -56
  850. package/edition/workspace-sections.mjs +0 -276
@@ -1,1064 +0,0 @@
1
- // ═══════════════════════════════════════════════════════════════════════════
2
- // THE DISTRIBUTION-LEVEL EVIDENCE SET — ONE OWNER FOR ITS SHAPE
3
- //
4
- // `produce-image-source-evidence.mjs` signs ONE statement per image, in the
5
- // repository that built it. This module owns everything that happens ABOVE
6
- // that: gathering those per-image bundles for one edition, stating that the
7
- // set is COMPLETE, entitling a customer to a delivery of it, and assembling
8
- // the `evidence-set.json` the offline verifier reads.
9
- //
10
- // It exists as its own module because three entrypoints need exactly the
11
- // same shapes and would otherwise each grow their own copy:
12
- //
13
- // * produce-distribution-completeness-evidence.mjs (signs completeness)
14
- // * produce-image-delivery-entitlement-evidence.mjs (signs entitlement)
15
- // * distribution-evidence-producer-contract-tests.mjs (proves both agree
16
- // with the VERIFIER's own binding validators)
17
- //
18
- // Every shape here is parsed through the kernel schema before it is returned,
19
- // so a statement this module builds and a statement the verifier accepts are
20
- // the same object by construction, not by review.
21
- //
22
- // WHAT IS DELIBERATELY *NOT* HERE
23
- //
24
- // Signature verification. Staging reads committed bundles and proves they are
25
- // internally consistent (descriptor digests, DSSE payload equality, kernel
26
- // schema, exact source coordinate) — it does NOT verify Sigstore signatures.
27
- // That is `image-evidence.mjs verifyDistributionImageEvidenceSet`, offline,
28
- // against the armed trust policy, at delivery. Re-implementing it here would
29
- // be a second trust decision in a place with no trust anchor.
30
- // ═══════════════════════════════════════════════════════════════════════════
31
-
32
- import { createHash } from 'node:crypto';
33
- import {
34
- mkdirSync,
35
- readFileSync,
36
- readdirSync,
37
- writeFileSync,
38
- } from 'node:fs';
39
- import { dirname, isAbsolute, join } from 'node:path';
40
-
41
- import { assertCanonicalDistributionId } from './distribution-paths.mjs';
42
- import { editionWorkspaceConfig } from './edition-config.mjs';
43
- import { COMMIT_PATTERN, SHA256_DIGEST_PATTERN } from './evidence-grammars.mjs';
44
- import {
45
- loadPinnedDeclaredTrustPolicy,
46
- } from './evidence-trust-pin.mjs';
47
- import {
48
- EVIDENCE_TREE_ROOT,
49
- canonicalJson,
50
- canonicalJsonBytes,
51
- compareCompletenessImages,
52
- decodeExactUtf8,
53
- evidenceDirectoryForDigest,
54
- loadValidatedLocks,
55
- normalizedImageLockDigest,
56
- sha256Digest,
57
- sourceIdentity,
58
- } from './image-evidence.mjs';
59
- import { completenessImageKey } from './image-subject-identity.mjs';
60
- import { assertKernelContractAuthorityEqual } from './kernel-contract-authority.mjs';
61
- import { compareStrings } from './lib.mjs';
62
- import { readBoundedNoFollowFile } from './no-follow-file.mjs';
63
- import {
64
- createRegistryClientResolver,
65
- describeInvalidReferrer,
66
- resolveImageSourceEvidenceReferrer,
67
- writeInvalidReferrerReport,
68
- } from './oci-image-source-evidence.mjs';
69
- import { BUNDLE_MEDIA_TYPE, canonicalSignedBundleBytes, cosignVerifyAttestationArgs, validateProducedBundle } from './produce-image-source-evidence.mjs';
70
- import { splitImageRef } from './registry-credentials.mjs';
71
- import { imageSubjectKey, thirdPartyImagePins } from './third-party-image-pins.mjs';
72
- import { thirdPartyProducerRecord } from './third-party-producer-evidence.mjs';
73
-
74
- /**
75
- * The ONE Sigstore bundle media type this plane stores — re-exported, never
76
- * re-declared. The kernel's `SigstoreEvidenceDescriptorSchema` accepts this
77
- * literal and nothing else, and `produce-image-source-evidence.mjs` owns it.
78
- */
79
- export { BUNDLE_MEDIA_TYPE };
80
-
81
- /** Same bound `check-committed-image-evidence.mjs` reads committed files at. */
82
- const MAX_EVIDENCE_FILE_BYTES = 4 * 1024 * 1024;
83
-
84
- /** `evidence/sha256-<64 hex>` — the shape `evidenceDirectoryForDigest` emits. */
85
- const EVIDENCE_DIRECTORY_PATTERN = /^sha256-[a-f0-9]{64}$/;
86
-
87
-
88
- function assertAbsolutePath(value, label) {
89
- if (typeof value !== 'string' || !isAbsolute(value)) {
90
- throw new Error(`${label} must be an absolute path`);
91
- }
92
- return value;
93
- }
94
-
95
- /**
96
- * The issuance window a statement may carry.
97
- *
98
- * `image-evidence.mjs assertTimeWindow` is the VERIFIER's copy of this rule and
99
- * additionally compares against `now`. A producer cannot use it: it signs at
100
- * issuance, so "not yet valid" and "expired" are not decidable statements about
101
- * its own output — but the MAXIMUM TTL is, and refusing an over-long TTL here
102
- * is what stops a statement that can never verify from being signed at all.
103
- */
104
- function assertIssuanceWindow({ issuedAt, expiresAt, maxTtlSeconds, label }) {
105
- const issued = Date.parse(issuedAt);
106
- const expires = Date.parse(expiresAt);
107
- if (!Number.isFinite(issued) || !Number.isFinite(expires)) {
108
- throw new Error(`${label} has an invalid issuedAt/expiresAt`);
109
- }
110
- if (!Number.isSafeInteger(maxTtlSeconds) || maxTtlSeconds <= 0) {
111
- throw new Error(`${label} requires a positive maximum TTL from the policy`);
112
- }
113
- if (expires <= issued) {
114
- throw new Error(`${label} expiresAt must be after issuedAt`);
115
- }
116
- if (expires - issued > maxTtlSeconds * 1000) {
117
- throw new Error(
118
- `${label} TTL ${Math.floor((expires - issued) / 1000)}s exceeds the ` +
119
- `policy maximum of ${maxTtlSeconds}s`,
120
- );
121
- }
122
- }
123
-
124
- /**
125
- * The canonical order of an evidence subject list — the VERIFIER's own
126
- * comparator, re-exported. `validateCompletenessStatementBinding` refuses a
127
- * statement whose `images[]` is not in this order, so a second copy here would
128
- * be a comparator a signature is bound to, drifting from the one that judges it.
129
- */
130
- export { compareCompletenessImages as compareEvidenceSubjects };
131
-
132
- /**
133
- * Deterministic per-subject artifact stem inside a staged evidence root.
134
- * Keyed by the same `kind\0id` identity `image-evidence.mjs` uses everywhere
135
- * else, so two subjects can never collide and one subject can never move.
136
- */
137
- export function subjectStem(subject) {
138
- return createHash('sha256')
139
- .update(sourceIdentity(subject))
140
- .digest('hex');
141
- }
142
-
143
- /**
144
- * Nonces are DERIVED from run identity, never random.
145
- *
146
- * Same construction as `evidenceNonce` in `produce-image-source-evidence.mjs`,
147
- * with its own domain-separation prefix so a completeness nonce can never
148
- * collide with a producer or entitlement nonce — the verifier keeps ONE
149
- * consumed-nonce set across all three and rejects a reuse
150
- * (`validateCompletenessStatementBinding` refuses a statement that replays a
151
- * producer nonce).
152
- *
153
- * Derivation, not randomness, is what makes a re-run of the SAME release
154
- * byte-identical: a random nonce would make every retry a distinct statement
155
- * and the replay state could never tell a retry from a rollback attempt.
156
- */
157
- function derivedNonce(domain, parts) {
158
- const hash = createHash('sha256').update(`${domain}\0`);
159
- for (const part of parts) {
160
- hash.update(String(part)).update('\0');
161
- }
162
- return hash.digest('base64url');
163
- }
164
-
165
- // ─────────────────────────────────────────────────────────────────────────────
166
- // Reading the committed producer evidence of every producing repository
167
- // ─────────────────────────────────────────────────────────────────────────────
168
-
169
- function readCommittedArtifact(evidenceDirectory, relativePath, label) {
170
- return readBoundedNoFollowFile(
171
- evidenceDirectory,
172
- relativePath,
173
- label,
174
- MAX_EVIDENCE_FILE_BYTES,
175
- ).bytes;
176
- }
177
-
178
- /**
179
- * Index every committed producer bundle reachable from the given producing
180
- * repository checkouts, keyed by the EXACT source coordinate its statement
181
- * attests (`canonicalJson(predicate.source)`).
182
- *
183
- * `onDefect` is REQUIRED and has no default: the two callers make opposite —
184
- * and both correct — decisions about a malformed committed bundle. Staging must
185
- * abort (it is about to build a release around this evidence); the refresh
186
- * planner must classify and continue (its entire job is reporting what is
187
- * broken). A default here would silently give one of them the other's posture.
188
- *
189
- * @returns {Map<string, Array<object>>}
190
- */
191
- export function indexCommittedProducerEvidence({
192
- producerRepositoryRoots,
193
- schemas,
194
- onDefect,
195
- }) {
196
- if (
197
- !Array.isArray(producerRepositoryRoots) ||
198
- producerRepositoryRoots.length === 0
199
- ) {
200
- throw new Error('at least one producing repository root is required');
201
- }
202
- if (typeof onDefect !== 'function') {
203
- throw new Error(
204
- 'a defect handler is required — staging and planning must not share a default posture',
205
- );
206
- }
207
- if (!schemas?.parseImageProducerStatement) {
208
- throw new Error('trusted kernel distribution schemas are required');
209
- }
210
- const seenRoots = new Set();
211
- const index = new Map();
212
- for (const root of producerRepositoryRoots) {
213
- assertAbsolutePath(root, 'producing repository root');
214
- if (seenRoots.has(root)) {
215
- throw new Error(`producing repository root ${root} was given twice`);
216
- }
217
- seenRoots.add(root);
218
- const evidenceRoot = join(root, EVIDENCE_TREE_ROOT);
219
- let entries;
220
- try {
221
- entries = readdirSync(evidenceRoot, { withFileTypes: true });
222
- } catch {
223
- // A producing repository that has never produced evidence is not a
224
- // defect — it is exactly the ABSENT verdict the planner must report and
225
- // the "no matching bundle" failure staging must raise, per subject.
226
- continue;
227
- }
228
- for (const entry of [...entries].sort((left, right) =>
229
- compareStrings(left.name, right.name),
230
- )) {
231
- const directory = join(evidenceRoot, entry.name);
232
- if (entry.isSymbolicLink()) {
233
- onDefect({
234
- root,
235
- directory,
236
- subjectKey: null,
237
- reason: `${EVIDENCE_TREE_ROOT}/${entry.name} is a symlink`,
238
- });
239
- continue;
240
- }
241
- if (!entry.isDirectory()) {continue;}
242
- if (!EVIDENCE_DIRECTORY_PATTERN.test(entry.name)) {
243
- onDefect({
244
- root,
245
- directory,
246
- subjectKey: null,
247
- reason: `${EVIDENCE_TREE_ROOT}/${entry.name} is not a sha256-<digest> evidence directory`,
248
- });
249
- continue;
250
- }
251
- indexOneEvidenceDirectory({
252
- root,
253
- directory,
254
- directoryName: entry.name,
255
- schemas,
256
- onDefect,
257
- index,
258
- });
259
- }
260
- }
261
- return index;
262
- }
263
-
264
- function indexOneEvidenceDirectory({
265
- root,
266
- directory,
267
- directoryName,
268
- schemas,
269
- onDefect,
270
- index,
271
- }) {
272
- let indexDocument;
273
- try {
274
- indexDocument = JSON.parse(
275
- decodeExactUtf8(
276
- readCommittedArtifact(directory, 'producer-evidence.json', 'producer index'),
277
- 'producer index',
278
- ),
279
- );
280
- } catch (error) {
281
- onDefect({
282
- root,
283
- directory,
284
- subjectKey: null,
285
- reason: `producer-evidence.json is missing or unreadable: ${error.message}`,
286
- });
287
- return;
288
- }
289
- if (
290
- indexDocument?.schemaVersion !== 1 ||
291
- !Array.isArray(indexDocument.producerEvidence) ||
292
- indexDocument.producerEvidence.length === 0
293
- ) {
294
- onDefect({
295
- root,
296
- directory,
297
- subjectKey: null,
298
- reason: 'producer-evidence.json is not a non-empty schemaVersion 1 index',
299
- });
300
- return;
301
- }
302
- for (const entry of indexDocument.producerEvidence) {
303
- if (
304
- entry === null ||
305
- typeof entry !== 'object' ||
306
- typeof entry.subjectKind !== 'string' ||
307
- typeof entry.subjectId !== 'string' ||
308
- entry.evidence === null ||
309
- typeof entry.evidence !== 'object'
310
- ) {
311
- onDefect({
312
- root,
313
- directory,
314
- subjectKey: null,
315
- reason: 'producer-evidence.json carries a malformed entry',
316
- });
317
- continue;
318
- }
319
- // Only named in a defect: the record is indexed by the statement's own source coordinate, which already
320
- // tells the generations of a composed artifact apart (its sourceTreeHash).
321
- const subjectKey = `${entry.subjectKind}:${entry.subjectId}`;
322
- const descriptor = entry.evidence;
323
- let statementBytes;
324
- let bundleBytes;
325
- let statement;
326
- try {
327
- statementBytes = readCommittedArtifact(
328
- directory,
329
- descriptor.statementPath,
330
- `${entry.subjectKind}:${entry.subjectId} statement`,
331
- );
332
- bundleBytes = readCommittedArtifact(
333
- directory,
334
- descriptor.bundlePath,
335
- `${entry.subjectKind}:${entry.subjectId} bundle`,
336
- );
337
- if (
338
- sha256Digest(statementBytes) !== descriptor.statementDigest ||
339
- sha256Digest(bundleBytes) !== descriptor.bundleDigest ||
340
- descriptor.bundleMediaType !== BUNDLE_MEDIA_TYPE
341
- ) {
342
- throw new Error(
343
- 'committed artifacts do not match the digests and media type producer-evidence.json records',
344
- );
345
- }
346
- // Proves the bundle carries exactly ONE DSSE in-toto signature whose
347
- // payload is byte-identical to the statement. Reused from the producer so
348
- // the staged bytes are validated by the very code that wrote them.
349
- validateProducedBundle(statementBytes, bundleBytes);
350
- statement = schemas.parseImageProducerStatement(
351
- JSON.parse(decodeExactUtf8(statementBytes, 'committed statement')),
352
- );
353
- if (
354
- evidenceDirectoryForDigest(statement.predicate.artifact.manifestDigest) !==
355
- `${EVIDENCE_TREE_ROOT}/${directoryName}`
356
- ) {
357
- throw new Error(
358
- `statement attests ${statement.predicate.artifact.manifestDigest}, which is not the digest this directory is named after`,
359
- );
360
- }
361
- if (
362
- statement.predicate.source.kind !== entry.subjectKind ||
363
- statement.predicate.source.id !== entry.subjectId
364
- ) {
365
- throw new Error(
366
- `statement attests ${statement.predicate.source.kind}:${statement.predicate.source.id}, which producer-evidence.json indexes as ${entry.subjectKind}:${entry.subjectId}`,
367
- );
368
- }
369
- } catch (error) {
370
- onDefect({ root, directory, subjectKey, reason: error.message });
371
- continue;
372
- }
373
- const coordinate = canonicalJson(statement.predicate.source);
374
- const record = {
375
- root,
376
- directory,
377
- subjectKind: statement.predicate.source.kind,
378
- subjectId: statement.predicate.source.id,
379
- statement,
380
- statementBytes,
381
- bundleBytes,
382
- descriptor,
383
- };
384
- const incumbent = index.get(coordinate);
385
- if (incumbent === undefined) {
386
- index.set(coordinate, [record]);
387
- } else {
388
- incumbent.push(record);
389
- }
390
- }
391
- }
392
-
393
- /**
394
- * The exact source coordinate a producer statement must attest for one locked
395
- * subject: the lock's own fields joined with the repository pin the runtime
396
- * index committed. Value-identical to `expectedSource` in
397
- * `image-evidence.mjs validateProducerStatementBinding` — that function is the
398
- * verifier's authority and the contract tests prove agreement by round-tripping
399
- * a staged statement through it.
400
- */
401
- export function expectedProducerSource({
402
- subject,
403
- repositoryPin,
404
- sourceHashAlgorithm,
405
- }) {
406
- if (
407
- repositoryPin?.repo !== subject.repo ||
408
- repositoryPin.sourceCommit !== subject.sourceCommit
409
- ) {
410
- throw new Error(
411
- `runtime subject "${subject.kind}:${subject.id}" does not match the committed repository pin for ${subject.repo}`,
412
- );
413
- }
414
- return {
415
- kind: subject.kind,
416
- id: subject.id,
417
- repositoryUrl: repositoryPin.repositoryUrl,
418
- repo: subject.repo,
419
- path: subject.path,
420
- sourceCommit: subject.sourceCommit,
421
- sourceManifestHash: subject.sourceManifestHash,
422
- sourceHashAlgorithm,
423
- sourceTreeHash: subject.contentHash,
424
- };
425
- }
426
-
427
- /**
428
- * Resolve the committed producer bundle of every subject in one edition's
429
- * `images.lock.json` and COPY the pairs into `outputRoot`.
430
- *
431
- * Copying (rather than referencing the producing checkouts in place) is what
432
- * makes the evidence root a self-contained artifact: `evidence-set.json`
433
- * descriptor paths are relative to it, and the offline verifier is handed that
434
- * one directory with no access to any producing repository.
435
- *
436
- * @returns {Promise<{distributionLock, imageLock, producers: Array<object>,
437
- * producerEvidence: Array<object>, images: Array<object>}>}
438
- */
439
- export async function stageProducerEvidence({ outputRoot, ...resolution }) {
440
- assertAbsolutePath(outputRoot, 'staging output root');
441
- const resolved = await resolveProducerEvidence(resolution);
442
- for (const producer of resolved.producers) {
443
- mkdirSync(join(outputRoot, 'producers', producer.stem), { recursive: true, mode: 0o700 });
444
- for (const [path, bytes] of stagedProducerFiles(producer)) {
445
- writeFileSync(join(outputRoot, path), bytes, { flag: 'wx', mode: 0o644 });
446
- }
447
- }
448
- return resolved;
449
- }
450
-
451
- /** The staged path and the exact bytes of both files of one producer's evidence. */
452
- export function stagedProducerFiles(producer) {
453
- return [
454
- [producer.evidence.statementPath, producer.statementBytes],
455
- [producer.evidence.bundlePath, producer.bundleBytes],
456
- ];
457
- }
458
-
459
- /**
460
- * Resolve the published producer evidence of every subject in one edition's
461
- * `images.lock.json`; writes nothing. The accept re-derives it with this and
462
- * compares it with the staging, so what it seals is what the registry serves.
463
- */
464
- export async function resolveProducerEvidence({
465
- distributionId,
466
- dataRoot,
467
- editionsRoot,
468
- schemas,
469
- expectedContractAuthority,
470
- registryClientFactory,
471
- channel,
472
- // The reader of the edition's validated locks; a seam so the assembly is testable without a whole edition tree.
473
- loadLocks = loadValidatedLocks,
474
- }) {
475
- assertCanonicalDistributionId(distributionId);
476
- assertAbsolutePath(dataRoot, 'data root');
477
- assertAbsolutePath(editionsRoot, 'editions root');
478
- if (!expectedContractAuthority) {
479
- throw new Error('the expected kernel contract authority is required');
480
- }
481
- const { distributionLock, imageLock, repositoryPins, runtimeSourceIndex, thirdPartySources } =
482
- await loadLocks(distributionId, dataRoot, schemas, { editionsRoot, channel });
483
- assertKernelContractAuthorityEqual(
484
- runtimeSourceIndex.contractAuthority,
485
- expectedContractAuthority,
486
- 'runtime-image-source-index.json',
487
- );
488
- const clientFor = createRegistryClientResolver({
489
- dataRoot,
490
- factory: registryClientFactory,
491
- });
492
-
493
- const thirdPartyImages = thirdPartyImagePins({
494
- pins: { byRepository: (repository) => thirdPartySources.get(repository) },
495
- subjects: imageLock.subjects,
496
- });
497
- const producers = [];
498
- for (const subject of imageLock.subjects) {
499
- const pinImage = thirdPartyImages.get(imageSubjectKey(subject));
500
- if (pinImage !== undefined) {
501
- // A third-party subject's contentHash is publisher-attested, not a tag: its evidence is the committed evidence its pin
502
- // binds, read from the data root with no registry call.
503
- producers.push(
504
- thirdPartyProducerRecord({
505
- subject,
506
- pinImage,
507
- dataRoot,
508
- schemas,
509
- expectedSource: expectedProducerSource({
510
- subject,
511
- repositoryPin: repositoryPins.get(subject.repo),
512
- sourceHashAlgorithm: imageLock.sourceHashAlgorithm,
513
- }),
514
- stem: subjectStem(subject),
515
- }),
516
- );
517
- continue;
518
- }
519
- const expectedSource = expectedProducerSource({
520
- subject,
521
- repositoryPin: repositoryPins.get(subject.repo),
522
- sourceHashAlgorithm: imageLock.sourceHashAlgorithm,
523
- });
524
- const { authority, repository } = splitImageRef(subject.imageRef);
525
- const client = clientFor(authority);
526
- const image = await client.getManifestByTag(repository, subject.contentHash);
527
- const invalidReferrers = [];
528
- const ociEvidence = await resolveImageSourceEvidenceReferrer({
529
- client,
530
- imageRepository: subject.imageRef,
531
- subjectDigest: image.digest,
532
- schemas,
533
- expectedContractAuthority,
534
- onInvalidReferrer: (skipped) => {
535
- invalidReferrers.push(skipped);
536
- writeInvalidReferrerReport(skipped);
537
- },
538
- });
539
- if (ociEvidence === null && invalidReferrers.length > 0) {
540
- throw new Error(
541
- `no valid OCI image-source evidence referrer exists for "${subject.kind}:${subject.id}" ` +
542
- `at ${subject.imageRef}@${image.digest}: ` +
543
- invalidReferrers.map(describeInvalidReferrer).join('; '),
544
- );
545
- }
546
- if (ociEvidence === null) {
547
- throw new Error(
548
- `no OCI image-source evidence referrer exists for "${subject.kind}:${subject.id}" ` +
549
- `at ${subject.imageRef}@${image.digest}`,
550
- );
551
- }
552
- const matches = ociEvidence.records
553
- .filter(
554
- (record) =>
555
- canonicalJson(record.statement.predicate.source) ===
556
- canonicalJson(expectedSource),
557
- )
558
- .map((record) => ({
559
- ...record,
560
- root: subject.imageRef,
561
- directory: `oci://${subject.imageRef}@${ociEvidence.artifactDigest}`,
562
- }));
563
- if (matches.length === 0) {
564
- throw new Error(
565
- `no published producer evidence attests "${subject.kind}:${subject.id}" at ` +
566
- `${subject.repo}@${subject.sourceCommit} (source tree ${subject.contentHash})`,
567
- );
568
- }
569
- const [match] = matches;
570
- const { artifact } = match.statement.predicate;
571
- if (
572
- artifact.imageRepository !== subject.imageRef ||
573
- match.statement.subject[0].name !== subject.imageRef ||
574
- `sha256:${match.statement.subject[0].digest.sha256}` !==
575
- artifact.manifestDigest
576
- ) {
577
- throw new Error(
578
- `committed producer evidence for "${subject.kind}:${subject.id}" attests image ` +
579
- `"${artifact.imageRepository}", not the locked "${subject.imageRef}"`,
580
- );
581
- }
582
- const stem = subjectStem(subject);
583
- producers.push({
584
- stem,
585
- subjectKind: subject.kind,
586
- subjectId: subject.id,
587
- imageRepository: subject.imageRef,
588
- manifestDigest: artifact.manifestDigest,
589
- statement: match.statement,
590
- sourceDirectory: match.directory,
591
- statementBytes: match.statementBytes,
592
- bundleBytes: match.bundleBytes,
593
- evidence: {
594
- statementPath: `producers/${stem}/statement.json`,
595
- statementDigest: sha256Digest(match.statementBytes),
596
- bundlePath: `producers/${stem}/bundle.sigstore.json`,
597
- bundleDigest: sha256Digest(match.bundleBytes),
598
- bundleMediaType: BUNDLE_MEDIA_TYPE,
599
- },
600
- });
601
- }
602
- producers.sort(compareCompletenessImages);
603
-
604
- return {
605
- distributionLock,
606
- imageLock,
607
- producers,
608
- producerEvidence: producers.map(({ subjectKind, subjectId, evidence }) => ({
609
- subjectKind,
610
- subjectId,
611
- evidence,
612
- })),
613
- images: producers.map((producer) => ({
614
- subjectKind: producer.subjectKind,
615
- subjectId: producer.subjectId,
616
- imageRepository: producer.imageRepository,
617
- manifestDigest: producer.manifestDigest,
618
- producerStatementDigest: producer.evidence.statementDigest,
619
- producerBundleDigest: producer.evidence.bundleDigest,
620
- })),
621
- };
622
- }
623
-
624
- // ─────────────────────────────────────────────────────────────────────────────
625
- // Statement shapes
626
- // ─────────────────────────────────────────────────────────────────────────────
627
-
628
- /**
629
- * The evidence channel a signer signs for: the one whose kernel-assigned ref (`EVIDENCE_CHANNEL_REFS`) is the
630
- * signer's workflow ref. The kernel's policy schema ties each policy row to exactly that ref, so the signer's ref
631
- * IS the channel the verifying row will state. A ref no channel owns is refused.
632
- */
633
- export function evidenceChannelOfSigner(signer, schemas) {
634
- const ref = signer?.githubWorkflow?.ref;
635
- const channel = schemas.EVIDENCE_CHANNELS.find((candidate) => schemas.EVIDENCE_CHANNEL_REFS[candidate] === ref);
636
- if (channel === undefined) {
637
- throw new Error(
638
- `the signer workflow ref "${String(ref)}" is the ref of no evidence channel (${schemas.EVIDENCE_CHANNELS.map((candidate) => `${candidate}: ${schemas.EVIDENCE_CHANNEL_REFS[candidate]}`).join(', ')})`,
639
- );
640
- }
641
- return channel;
642
- }
643
-
644
- /**
645
- * The distribution-completeness statement: "these EXACT images, produced by
646
- * these EXACT bundles, are the complete image set of this edition at this
647
- * release commit."
648
- */
649
- export function buildDistributionImagesStatement({
650
- distributionLock,
651
- imageLock,
652
- images,
653
- channel,
654
- releaseSequence,
655
- releaseSourceCommit,
656
- runId,
657
- runAttempt,
658
- issuedAt,
659
- expiresAt,
660
- maxTtlSeconds,
661
- schemas,
662
- }) {
663
- if (!schemas?.parseDistributionImagesStatement || typeof schemas.distributionLockDigest !== 'function') {
664
- throw new Error('trusted kernel distribution schemas are required');
665
- }
666
- if (
667
- distributionLock?.distributionId !== imageLock?.distributionId ||
668
- typeof distributionLock.inputHash !== 'string'
669
- ) {
670
- throw new Error(
671
- 'distribution completeness requires the distribution and image locks of ONE edition',
672
- );
673
- }
674
- const label = `distribution completeness for ${imageLock.distributionId}`;
675
- if (!COMMIT_PATTERN.test(releaseSourceCommit ?? '')) {
676
- throw new Error(`${label} requires an exact 40-hex release source commit`);
677
- }
678
- if (!Number.isSafeInteger(releaseSequence) || releaseSequence < 0) {
679
- throw new Error(`${label} requires a non-negative release sequence`);
680
- }
681
- if (!Number.isSafeInteger(runAttempt) || runAttempt <= 0) {
682
- throw new Error(`${label} requires a positive run attempt`);
683
- }
684
- assertIssuanceWindow({ issuedAt, expiresAt, maxTtlSeconds, label });
685
-
686
- if (!Array.isArray(images) || images.length === 0) {
687
- throw new Error(`${label} has an empty image set`);
688
- }
689
- // The COMPLETE set, exactly: the verifier rebuilds this list from the lock
690
- // and refuses anything that is missing, extra, or out of canonical order.
691
- // Refusing here as well means an incomplete set can never be SIGNED, rather
692
- // than being signed and rejected days later at a customer install.
693
- const expectedIdentities = imageLock.subjects
694
- .map((subject) =>
695
- completenessImageKey({
696
- subjectKind: subject.kind,
697
- subjectId: subject.id,
698
- imageRepository: subject.imageRef,
699
- manifestDigest: subject.imageDigest,
700
- }),
701
- )
702
- .sort(compareStrings);
703
- const actualIdentities = images
704
- .map((image) => completenessImageKey(image))
705
- .sort(compareStrings);
706
- if (
707
- new Set(actualIdentities).size !== actualIdentities.length ||
708
- canonicalJson(expectedIdentities) !== canonicalJson(actualIdentities)
709
- ) {
710
- throw new Error(
711
- `${label} image set is not the exact complete subject set of images.lock.json`,
712
- );
713
- }
714
- const ordered = [...images].sort(compareCompletenessImages);
715
- if (canonicalJson(images) !== canonicalJson(ordered)) {
716
- throw new Error(`${label} image set is not canonically ordered`);
717
- }
718
-
719
- // ONE owner for "what digest names this lock": the verifier compares against
720
- // `normalizedImageLockDigest(imageLock)`, so a second inline computation here
721
- // would be the exact drift this binding exists to catch.
722
- const normalizedLockDigest = normalizedImageLockDigest(imageLock);
723
- const statement = {
724
- _type: 'https://in-toto.io/Statement/v1',
725
- subject: [
726
- {
727
- name: `xema-distribution/${imageLock.distributionId}`,
728
- digest: { sha256: normalizedLockDigest.slice('sha256:'.length) },
729
- },
730
- ],
731
- predicateType: schemas.DISTRIBUTION_IMAGES_PREDICATE_TYPE,
732
- predicate: {
733
- schemaVersion: 2,
734
- channel,
735
- lockDigest: schemas.distributionLockDigest(distributionLock),
736
- distributionId: imageLock.distributionId,
737
- distributionInputHash: distributionLock.inputHash,
738
- normalizedImageLockDigest: normalizedLockDigest,
739
- releaseSequence,
740
- releaseSourceCommit,
741
- runId,
742
- runAttempt,
743
- nonce: derivedNonce('xema.distribution-completeness-evidence.nonce.v1', [
744
- runId,
745
- runAttempt,
746
- imageLock.distributionId,
747
- releaseSourceCommit,
748
- releaseSequence,
749
- normalizedLockDigest,
750
- ]),
751
- issuedAt,
752
- expiresAt,
753
- images: ordered.map((image) => ({
754
- subjectKind: image.subjectKind,
755
- subjectId: image.subjectId,
756
- imageRepository: image.imageRepository,
757
- manifestDigest: image.manifestDigest,
758
- producerStatementDigest: image.producerStatementDigest,
759
- producerBundleDigest: image.producerBundleDigest,
760
- })),
761
- },
762
- };
763
- return schemas.parseDistributionImagesStatement(statement);
764
- }
765
-
766
- /**
767
- * The delivery-entitlement statement: "this customer may take THIS release,
768
- * in THIS mode, to THIS target, once, before it expires."
769
- *
770
- * The mode/targetRegistry pairing is enforced by the kernel schema's own
771
- * `superRefine` (mirror REQUIRES a target registry; shared and airgap FORBID
772
- * one) at the `parse` below — which happens here, in the builder, BEFORE any
773
- * signing. Restating the rule in this file would be a second copy of a closed
774
- * decision that already has an owner.
775
- */
776
- export function buildImageDeliveryEntitlementStatement({
777
- distributionLock,
778
- distributionId,
779
- completenessStatementDigest,
780
- customerId,
781
- mode,
782
- targetRegistry,
783
- idempotencyKey,
784
- runId,
785
- runAttempt,
786
- issuedAt,
787
- expiresAt,
788
- maxTtlSeconds,
789
- schemas,
790
- }) {
791
- if (!schemas?.parseImageDeliveryEntitlementStatement || typeof schemas.distributionLockDigest !== 'function') {
792
- throw new Error('trusted kernel distribution schemas are required');
793
- }
794
- assertCanonicalDistributionId(distributionId);
795
- if (distributionLock?.distributionId !== distributionId) {
796
- throw new Error(`delivery entitlement for ${String(customerId)} requires the distribution lock of ${distributionId}`);
797
- }
798
- const label = `delivery entitlement for ${String(customerId)}`;
799
- if (!SHA256_DIGEST_PATTERN.test(completenessStatementDigest ?? '')) {
800
- throw new Error(
801
- `${label} requires the exact sha256 digest of the completeness statement`,
802
- );
803
- }
804
- if (targetRegistry !== null && typeof targetRegistry !== 'string') {
805
- throw new Error(
806
- `${label} requires an explicit target registry or an explicit null`,
807
- );
808
- }
809
- if (!Number.isSafeInteger(runAttempt) || runAttempt <= 0) {
810
- throw new Error(`${label} requires a positive run attempt`);
811
- }
812
- assertIssuanceWindow({ issuedAt, expiresAt, maxTtlSeconds, label });
813
-
814
- const statement = {
815
- _type: 'https://in-toto.io/Statement/v1',
816
- subject: [
817
- {
818
- name: `xema-distribution/${distributionId}`,
819
- digest: {
820
- sha256: completenessStatementDigest.slice('sha256:'.length),
821
- },
822
- },
823
- ],
824
- predicateType: schemas.IMAGE_DELIVERY_ENTITLEMENT_PREDICATE_TYPE,
825
- predicate: {
826
- schemaVersion: 2,
827
- customerId,
828
- distributionId,
829
- lockDigest: schemas.distributionLockDigest(distributionLock),
830
- // Present-and-nullable: null states the lock carries no catalogue; the lock digest binds the lock either way.
831
- catalogueDigest: distributionLock.catalogueDigest ?? null,
832
- // The field the lock carries, never both: a catalogue-free lock's catalogueContentDigest.
833
- ...(distributionLock.catalogueContentDigest === undefined ? {} : { catalogueContentDigest: distributionLock.catalogueContentDigest }),
834
- distributionStatementDigest: completenessStatementDigest,
835
- mode,
836
- targetRegistry,
837
- nonce: derivedNonce('xema.image-delivery-entitlement.nonce.v1', [
838
- runId,
839
- runAttempt,
840
- customerId,
841
- distributionId,
842
- completenessStatementDigest,
843
- idempotencyKey,
844
- ]),
845
- idempotencyKey,
846
- issuedAt,
847
- expiresAt,
848
- },
849
- };
850
- return schemas.parseImageDeliveryEntitlementStatement(statement);
851
- }
852
-
853
- /**
854
- * `evidence-set.json` — the one document the offline verifier is handed.
855
- *
856
- * It can only be assembled once completeness EXISTS: the kernel schema requires
857
- * the `completeness` descriptor, so there is no such thing as a half-assembled
858
- * set on disk. That ordering is the design, not an accident of this function.
859
- */
860
- export function buildDistributionImageEvidenceSet({
861
- distributionId,
862
- producerEvidence,
863
- completeness,
864
- schemas,
865
- }) {
866
- if (!schemas?.parseDistributionImageEvidenceSet) {
867
- throw new Error('trusted kernel distribution schemas are required');
868
- }
869
- assertCanonicalDistributionId(distributionId);
870
- return schemas.parseDistributionImageEvidenceSet({
871
- schemaVersion: 1,
872
- distributionId,
873
- producerEvidence,
874
- completeness,
875
- });
876
- }
877
-
878
- // ─────────────────────────────────────────────────────────────────────────────
879
- // The signing path shared by the completeness and entitlement producers
880
- // ─────────────────────────────────────────────────────────────────────────────
881
-
882
- /**
883
- * The pinned cosign version is read from the COMMITTED trust policy, never from
884
- * a literal in this file: the policy is what the offline verifier enforces, so
885
- * a producer signing with a different cosign than the verifier trusts must fail
886
- * at signing time, not at delivery.
887
- */
888
- export function assertPinnedCosignVersion(output, expectedVersion) {
889
- if (!/^v\d+\.\d+\.\d+$/.test(expectedVersion ?? '')) {
890
- throw new Error('the trust policy declares no exact cosign version');
891
- }
892
- const match = /\bGitVersion:\s*(v\d+\.\d+\.\d+)\b/.exec(String(output));
893
- if (!match || match[1] !== expectedVersion) {
894
- throw new Error(`cosign version does not match pinned ${expectedVersion}`);
895
- }
896
- return match[1];
897
- }
898
-
899
- /**
900
- * The trust policy the data root declares, held to the data root's pin of it.
901
- * Producers take their cosign version and TTL bounds from this policy, the
902
- * same one the verifier verifies under.
903
- */
904
- export function loadPinnedTrustPolicy({ dataRoot, schemas }) {
905
- return loadPinnedDeclaredTrustPolicy({
906
- dataRoot,
907
- declaration: editionWorkspaceConfig().evidenceTrustPolicy,
908
- schemas,
909
- });
910
- }
911
-
912
- function assertSignableStatement({ statement, root, certificateWorkflowSha, predicateType }) {
913
- assertAbsolutePath(root, 'signing root');
914
- if (!COMMIT_PATTERN.test(certificateWorkflowSha ?? '')) {
915
- throw new Error(
916
- 'signing requires the exact 40-hex commit of the signing workflow',
917
- );
918
- }
919
- if (statement.predicateType !== predicateType) {
920
- throw new Error(
921
- `refusing to stage a ${statement.predicateType} statement as ${predicateType}`,
922
- );
923
- }
924
- }
925
-
926
- /**
927
- * Write the canonical bytes of ONE statement for signing and return its
928
- * signing plan entry. This library never signs: the caller runs
929
- * `cosign attest-blob` and hands the bundle to {@link acceptSignedEvidenceStatement}.
930
- */
931
- export function stageEvidenceStatement({
932
- statement,
933
- root,
934
- statementPath,
935
- bundlePath,
936
- signer,
937
- certificateWorkflowSha,
938
- predicateType,
939
- }) {
940
- assertSignableStatement({ statement, root, certificateWorkflowSha, predicateType });
941
- const absoluteStatement = join(root, statementPath);
942
- mkdirSync(dirname(absoluteStatement), { recursive: true, mode: 0o700 });
943
- mkdirSync(dirname(join(root, bundlePath)), { recursive: true, mode: 0o700 });
944
- writeFileSync(absoluteStatement, canonicalJsonBytes(statement), { flag: 'wx', mode: 0o600 });
945
- return {
946
- schemaVersion: 1,
947
- root,
948
- predicateType,
949
- signer,
950
- certificateWorkflowSha,
951
- statements: [{ statementPath, bundlePath }],
952
- };
953
- }
954
-
955
- /**
956
- * Accept the signed bundle of a staged statement into `sealingRoot`. `statement`
957
- * is re-derived by the caller; the staged bytes must be exactly its canonical
958
- * bytes and the bundle must carry exactly them. The canonical statement and
959
- * bundle are WRITTEN to `sealingRoot` (the staging is only read) and cosign
960
- * verifies the bundle there, against the declared signer at the exact workflow
961
- * commit.
962
- */
963
- export function acceptSignedEvidenceStatement({
964
- statement,
965
- root,
966
- sealingRoot,
967
- statementPath,
968
- bundlePath,
969
- signer,
970
- certificateWorkflowSha,
971
- predicateType,
972
- runCosign,
973
- }) {
974
- assertSignableStatement({ statement, root, certificateWorkflowSha, predicateType });
975
- assertAbsolutePath(sealingRoot, 'sealing root');
976
- if (typeof runCosign !== 'function') {
977
- throw new Error('a cosign runner is required');
978
- }
979
- const statementBytes = canonicalJsonBytes(statement);
980
- if (!readFileSync(join(root, statementPath)).equals(statementBytes)) {
981
- throw new Error(
982
- `staged statement ${statementPath} is not the statement these inputs build`,
983
- );
984
- }
985
- const bundleBytes = canonicalSignedBundleBytes({ statementBytes, bundlePath: join(root, bundlePath) });
986
- mkdirSync(dirname(join(sealingRoot, statementPath)), { recursive: true, mode: 0o755 });
987
- mkdirSync(dirname(join(sealingRoot, bundlePath)), { recursive: true, mode: 0o755 });
988
- writeFileSync(join(sealingRoot, statementPath), statementBytes, { flag: 'wx', mode: 0o644 });
989
- writeFileSync(join(sealingRoot, bundlePath), bundleBytes, { flag: 'wx', mode: 0o644 });
990
- // Verified where it is sealed: the bytes cosign accepts are the bytes kept.
991
- runCosign(
992
- cosignVerifyAttestationArgs({
993
- bundlePath: join(sealingRoot, bundlePath),
994
- signer,
995
- certificateWorkflowSha,
996
- predicateType,
997
- }),
998
- );
999
- return {
1000
- statementPath,
1001
- statementDigest: sha256Digest(statementBytes),
1002
- bundlePath,
1003
- bundleDigest: sha256Digest(bundleBytes),
1004
- bundleMediaType: BUNDLE_MEDIA_TYPE,
1005
- };
1006
- }
1007
-
1008
- // ─────────────────────────────────────────────────────────────────────────────
1009
- // The CLI contract shared by this family's three entrypoints
1010
- // ─────────────────────────────────────────────────────────────────────────────
1011
-
1012
- /**
1013
- * Strict `--flag value` parsing.
1014
- *
1015
- * One owner for the three entrypoints in this family so they cannot drift in
1016
- * how they refuse an unknown flag, a repeated single-valued flag, or a missing
1017
- * value. A typo'd flag that parses as "not provided" is exactly how a producer
1018
- * silently signs with a default nobody chose.
1019
- */
1020
- export function parseEvidenceCliFlags(argv, { single = [], repeated = [] }) {
1021
- const singles = new Set(single);
1022
- const repeats = new Set(repeated);
1023
- const flags = new Map();
1024
- for (let index = 0; index < argv.length; index += 2) {
1025
- const flag = argv[index];
1026
- if (typeof flag !== 'string' || !flag.startsWith('--')) {
1027
- throw new Error(`unexpected argument "${String(flag)}"`);
1028
- }
1029
- const name = flag.slice(2);
1030
- const value = argv[index + 1];
1031
- if (value === undefined || value.startsWith('--')) {
1032
- throw new Error(`--${name} requires a value`);
1033
- }
1034
- if (repeats.has(name)) {
1035
- flags.set(name, [...(flags.get(name) ?? []), value]);
1036
- continue;
1037
- }
1038
- if (!singles.has(name)) {
1039
- throw new Error(`unknown option "--${name}"`);
1040
- }
1041
- if (flags.has(name)) {
1042
- throw new Error(`--${name} was given twice`);
1043
- }
1044
- flags.set(name, value);
1045
- }
1046
- return {
1047
- optional: (name) => flags.get(name),
1048
- many: (name) => flags.get(name) ?? [],
1049
- require(name) {
1050
- const value = flags.get(name);
1051
- if (value === undefined) {
1052
- throw new Error(`--${name} is required`);
1053
- }
1054
- return value;
1055
- },
1056
- requireMany(name) {
1057
- const values = flags.get(name);
1058
- if (!Array.isArray(values) || values.length === 0) {
1059
- throw new Error(`--${name} is required at least once`);
1060
- }
1061
- return values;
1062
- },
1063
- };
1064
- }